如何将 MIDI 原始数据发送到 MIDI 设备节点?

如何将 MIDI 原始数据发送到 MIDI 设备节点?

背景和实验

我有一个虚拟 MIDI 设备,如卡 #1,名为VirMIDI。有关联的 ALSA 音序器客户端(非原始 MIDI),至于Virtual Raw MIDI 1-0Virtual Raw MIDI 1-3有设备节点/dev/snd/midiC1D0/dev/snd/midiC1D3

一个软件 MIDI 键盘连接到Virtual Raw MIDI 1-0,一个声音字体合成器连接到hw:VirMIDI,0

当我弹奏软件键盘时,会有声音(只是为了检查它是否正常)。

我可以使用cat设备节点:如果我执行cat /dev/snd/midiC1D0 >data.bin并弹奏软件键盘,则文件data.bin将充满原始 MIDI 事件,并且合成器将播放声音(它和cat接收事件)。

但是,如果我稍后cat data.bin >/dev/snd/midiC1D0什么都不做:没有错误,也没有声音,合成器就不会收到任何 MIDI 事件。

它看起来似乎只适用于读取访问,但写入不会触发错误并且似乎什么也不做。

如果这很重要的话,尽管不是对设备节点的正确访问,但amidi -p hw:1,0 -s data.bin也不会执行任何操作,而amidi -p hw:1,0 -r data.bin行为却符合预期。

问题

如何向 MIDI 设备节点写入数据/dev/snd/midiCnDn并达到预期效果,就像从同一个 MIDI 设备节点读取数据一样?还是只能用于读取?

答案1

VirMIDI驱动程序设计为访问 RawMIDI 设备(实际上是 OSS 设备/dev/midi*)和 ALSA 音序器客户端的程序之间的接口。
在原始 MIDI 设备(hw:1,*/dev/*)处收到的所有内容都会发送到音序器端口。
在音序器端口(Virtual Raw MIDI 1-*)处收到的所有内容都会发送到原始 MIDI 设备。

要连接多个原始 MIDI 设备,您需要通过多个音序器端口:

+-------+       +--------+----------------------+
| synth |  <--  | hw:1,0 | Virtual Raw MIDI 1-0 |  <-+
+-------+       +--------+----------------------+    |
                                                     |aconnect
+-----+         +--------+----------------------+    |
| cat |    -->  | hw:1,1 | Virtual Raw MIDI 1-1 |  --+
+-----+         +--------+----------------------+

相关内容