使用Arduino发送MIDI SysEx消息?

时间:2013-03-30 08:10:40

标签: arduino midi

我想将这样的MIDI SysEx消息发送给我的Roland JX8P Synth。

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是指定字节的正确方法吗?

1 个答案:

答案 0 :(得分:3)

基本答案是“不”:

您的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);,但是,您会发现可能遇到另一个问题(取决于您的工具链) ):编译器可能会假设您的初始化程序列表是int s,而不是byte的列表,这也会导致编译器错误,除非您明确告诉编译器假设整数文字是8位。