10

私が推測しているかなり単純な質問ですが、どこにも決定的な答えを見つけることができません。

背景:最初のトラックにTEMPOコントロールを含むマルチトラックMIDIファイルがあります。他のトラックのABSOLUTE_TICKカウントを「秒」(MIDIファイルの先頭からオフセットされた小数秒)に変換する必要があります。

ファイルのPulsePerQuarterNote(PPQN)をテンポ(四分音符あたりのMS)に基づいて、ABSOLUTE_TICKを秒に関連付ける式があります。

問題は、最初のトラック(トラック0)のTEMPOの変更が他のすべてのトラックに適用されるかどうかです。

もしそうなら、私が他のトラック(例えば、私が興味を持っているNOTE_ONとNOTE_OFFメッセージを持っているトラック4)を解析している間、私はトラック0のTEMPO変化を並行して指している指を保つ必要があります。そうですか?

ありがとう、

マーク

4

1 に答える 1

11

要するに、はい。最初のトラックには、アレンジメント全体に適用されるタイミング情報が含まれているため、同じ絶対時間で各トラックにこれらのメッセージを適用します。すべてのイベントはティックでオフセットを使用するため、最初にテンポ変更メッセージを抽出し、それらを絶対時間に変換する必要があります。次に、他のトラックを読みながら、そのタイムラインに基づいてこれらのメッセージを適用します。

MIDI狂信者の技術洗脳センターより:

フォーマット 0 のファイルでは、テンポの変更は 1 つの MTrk 全体に散らばっています。フォーマット 1 では、最初の MTrk は、「テンポ マップ」を生成できるデバイスで読み取れるように、テンポ (および拍子記号) イベントのみで構成される必要があります。この MTrk に MIDI イベントを配置しないことをお勧めします。形式 2 では、各 MTrk は少なくとも 1 つの初期テンポ (および拍子記号) イベントで開始する必要があります。

とはいえ、一部のシーケンサーはこの規則を破り、実際の MIDI イベントをタイミング情報と一緒に最初のトラックに配置します。この方法でフォーマットされた MIDI ファイルが実際に発生する可能性があるため、プログラムは両方のケースに対処する必要があります。

于 2009-07-05T08:57:53.993 に答える