スポンサーリンク

DTM 技術情報
06.SMFフォーマット

フォーマット

SMF (Standard MIDI File)の構造。SMFファイルにはフォーマット0~2までがある。それぞれの違いは下表の通り。

フォーマット 説明
0 1トラックに全てのイベントをまとめたもの。再生専用向き
1 マルチトラックでデータを保持。通常はMIDIチャンネル毎にトラックを分ける。また先頭トラックはテンポ専用トラックとする事も多い。
2 1ファイルに複数曲、あるいは複数シーケンスパターンを格納。ほとんど使われない

ファイル構造

ヘッダーチャンクの後に複数のトラックチャンクが続く。数値は全てビッグエンディアンで扱われる。トラックチャンクではChunkIDとChunkSizeの後、デルタタイムとイベントの組が複数格納される。

フィールド名 長さ 説明







ChunkID 0x4d546864 4バイト 固定文字列 “MThd”
ChunkSize 0x00000006 4バイト ヘッダーチャンクの長さ(ChunkID/ChunkSizeは含まず)。”6″に固定されている
FormatType 0x0001 2バイト フォーマット: 0 / 1 / 2 のどれか
Number
ofTrack
0x0002 2バイト トラック数:フォーマット0ならば1、それ以外のフォーマットでは任意のトラックチャンクの数(0-65535)
TimeDivision 0x01e0 2バイト タイムベース:

  • 最上位ビットが0:
    • テンポベース。四分音符の分解能。この例では480
  • 最上位ビットが1:
    • 絶対時間ベース。 残り15ビットの内、上位7ビットがFramesPerSec(24 / 25 / 29 (30fpsDrop) / 30のどれか)、下位8ビットがTicksPerFrameを表す。

※ほとんどの場合はテンポベースで扱われる。









1
ChunkID 0x4d54726b 4バイト 固定文字列 “MTrk”
ChunkSize 0x000000ff 4バイト トラックチャンク1の長さ(ChunkID/ChunkSizeは含まず)
DeltaTime 0x83 0x60 1~4バイト デルタタイム:直前のイベントからの相対時間
Event 0x90 0x40 0x40 内容に依存 MIDIイベント / SysExイベント / メタイベント
DeltaTime 0x00 1~4バイト デルタタイム:直前のイベントからの相対時間
Event 0x90 0x43 0x40 内容に依存 MIDIイベント / SysExイベント / メタイベント
 ・

DeltaTime 0x00 1~4バイト デルタタイム:直前のイベントからの相対時間
Event 0xff 0x2f 0x00 3バイト トラックの最後は必ず[End of Track] メタイベント。省略不可。








2
ChunkID 0x4d54726b 4バイト 固定文字列 “MTrk”
 ・

Event 0xff 0x2f 0x00 3バイト トラックの最後は必ず[End of Track] メタイベント。省略不可。

デルタタイム

デルタタイムは1~4バイトの可変長で表す。最上位ビットを継続ビットとして、これが立っている場合、最大4バイトまで次のバイトに続け、各バイトの下位7ビットを連結して値とする。

デルタタイムの例
0x00 0x00
0x7f 0x7f
0x81 0x00 0x80
0xff 0x7f 0x3fff
0x81 0x80 0x00 0x4000
0xff 0xff 0x7f 0x1fffff
0x81 0x80 0x80 0x00 0x200000
0xff 0xff 0xff 0x7f 0xfffffff

MIDIイベント

MIDIイベントは通常のMIDIメッセージを使用する。例えば「ノートオン」ならば

0x90 (ノートオン:チャンネル1) 0x3c (ノート番号) 0x40 (ベロシティ)

のようになる。ランニングステータスを使ってもよい。

SysExイベント

SysExイベントはF0型とF7型の2タイプがある。データ長はデルタタイムと同じ可変長表現を使用する。通常の完結したSysExはF0型を使用し、イベントを分割する必要がある場合はF7型を併用する。

通常型

0xf0 データ長(1~4バイト) 先頭のF0を含まないF7で終わるSysExデータ本体(データ長で指定された長さ)

分割型。SysExを分割してゆっくり送信するする必要がある場合、下の例の各行にデルタタイムをはさんだ形で分割する。

0xf0 データ長1(1~4バイト) 先頭のF0を含まないSysExデータ本体1/3(データ長1で指定された長さ)
0xf7 データ長2(1~4バイト) SysExデータ本体2/3(データ長2で指定された長さ)
0xf7 データ長3(1~4バイト) F7で終わるSysExデータ本体3/3(データ長3で指定された長さ)

一部の古いMIDI機器などでは一度に大量のデータを送りつけると動作しないものがあり、その場合には分割型SysExを使用する必要がある。通常はF0型だけで問題ない。

F0型はデータ本体の先頭にF0を加えたデータを送り出すが、F7型は純粋にデータ本体だけを送り出す。このため、F7型はSysEx以外のリアルタイムバイトの送信にも使用できる。

メタイベント

メタイベントはMIDIに送出しない追加情報などを記録する。0xffで始まり、1バイトのタイプ、可変長のデータ長、データ本体からなる。

タイプ データ本体の長さ(可変長1~4バイト) データ本体
0xff 0 0x02 [Sequence Number] シーケンスナンバー。フォーマット2での使用をメインに想定
0xff 1 文字列長 [Text Event] テキストイベント。汎用のコメント。後に目的が明確なものについては0xff 0x01~0xff 0x0f の範囲で割り当てられた。ASCII文字列
0xff 2 文字列長 [Copyright Notice] 著作権表示。ASCII文字列
0xff 3 文字列長 [Sequence/Track Name] シーケンス名。トラック名
0xff 4 文字列長 [Instrument Name] 楽器名
0xff 5 文字列長 [Lyric] 歌詞
0xff 6 文字列長 [Marker] マーカー。例えば「Aメロ」、「間奏」などのような情報
0xff 7 文字列長 [Cue Point] キューポイント。映像との同期などで使用するコメント
0xff 0x08~0x0f 文字列長 各種文字情報用にリザーブ
0xff 0x20 0x01 [Channel Prefix] MIDIチャンネルプリフィックス。続くSysEx / メタイベントにMIDIチャンネルを指定
0xff 0x21 0x01 [Port Prefix] MIDIポートプリフィックス。続くSysEx / メタイベントにMIDIポートを指定
0xff 0x2f 0x00 [End of Track] トラックの最後を表す。データ本体は使用しない。このメタイベントは各トラックに必ず必要。
0xff 0x51 0x03 [Set Tempo] テンポ設定(3バイト)。四分音符あたりのマイクロ秒
0xff 0x54 0x05 [SMPTE Offset] SMPTEオフセット(5バイト)。 時(0-63):分(0-59):秒(0-59):フレーム(0-29):サブフレーム(0-99)、ただし時は0rrhhhhhでrr:00⇒24fps、rr:01⇒25fps、rr:10⇒30fpsDrop、rr:11⇒30fpsNonDrop
0xff 0x58 0x04 [Time Signature] 拍子(4バイト)。分子、分母(2を底とする対数)、メトロノーム間隔(四分音符/24)、24MIDIクロック中の32分音符の数(通常8)
0xff 0x59 0x02 [Key Signature] 曲のキー(2バイト)。-7~+7 (マイナスは♭、プラスは♯の数)、0⇒メジャー:1⇒マイナー
0xff 0x7f データ長 [Sequencer-Specific Meta-Event] シーケンサー固有データ
スポンサーリンク