USB midi 协议理解

Posted

技术标签:

【中文标题】USB midi 协议理解【英文标题】:USB midi protocol understanding 【发布时间】:2015-12-20 17:28:39 【问题描述】:

我有一个带有 USB MIDI 接口的声音处理器设备。除了官方应用程序到设备之外,我还想从我的 PC 控制设备。但是我没有命令协议描述。 在 usbmon 的帮助下,我可以设法将几个 USB 数据包转储到设备上。他们看着像是: 0x0B 0xB0 0x00 0x00 0x0C 0xC0 0x05 0x00

如果我从我的应用程序发送此命令,则设备会激活程序 5。

该协议似乎是 MIDI,但如果我遵循它并尝试与设备的其他功能交互,我不会得到想要的结果。

所以,我正在寻求任何帮助以使其正常工作。例如,我需要学习如何选择效果或控制音量和其他参数。

问候, 德米特里

【问题讨论】:

您想使用哪个操作系统?设备不是显示为 MIDI 端口吗? 那是Linux。我不确定它是否被识别,操作系统非常有限。我更愿意在我的用户应用程序中使用协议级别的低级别访问,以减少对操作系统的依赖。 它是否出现在amidi -l 的输出中?如果没有,则显示此设备的lsusb -v 的输出。 “有限”是什么意思? USB MIDI 驱动程序是内核的一部分。 amidi -l 显示一个空行(带标题) 【参考方案1】:

您可以在 Universal Serial Bus Device Class Definition for MIDI Devices 和 MIDI 规范中找到您需要的内容。

您的示例由两个数据包组成,每个数据包都包含一个 MIDI 事件。它们可以解码如下:

cable: 0
event: control change
channel number: 0
controller number: 0 (bank select)
controller value: 0

cable: 0
event: program change
channel number: 0
program number: 5

【讨论】:

是的,非常感谢您的快速答复。你的解释是完全正确的。我已经从规范开始解码命令。但是,如果我想设置主音量的某个值,我无法从规范中获得如何构建命令。据我了解,它应该看起来像 0x0c 0x07 0xXX 0x00。但是我的设备做错了,而是将音量设置为 XX。我是否正确地发送了消息,或者我需要在它之前发送另一条消息?再次非常感谢!!! 感谢您的提示。我只是尝试将此消息发送到设备,但没有看到任何反应...音量仍保持在其旧值。也许我需要在这个之后再发送一些事件? 换句话说。我是否理解正确,消息 0x0B 0xB0 0x07 0xXX 应该立即导致一些变化,或者它需要按照我原来的顺序发送任何额外的消息? 这是改变频道音量的正确方法。您的设备(无论是什么设备)是否对此消息做出反应是另一个问题。 哦,我从另一方面问,只是为了更好地理解协议序列。如果我需要使用某个踏板进行操作。是不是我理解对了,用命令0x0B 0xB0 0x04 0xXX我只会选择某个Pedal控制器,然后我需要使用Program Change事件来操作某个Pedal?【参考方案2】:

Zoom G3X 设备使用standard USB MIDI protocol。

但是,仅仅因为它使用 MIDI 消息并不能自动暗示您知道这些消息的含义。 还有其他标准,例如通用 MIDI,但是当设备不是“普通”合成器而是效果处理器时,大多数标准消息都没有意义。

要了解设备接受哪些 MIDI 消息,请查看文档。

如果消息没有被记录(例如在这种情况下,设备只能与提供的软件一起使用),您必须在设备上进行更改,并记录它发出的任何 MIDI 消息 ( amidi --dumpaseqdump)。

如果设备没有发送消息来显示其当前状态的变化,您必须使用 USB 监视器捕获官方应用程序发送的消息(如 Linux 中的usbmon)。

【讨论】:

以上是关于USB midi 协议理解的主要内容,如果未能解决你的问题,请参考以下文章

USB通信协议深入理解

(转)USB协议简介

USB 上可接受的 MIDI 带宽是多少?

使用 QT 通过 USB 发送 midi 消息

从 Arduino Yun 上的 USB 接口获取 MIDI 音符

Windows 10 上的 USB-MIDI 驱动程序