MIDIファイル(SMF)の基礎知識
このページでは、トラック及びチャンネルを 0から数えている。 1から数えることもあるので、その点注意。
用語
■トラックとチャンネル
・トラック MIDIファイル上の論理的な区分、単位。例えるなら譜面。
トラック数は最大 65535個。
・チャンネル 音源の(仮想的な)区分、単位。例えるなら楽器。
チャンネルは 0〜F の16個。チャンネル 9は打楽器に割り当てられる。
トラックとチャンネルの関係は、SMF0とSMF1の場合とで異なる。
■SMF0とSMF1
MIDIファイル(SMF)には、SMF0, SMF1, SMF2の3種類がある。SMF2はほとんど使用されていないのでここでは無視。
・SMF0
トラック数は1つ。全てのイベントをチャンネルに依らず、1つのトラックに格納する。
さっきの例えで言うなら、全ての楽器の演奏情報が1つの譜面に入っている。
・SMF1
トラック数は1つ以上。
最初のトラックはコンダクタトラックと呼ばれ、テンポなど曲全体の情報を格納する。MIDIイベント(後述)は入れない。
MIDIイベントはチャンネルごとにトラックを分けて格納する。多いのは、1トラック−1チャンネルというケース。
複数のトラックに、1つのチャンネルのMIDIイベントを分散して入れてもよい。
1つのトラックに、複数のチャンネルのMIDIイベントを入れるのはダメ。
さっきの例えで言うなら、楽器ごとに譜面を分けている。
1つの楽器に対し、譜面が複数あるのは可。
1つの譜面に、複数の楽器の情報を書くのはダメ。
トラックとチャンネルの関係の例 (あくまでも例)
■イベント
曲、演奏に関する情報はイベントという形で格納されている。
1つのイベントはステータスバイト(1byte)とデータバイト(1byte以上)から成る。
イベントは次の3種類があり、ステータスバイトの値により区別できる。
・MIDIイベント ステータスバイト: 8n, 9n, An, Bn, Cn, Dn, En (nにはチャンネル番号が入る)
演奏を制御するためのイベント。
MIDI Dump Playerにおいて個別に色を割り当てているイベントについて、その機能を説明すると、
8n kk vv Note on ノート番号 kkの音をベロシティ vvで鳴らす
9n kk vv Note off ノート番号 kkの音を止める。8n で vv=0 としてもよい。
Bn cc vv Control Change ccの値によって機能はさまざま。例えば、
cc=01 Modulation 変調の深さを vvに設定
cc=0B Expression 音の大きさを vvに設定
En mm ll Pitch Bend ピッチを (llmm-0x2000)だけ変化させる
・メタイベント ステータスバイト: FF
曲全体の演奏の制御(テンポ)やテキストデータを埋め込む(曲名、トラック名など)ためのイベント。
例)
FF 03 … 曲名/トラック名
FF 51 … テンポ
FF 2F 00 End of Track
・システムエクスクルーシブイベント ステータスバイト: F0, F7
機種依存の情報を埋め込むためのイベント。
■ランニングステータス
ステータスバイトが同一のMIDIイベントが連続する時、2つ目以降のMIDIイベントのステータスバイトを
省略できる。これをランニングステータスという。
ファイルサイズは小さくなるけど、曲の途中から再生する時処理が面倒になる。プログラマ泣かせ。
MIDIファイルの構造
SMF0 と SMF1のファイルの構造
1、ヘッダ
・フォーマットが何か?(SMF0, 1, 2)
・トラック数
・タイムベース(四分音符の長さをいくつで表現するか:デルタタイムの基準)
が記録されている。通常14byte固定。
2、トラック(ヘッダで示された個数ある)
2.1 チャンク
データ部が何バイト続くか、記録されている。8byte固定。
2.2 データ部
デルタタイムとイベントが交互に並ぶ。
デルタタイム・イベント・デルタタイム・イベント … デルタタイム・イベント
「前のイベントからデルタタイムだけ待って、イベントを実行しろ」という意味。
デルタタイムはSMFファイル上では、値によってバイト数が異なる可変長形式で記録されている。
参考
・MIDI Dump Playerでは、Setting - Viewer - Underline の設定によってデルタタイムに下線を付けることができる。
・MIDI Dump Playerでは、「デルタタイム・イベント」を1つのペアとみなしている。
このためダンプリスト中のデルタタイムの色は、直後のイベントの色と同じにしている。
- 戻る