ヘッダチャンクについて解説します。
ヘッダチャンクはMIDI(SMF)ファイルの先頭にあり、以下のようなデータ構造となっています。
バイトオフセット | バイトサイズ | 内容 |
---|---|---|
0 | 4 | チャンクタイプ |
4 | 4 | ヘッダチャンクのサイズ |
8 | 2 | フォーマット |
10 | 2 | トラック数 |
12 | 2 | ベース単位 |
チャンクタイプ
チャンクタイプには必ず”MThd”という文字列が入っています。
“MThd”は、このデータがMIDIファイルのヘッダチャンクであることを示す識別子となっています。
ヘッダチャンクのサイズ
このヘッダチャンクのサイズ以降の、ヘッダチャンクのバイトサイズが入っています。
(以降のデータは固定なので、絶対に6になります)
フォーマット
SMFには3つのフォーマットがあり、このファイルがどのフォーマットであるかを示します。(だいたいはフォーマット0か1みたいです。フォーマット2は対応していないシーケンサも多いようです)
0:フォーマット0(シングルトラック)
1:フォーマット1(マルチトラック)
2:フォーマット2(マルチシーケンス?よくわかんない?)
それ以外の値は使用されていません。
トラック数
SMFに含まれるトラックチャンクの数を示します。
フォーマット0の場合は必ず1が入ります。
フォーマット1/2では、1以上の値が入ります。
ベース単位
この2バイトの最上位bitの値によって意味が変わります。
最上位bitが0の場合、残りの15bitは、1拍あたりのティック数を示します。(つまり、4分音符の分解能。だいたいはこちらが使用されるようです)
最上位bitが1の場合、以下の2つのデータに分かれます。
bit8~15:1秒あたりのフレーム数
bit0~7:フレーム毎のティック数
1秒あたりのフレーム数は最上bitも含めた負の値に-1を掛けます。例えば上位1バイトが0xE8なら24フレーム/秒、0xE7なら25フレーム/秒になります。
試しにダンプしてみる
Dominoを使ってテキトーにSFMを作ります。
SMF書き出しして、作成されたMIDIファイルを自作のダンプツールでダンプしてみます。
========== MIDI HEADER ==========
Magic : MThd
Size : 0x00000006
Format : 1
TrackNum : 18
DeltaTime : 0x01E0(480)
こんな感じです。これまでに説明した通りのデータが入っていることがわかりますね。
コメント