我从这里下载了midi文件:Taylor Swift - You Belong With Me.mid
然后,我只想提取原声低音鼓部分,这意味着我想要输出这首歌的原声低音鼓。
我使用music21库来解析midi文件,下面是我的代码:
from music21 import *
import os
fp = os.path.join(common.getSourceFilePath(), 'midi', 'testPrimitive', 'Taylor Swift - You Belong With Me.mid')
mf = midi.MidiFile()
mf.open(fp)
mf.read()
mf.close()
s = midi.translate.midiFileToStream(mf)
partStream = s.parts.stream()
for p in partStream:
print p.partName
然后输出是
Saxophone
None
Electric Bass
None
None
Electric Guitar
None
None
None
Banjo
Banjo
Banjo
StringInstrument
Piano
我不知道哪一个是打击乐器...在知道哪一部分是打击乐器之后,我想提取该部分的原声低音鼓并将其输出为原声低音鼓.mid文件。谁能告诉我该怎么做?谢谢
[编辑]
我用下面的代码,
from music21 import *
import os
fp = os.path.join(common.getSourceFilePath(), 'midi', 'testPrimitive', 'Taylor Swift - You Belong With Me.mid')
mf = midi.MidiFile()
mf.open(fp)
mf.read()
mf.close()
for n in range(len(mf.tracks)):
for c in mf.tracks[n].getChannels():
if c == 10:
print n
然后输出是14,这意味着mf.tracks [14]是打击乐,然后我需要提取音高值为35或36的部分。
然后我用下面的代码:
for n in range(len(mf.tracks[14].events)):
if mf.tracks[14].events[n].pitch == 35 or mf.tracks[14].events[n].pitch == 36:
print n
然后有很多输出。我正在考虑下一步该怎么做。
最佳答案
在常规MIDI中,所有打击乐器事件都在通道9上发送。
因此,您必须在通道9上搜索带有事件的轨道。(流对象可能对此没有帮助)。
在该文件中,该轨道名为“ Drums”。 (我不知道为什么music21没有选择这个名称。)
要提取原声低音鼓事件,请删除所有不使用音符编号为35的音符。(该文件中的所有音符都是该音符;它实际上使用了另一个音符编号为36的低音鼓。)