Skip to content

MIDI の基礎

MIDI(Musical Instrument Digital Interface)は、音そのものではなく演奏を記述するための言語です。MIDI メッセージは「いまノート 60 をやや強めに鳴らせ」「ノート 60 を離せ」と伝えるだけで、音声は一切運びません。下流にある何か(シンセサイザー、SoundFont プレーヤー、あるいはハードウェア)がその指示を読み、音を生成します。

SYNTH · SUBTRACTIVEIDLE
音を形づくる — オシレーター・フィルター・エンベロープ

内蔵シンセが A3 を1音レンダリングします。輪郭はその振幅エンベロープ。アタックを上げると音が徐々に立ち上がり、カットオフを下げると音色が暗くなります。再生でパッチを試聴できます。

オシレーター
カットオフ
2200 Hz
アタック
8 ms

この分離は強力です。同じ MIDI 演奏を、行き先の楽器を差し替えるだけでピアノ音・ギター音・オーケストラとして再生できます。下のピアノロールはそれを具体的に示します。音符はそのままで、楽器を切り替えると、まったく同じ MIDI が別の内蔵音色で鳴り直します。

MIDI · PIANO ROLLIDLE
MIDI のフレーズ — 同じ音符を、どの楽器でも

旋律・和音・低音の3声フレーズをピアノロールで表示します。音符はそのまま、楽器を切り替えると、まったく同じ MIDI をエンジンが別の内蔵音色でバウンスします。テンポを動かせばシーケンス全体が速く・遅くなります。再生でフレーズを試聴でき、再生ヘッドは音声に追従します。

楽器
テンポ
100 BPM

MIDI は構造化された音楽情報なので、同じ音符はグリッドと同じくらい自然に楽譜としても読めます。下の譜面はエンジンが鳴らす MIDI からそのまま起こしたもので、音符も楽器切り替えもテンポも同一、各音符は鳴った瞬間に光ります。ピアノロールと楽譜は、ひとつの演奏を映す2つのビューです。

MIDI · SCOREIDLE
同じ MIDI を、楽譜で読む

上のピアノロールとまったく同じ3声フレーズ(旋律・分散和音・低音)を、大譜表に標準記譜したものです。音符・音価・連桁・音部記号は、エンジンが鳴らす MIDI からそのまま起こしています。楽器を切り替えれば同一の音符が別の内蔵音色で鳴り、テンポを動かせば演奏が速くなります。再生すると、鳴っている音符が鳴った瞬間に光ります。

楽器
テンポ
96 BPM

本ページでは、MIDI を読み書きするのに必要な語彙を説明します。概念のみで、コードはありません。

音声ではなく演奏

MIDI ファイルは波形ではなく指示を保存するため、サイズはキロバイト単位と非常に小さくなります。代償として、どの楽器でレンダリングするかで音が変わります。音声ファイルは常に同じに鳴りますが、無料で音色を差し替えたり移調したりはできません。

ノート: ノートオン・ノートオフ・番号・ベロシティ

中心となる 2 つのメッセージは、ノートオン(鍵が押された)とノートオフ(鍵が離された)です。それぞれが次を運びます。

  • ノート番号 0〜127。1 ステップが半音です。中央ハ(ミドル C) = 60、A4(440 Hz の基準音) = 69。1 オクターブ上げるには 12 を足します。
  • ベロシティ 0〜127 — 鍵をどれだけ強く叩いたか。楽器は通常ベロシティを音量と明るさに割り当てるので、高いベロシティほど大きく押し出しの強い音になります(慣習として、ベロシティ 0 のノートオンはノートオフとして扱われます)。

チャンネル

1 本の MIDI ストリームは 16 のチャンネルに分かれます。1 本のケーブルを共有する 16 人の奏者のようなものです。各チャンネルは独自の楽器を持てるので、チャンネル 1 がピアノ、チャンネル 2 がベース、といった具合です。慣習上 1 つのチャンネルが特別で、General MIDI(後述)ではチャンネル 10 がドラムチャンネルとなり、各ノート番号がピッチではなく異なる打楽器音を鳴らします。

コントロールチェンジ(CC)

CC

コントロールチェンジメッセージは、番号付きのつまみ(0〜127)を、ある値(0〜127)に回します。表現・ペダル・連続コントローラーを送る仕組みです。

代表的なコントローラー:

CC名称役割
CC1モッドホイール汎用のモジュレーション(多くはビブラートの深さ)
CC11エクスプレッションメイン音量に加えてフレーズで抑揚を付ける
CC64サステインペダル0〜63 = 離す、64〜127 = 踏む。鍵を離した後もノートを保持

音色を選ぶ: プログラムチェンジとバンクセレクト

プログラムチェンジメッセージは、チャンネルがどの楽器を鳴らすかを、プログラム番号 0〜127 で選びます。128 音色では足りないことが多いため、バンクセレクトでアドレスを広げます。CC0 がバンク MSB、CC32 がバンク LSB で、プログラムチェンジの直前に送って、128 プログラムからなる別のバンクを選びます。

GM(General MIDI)

General MIDI は、各プログラム番号の意味を固定する標準です。プログラム 0 は必ずアコースティックグランドピアノ、24 はナイロン弦ギター、という具合に 128 楽器のマップ全体を定め、さらにチャンネル 10 に標準のドラムマップを置きます。GM があるおかげで、ある機器で作った MIDI ファイルが、別の機器でも正しい種類の楽器で鳴ります。

ピッチベンド・RPN・NRPN

ピッチベンドは独自の高分解能メッセージ(CC ではありません)で、ノートのピッチを連続的に上下へスライドさせます — ギターのチョーキング、ビブラート、アームの効果などに使います。フルベンドがどこまで届くか、すなわちピッチベンドレンジは、ピッチベンドメッセージ自体には含まれず、後述の RPN メッセージで別に設定します。

RPN / NRPN

RPN(Registered Parameter Number)は、CC メッセージ経由でアドレス指定する標準化された設定です。RPN 0ピッチベンドレンジ — フルベンドが何半音をカバーするかです。NRPN(Non-Registered Parameter Number)は同じ仕組みを、標準外の機器固有パラメーターに使います。

MIDI ファイルと MIDI 2.0

UMP

MIDI 2.0 はプロトコルの現代的な改訂版です。UMP(Universal MIDI Packet)形式を用い、はるかに高い分解能(16 ビットのベロシティ、より細かいコントローラー)と双方向通信を加えつつ、上記の MIDI 1.0 の考え方との互換性を保ちます。

SMF(Standard MIDI File、拡張子 .mid)は演奏全体 — すべてのノートオン/オフ、CC、プログラムチェンジを、そのタイミングごと — を保存するため、保存・共有し、任意の楽器で再生できます。

全体像

libsonare での実装

libsonare のリアルタイムエンジンは、ノートを pushMidiNoteOn(destinationId, group, channel, note, velocity)pushMidiNoteOff(...) で、コントロールチェンジを pushMidiCc(destinationId, group, channel, controller, value) で受け取ります — destinationId はどの読み込み済み楽器がイベントを受けるかを選び、channel は 0〜15 の MIDI チャンネルです。ブラウザでは Web MIDI ブリッジ(bindWebMidi)が、物理 MIDI 鍵盤のイベントをそれらのエンジン入力へ直接つなぎ、ハードウェアコントローラーで NativeSynth や読み込んだ SoundFont をライブ演奏できます。同じノート/CC の語彙が、ライブエンジンとオフラインのアレンジメントバウンスの両方を駆動します。

関連: MIDI 入力SoundFont とサンプル音源編集の基礎