2016-12-06 13 views
2

私はマルチトラックのMIDIファイルを各トラックごとのノートと継続時間の配列に変換するためにmusic21を使用しようとしています。その中の16台のトラックとMIDIファイルtest.mid所与例えばmusic21:トラックごとのノートと継続時間の解析

、私は(音符のピッチ、継続時間(プラス多分位置))からなる、タプル16個の配列を取得したいと思い

。 music21ため

ドキュメントが従うことはかなり困難である、と私は本当にこの上の任意の助けをいただければ幸いです。..

答えて

1

ありmusic21でこれを行うために複数の方法があるので、これはただ一つの簡単な方法です。 .:

import music21 
from music21 import * 

piece = converter.parse("full_path_to_piece.midi") 
all_parts = [] 
for part in piece.parts: 
    part_tuples = [] 
    for event in part: 
    for y, in event.contextSites(): 
     if y[0] is part: 
     offset = y[1] 
    if getattr(event, 'isNote', None) and event.isNote: 
     part_tuples.append((event.nameWithOctave, event.quarterLength, offset)) 
    if getattr(event, 'isRest', None) and event.isRest: 
     part_tuples.append(('Rest', event.quarterLength, offset)) 
    all_parts.append(part_tuples) 

代替ソリューションは、音楽にアクセスVIS-フレームワークを使用することであろう等、半分ノートは2.0に等しく、四分音符が1.0に等しくなるように、durational値をfloatとして表現されることに注意してくださいmusic21経由でシンボリック表記のファイルを開き、その情報をpandasデータフレームに格納します。これを行うことができます:

pip install vis-framework 

もう1つの解決策は、music21の代わりにHumdrumを使用することです。

+0

ありがとうございます! 「ノートの位置」では、ノートのタイムスタンプを意味していたので、配列を操作した後にMIDIファイルを再構築することができます。それもイベントフィールドの一部ですか?また、「休憩の検出を含む」とはどういう意味ですか? – ytrewq

+0

タイムスタンプでは、作品の先頭からの時間的位置を意味しますか?音楽21の言い分(およびVIS用語)では、これはしばしばイベントの「オフセット」と呼ばれます。それが私に知らせることを意味するのであれば、私は "オフセット"属性があるので私の答えを編集しますが、それはあなたが期待するほど単純ではありません。私が休憩を含むことを意味したことは、私の答えのコードが現在休憩をスキップしていることです。あなたはまた、休憩に出くわすときも知りたいですか? – Alex

+0

また、music21には、ソフトウェアに関する非常に良い情報源であるGoogleグループがありますが、私はmusic21の質問にも適していると考えています。 https://groups.google.com/forum/?hl=en#!forum/music21list – Alex

関連する問題