MIDI 架構

本文描述了通用 MIDI 體系結構,獨立於任何平台實現、API 或特定於平台的功能。

關鍵概念

活動

MIDI 協議是為基於事件的通信而設計的。事件是某事在特定時間發生或將要發生的指示。 MIDI 事件由消息、原子信息包表示。

運輸

MIDI 消息通過傳輸層(縮寫為傳輸層)進行編碼和傳遞,它將原始 MIDI 數據發送給接收者,然後接收者將數據解碼為消息。

基於硬件的 MIDI 傳輸包括:

  • 帶有5 針 DIN連接器的 MIDI 1.0 電流環
  • USB
  • 低功耗藍牙 (BLE)

消息表示

MIDI 傳輸規範描述瞭如何傳遞消息。儘管消息的打包在最低級別是特定於傳輸的,但在更高級別的應用程序可以將按時間排序的消息序列視為劃分的字節流。這是可能的,因為每條消息都包含足夠的信息來確定消息的總長度,前提是消息邊界的開始是已知的。

大多數 MIDI 消息都很短(一到三個字節),但可以通過SysEx提供更長的消息。

時間戳

時間戳是在消息發起或接收時附加到消息的可選標籤,具體取決於傳輸方式。時間戳以時間單位表示,例如 seconds 或ticks

在沒有顯式時間戳的情況下,系統必須替換前一條消息的時間戳或當前時間。這些時間戳的準確性,無論是顯式的還是隱式的,都是基於 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 (表示直接路由到OUTIN )。

USB 和 BLE 等其他傳輸方式擴展了端口概念

MIDI 設備至少有一個OUT端口、 IN端口或兩者兼有。

MIDI 設備提供源自每個OUT端口的消息流,並接收到達每個IN端口的消息流。術語INOUT當然是相對於一個端口的;從另一個港口的角度來看,相反的術語適用。

聯繫

在 MIDI 1.0 傳輸中,由於電流循環的性質,一個OUT端口最多連接一個INTHRU端口。在 USB 和 BLE 傳輸中,最低層也是如此,儘管實現可能會重新調整消息流,以便將其廣播到多個IN端口。

電纜

MIDI 1.0電纜是將OUT端口連接到INTHRU端口的物理線束。電纜僅傳輸數據。

注意:對 MIDI 進行了非標準修改,通過兩個未使用的引腳供電。這稱為幻象電源

USB 電纜與此類似,只是連接器類型多種多樣,並且IN / OUT / THRU概念被主機/外設角色所取代。

在 USB 主機模式下運行時,主機設備為 MIDI 外圍設備供電。大多數小型 MIDI 外圍設備只需要一個 USB 單元負載 (100 mA) 或更少。然而,一些較大的外圍設備,或帶有音頻輸出或燈的外圍設備,需要比主機設備提供的更多的功率。如果您遇到問題,請嘗試其他 MIDI 外圍設備或有源 USB 集線器。

渠道

每個 MIDI 消息流在 16 個通道之間多路復用。大多數消息都針對特定通道,但也有一些消息類型不是特定於通道的。傳統上,通道編號為 1 到 16,儘管由 0 到 15 的通道值表示。

如果應用程序需要超過 16 個通道或比一個消息流支持的吞吐量更高,則必須使用多個端口。

在 MIDI 1.0 中,這是通過多條電纜連接成對的端口來實現的。

在通過 USB 傳輸的 MIDI 中,單個 USB 端點可以支持多個端口,每個端口都由一個電纜編號[原文如此]。根據 USB MIDI 規範,電纜編號標識端點內的虛擬端口。

注意:端口號是一個更準確的術語,因為它標識了一個端口。

因此,一根 USB 物理電纜可以承載多於一組的 16 個通道。

平台實施

如介紹中所述,這些通用 MIDI 概念適用於所有實現。關於 Android 平台上概念的解釋,請參閱Android MIDI 用戶指南android.media.midi