Linux 上的 MIDI 2.0

通用

MIDI 2.0 是一個擴充套件協議,旨在提供比傳統 MIDI 1.0 更高的解析度和更精細的控制。為支援 MIDI 2.0 引入的根本性變化包括:

  • 支援通用 MIDI 資料包 (UMP)

  • 支援 MIDI 2.0 協議訊息

  • UMP 和傳統 MIDI 1.0 位元組流之間的透明轉換

  • 用於屬性和配置檔案配置的 MIDI-CI

UMP 是一種新的容器格式,用於承載所有 MIDI 協議 1.0 和 MIDI 2.0 協議訊息。與以前的位元組流不同,它是 32 位對齊的,每個訊息可以放在一個數據包中。UMP 可以將事件傳送到多達 16 個“UMP 組”,每個 UMP 組包含多達 16 個 MIDI 通道。

MIDI 2.0 協議是一個擴充套件協議,旨在實現比舊 MIDI 1.0 協議更高的解析度和更多的控制。

MIDI-CI 是一種高階協議,可以透過特殊 SysEx 的形式與 MIDI 裝置進行靈活的配置檔案和配置通訊。

對於 Linux 實現,核心支援 UMP 傳輸以及 UMP 上 MIDI 協議的編碼/解碼,而 MIDI-CI 則透過標準 SysEx 在使用者空間中得到支援。

截至本文撰寫之時,只有 USB MIDI 裝置原生支援 UMP 和 Linux 2.0。UMP 支援本身是相當通用的,因此它可以被其他傳輸層使用,儘管它也可以以不同方式實現(例如作為 ALSA sequencer 客戶端)。

UMP 裝置的訪問方式有兩種:透過 rawmidi 裝置訪問和透過 ALSA sequencer API 訪問。

ALSA sequencer API 已擴充套件以允許 UMP 資料包的有效載荷。允許在 MIDI 1.0 和 MIDI 2.0 sequencer 客戶端之間自由連線,並且事件可以透明轉換。

核心配置

為支援 MIDI 2.0 添加了以下新配置:CONFIG_SND_UMPCONFIG_SND_UMP_LEGACY_RAWMIDICONFIG_SND_SEQ_UMPCONFIG_SND_SEQ_UMP_CLIENTCONFIG_SND_USB_AUDIO_MIDI_V2。第一個可見的是 CONFIG_SND_USB_AUDIO_MIDI_V2,當您選擇它(設定為 =y)時,將自動選擇 UMP 的核心支援(CONFIG_SND_UMP)和 sequencer 繫結(CONFIG_SND_SEQ_UMP_CLIENT)。

此外,CONFIG_SND_UMP_LEGACY_RAWMIDI=y 將啟用 UMP 端點的傳統 raw MIDI 裝置支援。

帶 USB MIDI 2.0 的 Rawmidi 裝置

當裝置支援 MIDI 2.0 時,USB 音訊驅動程式會探測並預設使用 MIDI 2.0 介面(始終在 altset 1 中找到),而不是 MIDI 1.0 介面(在 altset 0 中)。您也可以透過向 snd-usb-audio 驅動程式模組傳遞 midi2_enable=0 選項來切換回舊 MIDI 1.0 介面的繫結。

USB 音訊驅動程式嘗試查詢 UMP v1.1 以來提供的 UMP 端點和 UMP 功能塊資訊,並根據這些資訊構建拓撲。當裝置較舊且不響應新的 UMP 查詢時,驅動程式會回退並根據 USB 描述符中的組終端塊 (GTB) 資訊構建拓撲。某些裝置可能會因意外的 UMP 命令而出現問題;在這種情況下,請向 snd-usb-audio 驅動程式傳遞 midi2_ump_probe=0 選項以跳過 UMP v1.1 查詢。

當探測到 MIDI 2.0 裝置時,核心會為裝置的每個 UMP 端點建立一個 rawmidi 裝置。其裝置名稱為 /dev/snd/umpC*D*,與 MIDI 1.0 的標準 rawmidi 裝置名稱 /dev/snd/midiC*D* 不同,以避免傳統應用程式錯誤地訪問 UMP 裝置。

您可以直接從/向此 UMP rawmidi 裝置讀取和寫入 UMP 資料包資料。例如,如下所示透過 hexdump 讀取將以十六進位制格式顯示卡 0 裝置 0 的傳入 UMP 資料包。

% hexdump -C /dev/snd/umpC0D0
00000000  01 07 b0 20 00 07 b0 20  64 3c 90 20 64 3c 80 20  |... ... d<. d<. |

與 MIDI 1.0 位元組流不同,UMP 是一個 32 位資料包,讀取或寫入裝置的大小也對齊到 32 位(即 4 位元組)。

UMP 資料包有效載荷中的 32 位字始終採用 CPU 本地位元組序。傳輸驅動程式負責將 UMP 字從/到系統位元組序轉換為所需的傳輸位元組序/位元組順序。

當設定了 CONFIG_SND_UMP_LEGACY_RAWMIDI 時,驅動程式會額外建立一個標準的 raw MIDI 裝置,即 /dev/snd/midiC*D*。它包含 16 個子流,每個子流對應一個(基於 0 的)UMP 組。傳統應用程式可以透過每個子流以 MIDI 1.0 位元組流格式訪問指定的組。使用 ALSA rawmidi API,您可以開啟任意子流,而僅僅開啟 /dev/snd/midiC*D* 將最終開啟第一個子流。

每個 UMP 端點都可以提供額外資訊,這些資訊由透過 UMP 1.1 流訊息或 USB MIDI 2.0 描述符查詢到的資訊構建。一個 UMP 端點可以包含一個或多個 UMP 塊,其中 UMP 塊是 ALSA UMP 實現中引入的抽象,用於表示 UMP 組之間的關聯。UMP 塊對應於 UMP 1.1 規範中的功能塊。當 UMP 1.1 功能塊資訊不可用時,它會從 USB MIDI 2.0 規範中定義的組終端塊 (GTB) 部分填充。

UMP 端點和 UMP 塊的資訊可以在 proc 檔案 /proc/asound/card*/midi* 中找到。例如:

% cat /proc/asound/card1/midi0
ProtoZOA MIDI

Type: UMP
EP Name: ProtoZOA
EP Product ID: ABCD12345678
UMP Version: 0x0000
Protocol Caps: 0x00000100
Protocol: 0x00000100
Num Blocks: 3

Block 0 (ProtoZOA Main)
  Direction: bidirection
  Active: Yes
  Groups: 1-1
  Is MIDI1: No

Block 1 (ProtoZOA Ext IN)
  Direction: output
  Active: Yes
  Groups: 2-2
  Is MIDI1: Yes (Low Speed)
....

請注意,上面 proc 檔案中顯示的 Groups 欄位表示基於 1 的 UMP 組號(從-到)。

這些額外的 UMP 端點和 UMP 塊資訊可以透過新的 ioctls SNDRV_UMP_IOCTL_ENDPOINT_INFOSNDRV_UMP_IOCTL_BLOCK_INFO 分別獲取。

rawmidi 名稱和 UMP 端點名稱通常是相同的,在 USB MIDI 的情況下,它是從相應 USB MIDI 介面描述符的 iInterface 中獲取的。如果未提供,則作為備用從 USB 裝置描述符的 iProduct 中複製。

端點產品 ID 是一個字串欄位,應是唯一的。對於 USB MIDI,它從裝置的 iSerialNumber 中複製。

協議能力和實際協議位在 asound.h 中定義。

ALSA Sequencer 與 USB MIDI 2.0

除了 rawmidi 介面之外,ALSA sequencer 介面也支援新的 UMP MIDI 2.0 裝置。現在,每個 ALSA sequencer 客戶端可以設定其 MIDI 版本(0、1 或 2)來宣告自己分別是傳統、UMP MIDI 1.0 或 UMP MIDI 2.0 裝置。第一個傳統客戶端是傳送/接收舊 sequencer 事件的客戶端。同時,UMP MIDI 1.0 和 2.0 客戶端以 UMP 的擴充套件事件記錄傳送和接收。MIDI 版本可以在 snd_seq_client_info 的新 midi_version 欄位中看到。

透過指定新的事件標誌位 SNDRV_SEQ_EVENT_UMP,UMP 資料包可以嵌入在 sequencer 事件中進行傳送/接收。當此標誌設定時,事件有 16 位元組(128 位)資料載荷用於承載 UMP 資料包。如果沒有 SNDRV_SEQ_EVENT_UMP 位標誌,事件將作為傳統事件處理(最大 12 位元組資料載荷)。

當設定了 SNDRV_SEQ_EVENT_UMP 標誌時,UMP sequencer 事件的型別欄位將被忽略(但應預設設定為 0)。

每個客戶端的型別可以在 /proc/asound/seq/clients 中看到。例如:

% cat /proc/asound/seq/clients
Client info
  cur  clients : 3
....
Client  14 : "Midi Through" [Kernel Legacy]
  Port   0 : "Midi Through Port-0" (RWe-)
Client  20 : "ProtoZOA" [Kernel UMP MIDI1]
  UMP Endpoint: ProtoZOA
  UMP Block 0: ProtoZOA Main [Active]
    Groups: 1-1
  UMP Block 1: ProtoZOA Ext IN [Active]
    Groups: 2-2
  UMP Block 2: ProtoZOA Ext OUT [Active]
    Groups: 3-3
  Port   0 : "MIDI 2.0" (RWeX) [In/Out]
  Port   1 : "ProtoZOA Main" (RWeX) [In/Out]
  Port   2 : "ProtoZOA Ext IN" (-We-) [Out]
  Port   3 : "ProtoZOA Ext OUT" (R-e-) [In]

在這裡,您可以找到兩種型別的核心客戶端,“Legacy”(傳統)用於客戶端 14,和“UMP MIDI1”(UMP MIDI 1)用於客戶端 20,它是一個 USB MIDI 2.0 裝置。USB MIDI 2.0 客戶端總是將埠 0 賦予“MIDI 2.0”,其餘埠從 1 開始用於每個 UMP 組(例如,埠 1 用於組 1)。在此示例中,該裝置有三個活躍組(Main、Ext IN 和 Ext OUT),它們作為 sequencer 埠從 1 到 3 暴露。“MIDI 2.0”埠用於 UMP 端點,它與其他 UMP 組埠的區別在於 UMP 端點埠傳送來自裝置上所有埠的事件(“全捕獲”),而每個 UMP 組埠僅傳送來自給定 UMP 組的事件。此外,無組 UMP 訊息(如 UMP 訊息型別 0x0f)僅傳送到 UMP 端點埠。

請注意,儘管每個 UMP sequencer 客戶端通常建立 16 個埠,但那些不屬於任何 UMP 塊(或屬於非活躍 UMP 塊)的埠被標記為非活躍,它們不會出現在 proc 輸出中。在上面的示例中,sequencer 埠 4 到 16 存在但未顯示在那裡。

上面的 proc 檔案也顯示了 UMP 塊資訊。在 rawmidi proc 輸出中可以找到相同的條目(但有更詳細的資訊)。

當客戶端在不同的 MIDI 版本之間連線時,事件會根據客戶端的版本自動轉換,不僅在傳統和 UMP MIDI 1.0/2.0 型別之間,還在 UMP MIDI 1.0 和 2.0 型別之間進行轉換。例如,在傳統模式下執行 aseqdump 程式在 ProtoZOA 主埠上,將得到如下輸出:

% aseqdump -p 20:1
Waiting for data. Press Ctrl+C to end.
Source  Event                  Ch  Data
 20:1   Note on                 0, note 60, velocity 100
 20:1   Note off                0, note 60, velocity 100
 20:1   Control change          0, controller 11, value 4

當您在 MIDI 2.0 模式下執行 aseqdump 時,它將接收高精度資料,如下所示:

% aseqdump -u 2 -p 20:1
Waiting for data. Press Ctrl+C to end.
Source  Event                  Ch  Data
 20:1   Note on                 0, note 60, velocity 0xc924, attr type = 0, data = 0x0
 20:1   Note off                0, note 60, velocity 0xc924, attr type = 0, data = 0x0
 20:1   Control change          0, controller 11, value 0x2000000

同時資料由 ALSA sequencer 核心自動轉換。

Rawmidi API 擴充套件

  • 透過新的 ioctl SNDRV_UMP_IOCTL_ENDPOINT_INFO 可以獲取額外的 UMP 端點資訊。它包含關聯的卡和裝置號、位標誌、協議、UMP 塊的數量、端點的名稱字串等。

    協議在兩個欄位中指定:協議能力和當前協議。兩者都包含位標誌,用於在上位元組中指定 MIDI 協議版本(SNDRV_UMP_EP_INFO_PROTO_MIDI1SNDRV_UMP_EP_INFO_PROTO_MIDI2),並在下位元組中指定抖動減少時間戳(SNDRV_UMP_EP_INFO_PROTO_JRTS_TXSNDRV_UMP_EP_INFO_PROTO_JRTS_RX)。

    一個 UMP 端點最多可以包含 32 個 UMP 塊,當前分配的塊的數量顯示在端點資訊中。

  • 每個 UMP 塊的資訊可以透過另一個新的 ioctl SNDRV_UMP_IOCTL_BLOCK_INFO 獲取。需要傳遞塊 ID 號(基於 0)以查詢塊。接收到的資料包含關聯的塊方向、第一個關聯的組 ID(基於 0)和組的數量、塊的名稱字串等。

    方向可以是 SNDRV_UMP_DIR_INPUTSNDRV_UMP_DIR_OUTPUTSNDRV_UMP_DIR_BIDIRECTION

  • 對於支援 UMP v1.1 的裝置,可以透過“流配置請求”訊息(UMP 型別 0x0f,狀態 0x05)切換 UMP MIDI 協議。當 UMP 核心接收到此類訊息時,它會更新 UMP EP 資訊以及相應的 sequencer 客戶端。

  • 傳統 rawmidi 裝置號在 rawmidi 資訊的新的 tied_device 欄位中找到。另一方面,UMP rawmidi 裝置號也在傳統 rawmidi 資訊的 tied_device 欄位中找到。

  • 傳統 rawmidi 的每個子流都可以根據 UMP FB 狀態動態啟用/停用。當選定的子流處於非活動狀態時,它在傳統 rawmidi 資訊的 flags 欄位中由位 0x10(SNDRV_RAWMIDI_INFO_STREAM_INACTIVE)表示。

控制 API 擴充套件

  • 引入了新的 ioctl SNDRV_CTL_IOCTL_UMP_NEXT_DEVICE 用於查詢下一個 UMP rawmidi 裝置,而現有 ioctl SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE 僅查詢傳統 rawmidi 裝置。

    要設定要開啟的子裝置(子流號),請使用 ioctl SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE,就像正常的 rawmidi 一樣。

  • 兩個新的 ioctl SNDRV_CTL_IOCTL_UMP_ENDPOINT_INFOSNDRV_CTL_IOCTL_UMP_BLOCK_INFO 透過 ALSA control API 提供指定 UMP 裝置的 UMP 端點和 UMP 塊資訊,而無需開啟實際的 (UMP) rawmidi 裝置。card 欄位在查詢時被忽略,始終與控制介面的卡繫結。

Sequencer API 擴充套件

  • midi_version 欄位已新增到 snd_seq_client_info 中,用於指示每個客戶端當前的 MIDI 版本(0、1 或 2)。當 midi_version 為 1 或 2 時,從 UMP sequencer 客戶端讀取的對齊方式也從之前的 28 位元組更改為 32 位元組,以適應擴充套件的有效載荷。寫入的對齊大小不變,但每個事件的大小可能因以下新位標誌而異。

  • SNDRV_SEQ_EVENT_UMP 標誌位已新增到每個 sequencer 事件標誌中。當此位標誌設定時,sequencer 事件將擴充套件為具有 16 位元組而非傳統 12 位元組的更大有效載荷,並且事件在有效載荷中包含 UMP 資料包。

  • 新的 sequencer 埠型別位(SNDRV_SEQ_PORT_TYPE_MIDI_UMP)指示該埠支援 UMP。

  • sequencer 埠有新的能力位,用於指示非活動埠(SNDRV_SEQ_PORT_CAP_INACTIVE)和 UMP 端點埠(SNDRV_SEQ_PORT_CAP_UMP_ENDPOINT)。

  • ALSA sequencer 客戶端的事件轉換可以透過客戶端資訊中設定的新過濾位 SNDRV_SEQ_FILTER_NO_CONVERT 來抑制。例如,核心直通客戶端(snd-seq-dummy)在內部設定此標誌。

  • 埠資訊新增了 direction 欄位,用於指示埠的方向(SNDRV_SEQ_PORT_DIR_INPUTSNDRV_SEQ_PORT_DIR_OUTPUTSNDRV_SEQ_PORT_DIR_BIDIRECTION)。

  • 埠資訊的另一個附加欄位是 ump_group,它指定關聯的 UMP 組號(基於 1)。當它非零時,UMP 資料包中的 UMP 組欄位在傳遞到指定組時會更新(更正為基於 0)。如果每個 sequencer 埠是特定於某個 UMP 組的埠,則應設定此欄位。

  • 每個客戶端可以在 group_filter 點陣圖中設定 UMP 組的附加事件過濾器。該過濾器由基於 1 的組號的點陣圖組成。例如,當位 1 設定時,來自組 1(即第一個組)的訊息將被過濾且不被傳遞。位 0 用於過濾無組 UMP 訊息。

  • 為支援 UMP 的客戶端新增了兩個 ioctl:SNDRV_SEQ_IOCTL_GET_CLIENT_UMP_INFOSNDRV_SEQ_IOCTL_SET_CLIENT_UMP_INFO。它們用於獲取和設定與 sequencer 客戶端關聯的 snd_ump_endpoint_infosnd_ump_block_info 資料。USB MIDI 驅動程式從底層 UMP rawmidi 提供這些資訊,而使用者空間客戶端可以透過 *_SET ioctl 提供自己的資料。對於端點資料,將 0 傳遞給 type 欄位;對於塊資料,將塊號 + 1 傳遞給 type 欄位。為核心客戶端設定資料將導致錯誤。

  • 使用 UMP 1.1,功能塊資訊可能會動態更改。當從裝置接收到功能塊更新時,ALSA sequencer 核心會相應地更改相應的 sequencer 埠名稱和屬性,並透過向 ALSA sequencer 系統埠的通知來通知更改,類似於正常的埠更改通知。

  • 有兩種擴充套件事件型別用於透過系統通知埠通知 UMP 端點和功能塊更改:型別 68 (SNDRV_SEQ_EVENT_UMP_EP_CHANGE) 和型別 69 (SNDRV_SEQ_EVENT_UMP_BLOCK_CHANGE)。它們採用新的型別 snd_seq_ev_ump_notify 作為有效載荷,指示已更改的客戶端號和功能塊號。

MIDI2 USB Gadget 功能驅動程式

最新的核心包含對 USB MIDI 2.0 gadget 功能驅動程式的支援,可用於原型設計和除錯 MIDI 2.0 功能。

MIDI2 gadget 驅動程式需要啟用 CONFIG_USB_GADGETCONFIG_USB_CONFIGFSCONFIG_USB_CONFIGFS_F_MIDI2

此外,要使用 gadget 驅動程式,您需要一個工作的 UDC 驅動程式。在下面的示例中,我們使用在 PC 和 VM 上用於除錯目的的 dummy_hcd 驅動程式(透過 CONFIG_USB_DUMMY_HCD 啟用)。還有其他 UDC 驅動程式,取決於平臺,它們也可以用於真實裝置。

首先,在執行 gadget 的系統上,載入 libcomposite 模組:

% modprobe libcomposite

然後您將在 configfs 空間(通常是現代作業系統上的 /sys/kernel/config)下找到 usb_gadget 子目錄。然後建立一個 gadget 例項並在其中新增配置,例如:

% cd /sys/kernel/config
% mkdir usb_gadget/g1

% cd usb_gadget/g1
% mkdir configs/c.1
% mkdir functions/midi2.usb0

% echo 0x0004 > idProduct
% echo 0x17b3 > idVendor
% mkdir strings/0x409
% echo "ACME Enterprises" > strings/0x409/manufacturer
% echo "ACMESynth" > strings/0x409/product
% echo "ABCD12345" > strings/0x409/serialnumber

% mkdir configs/c.1/strings/0x409
% echo "Monosynth" > configs/c.1/strings/0x409/configuration
% echo 120 > configs/c.1/MaxPower

此時,必須存在一個子目錄 ep.0,這是 UMP 端點的配置。您可以填充端點資訊,例如:

% echo "ACMESynth" > functions/midi2.usb0/iface_name
% echo "ACMESynth" > functions/midi2.usb0/ep.0/ep_name
% echo "ABCD12345" > functions/midi2.usb0/ep.0/product_id
% echo 0x0123 > functions/midi2.usb0/ep.0/family
% echo 0x4567 > functions/midi2.usb0/ep.0/model
% echo 0x123456 > functions/midi2.usb0/ep.0/manufacturer
% echo 0x12345678 > functions/midi2.usb0/ep.0/sw_revision

預設 MIDI 協議可以設定為 1 或 2

% echo 2 > functions/midi2.usb0/ep.0/protocol

然後,您可以在此端點子目錄下找到一個子目錄 block.0。它定義了功能塊資訊:

% echo "Monosynth" > functions/midi2.usb0/ep.0/block.0/name
% echo 0 > functions/midi2.usb0/ep.0/block.0/first_group
% echo 1 > functions/midi2.usb0/ep.0/block.0/num_groups

最後,連結配置並啟用它

% ln -s functions/midi2.usb0 configs/c.1
% echo dummy_udc.0 > UDC

其中 dummy_udc.0 是一個示例,它會因系統而異。您可以在 /sys/class/udc 中找到 UDC 例項,並傳入找到的名稱代替:

% ls /sys/class/udc
dummy_udc.0

現在,MIDI 2.0 gadget 裝置已啟用,gadget 主機將透過 f_midi2 驅動程式建立一個包含 UMP rawmidi 裝置的新音效卡例項

% cat /proc/asound/cards
....
1 [Gadget         ]: f_midi2 - MIDI 2.0 Gadget
                     MIDI 2.0 Gadget

在連線的主機上,也應該出現類似的卡,但卡和裝置名稱是在上面的 configfs 中給出的

% cat /proc/asound/cards
....
2 [ACMESynth      ]: USB-Audio - ACMESynth
                     ACME Enterprises ACMESynth at usb-dummy_hcd.0-1, high speed

您可以在 gadget 端播放 MIDI 檔案

% aplaymidi -p 20:1 to_host.mid

這將顯示為連線主機上的 MIDI 裝置輸入

% aseqdump -p 20:0 -u 2

反之亦然,連線主機上的播放也會在 gadget 上作為輸入工作。

每個功能塊可以有不同的方向和 UI 提示,透過 directionui_hint 屬性指定。傳遞 1 表示僅輸入,2 表示僅輸出,3 表示雙向(預設值)。例如:

% echo 2 > functions/midi2.usb0/ep.0/block.0/direction
% echo 2 > functions/midi2.usb0/ep.0/block.0/ui_hint

當您需要多個功能塊時,可以動態建立子目錄 block.1block.2 等,並在連結之前在上述配置過程中對其進行配置。例如,為鍵盤建立第二個功能塊:

% mkdir functions/midi2.usb0/ep.0/block.1
% echo "Keyboard" > functions/midi2.usb0/ep.0/block.1/name
% echo 1 > functions/midi2.usb0/ep.0/block.1/first_group
% echo 1 > functions/midi2.usb0/ep.0/block.1/num_groups
% echo 1 > functions/midi2.usb0/ep.0/block.1/direction
% echo 1 > functions/midi2.usb0/ep.0/block.1/ui_hint

block.* 子目錄也可以動態刪除(block.0 除外,它是持久的)。

要為 MIDI 1.0 I/O 分配一個功能塊,請在 is_midi1 屬性中進行設定。1 表示 MIDI 1.0,2 表示低速連線的 MIDI 1.0。

% echo 2 > functions/midi2.usb0/ep.0/block.1/is_midi1

要停用 gadget 驅動程式中 UMP 流訊息的處理,請在頂級配置中將 0 傳遞給 process_ump 屬性

% echo 0 > functions/midi2.usb0/process_ump

altset 0 上的 MIDI 1.0 介面也受 gadget 驅動程式支援。當連線主機選擇 MIDI 1.0 介面時,gadget 上的 UMP I/O 會相應地從/轉換為 USB MIDI 1.0 資料包,而 gadget 驅動程式則透過 UMP rawmidi 與使用者空間保持通訊。

MIDI 1.0 埠根據每個功能塊中的配置設定。例如:

% echo 0 > functions/midi2.usb0/ep.0/block.0/midi1_first_group
% echo 1 > functions/midi2.usb0/ep.0/block.0/midi1_num_groups

上面的配置將為 MIDI 1.0 介面啟用組 1(索引 0)。請注意,這些組必須是為功能塊本身定義的組。

gadget 驅動程式也支援一個以上的 UMP 端點。與功能塊類似,您可以在卡頂層配置下建立新的子目錄 ep.1 來啟用新的端點

% mkdir functions/midi2.usb0/ep.1

並在那裡建立一個新的功能塊。例如,為這個新端點的功能塊建立 4 個組:

% mkdir functions/midi2.usb0/ep.1/block.0
% echo 4 > functions/midi2.usb0/ep.1/block.0/num_groups

現在,您總共將擁有 4 個 rawmidi 裝置:前兩個是用於端點 0 和端點 1 的 UMP rawmidi 裝置,另外兩個是與 EP 0 和 EP 1 對應的傳統 MIDI 1.0 rawmidi 裝置。

gadget 上的當前 altsetting 可以透過 RAWMIDI 介面的控制元素“Operation Mode”來獲取。例如,您可以透過在 gadget 主機上執行 amixer 程式來讀取它,如下所示:

% amixer -c1 cget iface=RAWMIDI,name='Operation Mode'
; type=INTEGER,access=r--v----,values=1,min=0,max=2,step=0
: values=2

該值(在返回的第二行中顯示為 : values=)表示 1 代表 MIDI 1.0 (altset 0),2 代表 MIDI 2.0 (altset 1),0 代表未設定。

目前,繫結後無法更改配置。