如果你看看你正在使用的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編號轉換爲音符,您只需要t o將其轉換爲http://virtualpiano.net/所使用的該筆記的鍵盤鍵。
中間C等於MIDI 60,這個音符對應於虛擬琴鍵盤上的第25個琴鍵,按下字母t
激活。下一個音符Cs_5是MIDI 61,它是大寫字母T
(<shift>-t)
。從那裏你可以計算MIDI數字到支持的虛擬琴鍵的映射;那就是:
midi_to_vk = (
[None]*36 +
list('[email protected]$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm') +
[None]*31
)
下一個問題,你將面臨被髮送的關鍵事件。請注意,在MIDI中,多個音符可以同時播放,或者可以在時間上重疊。這意味着您可能需要同時發送多個按鍵事件。
我不認爲你可以使用電腦鍵盤來處理速度。還有時間問題,但你說這對你來說不是問題。
如果我正確地理解了您的問題,您需要能夠識別MIDI文件中的音符。你可以用困難的方式(直接解析文件)或使用現有的庫,例如[python-midi](https://github.com/vishnubob/python-midi)。 –
好吧,我說「我可以用python-midi庫讀取任何MIDI文件」,我可以。這樣做沒有問題。其實我提到了和你一樣的圖書館。問題是我找不到任何關於如何將MIDI數字轉換爲C#-36或A-40(或任何正確名稱)的筆記的文檔 – alaswhu