スタンダードMIDIファイル
スタンダードMIDIファイル(Standard MIDI File、SMF)は、MIDI用の一つである。Format0/Format1/Format2の3タイプが存在する。一般的に用いられている拡張子は .mid。標準MIDIファイルとも呼ばれる。
MIDIの演奏データを記録するための基本ファイルフォーマットとして、Opcode社のDave Oppenheimが提唱し、デファクトスタンダードとなった。1991年にはMIDIの推奨実施例 (Recommended Practice) の第1号 (RP-001) として承認された。
バイト (情報)単位で記述されたコンピュータ等で演奏が可能なバイナリファイルである。記述内容は通常、2桁毎の16進法で解説されることが一般的である。ミュージックシーケンサーのような専門ソフトで作成・編集・演奏できるほか、バイナリエディタでも作成・修正・編集することが可能である。また、Windowsに附属するWindows Media Playerなどの音楽再生ソフトでも演奏できる。
SMFはチャンクと呼ばれるデータブロックから構成される。ファイルの先頭にあるチャンクはヘッダチャンク、それに続く演奏データが入るチャンクはトラックチャンクと呼ばれる。
SMFファイルはチャンク構造の違いで3つのフォーマットに分類される。ヘッダチャンクとトラックチャンク1つのみで構成されるフォーマット0、複数トラックを持つフォーマット1、 マルチシーケンスでシーケンスパターンを指定するフォーマット2の3種類である。このうちフォーマット2は、現在ほとんど使われていない。
ヘッダチャンクであることを示す"MThd"という4文字のアスキーコード 「4D 54 68 64」(4バイト)
ヘッダチャンクのデータ長 「00 00 00 06」(4バイト)
フォーマット「00 00」(フォーマットタイプが0の場合) (2バイト)
トラック数 「00 01」(トラック数が1個の場合)(2バイト)
時間単位 「01 E0」(タイムベース(4分音符あたりの分解能)が、例えば16進で1E0で、10進法で480の値。)(2バイト)
がこの順序で、ビッグエンディアン形式で格納されている。データ長はそれ以降のヘッダチャンクの長さを示すもので、拡張用に用意されている。
複数トラックを使用する場合には、フォーマット1を意味する「00 01」を指定し、使用するトラック数を記載する。
(カッコの中はそれぞれのデータ長を8bit-byte数で示す)
文字列情報は、16進法で記述されたアスキーコードで、次表の形式で記述できる。すべて省略しても演奏には差し支えない。
トラックチャンクには、実際の演奏データが格納される。それぞれのチャンクには
トラックチャンクであることを示す識別子"MTrk" 「4D 54 72 6B」(4バイト)
データ長(このトラックに入っているデータセクションのデータの長さ(16進法データの個数)。) (4バイト)
データセクション(可変長)
が格納される。データセクションの長さはデータ長で示される。データ長を数え誤って入力するなどデータ構成の整合性を欠くと標準MIDIファイルは演奏されない。
音色は、「00 C0 XX」によって指定する。XXには、0から127を意味する「00」から「7F」までの128種類の値が入る。何も音色を指定しなければ、「00」としてピアノの音色で演奏される。音色の一覧はGeneral MIDI#Melodic soundsを参照のこと。
音の高さ(ノートナンバー)、音量(ベロシティ値)については、以下を参照のこと。
MIDI#チャンネルメッセージ参照
どのキーをどの速さで押し下げたか等の音楽データをイベントと呼び、MIDIイベント、システムエクスクルーシブ (SysEx) イベント、メタイベントの3種類がある。
データセクションには時間情報と共にイベントを順次格納する。
なお、時間情報やイベント内のいくつかの数値については、同じくビッグエンディアン形式であるが一種の圧縮形式で格納されている。この形式は1byte~4byteの可変長で、可変長数値表現とも呼ばれ、1byteあたりには7bitの数値情報を持ち、最大28bitの数値情報を表すことができる。そして、それぞれの最上位bitがフラグとなっており、1である場合は次の1byteにビッグエンディアン形式の下位7bitずつの情報を含むことを示す。4byte目の最上位bitは使用しない。具体的には、音の長さを2進数で記載し、下7桁ずつで区切り、最下位の7桁に8桁目として0を付記し、次の7桁に8桁目として1を付記し、さらに次の7桁が存在すれば8桁目として1を付記し、それぞれの8桁の2進数を16進法表記に変換して時間情報(デルタタイム)を表現する。
例えば、2進法で10000 00000000(16進法で10 00、10進法で4096)ならば、100000 0000000のように下7桁毎に区切られて、最初の下7桁の冒頭に0を書き加え、次の下7桁の8桁目になる部分に1と間の桁に必要な数の0を書き加えて16桁の10 10000 0 0000000となる。これをそのまま2進法にすると10100000 00000000となる。これを16進法に変換するとA0 00という可変長数値表現が得られる。時間情報(デルタタイム)はこのような可変長数値表現が用いられる。
データセクションでは、音を出す、音を止める、の操作指示を出している。音を出す場合には、デルタタイム(待ち時間)、ノートオンコマンド「90」、音の高さ(ノートナンバー)、音量(ベロシティ値)、の4つのデータを示す。音を消す場合には、デルタタイム、ノートオフコマンド「80」、音の高さ、音量「00」、の4つのデータを示す。音を消す際のデルタタイムが、音を消す待ち時間となり、実際には音を出している時間に相当する。
ノートオンコマンド「90」の前半の「9」は音を出す指示を意味し、後半の「0」は16チャンネルあるうちの最初のチャンネル番号を意味する。同様に、ノートオフコマンド「80」の前半の「8」は音を止める指示を意味する。
4分音符のドの音を出して止めるには、音を出すデルタタイム「00」、音を出すノートオンコマンド「90」、音を出すドの音程「3C」、音を出す音量「40」、音を消すデルタタイム(可変長数値表現での待ち時間)「83 60」、音を消すノートオフコマンド「80」、音を消すドの音程「3C」、消した後の音量「00」、のようなコードになる。なお、音を出すノートオンコマンドは、同一トラック内で最初の1回だけ指定すれば以後のノートオンコマンドとノートオフコマンドの記載は省略することができる。
このような音を出す、音を止める操作の繰り返しとなる。
和音の場合には、音を出すデルタタイムをそれぞれ「00」にすることで同時に複数の音を出すことができる。
General MIDIでは10チャンネルは、パーカッション(打楽器)のために予約されている。SMFでも同様である。このチャンネルはプログラムが音色変更命令を送っても常にパーカションパートとなり、各ノートナンバーには異なる楽器が割り当てられている。この、ノートナンバーに対する打楽器割り当て表をドラムマップ(drum map)と呼ぶことがある。なお、最初の1チャンネルが「0」であるので、10チャンネルは「9」となる。ノートオンの16進法で90番台になるので、打楽器指定は「99」となる。詳細はGeneral MIDI#Percussion notesを参照のこと。
トラックの終了には「FF 2F 00」を宣言する。