import tkinter as tk
import pygame.midi
import time
初始化 pygame.midi
pygame.midi.init()
获取 MIDI 输出设备
midi_out = pygame.midi.Output(0)
def play_note(note_number, duration, instrument):
midi_out.set_instrument(instrument)
midi_out.note_on(note_number, 125)
pygame.time.wait(duration)
midi_out.note_off(note_number, 125)
root = tk.Tk()
root.title(“Digital Music Player”)
设置窗口大小
root.geometry(“400x300”)
创建主旋律文本框
entry_main = tk.Entry(root)
entry_main.pack(pady=10)
创建伴奏文本框
entry_accompaniment = tk.Entry(root)
entry_accompaniment.pack(pady=10)
为主旋律选择乐器的下拉菜单
main_instrument_var = tk.StringVar(root)
main_instrument_var.set(2) # 默认乐器为 2
main_instrument_menu = tk.OptionMenu(root, main_instrument_var, *range(128))
main_instrument_menu.pack(pady=10)
为伴奏选择乐器的下拉菜单
accompaniment_instrument_var = tk.StringVar(root)
accompaniment_instrument_var.set(5) # 默认乐器为 5
accompaniment_instrument_menu = tk.OptionMenu(root, accompaniment_instrument_var, *range(128))
accompaniment_instrument_menu.pack(pady=10)
def play_music():
main_music_notes = entry_main.get()
accompaniment_music_notes = entry_accompaniment.get()
note_index_main = 0
note_index_accompaniment = 0
base_duration = 500 # 基础音符时长
while note_index_main < len(main_music_notes) or note_index_accompaniment < len(accompaniment_music_notes):
main_note_char = main_music_notes[note_index_main] if note_index_main < len(main_music_notes) else None
accompaniment_note_char = accompaniment_music_notes[note_index_accompaniment] if note_index_accompaniment < len(accompaniment_music_notes) else None
main_duration = base_duration
accompaniment_duration = base_duration
if main_note_char == ‘-’:
time.sleep(0.5)
main_duration += base_duration
note_index_main += 1
continue
if accompaniment_note_char == ‘-’:
time.sleep(0.5)
accompaniment_duration += base_duration
note_index_accompaniment += 1
continue
main_note_number = convert_note(main_note_char)
accompaniment_note_number = convert_note(accompaniment_note_char)
if main_note_number is not None:
main_instrument = int(main_instrument_var.get())
play_note(main_note_number, main_duration, main_instrument)
if accompaniment_note_number is not None:
accompaniment_instrument = int(accompaniment_instrument_var.get())
play_note(accompaniment_note_number, accompaniment_duration, accompaniment_instrument)
note_index_main += 1
note_index_accompaniment += 1
def convert_note(note_char):
note_mapping = {‘1’: 60, ‘2’: 62, ‘3’: 64, ‘4’: 65, ‘5’: 67, ‘6’: 69, ‘7’: 71}
return note_mapping.get(note_char)
创建播放按钮
play_button = tk.Button(root, text=“播放”, command=play_music)
play_button.pack(pady=20)
root.mainloop()
关闭 MIDI 输出设备
midi_out.close()
pygame.midi.quit()