首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用music21库从midi文件中提取低音鼓

利用music21库从midi文件中提取低音鼓
EN

Stack Overflow用户
提问于 2016-12-11 18:14:06
回答 1查看 731关注 0票数 2

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

然后我只想提取声学低音鼓部分,这意味着我想要这首歌的输出声学低音drum.mid。

我使用了music21库来解析midi文件,下面是我的代码:

代码语言:javascript
复制
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

则输出为

代码语言:javascript
复制
Saxophone
None
Electric Bass
None
None
Electric Guitar
None
None
None
Banjo
Banjo
Banjo
StringInstrument
Piano

我不知道哪一个是打击乐。在我知道哪个部分是打击乐,然后我想提取声学低音鼓在该部分,并输出为声学低音drum.mid文件。有人能告诉我怎么做吗?谢谢

编辑我使用的下面的代码,

代码语言:javascript
复制
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.tracks14是打击乐,然后我需要提取音高数为35或36的部分。

然后我使用了下面的代码:

代码语言:javascript
复制
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

然后会有很多输出。我在想我下一步该做什么。

EN

回答 1

Stack Overflow用户

发布于 2016-12-11 19:05:49

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

在那个文件中,它是名为“鼓”的曲目。(我不知道为什么music21不接这个名字。)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41085082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档