|
|
|
@ -33,9 +33,8 @@ extern config_t configuration; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// override default sysex size settings
|
|
|
|
|
struct MicroDexedSettings : public midi::DefaultSettings |
|
|
|
|
{ |
|
|
|
|
static const unsigned SysExMaxSize = 4104; // Accept SysEx messages up to 1024 bytes long.
|
|
|
|
|
struct MicroDexedSettings : public midi::DefaultSettings { |
|
|
|
|
static const unsigned SysExMaxSize = 4104; // Accept SysEx messages up to 1024 bytes long.
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
@ -71,38 +70,37 @@ void MD_sendControlChange(uint8_t channel, uint8_t cc, uint8_t value); |
|
|
|
|
#define MIDI_BY_USB_HOST "MIDI_USB_HOST" |
|
|
|
|
#define MIDI_BY_USB "USB_MIDI" |
|
|
|
|
|
|
|
|
|
void handle_generic(byte inChannel, byte inData1, byte inData2, const char *midi_device, midi::MidiType event) |
|
|
|
|
{ |
|
|
|
|
void handle_generic(byte inChannel, byte inData1, byte inData2, const char *midi_device, midi::MidiType event) { |
|
|
|
|
char text[10]; |
|
|
|
|
|
|
|
|
|
switch(event) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::NoteOn: |
|
|
|
|
handleNoteOn(inChannel, inData1, inData2); |
|
|
|
|
strlcpy(text, "NoteOn",sizeof(text)); |
|
|
|
|
strlcpy(text, "NoteOn", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::NoteOff: |
|
|
|
|
handleNoteOff(inChannel, inData1, inData2); |
|
|
|
|
strlcpy(text, "NoteOff",sizeof(text)); |
|
|
|
|
strlcpy(text, "NoteOff", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::ControlChange: |
|
|
|
|
handleControlChange(inChannel, inData1, inData2); |
|
|
|
|
strlcpy(text, "CC",sizeof(text)); |
|
|
|
|
strlcpy(text, "CC", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::AfterTouchChannel: |
|
|
|
|
handleAfterTouch(inChannel, inData1); |
|
|
|
|
strlcpy(text, "Mono AT",sizeof(text)); |
|
|
|
|
strlcpy(text, "Mono AT", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::PitchBend: |
|
|
|
|
handlePitchBend(inChannel, inData1); |
|
|
|
|
strlcpy(text, "PB",sizeof(text)); |
|
|
|
|
strlcpy(text, "PB", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::ProgramChange: |
|
|
|
|
handleProgramChange(inChannel, inData1); |
|
|
|
|
strlcpy(text, "PC",sizeof(text)); |
|
|
|
|
strlcpy(text, "PC", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::AfterTouchPoly: |
|
|
|
|
handleAfterTouchPoly(inChannel, inData1, inData2); |
|
|
|
|
strlcpy(text, "Poly AT",sizeof(text)); |
|
|
|
|
strlcpy(text, "Poly AT", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
@ -112,11 +110,10 @@ void handle_generic(byte inChannel, byte inData1, byte inData2, const char *midi |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// MIDI THRU
|
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) |
|
|
|
|
{ |
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) { |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
if(strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
switch(event) { |
|
|
|
|
if (strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::NoteOn: |
|
|
|
|
usbMIDI.sendNoteOn(inData1, inData2, inChannel); |
|
|
|
|
break; |
|
|
|
@ -141,15 +138,15 @@ void handle_generic(byte inChannel, byte inData1, byte inData2, const char *midi |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
if(strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
switch(event) { |
|
|
|
|
if (strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::NoteOn: |
|
|
|
|
midi_serial.sendNoteOn(inData1, inData2, inChannel); |
|
|
|
|
break; |
|
|
|
@ -174,15 +171,15 @@ void handle_generic(byte inChannel, byte inData1, byte inData2, const char *midi |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_DIN")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
if(strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
switch(event) { |
|
|
|
|
if (strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::NoteOn: |
|
|
|
|
midi_usb.sendNoteOn(inData1, inData2, inChannel); |
|
|
|
|
break; |
|
|
|
@ -207,9 +204,9 @@ void handle_generic(byte inChannel, byte inData1, byte inData2, const char *midi |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB_HOST")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
@ -226,32 +223,31 @@ void handleSystemExclusive_generic(byte *data, uint len, const char *midi_device |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// MIDI THRU
|
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) |
|
|
|
|
{ |
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) { |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
if(strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
usbMIDI.sendSysEx(len, data); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB")); |
|
|
|
|
#endif |
|
|
|
|
if (strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
usbMIDI.sendSysEx(len, data); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB")); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
if(strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
midi_serial.sendSysEx(len, data); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_DIN")); |
|
|
|
|
#endif |
|
|
|
|
if (strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
midi_serial.sendSysEx(len, data); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_DIN")); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
if(strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
midi_usb.sendSysEx(len, data); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB_HOST")); |
|
|
|
|
#endif |
|
|
|
|
if (strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
midi_usb.sendSysEx(len, data); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB_HOST")); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
@ -261,22 +257,21 @@ void handleSystemExclusive_generic(byte *data, uint len, const char *midi_device |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::MidiType event) |
|
|
|
|
{ |
|
|
|
|
void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::MidiType event) { |
|
|
|
|
char text[10]; |
|
|
|
|
|
|
|
|
|
switch(event) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::TimeCodeQuarterFrame: |
|
|
|
|
handleTimeCodeQuarterFrame(inData1); |
|
|
|
|
strlcpy(text, "TimeCodeQuarterFrame",sizeof(text)); |
|
|
|
|
strlcpy(text, "TimeCodeQuarterFrame", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::SongSelect: |
|
|
|
|
handleSongSelect(inData1); |
|
|
|
|
strlcpy(text, "SongSelect",sizeof(text)); |
|
|
|
|
strlcpy(text, "SongSelect", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::TuneRequest: |
|
|
|
|
handleTuneRequest(); |
|
|
|
|
strlcpy(text, "TuneRequest",sizeof(text)); |
|
|
|
|
strlcpy(text, "TuneRequest", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
@ -286,11 +281,10 @@ void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::Mid |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// MIDI THRU
|
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) |
|
|
|
|
{ |
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) { |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
if(strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
switch(event) { |
|
|
|
|
if (strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::TimeCodeQuarterFrame: |
|
|
|
|
usbMIDI.sendTimeCodeQuarterFrame(0xF1, inData1); |
|
|
|
|
break; |
|
|
|
@ -303,15 +297,15 @@ void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::Mid |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
if(strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
switch(event) { |
|
|
|
|
if (strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::TimeCodeQuarterFrame: |
|
|
|
|
midi_serial.sendTimeCodeQuarterFrame(inData1); |
|
|
|
|
break; |
|
|
|
@ -324,15 +318,15 @@ void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::Mid |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_DIN")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
if(strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
switch(event) { |
|
|
|
|
if (strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::TimeCodeQuarterFrame: |
|
|
|
|
midi_usb.sendTimeCodeQuarterFrame(0xF1, inData1); |
|
|
|
|
break; |
|
|
|
@ -345,9 +339,9 @@ void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::Mid |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB_HOST")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
@ -357,34 +351,33 @@ void handleSystemCommon_generic(byte inData1, const char *midi_device, midi::Mid |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleRealtime_generic(const char *midi_device, midi::MidiType event) |
|
|
|
|
{ |
|
|
|
|
void handleRealtime_generic(const char *midi_device, midi::MidiType event) { |
|
|
|
|
char text[10]; |
|
|
|
|
|
|
|
|
|
switch(event) { |
|
|
|
|
switch (event) { |
|
|
|
|
case midi::Clock: |
|
|
|
|
handleClock(); |
|
|
|
|
strlcpy(text, "Clock",sizeof(text)); |
|
|
|
|
strlcpy(text, "Clock", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::Start: |
|
|
|
|
handleStart(); |
|
|
|
|
strlcpy(text, "Start",sizeof(text)); |
|
|
|
|
strlcpy(text, "Start", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::Continue: |
|
|
|
|
handleContinue(); |
|
|
|
|
strlcpy(text, "Continue",sizeof(text)); |
|
|
|
|
strlcpy(text, "Continue", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::Stop: |
|
|
|
|
handleStop(); |
|
|
|
|
strlcpy(text, "Stop",sizeof(text)); |
|
|
|
|
strlcpy(text, "Stop", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::ActiveSensing: |
|
|
|
|
handleActiveSensing(); |
|
|
|
|
strlcpy(text, "ActiveSensing",sizeof(text)); |
|
|
|
|
strlcpy(text, "ActiveSensing", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
case midi::SystemReset: |
|
|
|
|
handleSystemReset(); |
|
|
|
|
strlcpy(text, "SystemReset",sizeof(text)); |
|
|
|
|
strlcpy(text, "SystemReset", sizeof(text)); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
@ -394,32 +387,31 @@ void handleRealtime_generic(const char *midi_device, midi::MidiType event) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// MIDI THRU
|
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) |
|
|
|
|
{ |
|
|
|
|
if (configuration.sys.soft_midi_thru == 1) { |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
if(strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
if (strcmp(MIDI_BY_USB, midi_device)) { |
|
|
|
|
usbMIDI.sendRealTime(event); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
if(strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
if (strcmp(MIDI_BY_DIN, midi_device)) { |
|
|
|
|
midi_serial.sendRealTime(event); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_DIN")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
if(strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
if (strcmp(MIDI_BY_USB_HOST, midi_device)) { |
|
|
|
|
midi_usb.sendRealTime(event); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F(" THRU->MIDI_USB_HOST")); |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
@ -435,13 +427,13 @@ void handleRealtime_generic(const char *midi_device, midi::MidiType event) |
|
|
|
|
// handleRealTimeSystem();
|
|
|
|
|
// #ifdef DEBUG
|
|
|
|
|
// switch(midi_device) {
|
|
|
|
|
// case MIDI_DIN:
|
|
|
|
|
// case MIDI_DIN:
|
|
|
|
|
// Serial.print(F("[MIDI_DIN] RealTimeSystem"));
|
|
|
|
|
// break;
|
|
|
|
|
// case MIDI_USB_HOST:
|
|
|
|
|
// case MIDI_USB_HOST:
|
|
|
|
|
// Serial.print(F("[MIDI_USB_HOST] RealTimeSystem"));
|
|
|
|
|
// break;
|
|
|
|
|
// case USB_MIDI:
|
|
|
|
|
// case USB_MIDI:
|
|
|
|
|
// Serial.print(F("[USB_MIDI] RealTimeSystem"));
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
@ -487,43 +479,35 @@ void handleRealtime_generic(const char *midi_device, midi::MidiType event) |
|
|
|
|
*****************************************/ |
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
|
|
|
|
|
void handleNoteOn_MIDI_DEVICE_DIN(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleNoteOn_MIDI_DEVICE_DIN(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_DIN, midi::NoteOn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleNoteOff_MIDI_DEVICE_DIN(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleNoteOff_MIDI_DEVICE_DIN(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_DIN, midi::NoteOff); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleControlChange_MIDI_DEVICE_DIN(byte inChannel, byte inData1, byte inData2) |
|
|
|
|
{ |
|
|
|
|
void handleControlChange_MIDI_DEVICE_DIN(byte inChannel, byte inData1, byte inData2) { |
|
|
|
|
handle_generic(inChannel, inData1, inData2, MIDI_BY_DIN, midi::ControlChange); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleAfterTouch_MIDI_DEVICE_DIN(byte inChannel, byte inPressure) |
|
|
|
|
{ |
|
|
|
|
void handleAfterTouch_MIDI_DEVICE_DIN(byte inChannel, byte inPressure) { |
|
|
|
|
handle_generic(inChannel, inPressure, '\0', MIDI_BY_DIN, midi::AfterTouchChannel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handlePitchBend_MIDI_DEVICE_DIN(byte inChannel, int inPitch) |
|
|
|
|
{ |
|
|
|
|
void handlePitchBend_MIDI_DEVICE_DIN(byte inChannel, int inPitch) { |
|
|
|
|
handle_generic(inChannel, inPitch, '\0', MIDI_BY_DIN, midi::PitchBend); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleProgramChange_MIDI_DEVICE_DIN(byte inChannel, byte inProgram) |
|
|
|
|
{ |
|
|
|
|
void handleProgramChange_MIDI_DEVICE_DIN(byte inChannel, byte inProgram) { |
|
|
|
|
handle_generic(inChannel, inProgram, '\0', MIDI_BY_DIN, midi::ProgramChange); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleAfterTouchPoly_MIDI_DEVICE_DIN(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleAfterTouchPoly_MIDI_DEVICE_DIN(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_DIN, midi::AfterTouchPoly); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemExclusive_MIDI_DEVICE_DIN(byte * data, uint len) |
|
|
|
|
{ |
|
|
|
|
void handleSystemExclusive_MIDI_DEVICE_DIN(byte *data, uint len) { |
|
|
|
|
handleSystemExclusive_generic(data, len, MIDI_BY_DIN); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -553,48 +537,39 @@ void handleSystemExclusive_MIDI_DEVICE_DIN(byte * data, uint len) |
|
|
|
|
#endif |
|
|
|
|
} */ |
|
|
|
|
|
|
|
|
|
void handleTimeCodeQuarterFrame_MIDI_DEVICE_DIN(byte data) |
|
|
|
|
{ |
|
|
|
|
void handleTimeCodeQuarterFrame_MIDI_DEVICE_DIN(byte data) { |
|
|
|
|
handleSystemCommon_generic(data, MIDI_BY_DIN, midi::TimeCodeQuarterFrame); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSongSelect_MIDI_DEVICE_DIN(byte inSong) |
|
|
|
|
{ |
|
|
|
|
void handleSongSelect_MIDI_DEVICE_DIN(byte inSong) { |
|
|
|
|
handleSystemCommon_generic(inSong, MIDI_BY_DIN, midi::SongSelect); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleTuneRequest_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleTuneRequest_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleSystemCommon_generic('\0', MIDI_BY_DIN, midi::TuneRequest); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleClock_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleClock_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_DIN, midi::Clock); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleStart_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleStart_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_DIN, midi::Start); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleContinue_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleContinue_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_DIN, midi::Continue); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleStop_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleStop_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_DIN, midi::Stop); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleActiveSensing_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleActiveSensing_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_DIN, midi::ActiveSensing); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemReset_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
void handleSystemReset_MIDI_DEVICE_DIN(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_DIN, midi::SystemReset); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -602,49 +577,41 @@ void handleSystemReset_MIDI_DEVICE_DIN(void) |
|
|
|
|
{ |
|
|
|
|
handleRealTimeSystem_generic(MIDI_DIN); |
|
|
|
|
} */ |
|
|
|
|
#endif // MIDI_DEVICE_DIN
|
|
|
|
|
#endif // MIDI_DEVICE_DIN
|
|
|
|
|
|
|
|
|
|
/*****************************************
|
|
|
|
|
MIDI_DEVICE_USB_HOST |
|
|
|
|
*****************************************/ |
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
void handleNoteOn_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleNoteOn_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_USB_HOST, midi::NoteOn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleNoteOff_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleNoteOff_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_USB_HOST, midi::NoteOff); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleControlChange_MIDI_DEVICE_USB_HOST(byte inChannel, byte inData1, byte inData2) |
|
|
|
|
{ |
|
|
|
|
void handleControlChange_MIDI_DEVICE_USB_HOST(byte inChannel, byte inData1, byte inData2) { |
|
|
|
|
handle_generic(inChannel, inData1, inData2, MIDI_BY_USB_HOST, midi::ControlChange); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleAfterTouch_MIDI_DEVICE_USB_HOST(byte inChannel, byte inPressure) |
|
|
|
|
{ |
|
|
|
|
void handleAfterTouch_MIDI_DEVICE_USB_HOST(byte inChannel, byte inPressure) { |
|
|
|
|
handle_generic(inChannel, inPressure, '\0', MIDI_BY_USB_HOST, midi::AfterTouchChannel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handlePitchBend_MIDI_DEVICE_USB_HOST(byte inChannel, int inPitch) |
|
|
|
|
{ |
|
|
|
|
void handlePitchBend_MIDI_DEVICE_USB_HOST(byte inChannel, int inPitch) { |
|
|
|
|
handle_generic(inChannel, inPitch, '\0', MIDI_BY_USB_HOST, midi::PitchBend); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleProgramChange_MIDI_DEVICE_USB_HOST(byte inChannel, byte inPitch) |
|
|
|
|
{ |
|
|
|
|
void handleProgramChange_MIDI_DEVICE_USB_HOST(byte inChannel, byte inPitch) { |
|
|
|
|
handle_generic(inChannel, inPitch, '\0', MIDI_BY_USB_HOST, midi::ProgramChange); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleAfterTouchPoly_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleAfterTouchPoly_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_USB_HOST, midi::AfterTouchPoly); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemExclusive_MIDI_DEVICE_USB_HOST(byte * data, uint len) |
|
|
|
|
{ |
|
|
|
|
void handleSystemExclusive_MIDI_DEVICE_USB_HOST(byte *data, uint len) { |
|
|
|
|
handleSystemExclusive_generic(data, len, MIDI_BY_USB_HOST); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -674,48 +641,39 @@ void handleSystemExclusive_MIDI_DEVICE_USB_HOST(byte * data, uint len) |
|
|
|
|
#endif |
|
|
|
|
} */ |
|
|
|
|
|
|
|
|
|
void handleTimeCodeQuarterFrame_MIDI_DEVICE_USB_HOST(midi::DataByte data) |
|
|
|
|
{ |
|
|
|
|
void handleTimeCodeQuarterFrame_MIDI_DEVICE_USB_HOST(midi::DataByte data) { |
|
|
|
|
handleSystemCommon_generic(data, MIDI_BY_USB_HOST, midi::TimeCodeQuarterFrame); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSongSelect_MIDI_DEVICE_USB_HOST(byte inSong) |
|
|
|
|
{ |
|
|
|
|
void handleSongSelect_MIDI_DEVICE_USB_HOST(byte inSong) { |
|
|
|
|
handleSystemCommon_generic(inSong, MIDI_BY_USB_HOST, midi::SongSelect); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleTuneRequest_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleTuneRequest_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleSystemCommon_generic('\0', MIDI_BY_USB_HOST, midi::TuneRequest); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleClock_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleClock_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB_HOST, midi::Clock); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleStart_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleStart_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB_HOST, midi::Start); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleContinue_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleContinue_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB_HOST, midi::Continue); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleStop_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleStop_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB_HOST, midi::Stop); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleActiveSensing_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleActiveSensing_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB_HOST, midi::ActiveSensing); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemReset_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
void handleSystemReset_MIDI_DEVICE_USB_HOST(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB_HOST, midi::SystemReset); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -723,49 +681,41 @@ void handleSystemReset_MIDI_DEVICE_USB_HOST(void) |
|
|
|
|
{ |
|
|
|
|
handleRealTimeSystem_generic(inRealTime, MIDI_USB_HOST); |
|
|
|
|
} */ |
|
|
|
|
#endif // MIDI_DEVICE_USB_HOST
|
|
|
|
|
#endif // MIDI_DEVICE_USB_HOST
|
|
|
|
|
|
|
|
|
|
/*****************************************
|
|
|
|
|
MIDI_DEVICE_USB |
|
|
|
|
*****************************************/ |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
void handleNoteOn_MIDI_DEVICE_USB(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleNoteOn_MIDI_DEVICE_USB(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_USB, midi::NoteOn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleNoteOff_MIDI_DEVICE_USB(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleNoteOff_MIDI_DEVICE_USB(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_USB, midi::NoteOff); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleControlChange_MIDI_DEVICE_USB(byte inChannel, byte inData1, byte inData2) |
|
|
|
|
{ |
|
|
|
|
void handleControlChange_MIDI_DEVICE_USB(byte inChannel, byte inData1, byte inData2) { |
|
|
|
|
handle_generic(inChannel, inData1, inData2, MIDI_BY_USB, midi::ControlChange); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleAfterTouch_MIDI_DEVICE_USB(byte inChannel, byte inPressure) |
|
|
|
|
{ |
|
|
|
|
void handleAfterTouch_MIDI_DEVICE_USB(byte inChannel, byte inPressure) { |
|
|
|
|
handle_generic(inChannel, inPressure, '\0', MIDI_BY_USB, midi::AfterTouchChannel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handlePitchBend_MIDI_DEVICE_USB(byte inChannel, int inPitch) |
|
|
|
|
{ |
|
|
|
|
void handlePitchBend_MIDI_DEVICE_USB(byte inChannel, int inPitch) { |
|
|
|
|
handle_generic(inChannel, inPitch, '\0', MIDI_BY_USB, midi::PitchBend); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleProgramChange_MIDI_DEVICE_USB(byte inChannel, byte inProgram) |
|
|
|
|
{ |
|
|
|
|
void handleProgramChange_MIDI_DEVICE_USB(byte inChannel, byte inProgram) { |
|
|
|
|
handle_generic(inChannel, inProgram, '\0', MIDI_BY_USB, midi::ProgramChange); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleAfterTouchPoly_MIDI_DEVICE_USB(byte inChannel, byte inNoteNumber, byte inVelocity) |
|
|
|
|
{ |
|
|
|
|
void handleAfterTouchPoly_MIDI_DEVICE_USB(byte inChannel, byte inNoteNumber, byte inVelocity) { |
|
|
|
|
handle_generic(inChannel, inNoteNumber, inVelocity, MIDI_BY_USB, midi::AfterTouchPoly); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemExclusive_MIDI_DEVICE_USB(byte * data, uint len) |
|
|
|
|
{ |
|
|
|
|
void handleSystemExclusive_MIDI_DEVICE_USB(byte *data, uint len) { |
|
|
|
|
handleSystemExclusive_generic(data, len, MIDI_BY_USB); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -795,48 +745,39 @@ void handleSystemExclusive_MIDI_DEVICE_USB(byte * data, uint len) |
|
|
|
|
#endif |
|
|
|
|
} */ |
|
|
|
|
|
|
|
|
|
void handleTimeCodeQuarterFrame_MIDI_DEVICE_USB(midi::DataByte data) |
|
|
|
|
{ |
|
|
|
|
void handleTimeCodeQuarterFrame_MIDI_DEVICE_USB(midi::DataByte data) { |
|
|
|
|
handleSystemCommon_generic(data, MIDI_BY_USB, midi::TimeCodeQuarterFrame); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSongSelect_MIDI_DEVICE_USB(byte inSong) |
|
|
|
|
{ |
|
|
|
|
void handleSongSelect_MIDI_DEVICE_USB(byte inSong) { |
|
|
|
|
handleSystemCommon_generic(inSong, MIDI_BY_USB, midi::SongSelect); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleTuneRequest_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleTuneRequest_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleSystemCommon_generic('\0', MIDI_BY_USB, midi::TuneRequest); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleClock_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleClock_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB, midi::Clock); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleStart_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleStart_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB, midi::Start); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleContinue_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleContinue_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB, midi::Continue); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleStop_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleStop_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB, midi::Stop); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleActiveSensing_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleActiveSensing_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB, midi::ActiveSensing); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void handleSystemReset_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
void handleSystemReset_MIDI_DEVICE_USB(void) { |
|
|
|
|
handleRealtime_generic(MIDI_BY_USB, midi::SystemReset); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -844,10 +785,9 @@ void handleSystemReset_MIDI_DEVICE_USB(void) |
|
|
|
|
{ |
|
|
|
|
handleRealTimeSystem_generic(inRealTime, USB_MIDI); |
|
|
|
|
} */ |
|
|
|
|
#endif // MIDI_DEVICE_USB
|
|
|
|
|
#endif // MIDI_DEVICE_USB
|
|
|
|
|
|
|
|
|
|
FLASHMEM void MD_sendControlChange(uint8_t channel, uint8_t cc, uint8_t value) |
|
|
|
|
{ |
|
|
|
|
FLASHMEM void MD_sendControlChange(uint8_t channel, uint8_t cc, uint8_t value) { |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
Serial.print(F("[MD] SendControlChange CH:")); |
|
|
|
|
Serial.print(channel, DEC); |
|
|
|
@ -882,8 +822,7 @@ FLASHMEM void MD_sendControlChange(uint8_t channel, uint8_t cc, uint8_t value) |
|
|
|
|
/*****************************************
|
|
|
|
|
HELPER FUNCTIONS |
|
|
|
|
*****************************************/ |
|
|
|
|
FLASHMEM void setup_midi_devices(void) |
|
|
|
|
{ |
|
|
|
|
FLASHMEM void setup_midi_devices(void) { |
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
// Start serial MIDI
|
|
|
|
|
midi_serial.begin(DEFAULT_MIDI_CHANNEL); |
|
|
|
@ -966,8 +905,7 @@ FLASHMEM void setup_midi_devices(void) |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FLASHMEM void check_midi_devices(void) |
|
|
|
|
{ |
|
|
|
|
FLASHMEM void check_midi_devices(void) { |
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
midi_serial.read(); |
|
|
|
|
#endif |
|
|
|
@ -980,82 +918,75 @@ FLASHMEM void check_midi_devices(void) |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FLASHMEM void send_sysex_voice(uint8_t midi_channel, uint8_t* data) |
|
|
|
|
{ |
|
|
|
|
FLASHMEM void send_sysex_voice(uint8_t midi_channel, uint8_t *data) { |
|
|
|
|
uint8_t checksum = 0; |
|
|
|
|
uint8_t vd[161]; |
|
|
|
|
|
|
|
|
|
// Send SYSEX data also via MIDI
|
|
|
|
|
//vd[0] = 0xF0; // SysEx start
|
|
|
|
|
vd[0] = 0x43; // ID=Yamaha
|
|
|
|
|
vd[1] = midi_channel; // Sub-status and MIDI channel
|
|
|
|
|
vd[2] = 0x00; // Format number (0=1 voice)
|
|
|
|
|
vd[3] = 0x01; // Byte count MSB
|
|
|
|
|
vd[4] = 0x1B; // Byte count LSB
|
|
|
|
|
for (uint8_t n = 0; n < 155; n++) |
|
|
|
|
{ |
|
|
|
|
vd[0] = 0x43; // ID=Yamaha
|
|
|
|
|
vd[1] = midi_channel; // Sub-status and MIDI channel
|
|
|
|
|
vd[2] = 0x00; // Format number (0=1 voice)
|
|
|
|
|
vd[3] = 0x01; // Byte count MSB
|
|
|
|
|
vd[4] = 0x1B; // Byte count LSB
|
|
|
|
|
for (uint8_t n = 0; n < 155; n++) { |
|
|
|
|
checksum -= data[n]; |
|
|
|
|
vd[5 + n] = data[n]; |
|
|
|
|
} |
|
|
|
|
vd[160] = checksum & 0x7f; // Checksum
|
|
|
|
|
vd[160] = checksum & 0x7f; // Checksum
|
|
|
|
|
//vd[162] = 0xF7; // SysEx end
|
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
midi_serial.sendSysEx(161, vd); // Send to DIN MIDI
|
|
|
|
|
midi_serial.sendSysEx(161, vd); // Send to DIN MIDI
|
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
usbMIDI.sendSysEx(161, vd); // Send to USB MIDI
|
|
|
|
|
usbMIDI.sendSysEx(161, vd); // Send to USB MIDI
|
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
midi_usb.sendSysEx(161, vd); // Send to USB-HOST MIDI
|
|
|
|
|
midi_usb.sendSysEx(161, vd); // Send to USB-HOST MIDI
|
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FLASHMEM void send_sysex_bank(uint8_t midi_channel, uint8_t* bank_data) |
|
|
|
|
{ |
|
|
|
|
FLASHMEM void send_sysex_bank(uint8_t midi_channel, uint8_t *bank_data) { |
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
midi_serial.sendSysEx(4104, bank_data); // Send to DIN MIDI
|
|
|
|
|
midi_serial.sendSysEx(4104, bank_data); // Send to DIN MIDI
|
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
// Sysex bank dump is splitted due to Windows USB driver limitations
|
|
|
|
|
usbMIDI.sendSysEx(2048, bank_data, true); // Send to USB MIDI
|
|
|
|
|
usbMIDI.sendSysEx(2048, bank_data, true); // Send to USB MIDI
|
|
|
|
|
delay(50); |
|
|
|
|
usbMIDI.sendSysEx(2048, bank_data+2048, true); |
|
|
|
|
usbMIDI.sendSysEx(2048, bank_data + 2048, true); |
|
|
|
|
delay(50); |
|
|
|
|
usbMIDI.sendSysEx(8, bank_data+4096, true); |
|
|
|
|
usbMIDI.sendSysEx(8, bank_data + 4096, true); |
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
midi_usb.sendSysEx(4104, bank_data); // Send to USB-HOST MIDI
|
|
|
|
|
midi_usb.sendSysEx(4104, bank_data); // Send to USB-HOST MIDI
|
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FLASHMEM void send_sysex_param(uint8_t midi_channel, uint8_t var, uint8_t val, uint8_t param_group) |
|
|
|
|
{ |
|
|
|
|
FLASHMEM void send_sysex_param(uint8_t midi_channel, uint8_t var, uint8_t val, uint8_t param_group) { |
|
|
|
|
uint8_t s[5]; |
|
|
|
|
|
|
|
|
|
s[0] = 0x43; // ID=Yamaha
|
|
|
|
|
s[1] = midi_channel; // Sub-status and MIDI channel
|
|
|
|
|
s[2] = (param_group & 5) << 2; // Format number (0=1 voice)
|
|
|
|
|
if (param_group == 0) |
|
|
|
|
{ |
|
|
|
|
s[0] = 0x43; // ID=Yamaha
|
|
|
|
|
s[1] = midi_channel; // Sub-status and MIDI channel
|
|
|
|
|
s[2] = (param_group & 5) << 2; // Format number (0=1 voice)
|
|
|
|
|
if (param_group == 0) { |
|
|
|
|
s[2] |= 1; |
|
|
|
|
s[3] = var & 0x7f; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
} else { |
|
|
|
|
s[3] = var & 0x7f; |
|
|
|
|
} |
|
|
|
|
s[4] = val & 0x7f; |
|
|
|
|
|
|
|
|
|
#ifdef MIDI_DEVICE_DIN |
|
|
|
|
midi_serial.sendSysEx(5, s); // Send to DIN MIDI
|
|
|
|
|
midi_serial.sendSysEx(5, s); // Send to DIN MIDI
|
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI_DEVICE_USB |
|
|
|
|
usbMIDI.sendSysEx(5, s); // Send to USB MIDI
|
|
|
|
|
usbMIDI.sendSysEx(5, s); // Send to USB MIDI
|
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI_DEVICE_USB_HOST |
|
|
|
|
midi_usb.sendSysEx(5, s); // Send to USB-HOST MIDI
|
|
|
|
|
midi_usb.sendSysEx(5, s); // Send to USB-HOST MIDI
|
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif // MIDI_DEVICES_H
|
|
|
|
|
#endif // MIDI_DEVICES_H
|
|
|
|
|