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つのペアとみなしている。 このためダンプリスト中のデルタタイムの色は、直後のイベントの色と同じにしている。