MIDIプロトコルってなんだろう?

コンピュータによる音楽の表現は大きく2つに分類できます。1つは、多くの消費者が利用しているMP3を代表としたオーディオ形式のデータです。これは、物理的な音の波をデジタルデータとしてサンプリングした形式で、十分な数のサンプルが確保できていれば、正確に元の音声を再現できます。いわゆる「録音」されたデータはオーディオ形式となります。しばしば、ウェーブ形式と呼ぶこともあります。

オーディオ形式

もう1つは、音の高さや強さなどを値で記しただけで音源を持ちません。これが MIDIです。MIDIは、オーディオとは異なり演奏データだけを持ち、音自体は持ちません。MIDIはタイムラインを持たないので音の3要素の1つである「長さ」が表現されないという違いはありますが、一種の楽譜をデジタルデータとして表したものがMIDIと考えれば分かりやすいです。演奏するのはMIDIを再生する電子楽器です。当然、結果は奏者によって異なるでしょう。

MIDI

オーディオ形式とMIDIの関係は、グラフィックスの世界で例えるならラスタグラフィックスとベクタグラフィックスの関係に似ています。その長所と短所も似ています。ラスタグラフィックスは全てのピクセルの色情報を保持するので写実的な画像を表現するのに適しています。しかし、すべての点の色を情報として保持するためデータサイズが大きく、解像度に比例してファイルサイズが肥大化します。オーディオ形式も同じです。実際の音を忠実に再現できますが、音の波をすべて記録するため情報量が多くデータサイズが大きくなってしまいます。

ベクタグラフィックスは、ピクセル情報ではなく図形の形を記録しています。「線を描きなさい」「楕円を塗りつぶしなさい」といった手順が記録されているだけなので、解像度に関係なくデータ量は一定で、画像は描画される直前で記録を元に「再生」されることになります。MIDIも同じです。音の高さや強さを記録した情報が音源によって再生されるので、オーディオ形式に比べるとMIDIの方が圧倒的にデータ量は小さくなります。編集においてもMIDIは有利になります。オーディオ形式のデータから歌声だけを切り抜くのは非常に難しい編集作業になります。しかし、MIDIであれば対象のトラックをミュートするだけで実現できてしまいます。

MIDIは1981年に楽器メーカーがまとめた電子楽器を鳴らすための通信プロトコルです。元は作曲やPC上での利用は想定されておらず、シンセサイザーの音と鍵盤を分離することにありました。鍵盤と音源を分離し、これをケーブルで接続してコントロールできるようにするためにMIDIが策定されたのです。鍵盤が押されたときにMIDIメッセージが音源に送られ、音源は受け取ったメッセージを再生するという関係になります。こうした背景から、MIDIは打鍵楽器向けの性質をもっています。

MIDIは「鍵盤を押した」というような電子楽器の操作を通信するためのプロトコルなので、タイムラインを持ちません。音源は、MIDIメッセージを受け取った瞬間に処理を開始します。MIDIによる演奏データを記録したファイルは、通常はSMF(Standard MIDI File)と呼ばれる形式が用いられています。SMFは、一般にはmidという拡張子で保存されます。SMFの再生は、性質的にMIDIプロトコルを使ってソフトウェアから電子楽器を制御して演奏を再現するということになります。見方を変えれば、電子楽器の自動演奏を行うソフトウェアと表現することもできます。こうした性質のソフトウェアは、シーケンサーとも呼ばれます。

本稿の試みは、単純に言ってしまえば鍵盤の代わりにプログラムから音源に MIDI メッセージを送信するということです。前述したように、MIDI プロトコルは鍵盤と音源を分離するためのものでした。そのため、通信されるデータが適切であれば、送り主が鍵盤でもプログラムでも音源には関係のないことなのです。

また、逆に音源を"プログラム"にしてしまうということも可能です。MIDIメッセージをソフトウェアで受け取ってプログラム的な処理を施せます。たとえば、プログラムでMIDIメッセージを解析して、その結果から音を再生すれば、専用のハードウェアを使わずにPCを音源とすることができます。こうした性質のソフトウェア音源は、ソフトウェア・シンセサイザー、ヴァーチャル・シンセサイザーなどとも呼ばれます。

当然、MIDIメッセージを音として再生するには音源が必要です。MIDIプロトコルを使ってプログラムから音を再生しようと考えても、MIDIメッセージを送信する先が存在しなければ意味がありません。幸い、Windowsであれば標準でソフトウェア音源のMicrosoft GS Wavetable SW Synthが使えます。またJavaがインストールされている環境であればJava Sound Synthesizerを使うことができます。