1

我想向我的 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 是在此处指定字节的正确方法吗?

4

1 回答 1

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);

In C++11 you can get closer to what you want by initializing the list in the function call, something like sendSysEx(10,{0xF0, 0x41, 0x36, 0x06, 0x21, 0x20, 0x01, 0x22, 0x1B, 0xF7}, true);, however, you'll find that might run into another problem (depending on your toolchain): the compiler may assume that your initializer lists like that are lists of ints, not bytes, which will also cause a compiler error, unless you specifically told your compiler to assume integer literals to be 8 bits.

于 2013-03-30T15:31:11.003 回答