本文介绍了通用的 MIDI 架构,该架构独立于任何平台实现、API 或平台特定功能。
主要概念
事件
MIDI 协议专为基于事件的通信而设计。 事件表示在指定时间发生或将要发生某事。 MIDI 事件由消息表示,即原子信息包。
传输
MIDI 消息经过编码并通过传输层(简称传输)进行传送,传输层会将原始 MIDI 数据发送给接收者,然后由接收者将数据解码为消息。
基于硬件的 MIDI 传输包括
- 带有 5 针 DIN 连接器的 MIDI 1.0 电流环路
- USB
- 蓝牙低功耗 (BLE)
消息表示
MIDI 传输规范描述了如何传送消息。虽然消息的封装在最低级别上是传输特定的,但在更高级别上,应用可以将时间排序的消息序列视为已划分界限的 字节流。之所以可以这样做,是因为每条消息都包含足够的信息来确定消息的总长度(前提是已知消息边界的起始位置)。
大多数 MIDI 消息都很短(一到三个字节),但可以通过 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 线缆与之类似,但连接器类型更多样,并且 IN/OUT/THRU 概念被主机/外围设备角色取代。
在 USB 主机模式下运行时,主机设备会向 MIDI 外围设备供电。大多数小型 MIDI 外围设备消耗一个 USB 单位负载 (100 mA) 或更少电量。但是,一些较大的外围设备或带有音频输出或指示灯的外围设备需要的电量超过主机设备所能提供的电量。如果您遇到问题,请尝试其他 MIDI 外围设备或有源 USB 集线器。
通道
每个 MIDI 消息流在 16 个通道之间进行多路复用。大多数消息都定向到特定通道,但有些消息类型并非特定于通道。按照惯例,通道编号为 1 到 16,但通道值表示为 0 到 15。
如果应用需要超过 16 个通道或比单个消息流可以支持的吞吐量更高的吞吐量,则必须使用多个端口。
在 MIDI 1.0 中,这通过连接多对端口的多条线缆来实现。
在 MIDI over USB 传输中,单个 USB 端点可以支持多个端口,每个端口都由线缆编号 [原文如此] 标识。根据 USB MIDI 规范,线缆编号标识端点内的虚拟端口。
注意:端口号本来会是一个更准确的术语,因为它标识的是一个端口。
因此,单根 USB 物理线缆可以承载多于一组的 16 个通道。
平台实现
如引言中所述,这些通用的 MIDI 概念适用于所有实现。有关 Android 平台上这些概念的解释,请参阅 Android MIDI 用户指南,其中介绍了 android.media.midi
。