使用 Arduino 发送 MIDI SysEx 消息?

Posted

技术标签:

【中文标题】使用 Arduino 发送 MIDI SysEx 消息?【英文标题】:Sending MIDI SysEx messages with the Arduino? 【发布时间】:2013-03-30 08:10:39 【问题描述】:

我想向我的 Roland JX8P 合成器发送这样的 MIDI SysEx 消息。

F0 41 36 06 21 20 01 22 1B F7

此消息将更改合成器的 VCF 截止频率。 1B 是一个可变的十六进制值,相对于截止频率在 00 到 7F 之间摆动。

在 MIDI 库中,我找到了发送 SysEx 消息的文档。

sendSysEx (int length, const byte *const array, bool ArrayContainsBoundaries=false)

据我所知,bool ArrayContainsBoundaries 指定您是否希望库包含 F0 和 F7 消息开始/停止标记(我不这样做,所以我将其设置为 true)。 int length 以字节为单位表示消息长度(我的消息是 10 个字节,所以这将是 10)。

我感到困惑的是数组。我可以像这样指定它们而不是存储数组中的所有值吗?

 MIDI.sendSysEx(10,0xF0 0x41 0x36 0x06 0x21 0x20 0x01 0x22 0x1B 0xF7,true);

另外,添加前缀 0x 是在此处指定字节的正确方法吗?

【问题讨论】:

您想发送以十六进制表示形式指定的字节吗?在这种情况下,是的,添加“0x”前缀就是你想要的。 是的,目前编译器声明没有匹配函数调用 'MIDI_Class::sendSysEx(int, int, int, int, int, int, int, int, int, int,整数,整数)' 【参考方案1】:

基本答案是“不”:

您的sendSysEx() 函数正在寻找两个或三个参数:

长度 数据数组 数组是否包含边界的标志。这是可选的:如果您省略它,该参数将被视为 false

通过尝试像这样传递您的数组数据:

MIDI.sendSysEx(10,0xF0 0x41 0x36 0x06 0x21 0x20 0x01 0x22 0x1B 0xF7,true);

你正在做两件事之一:

如上所述,这只是一个语法错误:编译器不知道如何解析没有任何分隔的数字文字列表。 如果您用逗号分隔项目,编译器会说“哦,他传递了 12 个参数。让我找一个接受 12 个整数参数的函数……哦,我没有。抱歉。”这会导致您的 no matching function for call to 错误。

所以,调用函数的一种方法是这样的:

byte data[] =  0xF0, 0x41, 0x36, 0x06, 0x21, 0x20, 0x01, 0x22, 0x1B, 0xF7 ;
sendSysEx(10, data, true);

在 C++11 中,您可以通过在函数调用中初始化列表来接近您想要的,例如 sendSysEx(10,0xF0, 0x41, 0x36, 0x06, 0x21, 0x20, 0x01, 0x22, 0x1B, 0xF7, true);,但是,您会发现可能会遇到另一个问题(取决于您的工具链):编译器可能会假设您的初始化列表是 ints 的列表,而不是 bytes 的列表,这也会导致编译器错误,除非您明确告诉编译器假设整数文字为 8 位。

【讨论】:

以上是关于使用 Arduino 发送 MIDI SysEx 消息?的主要内容,如果未能解决你的问题,请参考以下文章

MIDI 蓝牙 LE、SYSEX 消息不完整

Alesis QS MIDI Sysex 数据转换

为啥 Arduino Midi 库将十六进制 F7 读取为 0

SysEx 不会发送字节“AD”

如何从音量级别创建 MIDI Sysex Master Volume 消息?

Audiokit 似乎只接收前三个 sysex MIDI 消息