我从这里下载了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
然后有很多输出。我在想我接下来应该做些什么。
答案 0 :(得分:1)
在通用MIDI中,所有打击乐事件都在通道9上发送。 因此,您必须在通道9上搜索包含事件的轨道。(流对象可能对此没有帮助。)
在该文件中,它是名为" Drums"的曲目。 (我不知道为什么音乐21没有拿起这个名字。)
要提取声学低音鼓事件,请删除所有不使用音符编号35的音符。(该文件中的所有音符都是;它实际上使用另一个音符编号为36的低音鼓。)