2013-03-30 88 views
1

我想發送這樣的MIDI系統信息給我的Roland JX8P Synth。用Arduino發送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) 

從我可以告訴布爾ArrayContainsBoundaries指定您是否希望庫包括F0和F7消息開始/停止標籤(我不這樣我將它設置爲true)。 Int長度表示消息長度(以字節爲單位)(我的消息是10個字節,所以這將是10)。

我很困惑的是數組。而不是將所有的值存儲在數組中,我可以像這樣指定它們嗎?

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

另外,在這裏添加前綴0x正確的方式來指定字節?

+0

你想發送由他們的十六進制表示指定的字節?在這種情況下,是的,添加「0x」前綴是你想要的。 – 2013-03-30 08:18:35

+0

是的,我現在編譯器指出沒有匹配函數調用'MIDI_Class :: sendSysEx(int,int,int,int,int,int,int,int,int,int,int)' – blarg

回答

3

最基本的答案是「不」:

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位。