4

.mid ファイルから情報を読み込もうとしていますが、どの MIDI メッセージにも含まれていないように見える余分なバイトが表示され続けます。これらを予測/対処する方法がわかりません。プロジェクトで他のすべてを捨てています。助言がありますか?いくつかの例を次に示します。

4d 54 72 6b 00 00 04 48 トラック ヘッダー
00 c0 19 プログラムチェンジ
00 ff 03 07 54 72 61 63 6b 20 31 トラック タイトル
00 b0 05 00 コントローラ イベント
00 64 00 00 06 0c 00 26 00 ????
00 b0 20 00 コントローラ イベント

00 ff 58 04 0c 03 0c 08 拍子記号
81 89 ????
50 ff 51 03 0f 42 40 テンポ
00 ff 2f 00 トラックの終わり

00 ff 21 01 00 不明なメタ イベント
30 b0 79 00 コントローラ イベント
00 07 64 01 0a 32 01 5b ????
14 01 5d 11 01 20 00 00 00 ????
00 c0 23 プログラムチェンジ
8c 7c 90 23 ????

これらのいくつかは、まったく理由もなくゼロ以外のデルタ時間を持っているように見えるため、ここに内訳があるとは思えません。

4

3 に答える 3

2

MusiGenesisはそれを半分正しくしました-あなたは可変長のデルタを正しく解析していません。ただし、表示されている他のイベントは実行中のステータスです。これは、同じタイプの複数のメッセージを送信するときにステータスバイトを省略して帯域幅を節約するために使用される手法です。

そのダンプを解析する方法は次のとおりです。

4d 54 72 6b 00 000448トラックヘッダー
00c019プログラムの変更
00 ff 03 07 54 72 61 63 6b2031トラックタイトル
00 b00500コントローラーイベント
00 64 00実行ステータス(コントローラーイベント)
00 06 0c実行ステータス(コントローラーイベント)
00 26 00実行ステータス(コントローラーイベント)
00 b02000コントローライベント

等々。しかし、私が理解していないのは、トラックメッセージの終了後、次のトラックヘッダーの前に、大量の追加イベントが表示される理由です。MIDIファイル全体を貼り付けましたか?

于 2009-07-26T12:02:03.037 に答える
2

MIDI イベントのデルタ時間は可変長であるため、各イベントは 1 バイト以上を使用して、最後のイベントからの経過時間をエンコードします。これを参照してください。

すべての MIDI イベントには、0 (前のイベントとまったく同じ時間に発生することを示す) または正の値 (前のイベントの後に発生する必要があることを示す) のいずれかのデルタ時間があります。

于 2009-07-25T02:34:13.267 に答える
1

あなたは正しく始めていないようです。最初の 8 バイト

4D 54 68 64 00 00 00 06

私の推測では、ファイルがホースで固定されているか、正しく読み込んでいないのでしょうか?

編集:気にしないでください。これがファイルの始まりだとは言いませんでした。あなたが持っている4バイトはチャンクヘッダーです。

于 2009-07-25T01:29:45.057 に答える