RSS Twitter Facebook
g200kg > DTM技術情報 > 5.SMFフォーマット

DTM技術情報

2011/09/17

5.SMFフォーマット



フォーマット

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

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

ファイル構造

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

フィールド名長さ説明







ChunkID0x4d5468644バイト固定文字列 "MThd"
ChunkSize0x000000064バイトヘッダーチャンクの長さ(ChunkID/ChunkSizeは含まず)。"6"に固定されている
FormatType0x00012バイトフォーマット: 0 / 1 / 2 のどれか
Number
ofTrack
0x00022バイトトラック数:フォーマット0ならば1、それ以外のフォーマットでは任意のトラックチャンクの数(0-65535)
TimeDivision0x01e02バイトタイムベース:
  • 最上位ビットが0:
    • テンポベース。四分音符の分解能。この例では480
  • 最上位ビットが1:
    • 絶対時間ベース。 残り15ビットの内、上位7ビットがFramesPerSec(24 / 25 / 29 (30fpsDrop) / 30のどれか)、下位8ビットがTicksPerFrameを表す。
※ほとんどの場合はテンポベースで扱われる。








1
ChunkID0x4d54726b4バイト固定文字列 "MTrk"
ChunkSize0x000000ff4バイトトラックチャンク1の長さ(ChunkID/ChunkSizeは含まず)
DeltaTime0x83 0x601~4バイトデルタタイム:直前のイベントからの相対時間
Event0x90 0x40 0x40内容に依存MIDIイベント / SysExイベント / メタイベント
DeltaTime0x001~4バイトデルタタイム:直前のイベントからの相対時間
Event0x90 0x43 0x40内容に依存MIDIイベント / SysExイベント / メタイベント
 ・
 ・
 ・
DeltaTime0x001~4バイトデルタタイム:直前のイベントからの相対時間
Event0xff 0x2f 0x003バイトトラックの最後は必ず[End of Track] メタイベント。省略不可。








2
ChunkID0x4d54726b4バイト固定文字列 "MTrk"
 ・
 ・
 ・
Event0xff 0x2f 0x003バイトトラックの最後は必ず[End of Track] メタイベント。省略不可。

デルタタイム

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

デルタタイムの例
0x000x00
0x7f0x7f
0x81 0x000x80
0xff 0x7f0x3fff
0x81 0x80 0x000x4000
0xff 0xff 0x7f0x1fffff
0x81 0x80 0x80 0x000x200000
0xff 0xff 0xff 0x7f0xfffffff


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バイト)データ本体
0xff00x02[Sequence Number] シーケンスナンバー。フォーマット2での使用をメインに想定
0xff1文字列長[Text Event] テキストイベント。汎用のコメント。後に目的が明確なものについては0xff 0x01~0xff 0x0f の範囲で割り当てられた。ASCII文字列
0xff2文字列長[Copyright Notice] 著作権表示。ASCII文字列
0xff3文字列長[Sequence/Track Name] シーケンス名。トラック名
0xff4文字列長[Instrument Name] 楽器名
0xff5文字列長[Lyric] 歌詞
0xff6文字列長[Marker] マーカー。例えば「Aメロ」、「間奏」などのような情報
0xff7文字列長[Cue Point] キューポイント。映像との同期などで使用するコメント
0xff0x08~0x0f文字列長各種文字情報用にリザーブ
0xff0x200x01[Channel Prefix] MIDIチャンネルプリフィックス。続くSysEx / メタイベントにMIDIチャンネルを指定
0xff0x210x01[Port Prefix] MIDIポートプリフィックス。続くSysEx / メタイベントにMIDIポートを指定
0xff0x2f0x00[End of Track] トラックの最後を表す。データ本体は使用しない。このメタイベントは各トラックに必ず必要。
0xff0x510x03[Set Tempo] テンポ設定(3バイト)。四分音符あたりのマイクロ秒
0xff0x540x05[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
0xff0x580x04[Time Signature] 拍子(4バイト)。分子、分母(2を底とする対数)、メトロノーム間隔(四分音符/24)、24MIDIクロック中の32分音符の数(通常8)
0xff0x590x02[Key Signature] 曲のキー(2バイト)。-7~+7 (マイナスは♭、プラスは♯の数)、0⇒メジャー:1⇒マイナー
0xff0x7fデータ長[Sequencer-Specific Meta-Event] シーケンサー固有データ



g200kg