【问题标题】:Bi-directional sniffing/snooping on an ALSA MIDI SysEx exchangeALSA MIDI SysEx 交换上的双向嗅探/窥探
【发布时间】:2012-04-30 11:03:12
【问题描述】:

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

我想对用于在键盘内存中复制 MIDI 文件的协议进行逆向工程,为此,我需要记录两者之间的有效交换。

该实用程序确实可以在 Wine (with a little nudging) 中使用,但是当我可以使用 FUSE 文件系统时,我不想在 Wine 中依赖廉价、不可编写脚本的应用程序。

这是目前的情况:

  • 我的键盘通过内置的 USB-MIDI 桥连接到我的 PC。 USB dumpers/snoopers 是可能的,但如果可能的话,我宁愿避免它们。在开始之前,我不想再解码一层协议编码。
  • 我只运行 Linux。但是,如果除了基于 Windows 的 dumper/snooper 之外别无选择,我可以尝试让 USB 1.1 直通在我的 WinXP VirtualBox VM 上运行。
  • 我为我的音频系统运行裸 ALSA,并使用 dmix 进行波形音频混合。
    • 如果需要声音服务器,我愿意尝试 JACK。
    • 请不要使用 PulseAudio。从我的系统中删除它需要很长时间。
  • 如果过程涉及 ALSA MIDI 路由:
    • 我可以从下载器中选择一个虚拟直通设备是首选,因为它通常只在它开始与键盘通信之前的瞬间出现在像 patchage 这样的 ALSA 补丁托架 GUI 中。
    • 据我所知,KMIDIMonGMIDIMonitor 都不支持双向监听。
    • virmidi isn't relevant 我还没有设法让 snd-seq-dummy 工作。
  • 我想如果我真的必须的话,我可以修补 ALSA 以获取转储,但这确实是不得已而为之的选择。
    • 我的绝大多数编程经验是 Python、PHP、Javascript 和 shell 脚本。
    • 我几乎没有 C 编程经验。
    • 我什至从未见过内核模式代码。
    • 我希望保持系统稳定并延长正常运行时间。

【问题讨论】:

    标签: linux midi alsa wine sniffing


    【解决方案1】:

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

    当我想嗅探用于在 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 许可下)

    【讨论】:

    • 谢谢。一旦我不再因刚刚开始新学期的课程而不知所措,我会尝试一下。
    【解决方案2】:

    我喜欢为此使用aseqdump

    http://www.linuxcommand.org/man_pages/aseqdump1.html

    【讨论】:

    • 那个手册页并没有给我的印象是它可以双向窥探。
    【解决方案3】:

    您可以为此使用虚拟 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 实例,该实例仅连接到其中一个端口。丢失的消息来自另一个端口。

    【讨论】:

    • 这不起作用,因为 14:0 直通输出将所有内容复制到 14:1 输入,并且由于 aconnect 132:0 14:0 将 132:0 复制到 14:0,因此 aseqdump -p 14 :1,132:0 记录所有内容两次,首先从 132:0 开始,然后从 14:1 开始。
    • 工作原理:使用常规的 snd_seq_dummy(没有 duplex=1)、aconnect 14:0 131:0、aseqdump -p 14:0,132:0,并使相关应用程序从 132:0 读取并写信到 14:0。
    • 您至少需要两个通道,这就是我使用 duplex=1 的原因。在复杂的 MIDI 设置中可能更容易,因为它标记了对。不知何故,我错过了双工端口象征着交叉的 MIDI 电缆。我在答案中解决了这个问题。
    • 谢谢!现在它按原样工作。不过双工不是必需的,因为不是将 132:0 连接到 14:0 并让相关应用程序从 14:1 读取此流,而是可以直接从 132:0 读取。这使得 14:0 到 14:1 互连完全未被使用。
    • 你是对的。我只是认为即使使用 RawMidi 访问,我的想法也会起作用。但它没有(参见例如stackoverflow.com/questions/60950252/…),因为 aconnect 使用音序器接口,这可能会丢弃部分 MIDI 消息。
    【解决方案4】:

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

    【讨论】:

    • 正如它在问题中所说的那样,“据我所知,KMIDIMon 和 GMIDIMonitor 都不支持双向窥探。”
    • 应用程序是否支持双向或仅单向间谍(至少在某些情况下)并不重要,请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2021-01-09
    相关资源
    最近更新 更多