1

このチュートリアルに従って、MIDI を 16 進形式で読み取り、必要なデータを推定する C++ プログラムを作成しようとしています。トラック チャンク情報では、最初の情報は、トラック「MTrk」を見ているという事実です。2 番目の 4 バイトは、チャンク サイズを示します。

私が理解していることから、チャンクサイズは、次のトラックチャンクの開始前、またはファイルの終わりまでのバイト数を指します。ただし、私が作業してきた midi ファイルでは、多くの場合、チャンク サイズが小さすぎます。つまり、チャンク サイズが 40 バイトであるとしましょう。次の「MTrk」は、現在のものの 70 バイト後まで発生しません (「MTrk」とチャンク サイズ自体が異なるという事実を説明しました)。チャンク サイズの一部)。では、これらの追加の 30 バイトは何ですか? チャンク サイズの後に発生するバイトを切り捨てる必要がありますか? それとも、チャンク サイズを無視して、次のトラック (またはトラックの終わりを示す FF2F00) に遭遇するまで読み続ける必要がありますか?

MIDI ファイルを読み込んだ後、出力として次のように記録しました。

4D546864000000060001000300604D54726B0000000B00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F004D54726B

以下に、意味のある部分を分けました。

4D546864
00000006
0001
0003
0060 

(ヘッダーの終わり)

4D54726B
0000000B

(チャンクサイズ = 11 バイト)

00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F00

(しかし、ここでは 20 バイトが表示されます)

4D54726B

これが私が使用したMIDIファイルです。

4

1 に答える 1

0

提供されたリンクからファイルをダウンロードしましたが、非常に正常に見えます。それが定義するチャンクを分解しましょう。

最初のチャンクのサイズは 6 バイト: です00 01 00 03 60。これは、3 トラックの MIDI タイプ 1 ファイルであり、時分割が 96 であることを示しています。

次のチャンク (MTrk) の長さは 11 バイトです: 00 ff 51 03 06 8a 1b 00 ff 2f 00. この場合、テンポの 1 つの MIDI メタ イベントと、トラック終了メッセージのみが含まれます。

その後、長さが02 92バイト (基数 10 で 658) の 2 番目のトラックが続きます。トラック名と楽器を定義するいくつかの MIDI メタ イベントが来て、次に通常の MIDI データが来ます。いよいよラストトラック…。

あなたのカウントが正確にどこでオフになったのかわかりません。チャンク内の合計バイト数に対して 4 バイトのヘッダー (つまり、MTrk) をカウントしていないのですか? チャンクの長さには、名前または長さに必要な 8 バイトは含まれません。

今後の参考のために、このhexdumpユーティリティは、特に-C. このファイルの場合、データは次のように表示されます。

$> hexdump -C ArminvanBuurenFerryCorsten_-_Bruteversion4__iCarroller_20130206094335.mid 
00000000  4d 54 68 64 00 00 00 06  00 01 00 03 00 60 4d 54  |MThd.........`MT|
00000010  72 6b 00 00 00 0b 00 ff  51 03 06 8a 1b 00 ff 2f  |rk......Q....../|
00000020  00 4d 54 72 6b 00 00 02  92 00 ff 03 0c 53 61 77  |.MTrk........Saw|
... etc.
于 2013-10-29T16:51:48.107 に答える