MIDI

乐器数字接口 (MIDI) 是一种将计算机与乐器、舞台灯光和其他面向时间的媒体互连的标准协议。

从 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 是一个 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 1.0 传输

MIDI 1.0 实现依赖于 ALSA 进行 USB 主机模式和 USB 外围设备模式传输。ALSA 不用于 BLE 和虚拟传输。

USB 主机模式

要为 USB 主机模式启用 MIDI,首先要全面支持 USB 主机模式,然后在您的内核配置中启用 CONFIG_SND_RAWMIDICONFIG_SND_USB_MIDI

USB MIDI 传输由 Universal Serial Bus Device Class Definition for MIDI Devices Release 1.0 Nov 1, 1999 标准正式定义,该标准由 USB Implementers Forum, Inc 发布。

USB 外围设备模式

要为 USB 外围设备模式启用 MIDI,您可能需要将补丁应用到您的 Linux 内核,以将 drivers/usb/gadget/f_midi.c 集成到 USB gadget 驱动程序中。这些补丁适用于 Linux 内核版本 3.10。这些补丁尚未针对 ConfigFs(USB gadget 驱动程序的新架构)进行更新,也未在上游 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,则始终启用 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 调试桥的无线使用部分。