///Axe-FX III Reader Rev04
///Test SysEx to query Preset and Scene names
// Debug version.
///M.Guerrero 28-Aug-2018
#include <MIDI.h>
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
char PresetName[32];
char SceneName1[32];
char SceneName2[32];
char SceneName3[32];
char SceneName4[32];
char SceneName5[32];
char SceneName6[32];
char SceneName7[32];
char SceneName8[32];
int SceneCounter = 0;
uint16_t length;
const uint8_t * data_p;
byte QueryPresetName[10] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0D, 0x7F, 0x7F, 0x18, 0xF7};
// Returns: F0 00 01 74 10 0D dd dd dd … cs F7; where dd dd dd … is 32 characters of name.
byte QuerySceneName1[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x00, 0x1B, 0xF7};
byte QuerySceneName2[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x01, 0x1A, 0xF7};
byte QuerySceneName3[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x02, 0x19, 0xF7};
byte QuerySceneName4[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x03, 0x18, 0xF7};
byte QuerySceneName5[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x04, 0x1F, 0xF7};
byte QuerySceneName6[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x05, 0x1E, 0xF7};
byte QuerySceneName7[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x06, 0x1D, 0xF7};
byte QuerySceneName8[9] = {0xF0, 0x00, 0x01, 0x74, 0x10, 0x0E, 0x07, 0x1C, 0xF7};
// Returns: F0 00 01 74 10 0E dd dd dd … cs F7; where dd dd dd … is 32 characters of name
unsigned long timing = 0;
void setup() {
Serial.begin(115200);
MIDI.begin(0);
MIDI.turnThruOff();
Serial.println ("Axe-FX III SysEx Requests debug start");
MIDI.setHandleSystemExclusive(HandleSysEx);
}
void loop() {
MIDI.read(); //Now this is being called VERY often, since the loop hardly does anything else ;-)
//This is supposed to be a substitute for delay(1000) which doesn't interrupt the loop.
if (millis() - timing > 10000) {
SceneCounter = 1;
MIDI.sendSysEx(10, QueryPresetName);
MIDI.sendSysEx(9, QuerySceneName1);
MIDI.sendSysEx(9, QuerySceneName2);
MIDI.sendSysEx(9, QuerySceneName3);
MIDI.sendSysEx(9, QuerySceneName4);
MIDI.sendSysEx(9, QuerySceneName5);
MIDI.sendSysEx(9, QuerySceneName6);
MIDI.sendSysEx(9, QuerySceneName7);
MIDI.sendSysEx(9, QuerySceneName8);
Serial.println("----------------------");
timing = millis();
}
}
void HandleSysEx(byte *SysExArray, unsigned int size) {
length = MIDI.getSysExArrayLength();
const byte *sys = MIDI.getSysExArray();
if(SysExArray[5]==0x0D) { // 0DE = Identifier for Preset Name
data_p = MIDI.getSysExArray();
// for (uint16_t idx = 0; idx < length; idx++)
// {
// Serial.print(data_p[idx], HEX);
// Serial.print(" ");
// }
// Serial.println();
Serial.print("Preset Name: ");
for(byte i = 0x00; i < 0x1F; i++) { // parse Preset Name name from sysex data
PresetName[i] = data_p[i + 6];
Serial.print (PresetName[i]);
}
Serial.println("");
}
if(SysExArray[5]==0x0E) { // 0E = Identifier for Scene Name
data_p = MIDI.getSysExArray();
// for (uint16_t idx = 0; idx < length; idx++)
// {
// Serial.print(data_p[idx], HEX);
// Serial.print(" ");
// }
// Serial.println();
Serial.print("Scene ");Serial.print(SceneCounter);Serial.print(": ");
for(byte i = 0x00; i < 0x1F; i++) { // parse SceneName1 name from sysex data
SceneName1[i] = data_p[i + 6];
Serial.print (SceneName1[i]);
}
Serial.println("");
SceneCounter = SceneCounter + 1;
}
}