如果您查看midi
您正在使用的模块,您会发现有一些常量可用于将音符转换为它们的 MIDI 编号,反之亦然。
>>> import midi
>>> midi.C_0 # note C octave 0
0
>>> midi.G_3 # G octave 3
43
>>> midi.Gs_4 # G# octave 4
56
>>> midi.A_8 # A octave 8
105
>>> midi.NOTE_VALUE_MAP_SHARP[0]
C_0
>>> midi.NOTE_VALUE_MAP_SHARP[56]
Gs_4
>>> midi.NOTE_VALUE_MAP_SHARP[105]
A_8
打开一个 MIDI 文件,read_midifile()
返回一个Pattern
如下所示的对象(取自示例):
>>> midi.read_midifile('example.mid')
midi.Pattern(format=1, resolution=220, tracks=\
[midi.Track(\
[midi.NoteOnEvent(tick=0, channel=0, data=[43, 20]),
midi.NoteOffEvent(tick=100, channel=0, data=[43, 0]),
midi.EndOfTrackEvent(tick=1, data=[])])])
NoteOnEvent
包含您可以检索的时序、MIDI 编号/音高和速度:
>>> on = midi.NoteOnEvent(tick=0, channel=0, data=[43, 20])
>>> on.pitch
43
>>> midi.NOTE_VALUE_MAP_SHARP[on.pitch]
'G_3'
现在所有这些都很有趣,但是您实际上不需要将 MIDI 编号转换为音符,只需将其转换为http://virtualpiano.net/使用的该音符的键盘键。
中间 C 等于 MIDI 60,这个音符对应于虚拟钢琴键盘上的第 25 个键,通过按字母激活t
。下一个音符 Cs_5 是 MIDI 61,它是大写的T
(<shift>-t)
。从那里您可以计算出 MIDI 数字到支持的虚拟钢琴键的映射;是这样的:
midi_to_vk = (
[None]*36 +
list('1!2@34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm') +
[None]*31
)
您将面临的下一个问题是发送关键事件。请注意,在 MIDI 中,多个音符可以同时播放,也可以在时间上重叠。这意味着您可能需要能够同时发送多个按键事件。
我认为您无法使用计算机键盘处理速度。还有时间问题,但你说这对你来说不是问题。