MIDI 架构

本文将介绍不依赖于任何平台实现、API 或平台专用功能的通用 MIDI 架构。

主要概念

事件

该 MIDI 协议专为基于事件的通信而设计。 事件表示已经发生或即将在特定时间发生的事情。MIDI 事件用信息(原子式信息包)表示。

传输

MMIDI 信息通过传输层(简称“传输”)进行编码和传递,传输层会将原始 MIDI 数据发送给接收者,以便接收者随后将数据解码为信息。

基于硬件的 MIDI 传输包括:

  • 使用 5 针 DIN 连接器的 MIDI 1.0 电流回路
  • USB
  • 蓝牙低功耗 (BLE)

信息呈现方式

MIDI 传输规范介绍了信息的传递方式。 尽管在最低级别信息的封装是特定于传输层进行的,但是在较高级别,应用可以将按时间排序的信息序列视为已划分界线的字节流。 这可能是因为,只要已知信息边界的起点,则每条信息都会包含足够的信息来确定其总长度。

大多数 MIDI 信息都比较短(一到三个字节),不过您可以通过 SysEx 实现较长的信息。SysEx

时间戳

时间戳是在发出或接收信息时(具体取决于传输)附加到信息中的可选标签。时间戳用时间单位表示,例如秒或滴答声

在没有显式时间戳的情况下,系统必须替换紧挨着的上一条信息或当前时间的时间戳。这些时间戳(无论显式或隐式)的准确性是影响基于 MIDI 的系统的可靠性的重要因素。

时间戳不是 MIDI 1.0 协议的组成部分,它们通常会被添加为平台专用 API 的一部分。BLE 传输有时间戳,用于表明一个 BLE 数据包内多条信息各自的发送时间。

设备

外围设备为计算机提供输入/输出 (I/O) 功能。“MIDI 外围设备”和“MIDI 设备”这两个术语通常指支持 MIDI 协议的各种硬件或软件模块。 在本文中,“MIDI 外围设备”指物理实体,“MIDI 设备”指实际实现 MIDI 的模块。

端口

端口是计算机和外围设备之间的接口点。

MIDI 1.0 使用 5 针 DIN 母头插座作为端口。 端口有三种:OUT(MIDI 数据的源)、IN(MIDI 数据的接收器)或 THRU(表示直接路由到 OUT 的 IN)。

USB 和 BLE 等其他传输端口是端口概念的延伸。

MIDI 设备拥有至少一个 OUT 端口、一个 IN 端口,或同时具有这两个端口。

MIDI 设备提供源自每个 OUT 端口的信息流,并接收抵达每个 IN 端口的信息流。 当然,术语 IN 和 OUT 是相对于一个端口而言的;对于一个端口是输入,对于另一个端口则是输出,反之亦然。

连接

在 MIDI 1.0 传输层中,由于电流回路的性质,一个 OUT 端口最多能连接一个 IN 或 THRU 端口。 在 USB 和 BLE 传输层中,最底层的情况也是如此(尽管您可以通过实现修复信息流,以便它能广播到多个 IN 端口)。

线缆

MIDI 1.0 线缆是连接 OUT 端口和 IN 或 THRU 端口的实体线束, 仅用于传输数据。

注意:我们对 MIDI 进行了一些非标准修改,以便通过两个未使用的针脚供电,称为“幻象电源”。

USB 线缆和 MIDI 1.0 线缆类似,不过它有多种连接器类型,并且 IN/OUT/THRU 概念被替换为主机/外围设备角色。

在 USB 主机模式下操作时,主机设备会为 MIDI 外围设备供电。大多数小型 MIDI 外围设备使用一个 USB 单元负载 (100mA) 或者更少电量,而一些较大型的外围设备或配有音频输出或指示灯的外围设备所需的电量会超出主机设备能够提供的电量。 如果您遇到问题,请尝试其他 MIDI 外围设备或有电源的 USB 集线器。

频道

每个 MIDI 信息流均在 16 个通道间进行多路复用。大多数信息都针对特定通道,不过也有些信息类型不针对特定通道。 按照惯例,尽管通道值用 0 到 15 表示,但通道按 1 到 16 进行编号。

如果应用需要超过 16 个通道,或者需要的吞吐量超过一个信息流所能支持的限度,则必须使用多个端口。

在 MIDI 1.0 中,可使用多根线缆连接端口对来实现上述目的。

在使用 USB 传输的 MIDI 中,单个 USB 端点可以支持多个端口,每个端口用线缆编号 [sic] 标识。 根据 USB MIDI 规范,线缆编号可标识端点中的虚拟端口。

注意:在标识端口时,端口编号是一个更为准确的术语。

这样一来,单个 USB 实体线缆就可以承载 16 个以上的通道。

平台实现

如简介中所述,这些通用 MIDI 概念适用于所有实现。有关 Android 平台上的概念的解释说明,请参阅 android.media.midi 的 Android MIDI 用户指南