首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Arduino发送MIDI SysEx消息?

用Arduino发送MIDI SysEx消息?
EN

Stack Overflow用户
提问于 2013-03-30 16:10:40
回答 1查看 4.2K关注 0票数 1

我想发送一个这样的MIDI SysEx消息到我的罗兰JX8P合成器。

F0 41 36 06 21 20 01 22 1B F7

该消息将改变合成器的VCF截止频率。1B是一个可变的十六进制值,范围从00到7F,相对于截止频率。

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

代码语言:javascript
复制
sendSysEx (int length, const byte *const array, bool ArrayContainsBoundaries=false)

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

我搞不懂的是数组。我可以像这样指定它们,而不是将所有的值都存储在数组中吗?

代码语言:javascript
复制
 MIDI.sendSysEx(10,0xF0 0x41 0x36 0x06 0x21 0x20 0x01 0x22 0x1B 0xF7,true);

另外,在这里添加前缀0x是指定字节的正确方式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 23:31:11

基本答案是“不”:

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

  • Length
  • The array of data
  • 数组是否包含边界的标志。这是可选的:如果省略它,该参数将被视为false

尝试像这样传递数组数据:

代码语言:javascript
复制
MIDI.sendSysEx(10,0xF0 0x41 0x36 0x06 0x21 0x20 0x01 0x22 0x1B 0xF7,true);

您正在做以下两件事之一:

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

因此,调用函数的一种方法如下所示:

代码语言:javascript
复制
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的列表,而不是byte的列表,这也会导致编译器错误,除非你特别告诉你的编译器假设整数字面量是8位。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15716446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档