使用music21库从midi文件中提取声学低音鼓

时间:2016-12-11 10:14:06

标签: python midi music21

我从这里下载了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

我不知道哪一个是打击乐器...在我知道哪个部分是打击乐器之后,我想要在该部分中提取声学低音鼓并将其输出为声学低音drum.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

然后有很多输出。我在想我接下来应该做些什么。

1 个答案:

答案 0 :(得分:1)

在通用MIDI中,所有打击乐事件都在通道9上发送。 因此,您必须在通道9上搜索包含事件的轨道。(流对象可能对此没有帮助。)

在该文件中,它是名为" Drums"的曲目。 (我不知道为什么音乐21没有拿起这个名字。)

要提取声学低音鼓事件,请删除所有不使用音符编号35的音符。(该文件中的所有音符都是;它实际上使用另一个音符编号为36的低音鼓。)