MIDI アーキテクチャ

この記事では、プラットフォームの実装、API、プラットフォーム固有の機能に依存しない、一般的な MIDI アーキテクチャについて説明します。

主な概念

イベント

MIDI プロトコルは、イベントベースの通信用に設計されています。イベントとは、特定の時間に何かが発生した、または発生することを意味します。MIDI イベントはメッセージとして、つまり一番小さな情報のセットとして表されます。

トランスポート

MIDI メッセージはエンコードされ、略してトランスポートとも呼ばれるトランスポート層を介して配信されます。トランスポート層は生の MIDI データを送信し、受信者はデータをメッセージにデコードします。

ハードウェアベースの MIDI トランスポートには次のものがあります。

  • 5 ピン DIN コネクタ付きの MIDI 1.0 電流ループ
  • USB
  • Bluetooth Low Energy(BLE)

メッセージ表現

メッセージの伝達方法は、MIDI トランスポートの仕様で説明されています。メッセージのパッケージ化は、最下位レベルではトランスポート固有になりますが、上位レベルのアプリケーションではメッセージの時間順シーケンスが境界バイト ストリームと見なされます。これは、メッセージ境界の開始点がわかる場合に全長を決定するための十分な情報がそれぞれのメッセージに含まれているためです。

MIDI メッセージの長さは多くの場合 1~3 バイトですが、SysEx を介したより長いメッセージである場合もあります。

タイムスタンプ

タイムスタンプは、トランスポートに応じて開始時または受信時にメッセージに添付される任意のラベルです。タイムスタンプは、秒やティックなどの時間単位で表されます。

明示的なタイムスタンプがない場合、システムは直前のメッセージのタイムスタンプまたは現在の時刻を置き換える必要があります。こうしたタイムスタンプの正確性は、明示的なものであれ暗黙的なものであれ、MIDI ベースのシステムの信頼性の重要な側面と言えます。

タイムスタンプは、MIDI 1.0 プロトコルの一部ではありません。多くの場合はプラットフォーム固有の API の一部として追加されます。BLE トランスポートには、1 つの BLE パケット内で送信された複数の個別メッセージのタイミングを示すタイムスタンプがあります。

デバイス

周辺機器を使うと、コンピュータでの入出力(I/O)が可能になります。MIDI 周辺機器と MIDI デバイスとは通常、MIDI プロトコルをサポートするハードウェアまたはソフトウェア モジュールを指します。このドキュメントでは、MIDI 周辺機器は物理エンティティを指し、MIDI デバイスは実際に MIDI を実装したモジュールを指します。

ポート

コンピュータと周辺機器間の接続ポイントがポートです。

MIDI 1.0 では、メスの 5 ピン DIN ソケットをポートとして使用します。各ポートは、出力(MIDI データのソース)、入力(MIDI データのシンク)、またはスルー(出力に直接ルーティングされる入力)のいずれかになります。

USB や BLE などの他のトランスポートは、ポートの概念を拡張するものです。

1 つの MIDI デバイスには、少なくとも 1 つの出力ポートか入力ポート、またはその両方があります。

MIDI デバイスは、各出力ポートから発信されるメッセージのストリームを送信し、各入力ポートに到達するメッセージのストリームを受信します。入力あるいは出力という表現は、ある 1 つのポートから見た場合の言い方ですが、別のポートからは逆になります。

接続

MIDI 1.0 トランスポートでは、電流ループの特性により、出力ポートを 1 つの入力ポートまたはスルーポートに接続します。同じことが最下層にも当てはまりますが、USB および BLE トランスポートでは、MIDI を実装した場合、複数の入力ポートに送信できるようにメッセージ ストリームが再調整されることがあります。

ケーブル

MIDI 1.0 ケーブルは、出力ポートを入力またはスルーポートに接続するための物理的なワイヤーです。このケーブルで伝送されるのは、データのみです。

注: 未使用の 2 本のピンで電力を供給する MIDI の非標準の仕様を、ファンタム電源と言います。

USB ケーブルも MIDI ケーブルと同様に機能しますが、コネクタにはさまざまな種類があり、また、入力 / 出力 / スルーという概念がホストと周辺機器という分担になっている点で異なります。

USB ホストモードで動作している場合、ホストデバイスは MIDI 周辺機器に電力を供給します。小型 MIDI 周辺機器は、1 ユニットロードが 100 mA 以下であることがほとんどです。ただし、一部の大型の周辺機器、またはオーディオ出力やライトを備えた周辺機器に対しては、ホストデバイスで供給可能な電力以上の出力が必要です。問題が発生した場合は、別の MIDI 周辺機器または電源付き USB ハブをお試しください。

チャンネル

各 MIDI メッセージ ストリームは 16 チャンネルに多重化されています。ほとんどのメッセージは特定のチャンネルで送信されますが、チャンネル固有ではないメッセージ タイプもあります。通常、各チャンネルには 1 から 16 までの番号が付けられ、それぞれ 0~15 のチャンネル値で表されます。

アプリケーションで 16 を超えるチャンネルが必要な場合、または 1 つのメッセージ ストリームがサポートするスループットよりも高いスループットが必要な場合は、複数のポートを使用する必要があります。

MIDI 1.0 では、複数のケーブルで各ポートを接続します。

MIDI over USB によるトランスポートでは、単一の USB エンドポイントで複数のポートをサポートし、各ポートはケーブル番号 [sic] で識別されます。USB MIDI の仕様に従って、ケーブル番号がエンドポイント内の仮想ポートを示します。

注: ポートを識別するためのものなので、ポート番号としたほうが適切だったと言えます。

このように、1 本の USB 物理ケーブルで複数の 16 チャンネル セットを伝送できます。

プラットフォームの実装

はじめに述べたように、こうした一般的な MIDI の概念はすべての実装に適用されます。この概念の Android プラットフォームにおける解釈については、Android MIDI ユーザーガイド(android.media.midiを参照してください。