使用 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()
函数正在寻找两个或三个参数:
通过尝试像这样传递您的数组数据:
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);
,但是,您会发现可能会遇到另一个问题(取决于您的工具链):编译器可能会假设您的初始化列表是 int
s 的列表,而不是 byte
s 的列表,这也会导致编译器错误,除非您明确告诉编译器假设整数文字为 8 位。
【讨论】:
以上是关于使用 Arduino 发送 MIDI SysEx 消息?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Arduino Midi 库将十六进制 F7 读取为 0