MIDI

樂器數字接口 (MIDI)是一種標準協議,用於將計算機與樂器、舞檯燈光和其他面向時間的媒體互連。

嚴格來說,MIDI 與音頻無關。但是因為MIDI是常用的音樂,所以這篇文章放在了音頻部分。

用於 NDK 的 MIDI

Android 10 使使用 MIDI 將專業音頻應用程序移植到 Android 平台變得更加容易。

AMidi是一個NDK API ,它使應用程序開發人員能夠使用 C/C++ 代碼發送和接收 MIDI 數據。

Android MIDI 應用程序通常使用midi API 與 Android MIDI 服務進行通信。 MIDI 應用程序主要依賴於MidiManager類來發現、打開和關閉一個或多個MidiDevice對象,並通過設備的 MIDI 輸入和輸出端口將數據傳入和傳出每個設備。

運輸

原始 MIDI 1.0 中指定的物理傳輸層是帶有5 針 DIN連接器的電流迴路。

自 MIDI 1.0 以來,已經定義了其他傳輸方式,包括基於 USB 的 MIDI 和基於藍牙低功耗 (BLE)的 MIDI。

Android 的 MIDI

Android 支持USB On-The-Go ,它允許 Android 設備充當 USB 主機來驅動 USB 外圍設備。 USB 主機模式 API 允許開發人員在應用程序級別通過 USB 實現 MIDI,但直到最近還沒有用於 MIDI 的內置平台 API。

從 Android 6.0 (Marshmallow) 版本開始,設備製造商可以在平台中啟用可選的 MIDI 支持。 Android 直接支持 USB、BLE 和虛擬(應用間)傳輸。 Android 通過外部適配器支持 MIDI 1.0。

有關使用 MIDI API 進行應用程序編程的詳細信息,請參閱android.media.midi包。

本文的其餘部分將討論 Android 設備製造商如何在平台中啟用 MIDI 支持。

啟用傳輸

MIDI 實現依賴於 USB 主機模式和 USB 外圍模式傳輸的 ALSA。 ALSA 不用於 BLE 和虛擬傳輸。

USB主機模式

要為 USB 主機模式啟用 MIDI,首先通常支持 USB 主機模式,然後在內核配置中啟用CONFIG_SND_RAWMIDICONFIG_SND_USB_MIDI 。請參閱Android 內核配置。

USB 傳輸的 MIDI 由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 for ,然後選擇MIDI

低功耗藍牙

如果設備支持 BLE,則始終啟用 BLE 上的 MIDI。

虛擬(應用程序間)

始終啟用虛擬(應用程序間)傳輸。

聲明該功能

應用程序可以使用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 調試橋 (adb) 調試。請參閱 Android Debug Bridge 的無線使用部分以獲取替代方法。