スタンダード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進法で記述されたアスキーコードで、次表の形式で記述できる。すべて省略しても演奏には差し支えない。

|  |  |  |  |
| --- | --- | --- | --- |
| 表示項目 | コード | 文字列データ数 | 内容 |
| テキスト | FF 01 | n | 任意のテキスト(文字列)をSMF内に記載するために使う。 |
| 著作権表示 | FF 02 | n | 著作権表示用のテキスト文字列。トラックチャンクの先頭イベント(タイム0)とする。 |
| シーケンス名/トラック名 | FF 03 | n | シーケンス/トラック名を記述するテキスト文字列。シーケンス名はフォーマット0のトラック内か、 フォーマット1の最初のトラック内に記載する。その他の場合は、トラック名として扱う。 |
| 楽器名 | FF 04 | n | 各チャンネルに対応する楽器名を記述する。 |
| 歌詞 | FF 05 | n | 歌詞を記述する場合に使用するテキスト文字列。 |
| マーカ | FF 06 | n | フォーマット0/1の最初のトラックで使用し、シーケンス内のポイント名を記述するテキスト文字列。 |
| キューポイント | FF 07 | n | ビデオなどに対して指示を出すときに使う。テキスト文字列。 |
|

### トラックチャンク

トラックチャンクには、実際の演奏データが格納される。それぞれのチャンクには

- トラックチャンクであることを示す識別子"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」を宣言する。

## 関連事項

- デスクトップミュージック
- 自動作曲
- Black MIDI