在ALSA MIDI SysEx交换机上进行双向嗅探/窥探

时间:2012-04-18 23:17:57

标签: linux midi alsa wine sniffing

有没有人知道在Linux上双向转储MIDI SysEx数据的好方法? (在雅马哈PSR-E413 MIDI键盘和运行在Wine中的Yamaha MusicSoft Downloader副本之间)

我想对用于将MIDI文件复制到键盘内部存储器的协议进行反向工程,为此,我需要对两者之间的有效交换进行一些记录。

该实用程序在Wine(with a little nudging)中有效,但我不想在使用FUSE文件系统时依赖Wine中廉价,无法编写脚本的应用程序。

以下是目前的状况:

  • 我的键盘通过内置USB-MIDI桥连接到我的电脑。 USB转储器/窥探器是可能的,但我希望尽可能避免使用它们。我甚至不想在开始之前解码另一层协议编码。
  • 我只运行Linux。但是,如果除了基于Windows的dumper / snooper之外没有其他选择,我可以尝试在我的WinXP VirtualBox VM上运行USB 1.1传递。
  • 我使用dmix为我的音频系统运行裸ALSA以进行波形音频混合。
    • 如果需要声音服务器,我愿意尝试使用JACK。
    • 请不要PulseAudio。花了很长时间才从我的系统中删除它。
  • 如果该过程涉及ALSA MIDI路由:
    • 我可以选择从Downloader内部选择的虚拟直通设备,因为它通常只会在开始与键盘通信之前的瞬间出现在patchage之类的ALSA补丁托架GUI中。
    • 就我所知,KMIDIMonGMIDIMonitor都不支持双向窥探。
    • virmidi isn't relevant我无法让snd-seq-dummy工作。
  • 我想我可以修补ALSA以获得转储,如果我真的必须,但它确实是最后的选择。
    • 我的绝大多数编程经验都是Python,PHP,Javascript和shell脚本。
    • 我几乎没有使用C编程的经验。
    • 我从未见过内核模式代码的一瞥。
    • 我更喜欢保持系统稳定和正常运行时间。

4 个答案:

答案 0 :(得分:4)

这个问题已经有一段时间没有答案了,虽然我对你的问题没有一个确切的答案,但我可能有一些东西可以推动你朝着正确的方向(或者也许是其他有类似问题的人)。

当我想要嗅探用于在Akai LPK25 MIDI键盘上设置和读取预设的数据时,我有一个类似但不那么复杂的问题。与您的设置类似,设置键盘的软件可以在Wine中运行,但我也没有找到Linux的嗅探器设置。

由于缺乏现有的解决方案,我使用ALSA MIDI路由在virmidi端口上自行编写。我明白为什么你认为它们毫无用处,因为没有额外的软件它们无法帮助嗅探MIDI流量。

我的解决方案是用Java编程MIDI继电器/桥接器,我从virmidi端口读取输入,显示数据并将其进一步发送到键盘。键盘的答案(如果有的话)也被读取,显示并最终传回virmidi端口。 Wine中的应用程序可以设置为使用virmidi端口进行通信,理论上这个过程是完全透明的(潜在的延迟问题除外)。应用程序以通用方式编写,而不是硬编码到我的问题。

我只处理大约20字节长度的SysEx消息,因此我不确定该软件在嗅探大量数据传输方面的效果如何。但也许您可以按照示例修改它/编写自己的程序。

此处提供的来源:https://github.com/hiben/MIDISpy

(Java 1.6,包含ant构建文件,源代码为BSD许可证)

答案 1 :(得分:0)

答案 2 :(得分:0)

您可以为此目的使用虚拟Midi设备。因此,您必须加载snd_seq_dummy,以便它创建至少两个端口:

    $ sudo modprobe -r snd_seq_dummy
    $ sudo modprobe snd_seq_dummy ports=1 duplex=1

然后,您应该拥有一个名为Midi through的设备:

    $ aconnect -i -o -l
    client 0: 'System' [type=kernel]
        0 'Timer           '
        1 'Announce        '
    client 14: 'Midi Through' [type=kernel]
        0 'Midi Through Port-0:A'
        1 'Midi Through Port-0:B'
    client 131: 'VMPK Input' [type=user,pid=50369]
        0 'in              '
    client 132: 'VMPK Output' [type=user,pid=50369]
        0 'out             '

在此示例中,我将使用端口号和设备号。您必须根据设置自己检查它们。

现在您将喜爱的MIDI设备插入Midi Through端口:

    $ aconnect 132:0 14:0
    $ aconnect 14:0 131:0

这时您具有一个连接,可以同时在两个设备上进行监视。您可以使用aseqdump监视MIDI对话。有不同的可能性。我建议监视回送设备和真实设备之间的连接。这使您可以将Rawmidi连接到回送设备。

    $ aseqdump -p 14:0,132:0 | tee dump.log

现在所有内容都可以使用了。您只需要注意MIDI应用程序中的端口名。它应该从Midi Through Port-0:B读取MIDI数据,并将数据写入Midi Through Port-0:B

一些其他提示:您可以使用图形前端patchage通过拖放来连接和检查MIDI连接。如果这样做,您将看到每个Midi Through端口出现两次作为输入,一次出现作为输出。两者都必须连接才能使此设置正常工作。

如果您要使用GMidiMonitor或其他应用程序,则可以使用aconnect监视两个混合在一起的流(不显示方向),假设129:0Midi Monitor端口:

    $ aconnect 14:0 129:0
    $ aconnect 132:0 129:0

如果要获得确切的方向信息,可以添加另一个仅连接到其中一个端口的GMidiMonitor实例。丢失的消息来自另一个端口。

答案 3 :(得分:-1)

使用gmidimonitor怎么样?见http://home.gna.org/gmidimonitor/