MIDI

MIDI(Musical Instrument Digital Interface)は、コンピュータを楽器、舞台照明、その他の時間指向メディアと相互接続するための標準プロトコルです。

Android 13 以降、USB トランスポートに MIDI 2.0 サポートが追加されています。MIDI 2.0 は、2020 年に定義された新しい MIDI 標準です。このプロトコルは、双方向通信、高解像度、プロパティ交換などの機能を追加します。プラットフォームで MIDI サポートが有効になっている場合、USB ホストモードを介した MIDI 2.0 は常に有効になります。

厳密に言えば、MIDI はオーディオとは無関係です。しかし、MIDI は音楽で使用されることが多いため、この記事をオーディオ セクション内に配置しています。

NDK 用 MIDI

Android 10 では、MIDI を使用するプロ向けオーディオ アプリを Android プラットフォームに簡単に移植できます。

AMidi は、アプリのデベロッパーが C / C++ コードで MIDI データを送受信できるようにする NDK API です。

通常、Android MIDI アプリは midi API を使用して Android MIDI サービスと通信します。MIDI アプリは主に MidiManager クラスを利用して 1 つ以上の MidiDevice オブジェクトの検出、開始、終了を行い、デバイスの MIDI 入出力ポートを介して各デバイスとのデータの送受信を行います。

トランスポート

オリジナルの MIDI 1.0 で使用される物理トランスポート層は、5 ピン DIN コネクタ付きの電流ループです。

MIDI 1.0 以降では、USB 経由の MIDI や Bluetooth Low Energy(BLE)経由の MIDI など、追加のトランスポートが定義されています。

Android 用 MIDI

Android は USB On-The-Go をサポートしているため、Android デバイスは USB 周辺機器を駆動させる USB ホストとして機能します。USB ホストモードの API を使用すると、デベロッパーはアプリレベルで MIDI over USB を実装できますが、最近まで MIDI 用の組み込みプラットフォーム API は用意されていませんでした。

Android 6.0(Marshmallow)リリース以降では、デバイス メーカーがプラットフォームで MIDI のサポート(オプション)を有効にできるため、Android が USB、BLE、仮想(アプリ間)トランスポートを直接サポートします。また、Android は外部アダプターを介して MIDI 1.0 をサポートします。

MIDI API を使用したアプリ プログラミングについて詳しくは、android.media.midi パッケージをご覧ください。

この記事の後半部分では、Android デバイス メーカーがプラットフォームで MIDI のサポートを有効にする方法について説明します。

MIDI 1.0 トランスポートの有効化

MIDI 1.0 の実装は、ALSA の USB ホストモードと USB ペリフェラル モードのトランスポートに応じて異なります。ALSA は、BLE および仮想トランスポートには使用されません。

USB ホストモード

USB ホストモードで MIDI を有効にするには、最初に一般的な USB ホストモードのサポートを有効にしてから、カーネル構成で CONFIG_SND_RAWMIDICONFIG_SND_USB_MIDI を有効にします。詳しくは、Android カーネル設定をご覧ください。

MIDI over USB トランスポートは、USB インプリメンターズ フォーラムが発行した MIDI デバイスのユニバーサル シリアルバス デバイス クラス定義リリース 1.0(1999 年 11 月 1 日)という規格によって正式に定義されています。

USB 周辺機器モード

USB ペリフェラル モードで MIDI を有効にするには、Linux カーネルにパッチを適用して drivers/usb/gadget/f_midi.c を USB ガジェット ドライバに統合する必要があります。これらのパッチは、Linux カーネル バージョン 3.10 で利用可能です。これらのパッチはまだ ConfigFs(USB ガジェット ドライバ向けの新たなアーキテクチャ)用に更新されておらず、より上位の kernel.org でもマージされていません。

このパッチは、プロジェクト kernel/common ブランチ android-3.10 のカーネルツリーのコミット順に次のように表示されます。

  1. https://android-review.googlesource.com/#/c/127450/
  2. https://android-review.googlesource.com/#/c/127452/
  3. https://android-review.googlesource.com/#/c/143714/

また、次のいずれかの操作を行う必要があります。

  • [設定] > [開発者向けオプション] > [ネットワーク] にアクセスして、[USB 設定の選択] ダイアログで [MIDI] のボックスをオンにします。
  • USB ホストに接続した状態で画面上部を下へスワイプし、[USB の使用] を選んでから [MIDI] を選択します。

BLE

デバイスが BLE をサポートしている場合、MIDI over BLE は常に有効になります。

仮想(アプリ間)

仮想(アプリ間)トランスポートは常に有効です。

機能の要求

アプリは、android.software.midi 機能を使用して MIDI サポートの有無を判別します。

MIDI のサポートを要求するには、次の行を device.mk に追加します。

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.software.midi.xml:system/etc/permissions/android.software.
midi.xml

機能を要求するための要件については、Android 互換性定義ドキュメント(CDD)をご覧ください。

ホストモードでのデバッグ

USB ホストモードでは、USB 経由の Android Debug Bridge(adb)デバッグは利用できません。代替の方法については、Android Debug Bridge のワイヤレスでの使用についてのセクションをご覧ください。