背景和实验
我有一个虚拟 MIDI 设备,如卡 #1,名为VirMIDI
。有关联的 ALSA 音序器客户端(非原始 MIDI),至于Virtual Raw MIDI 1-0
。Virtual 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 | --+
+-----+ +--------+----------------------+