我从这里下载了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的低音鼓。)

09-12 09:45