MIDI
31,250 baud のシリアル線を流れる、3 バイトの音楽メッセージ。
Note On の中身
3 バイトをビットに分けて見ます。最上位ビットがステータスとデータを区別し、残りが種別・チャンネル・音・強さを運びます。
フレーム全体
3 バイトで「チャンネル 1、ノート 60(真ん中のド)を、ベロシティ 100 で鳴らせ」と伝えます。各バイトの最上位ビットでステータスとデータを区別できるので、途中から聞き始めた受信側も次のステータスバイトで同期できます。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| ステータスフラグ | 0 バイト目の bit 7 | 1 | 1 = このバイトはメッセージの先頭 |
| メッセージ種別 | 0 バイト目の bits 6–4 | 001 = Note On | 001 = Note On。ほかに 000 Note Off、010 ポリプレッシャー、011 コントロールチェンジ、100 プログラムチェンジ、101 チャンネルプレッシャー、110 ピッチベンドがあります。 |
| チャンネル | 0 バイト目の bits 3–0 | 0 = チャンネル 1 | 線上では 0〜15、演奏者には チャンネル 1〜16 と表示されます。0 = チャンネル 1。 |
| データフラグ | 1 バイト目の bit 7 | 0 | 0 = データバイト。値に使えるのは残り 7 ビット |
| ノート番号 | 1 バイト目の bits 6–0 | 60 = C4(真ん中のド) | 0〜127。60 が真ん中のド(C4)で、+1 ごとに半音上がります。69 が A4 = 440 Hz です。 |
| データフラグ | 2 バイト目の bit 7 | 0 | ここも 0。データバイトは最上位ビットを必ず 0 にします |
| ベロシティ | 2 バイト目の bits 6–0 | 100(かなり強め) | 0〜127。鍵盤を押した強さ。0 は Note Off の意味です。 |
概要
MIDI 1.0(1983 年)は、キーボード・シンセサイザ・コンピュータを会話させる規格です。音そのものではなく「鍵盤を押した」「つまみを回した」といったイベントを運びます。線上の形式は 31,250 baud の UART で、1 つのメッセージは 1 バイトのステータスと 1〜2 バイトのデータでできています。
設計の工夫は最上位ビットです。ステータスバイトは 1(0x80〜0xFF)、データバイトは 0(0x00〜0x7F)。受信側はストリームのどこから聞き始めても、メッセージの境目が分かります。
基本情報
- 信号線
- 5 ピン DIN の電流ループ(または USB)
- 速度
- 31,250 baud (8N1)
- メッセージ長
- 1〜3 バイト(+ SysEx)
- チャンネル
- 16
- 音域
- 0 – 127
- 方向
- ケーブル 1 本につき一方向
同じメッセージを線の上で
下の層は普通の UART です。スタートビット、下位から 8 ビット、ストップビットを 3 回繰り返します。
フレーム全体
Note On 1 つは線上で約 1 ミリ秒(31,250 baud で 30 ビット)です。10 音の同時発音なら 10 ms かかり、古い MIDI 機材で和音がずれる理由になります。
スタート
スタートビット(常に 0)。普通のシリアルポートと同じ UART のフレーミングです。MIDI は 31,250 baud・データ 8 ビット・パリティなし・ストップ 1 ビットの UART そのものです。
ステータス 0x90
ステータスバイトです。最上位ビットが 1(受信側がステータスとデータを見分ける目印)、001 は Note On、下位 4 ビットの 0 は MIDI チャンネル 1 を表します。
ストップ
ストップビット(常に 1)。メッセージ全体は 3 × 10 = 30 ビット時間で、約 0.96 ms です。
ノート 0x3C(C4)
データ 1 バイト目: ノート番号です。データバイトの最上位ビットは常に 0 で、残り 7 ビット(0〜127)が値です。0x3C = 60 = 真ん中のドです。
ベロシティ 0x64
データ 2 バイト目: 鍵盤を叩いた強さで、0x64 = 100(最大 127)です。ベロシティ 0 の Note On は Note Off として扱われます。
ランニングステータス
連続するメッセージが同じステータスなら、送信側は省略できます。低速な回線で帯域を節約するための仕組みです。
フレーム全体
ランニングステータスは、繰り返しのステータスバイトを省きます。C メジャーの和音が 9 バイトではなく 7 バイトで送れ、31,250 baud の回線では 22% の節約になります。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| ステータス 0x90 | 0 バイト目 | Note On ch.1 | 最初に 1 回だけ送ります。Note On、チャンネル 1。 |
| ノート 60(C4) | 1 バイト目 | 0x3C = 60 | 1 つ目の音: C4。 |
| ベロシティ 100 | 2 バイト目 | 0x64 = 100 | 強さ: 100。 |
| ノート 64(E4) | 3 バイト目 | 0x40 = 64 = E4 | ここにステータスバイトはありません。データバイト(最上位ビット 0)が来たら、受信側は直前のステータスを使い回します。これがランニングステータスで、2 つ目の音は 3 バイトではなく 2 バイトで済みます。 |
| ベロシティ 100 | 4 バイト目 | 0x64 = 100 | 2 つ目の音のベロシティ。 |
| ノート 67(G4) | 5 バイト目 | 0x43 = 67 = G4 | 3 つ目の音もステータスなし。C メジャーの和音 C4・E4・G4 がそろいます。 |
| ベロシティ 100 | 6 バイト目 | 0x64 = 100 | 3 つ目の音のベロシティ。合計 7 バイト(通常なら 9 バイト)です。 |
使われる場面
- キーボード・ドラムパッド・コントローラと DAW・シンセの接続
- 舞台照明やショーコントロール(MIDI Show Control)
- USB-MIDI や Bluetooth-MIDI も同じメッセージを運びます
つまずきやすい点
- 線の速度は 38400 でも 115200 でもなく、ちょうど 31,250 baud(1 MHz ÷ 32)です。PC の普通のシリアルポートでは出せず、マイコンなら出せます。
- チャンネルは線上で 0〜15、画面では 1〜16 です。1 ずれの勘違いが定番です。
- 音が鳴りっぱなしになるのは、たいてい Note Off が失われたためです。多くの機器は「All Notes Off」(コントローラ 123)に反応します。
出典・規格
- MIDI 1.0 Detailed Specification (MIDI Manufacturers Association)