2016-12-11 7 views
2

を使用して、MIDIファイルからアコースティックバスドラムを抽出しますこの曲のは、私はここからMIDIファイルをダウンロードしたmusic21ライブラリ

私は私のコードで以下、MIDIファイルを解析するmusic21ライブラリを使用:後...私は打楽器である1かわからない

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ファイルとして出力したいと思います。それを行う方法を教えてもらえますか?ありがとう

mf.tracksは、[14]が、その後、私はそのピッチ番号部分を抽出するためにパーカッション必要があることを意味して出力が14である

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 

[編集]私はコードの下に使用 、 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

一般的なMIDIでは、パーカッションイベントはすべてチャンネル9で送信されます。 チャンネル9のイベントでトラックを検索する必要があります(ストリームオブジェクトはおそらく役に立ちません)。

このファイルには、「Drums」という名前のトラックがあります。 (なぜ音楽21が名前を拾わなかったのか分かりません)

アコースティックバスドラムイベントを抽出するには、ノート番号35を使用しないすべてのノートを削除します(これは、そのファイル内のすべてです。 )実際には、ノートナンバー36の他のベースドラムを使用しています。

+0

music21のパーカッションサポートはこの時点でかなり不足しています、私は恐れますが、開発者としてかつてのパーカッショニストとして... –

関連する問題