My Works
- LEDチェッカ
- 太陽電池式回路テスタ
- TTL Pong
- DSP プリセットラジオ
- 電動式 CVCC 電源装置
- OLED MP3 プレーヤ
- etc.
Report
- MIDI のハードウェア
- aitendo DSPラジオ一覧表
- etc.
Parts Collection
- Logic IC
- Calculator LSI
- CMOS Melody IC
- etc.
主な更新のみ
24/09/11
- MCU-based Melody ICs
24/08/12
- MCU-based Melody ICs
24/03/10
- Logic IC Collection
初版公開:2013/02/19
最終更新:
2016/07/21
MIDI (Musical Instrument Digital Interface) は電子楽器のためのデジタル・インタフェースで、1980 年代からシンセサイザやキーボードのインタフェースとして広く使われてきました。2013 年現在、第一線の音楽製作の分野では MIDI は DAW 的な統合ソフトウェアに取って代わられようとしていますが、自作楽器の分野では、MIDI はまだまだこれからも健在なインタフェースといえるでしょう。
さて、標準的な MIDI 機器は MIDI ケーブルといわれるケーブルを通して信号を転送するわけですが、その信号の詳細や、ハードウェアのインプリメンテーションについてはあまり知られていないのではないでしょうか。ここでは、電子工作などで MIDI 信号を扱う上で知っておくべきことを少しまとめてみました。標準的な MIDI 規格についてざっくり説明します。
ちなみに MIDI 規格は日本では JIS X 6054-1, 2 に規格化されており、JISC の Web ページから閲覧できるようになっているので、詳しく知りたい方はそちらも見ることをお勧めします。
コネクタには 5 ピンの DIN コネクタが使われます。デバイス・ホスト共にメスコネクタを使用して、オス-オスのストレートケーブル(MIDI ケーブル)で信号を転送されます。以下に示すように 1 本の MIDI ケーブルでは片方向の通信しかできませんので、入力用のコネクタ・出力用のコネクタが個別に必要になります。
5 ピン DIN コネクタ(メス)
向かって左から、1, 4, 2, 5, 3 ピン
ピン# | 信号 |
1 | NC |
2 | GND(シールド用) |
3 | NC |
4 | +5V |
5 | 信号 |
コネクタは 5 ピンですが、そのうち 3 ピンしか使用されません。2 番ピンはシールド用の グラウンド、4 番ピンは +5V なので、信号の転送には実質的に 5 番ピンの 1 本しか使われません。また、1 番ピン、3 番ピンは NC とすることと規定されています。
1つの MIDI ケーブルの長さは 15 メートル以下で、5 番ピン 4 番ピンのツイストペアを 2 番ピンに接続されたシールドするということに規定されています。
信号は、ピン 5-4 間のカレントループで伝達され、電流が流れている状態を論理"0"、流れていない状態を論理"1" とするように規定されています。
以下の回路例のように、機器間でグラウンドを共有しないように、フォトカプラによってアイソレーションを行います。信号の受信側(MIDI IN デバイス側)がフォトカプラで信号を受けるように規定されています。グラウンドループを防ぐ必要があるので、受信側機器は 2 番ピンをグラウンドに接続してはいけません。
受信回路での(フォトカプラの受け側の)信号の立ち上がり・立ち下がりは 2 us 未満であること、動作電流は 5 mA 以下(送信側は 5 mA 以上の駆動能力、送信側は 5 mA 未満の消費電力)であることが規定されています。現在の基準からすれば低速な MIDI ですが、フォトカプラに適当なバイアスを流さないと転送に失敗する程度には高速な信号です。受信側はこれらの規定を満たすようにフォトカプラの選定など回路を設計する必要があります。
前述のように、カレントループに電流が流れている状態が論理 "0" と規定されているので、以下の回路例では "Rx" 端子の "L" 入力が論理 "0" となります。
以下の回路例のように、送信側(MIDI OUT デバイス側)はフォトカプラを駆動するだけなので、普通のマイコンの出力ピンでも駆動可能なケースも多いです。
前述のように、カレントループに電流が流れている状態が論理 "0" と規定されているので、以下の回路例では "Tx" 端子の "L" 出力が論理 "0" となります。
データは下図のような 31.25 kbps (31.25kHz = 1MHz / 32) ±1% の非同期シリアルで転送されます。送受信の 1 単位は 8 bit で、LSB ファーストです。
見てわかる通り、一般的な UART と同様にスタートビット・ストップビットが付加され、MSBはしばしばステータスビット(ステータスバイト/データバイトの識別)として使われることを考えると、転送の効率はあまり高くありません。一般的に 1つの MIDI メッセージは 3 バイト からなるので、この転送には 0.96ms もかかることになります。
MIDI では、複数バイト(通常 3 バイト)からなる「メッセージ」単位で転送/解釈が行われます。システムエクスクルーシブやリアルタイムメッセージの例外を除くと、ふつう、 1 つの MIDI メッセージは 1 つの「ステータスバイト」と 2 つの「データバイト」の 3 バイトからなります。MSB が "1" のバイトはステータスバイト、 "0" のバイトはデータバイトとなります。
例えば、チャンネル #0 の E4 (ノートナンバー 0x40) をベロシティ 100(0x64) で発音するには、ノートオンのステータスバイトは 0x9n なので(下表参照)、MIDI メッセージは "0x90, 0x40, 0x64" という 3 バイトということになります。この順番に 1 バイトずつ送信すればよいわけです。
MIDI メッセージは一般的に、「チャンネルボイス」、「チャンネルモード」、「システムコモン」、「システムリアルタイム」、「システムエクスクルーシブ」の 5 つに分類されます。また、前2者が「チャンネルメッセージ」、後3者が「システムメッセージ」と呼ばれます。チャンネルメッセージはチャンネル単位でパラメータを指定するためのメッセージ、システムメッセージはシステム全体に効果を与えるメッセージです。チャンネルメッセージとシステムメッセージでは、ステータスバイトの構造が異なります。(下図参照)
2種類のステータスバイトの構造(注:この後にデータバイトが続く)
これらメッセージの詳細は下の「参考資料」を参照してください。
システムメッセージを使うシチュエーションは少なく、実際はいくつかのチャンネルメッセージを覚えるだけで事足りる場面がほとんどです。参考までに、よく使うチャンネルメッセージを以下に示します。MIDI 送信デバイスを製作するには、以下のメッセージさえ覚えれば良いでしょう。
メッセージ名 |
ステータスバイト |
データバイト1[1] | データバイト2[1] |
ノートオン | 0x9n | ノートナンバー[2] | ベロシティ[3] |
ノートオフ | 0x8n | ノートナンバー[2] | 0 |
コントロールチェンジ | 0xBn | コントロールナンバー | コントロール値 |
プログラムチェンジ | 0xCn | プログラムナンバー | - |
ピッチベンド | 0xEn | MSB[4] | LSB[4] |
「プロトコル」の項で触れたように、MIDI は低速なプロトコルなので、これを心もち解消するための「ランニングステータス」という仕組みがあります。
ランニングステータスとは、ステータスバイトが直前に送られたメッセージのステータスバイトと同じ場合、そのステータスバイトを省略して、データバイトのみを送信できるという仕組みです。
例えば、チャンネル #0 の「C4 の発音(ベロシティ64)」⇒「C4 の止音」 の MIDI メッセージは、ノートオンメッセージを使って "0x90 0x3C 0x40"⇒"0x90 0x3C 0x00" と表されますが、ステータスバイトが同じなので、"0x90 0x3C 0x40"⇒"0x3C 0x00" とすることができます。ノートオフメッセージではなく ノートオンメッセージによってノートオフを通知した理由は、このようにランニングステータスが適用できるメリットがあるためです。
ランニングステータスかどうかは、メッセージの最初のバイトの b7 を見ることで判別できます。すなわち、b7 =1 ならばステータスバイトから開始するので通常のメッセージであり、b7=0 ならばランニングステータスだとわかります。
もしも MIDI 信号を受信する装置を製作する場合、このランニングステータスに対応する必要があります。
ランニングステータスは特にエクスプレッション、アフタータッチ、ピッチベンドなどのメッセージで特に有効です。