void handleSysEx(const byte* sysExData, uint16_t sysExSize, bool complete){
uint8_t midiPort;
boolean isMackieControlMessage = true;
boolean isMackieControlXTMessage = true;
midiPort = usbMIDI.getCable();
switch (midiPort) {
// Logic Control Main on Port 0
case 0:
// compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control message
for (int i=0;i<5;i++) {
if (sysExData[i]!=sysExHeader[i]) {
isMackieControlMessage = false;
}
}
// handle mackie control message
if (isMackieControlMessage) {
boolean processMessage = true;
// handle different message types
switch (sysExData[5]) {
// respond to device query
case 0:
usbMIDI.sendSysEx(18, sysExHostConnectionQuery,true,0);
break;
// respond to host connection reply with connection confirmation
case 2:
usbMIDI.sendSysEx(14, sysExHostConnectionConfirmation,true,0);
break;
// respond to firmware version request
case 19:
usbMIDI.sendSysEx(12, sysExVersionReply,true,0);
break;
// handle LCD display update
case 18:
// get message text for determination of message type
for (int i=7;i<sysExSize-1;i++) {
messageText[i-7]= sysExData[i];
}
// check for page message
if (strncmp(pageMessageHeader,messageText,9)==0){
// ignore
processMessage=false;
}
// check for insert name message
else if (strstr(messageText,insertMessageHeader)){
//ignore
processMessage=false;
}
if (processMessage){
//update lcdText with message text
for (int i=7;i<sysExSize-1;i++) {
lcdTextR[sysExData[6]+i-7]= sysExData[i];
}
//if the update starts at position 0 check if plugin page can be identified
if (sysExData[6]==0){
checkPlugin();
}
updateStart = int(float(sysExData[6])/7.0);
updateEnd = updateStart + int((float(sysExSize-8))/7.0);
// loop through text fields and write 7 characters, only update fields that need to be updated
for (int i=updateStart;i<=updateEnd;i++){
char text[8];
for (int j=0;j<7;j++){
text[j]=lcdTextR[7*i+j];
}
displayText(text,i);
}
}
break;
// handle LED display update
case 16:
// update led display
for (int i=7;i<sysExSize-1;i++) {
ledText[9-(sysExData[6]+i-7)]= sysExData[i];
}
// null terminate string for 4D string object
ledText[10]='\0';
//displayL.WriteStr(23,ledText);
break;
case 97:
//faders to minimum
break;
case 98:
//all leds off
break;
case 99:
//reboot in offline mode
break;
default:
// statements
break;
}
}
break;
// Logic Control XT on Port 1
case 1:
// compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control XT message
for (int i=0;i<5;i++) {
if (sysExData[i]!=sysExHeaderXT[i]) {
isMackieControlXTMessage = false;
}
}
// handle mackie control message
if (isMackieControlXTMessage) {
boolean processMessage = true;
// handle different message types
switch (sysExData[5]) {
// respond to device query
case 0:
usbMIDI.sendSysEx(18, sysExHostConnectionQueryXT,true,1);
break;
// respond to host connection reply with connection confirmation
case 2:
usbMIDI.sendSysEx(14, sysExHostConnectionConfirmationXT,true,1);
break;
// respond to firmware version request
case 19:
usbMIDI.sendSysEx(12, sysExVersionReplyXT,true,1);
break;
// handle LCD display update
case 18:
// get message text for determination of message type
for (int i=7;i<sysExSize-1;i++) {
messageText[i-7]= sysExData[i];
}
// check for page message
if (strncmp(pageMessageHeader,messageText,9)==0){
// ignore
processMessage=false;
}
// check for insert name message
else if (strstr(messageText,insertMessageHeader)){
//ignore
processMessage=false;
}
if (processMessage){
//update lcdText with message text
for (int i=7;i<sysExSize-1;i++) {
lcdTextL[sysExData[6]+i-7]= sysExData[i];
}
//if the update starts at position 0 check if plugin page can be identified
if (sysExData[6]==0){
checkPlugin();
}
updateStart = int(float(sysExData[6])/7.0);
updateEnd = updateStart + int((float(sysExSize-8))/7.0);
// loop through text fields and write 7 characters, only update fields that need to be updated
for (int i=updateStart;i<=updateEnd;i++){
char text[8];
for (int j=0;j<7;j++){
text[j]=lcdTextL[7*i+j];
}
displayText(text,i);
}
}
break;
// handle LED display update
case 16:
// no led display on XT unit
break;
case 97:
//faders to minimum
break;
case 98:
//all leds off
break;
case 99:
//reboot in offline mode
break;
default:
// statements
break;
}
}
break;
// Synth control on Port 2
case 2:
// nothing yet
break;
default:
// ignore sysExData
break;
}
}