python钢琴MIDI简谱播放器代码

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EYYLTV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值