MIDIミニ知識
MIDIとは
MIDI(ミディ)とは、Musical Instrument Digital Interface のことで、電子楽器間の演奏情報や音色情報を交換するために制定された統一規格。MIDI 1は1983年に規格書が出版されている。
パソコンからこの規格に従ったデータを電子楽器(パソコンで使用する場合は、音源モジュールであることが多い。外部音源の他、サウンドカードに内蔵されたものや、最近では音源モジュールをシュミレートするソフトも多くなっている。)に送って音楽を演奏させたり,逆に電子楽器で演奏した情報をパソコン側で記録したりすることができる。
ウインドウズでは、通常MIDIがサポートされており、サウンド機能を有するパソコンでは、たいてい利用可能である。「なんでもオルゴール」はパソコンにインストールされているMIDI機能を利用したものである。
MIDIデータを記録しておいていつでも同じMIDIデータを利用できるようにしたものがMIDIファイルであり、その代表が標準MIDIファイル(SMF)である。SMFは携帯電話でも利用できるが、古い機種などでは機種特有なデータとファイルフォーマットによらなければ音楽を鳴らすことが出来ない。代表的なものはiモード端末のMLDファイル(MFi)である。
MIDIデータ
1.基本構成
 MIDIデータはバイト列から成る「MIDIメッセージ」として使用される。1から16までのチャンネルを指定して使用するチャンネル・メッセージとシステム全体に指令するシステム・メッセージがある。1バイトのうち最上位ビットは特別な意味に使用され、残り7ビットがその他の情報を担っている。
2.チャンネル・メッセージ
 上位4ビットでメッセージの種類、下位4ビットでチャンネルを指定(0は1チャンネル)した1バイトのステータスバイトとその後に続く1又は2バイトのデータバイトからなる。ステータスバイトの最上位ビットは1であるのに対し、データバイトの最上位ビットは0である。
 チャンネル・メッセージには次の種類がある。(nは0からFを表す)
| 
       種 類  | 
    HEX | 
       説 明  | 
  
| ノートオフ | 8n | 消音。データバイト1はキーを、同2はベロシティーを指定する | 
| ノートオン | 9n | 発音。同上 | 
| ポリフォニック キープレッシャー | An | データバイト1はキーを、同2はアフタータッチを指定する | 
| コントロールチェンジ/ チャンネルモードメッセージ  | 
    Bn | 1バイトのコントロール番号と1バイトのコントロール値を指定する。コントロール番号の0と32はそれぞれバンクセレクトの上位バイトと下位バイトを示す。その他リバーブ等エフェクトの指定など。 コントロール番号120から127はチャンネルモードメッセージとなる  | 
  
| プログラムチェンジ | Cn | 音色の変更に使用され、1バイトの音色番号を指定する。直前のバンクセレクトにより指定されたバンク内の指定音色番号に変更されることとなる。 | 
| チャンネルプレッシャー | Dn | 1バイトのアフタータッチを指定する。チャンネル全体に効果が及ぶ。 | 
| ピッチベンド | En | ピッチの変化を2バイトで指定する。 | 
キーについて:音の高さのことで0から127まであり、ピアノ鍵盤の中央C(C4)は60である。
ベロシティについて:ノートオンのときはその音の強さ(大きさ、つまりピアノかフォルテか)、オフのときは音の立ち下がりの程度である(実際にはほとんど関係しない)。ベロシティ0でのノートオンは基本的にはノートオフと同じである。
3.システム・メッセージ
 そのMIDIシステム全体に対するメッセージで、コモン(表の上から5番目まで)、リアルタイム(表の6番目から11番目まで)、エクスクルーシブの3種類があり、次のとおりである。
| 
       種 類  | 
    HEX | 
       説 明  | 
  
| MIDIタイムコード | F1 | フレーム、秒、分、時間カウントの情報を扱う。 | 
| ソングポジションポインタ | F2 | 現在の曲位置情報 | 
| ソングセレクト | F3 | シーケンスの選択 | 
| チューンリクエスト | F6 | アナログ音源への自動チューニングの指示 | 
| エンドオブエクスクルーシブ | F7 | エクスクルーシブ・メッセージの終了時のマーカ | 
| タイミングクロック | F8 | 同期用の信号 | 
| スタート | FA | スレーブ機器へのスタート指示 | 
| コンティニュー | FB | スレーブ機器へストップ後の再開を指示 | 
| ストップ | FC | 演奏停止の指示 | 
| アクティブセンシング | FE | 機器の接続の確認等のため一定時間ごとに送られる信号 | 
| システムリセット | FF | 全ての機能のリセットの指示 | 
| システムエクスクルーシブ | F0 | 音色パラメータの設定などに使用されるもので、ステータスバイトの次に機器メーカーごとに異なる1バイトのID番号が続き、その後に各メーカごとの決められたデータが続く。なお、IDの7Eと7Fは各機器共通のものでユニバーサル・エクスクルーシブ・メッセージと呼ばれる。 | 
4.ランニング・ステータス
 ノートオンなどのメッセージが連続するとき、最初のステータスバイトだけ送り、次に続くメッセージのステータスバイトを省略してデータバイトのみを連続して送ることが出来る。これをランニング・ステータスといい、ステータスバイトが省略されてデータバイトだけが送られてきたときには、直近のステータスバイトと同じとみなして処理される。
5.音色等について
 MIDIは楽器で音を鳴らすときに使用されるものであるから、音色等は重要なことである。ある人に「中央Cの音をメゾフォルテで鳴らす」ということを言ったときに、ピアノなのかフルートなのか、それともバイオリンか、によって音色は全く別のものになる。さらに材質やメーカー、作者によっても一様ではない(ストラディバリウスなど)。同様にMIDIでも使用する楽器(つまり音源)によって音色等は全く別なものになることもある。
 MIDIでは、音色の変更はコントロールチェンジによりバンクセレクトを行ったうえで、プログラムチェンジにより音色番号を指定して行う。プログラムチェンジによる指定のみを行った場合には、そのとき選択されているバンクに於ける当該番号の音色となる。
 どの番号を指定したときに何楽器の音色になるかが決まっていないと、A音源とB音源の演奏では全くの別物になってしまう可能性がある。このための代表的な規格がGMといわれるものであり、なんでもオルゴールもGM準拠を前提にしている。パソコンに内蔵の音源など、たいていのものはこれに準拠しており、GMを拡張したGSやXG等の規格もある。GMではNo11はオルゴールと決められているが、具体的にどんな音かはそれぞれの音源ごとに聞いてみなければわからない。mp3ファイルがいわばレコードでいつでもどこでも同じ音を再生するのに対し、MIDIファイルはいわば演奏指示書(楽譜)であり、使う楽器(音源)によって皆少しずつ違った音になるわけである。
1.ファイルの構造
 標準MIDIファイル(SMF)は、拡張子が.midのバイナリファイルであり、ヘッダチャンクと1つ以上のトラックチャンクという複数のブロックから成っている。フォーマット0はトラックチャンクが1つのみで、フォーマット1とフォーマット2はトラックチャンクが複数であるが、フォーマット2は一般的ではない。フォーマット0ではファイルにも時間の順に全てのことが記録されることになるが、他のフォーマットでは例えばチャンネル1の演奏情報が全て終わった後にチャンネル2の演奏情報が始まることとなる。
 SMFでは、1バイト以上で数値を記録する場合は、ビッグ・エンディアンで記録される。
2.ヘッダチャンク
 ヘッダチャンクは、チャンクタイプを示す識別コードとしてMThdという4バイトの文字列、次にその後に続くデータの長さを4バイトで(値は6に固定)、次にフォーマットタイプ2バイト、チャンネル数2バイト(フォーマット0では常に1となる)、時間単位2バイトと続き合計14バイトである。時間単位の第1バイトの最上位ビットが0の場合は4分音符あたりのチック数、最上位ビットが1の場合は第1バイトはフレーム数/秒、第2バイトはフレームあたりの分解能を表す。
 例:4D 54 68 64 00 00 00 06 00 00 00 01 00 60
3.トラック・チャンク
 トラックチャンクは、チャンクタイプを示す識別コードとしてMTrkという4バイトの文字列、データの長さのバイト数を4バイトで記録し、その後にデータが続く。
 データは、デルタ・タイム+MIDIイベント、デルタ・タイム+メタイベント、又はデルタ・タイム+システム・エクスクルーシブ・イベントの連続データである。デルタ・タイムは直前のイベントからの時間単位で表され、例えば時間単位が分解能96チックである場合で、直前のイベントから8分音符分経ってからだとすると、このデルタ・タイムは48となる。デルタタイムは可変長数値表現となっており、127までは1バイトで記録できるが、それを越えて数値が大きくなると複数バイトを使用する。この数値が1バイトだけなのか、もっとあるのかは当該バイトデータの最上位ビットに記録されており、これが1の場合はその後に下位バイトが続くことを示し、0の場合はそこで数値データが終了することを示す(1バイト7ビットのデータとなることに注意)。例:128は(HEX)81            
00となる。
 上のMIDIデータで説明したチャンネル・メッセージがデルタ・タイムとともにMIDIイベントとしてトラックチャンクに記録されることとなる。上で説明したランニングステータスはMIDIファイルでも有効である。なお、システム・メッセージについては、システムエクスクルーシブ以外はMIDIファイルに記録されることはほとんど無い。システムエクスクルーシブの場合、ファイルへの記録はMIDIメッセージとは異なり、F0のステータスバイトの後に可変長数値でのデータ長が記録され、その次にID等のデータが続くことになる。また、F7をステータスとして、次に可変長数値のデータ長が来た後にデータが続くものもあり、この場合はそのデータがそのままMIDIメッセージとなる。
4.メタ・イベント
 メタ・イベントは、テンポや拍子などの演奏全体についての情報や、シーケンス名(曲名)、歌詞、楽器名などの情報を記録するもの。メタ・イベントはステータスバイトFFに続いて、イベントタイプを表す1バイトの数値、可変長数値によるデータ長(データ部分のバイト数)記録と続き、その後にデータが記録される。
 メタ・イベントには次のような種類がある。
| イベント・タイプ | FFに続く書式(HEX) | 説 明 | 
| シーケンス番号 | 00 02 nnnn | nnnnは2バイトの数値。フォーマット2でのみ使用 | 
| テキスト | 01 len text | 曲に対するコメントや演奏メモ等 | 
| 著作権表示 | 02 len text | 著作権の表示 | 
| シーケンス名 | 03 len text | シーケンス名、複数トラックがある場合の2つ目以降はトラック名 | 
| 楽器名 | 04 len text | 楽器の種類 | 
| 歌詞 | 05 len text | 演奏に合わせて歌詞を表示する場合などに使用 | 
| マーカー | 06 len text | セッション名など | 
| キュー・ポイント | 07 len text | 他の動作のためのマーカーなど | 
| MIDIチャンネルプリフィクス | 20 01 nn | シーケンサに対してチャンネルを指定する。 nnは1バイトの数値 | 
| エンド・オブ・トラック | 2F 00 | トラックの終わりを明示するためにこれを入れる。 | 
| セット・テンポ | 51 03 nnnnnn | 4分音符の長さを百万分の1秒単位で3バイトの数値で記録 | 
| SMPTEオフセット | 54 05 hh mm ss ff nn | トラックの開始時刻をSMPTEタイムコードで指定。時間、分、秒、フレームを各1バイト。最後は百分の1フレームを単位とした1バイトの数値、時間バイトは下位5ビットで時間を、6・7ビットでフレームタイプを指定。 | 
| 拍子 | 58 04 nn dd cc bb | nnは1バイトの数値で拍子記号の分子を、ddは分母が2の何乗かを1バイトで記録。ccはメトロノーム間隔(4分音符は24)を、bbは4分音符あたりの32分音符の数を各1バイトで記録。 | 
| 調 | 59 02 sf mm | 調性を示す。sfは1バイトの符号付き整数で、正はシャープの数、負はフラットの数。 mmは1バイトの数値で0は長調、1は短調である。  | 
  
| シーケンサ固有メタイベント | 7F len any | anyはメーカーIDに続く特定のシーケンサに固有の任意のデータ | 
len:可変長数値によるデータ長、 text:任意のテキストデータ を示す。
スタンダード・MIDIファイルの例
○公式のMIDI規格書
   JIS X6054−1、2の閲覧(日本産業標準調査会にリンク)
(注)記載内容には十分注意をしたつもりですが、勘違いやミスタイプ等により誤りがあった場合はご容赦下さい。