2

我从这里下载了 midi 文件:Taylor Swift - You Belong With Me.mid

然后我只想提取原声低音鼓部分,这意味着我想要这首歌的输出原声低音鼓.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

然后有很多输出。我正在考虑下一步我应该做什么。

4

1 回答 1

1

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

在该文件中,它是名为“Drums”的曲目。(不知道为什么music21没有取这个名字。)

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

于 2016-12-11T11:05:48.930 回答