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、付费专栏及课程。

余额充值