2017-11-14 12 views
1

私はピアノのMIDIファイルからすべての音符の開始時間と終了時間を取得しようとしています。私の理解から、デルタ時間のtick_onとnote_offイベントがあり、開始時刻と終了時刻を取得するために使用することができます。しかし、私が混乱しているのは、時間変数です。私はちょうどそのようなMIDIメッセージの混乱[Python]

for msg in mid: 
    print(msg.dict()) 

などの簡単なプログラムを持っている場合は、私のような出力を得る:私の理解から

{'note': 60, 'velocity': 61, 'type': 'note_on', 'channel': 0, 'time': 0.0016891895833333333} 
{'note': 64, 'velocity': 57, 'type': 'note_on', 'channel': 0, 'time': 0.20270275} 
{'note': 67, 'velocity': 56, 'type': 'note_on', 'channel': 0, 'time': 0.20270275} 
{'note': 67, 'velocity': 0, 'type': 'note_on', 'channel': 0, 'time': 0.20270275} 
{'note': 72, 'velocity': 60, 'type': 'note_on', 'channel': 0, 'time': 0} 
{'type': 'set_tempo', 'tempo': 794702, 'time': 0.20101356041666665} 

を、これはノートは、すべての1匹の未満ダニあるデルタ時間を持っていることを意味し私には完全に間違っているようです。しかし、私が気に入っているのは、このようにするには、note_on、note_off、およびset_tempoイベントが発生する順番であることです。彼らはすべての100+ダニを持っていますが、順序がであるとしてメッセージに時間要素は、私に多くの意味を成して

<meta message set_tempo tempo=794702 time=480> 
<meta message set_tempo tempo=810811 time=120> 
<meta message set_tempo tempo=800000 time=960> 
<meta message set_tempo tempo=810811 time=360> 
... 
=== Track 1 
<meta message midi_port port=0 time=0> 
<meta message track_name name=u'Piano right' time=0> 
<message program_change channel=0 program=0 time=0> 
<message control_change channel=0 control=7 value=100 time=0> 
<message control_change channel=0 control=10 value=64 time=0> 
<message control_change channel=0 control=91 value=127 time=0> 
<meta message text text=u'bdca426d104a26ac9dcb070447587523' time=0> 
<message note_on channel=0 note=67 velocity=56 time=241> 
<message note_on channel=0 note=67 velocity=0 time=120> 

:私が代わりに

mid.print_tracks() 

を行うと、私は、次のような出力を得ますテンポの変更は一度に印刷され、次に右手のためのすべてのメモイベント、次に左手(すべて)のすべてのメモイベントが表示されます。私はprint_tracks()から取得する100以上の数値である時間属性に基づいてMIDIイベントのリストを取得することができます。

+1

これらのオブジェクトを生成したライブラリはどれですか? –

+0

それを指定しないと申し訳ありません。私が使用しているライブラリはMidoですhttps://mido.readthedocs.io/en/latest/ –

答えて

1

documentationは言う:

time属性は、いくつかの異なる方法で使用されます。

  • トラックの内側に、それはダニにおけるデルタ時間です。これは整数でなければなりません。メッセージに
  • は、それが(前回得られたメッセージからの経過時間)デルタ秒単位の時間

デルタ時間はあなたが追加する必要がありますので、同じトラック内の前のメッセージへの相対的なものであるplay()から得られましたトラックごとに別々に表示されます。

+0

私はそれを読んでいますが、私が混乱していたのは、メッセージをどのように出力するかによって数字がどう違うかです。 –