//*************************************************************************
// Update SysEx Status
//*************************************************************************
FLASHMEM void updateSysExStatus(void)
{
// send SysEx ---------------------------------------------------------
if (sendSysExFlag == true){
static uint8_t count = 0;
uint8_t filenumbers = 0;
uint8_t patchno = 0;
if (sysexDest == false && sysexTyp == false) { // Patch via USB
filenumbers = 1; // Filenumbers = 1
progressBarPercent = 300; // Progressbar fast
patchno = sysexSource; // set Patch No from menu
timer_ProgressbarFlag = true; // start Progressbar
}
else if (sysexDest == false && sysexTyp == true){ // Bank via USB
filenumbers = 128; // Filenumbers = 128
progressBarPercent = 110; // Progressbar slow
patchno = 0; // start Patch No
timer_ProgressbarFlag = true; // start Progressbar
}
else if (sysexDest == true && sysexTyp == false) { // Patch via Midi
filenumbers = 1; // Filenumbers = 1
progressBarPercent = 300; // Progressbar fast
patchno = sysexSource; // set Patch No from menu
timer_ProgressbarFlag = true; // start Progressbar
}
else if (sysexDest == true && sysexTyp == true){ // Bank via Midi
filenumbers = 128; // Filenumbers = 128
progressBarPercent = 7; // Progressbar slow
patchno = 0; // start Patch No
timer_ProgressbarFlag = true; // start Progressbar
}
progressBarFlag = true; // start ProgressBar
uint8_t sysexpatch = patchno + count;
mySendSysEx(sysexpatch, sysexBank);
count++;
sysexDataLenght += 348;
//progressBarPercent = count;
if (count >= filenumbers) {
sendSysExFlag = false;
count = 0;
}
}
// wait Time to SysEx Receive Data (10sec)
if (sysexRecTimeStatus == true && time_sysexRecStatus == false) {
timer_sysexRec = millis();
time_sysexRecStatus = true;
if (PageNr == 11 && myPageShiftStatus[11] == true) {
tft.fillRoundRect(123,20+(19*4),31,10,2,ST7735_RED);
tft.setTextColor(ST7735_WHITE);
print_String(198,130,97); // print "REC"
}
}
// wait Time end
else if (sysexRecTimeStatus == true && time_sysexRecStatus == true) {
if ((millis() - timer_sysexRec) >= 15000){
sysexRecTimeStatus = false;
time_sysexRecStatus = false;
if (PageNr == 11 && myPageShiftStatus[11] == true) {
tft.fillRoundRect(123,20+(19*4),31,10,2,ST7735_BLACK);
tft.fillRoundRect(123,19+(19*4),31,10,2,ST7735_BLUE);
tft.setTextColor(ST7735_WHITE);
print_String(198,130,97); // print "REC"
}
}
}
}
//*************************************************************************
// send Midi system exclusive dump
//*************************************************************************
FLASHMEM void mySendSysEx(uint8_t PatchNo, uint8_t BankNo)
{
byte sysexData[350]; // SysEx buffer 349 Byte
uint8_t data_len = NO_OF_PARAMS;
uint16_t sysexCount = 0;
String numString = String(PatchNo + 1);
String bankString = char(BankNo + 65);
String fileString = (bankString + "/" + numString);
// get Sound File String
File patchFile = SD.open(fileString.c_str());
String data[data_len]; //Array of data read in
recallPatchData(patchFile, data);
patchFile.close();
// convert Patch data into 7bit SysEx format
// Ind. len value
sysexData[sysexCount++] = 0xF0; // - 1 0 - Start SysEx
sysexData[sysexCount++] = 0x00; // - 1 1 - ID
sysexData[sysexCount++] = 0x00; // - 1 2 - ID
sysexData[sysexCount++] = 0x00; // - 1 3 - ID
sysexData[sysexCount++] = 0x00; // - 1 4 - Device ID 0-64
sysexData[sysexCount++] = PatchNo; // - 1 5 - Patch No
sysexData[sysexCount++] = BankNo; // - 1 6 - Bank No
float_to_string(data[0], 12, sysexCount, sysexData); // (0) 12 7 - Patch Name
float_to_sysex1Byte(data[1], sysexCount, sysexData); // (1) 1 19 - oscALevel (0 - 1.00)
float_to_sysex1Byte(data[2], sysexCount, sysexData); // (2) 1 20 - oscBLevel (0 - 1.00)
float_to_sysex2Bytes(data[3], sysexCount, sysexData); // (3) 2 21 - noiseLevel ( -1.00 - +1.00)
uint8_to_sysex1Byte(data[4], sysexCount, sysexData); // (4) 1 23 - unison (0 - 2)
uint8_to_sysex1Byte(data[5], sysexCount, sysexData); // (5) 1 24 - oscFX (0 - 6)
float_to_sysex5Bytes(data[6], sysexCount, sysexData); // (6) 5 25 - detune (0 - 1.00000)
// (7) - (not available)
float_to_string(data[8], 4, sysexCount, sysexData); // (8) 4 30 - midiClkTimeInterval
// (9) - (not available)
float_to_sysex5Bytes(data[10], sysexCount, sysexData); // (10) 5 34 - keytrackingAmount (0 - 1.0000)
float_to_sysex5Bytes(data[11], sysexCount, sysexData); // (11) 5 39 - glideSpeed (0 - 1.00000)
int8_to_sysex2Bytes(data[12], sysexCount, sysexData); // (12) 2 44 - oscPitchA (-24 - +24)
int8_to_sysex2Bytes(data[13], sysexCount, sysexData); // (13) 2 46 - oscPitchB (-24 - +24)
uint8_to_sysex1Byte(data[14], sysexCount, sysexData); // (14) 1 48 - oscWaveformA (0 - 63)
uint8_to_sysex1Byte(data[15], sysexCount, sysexData); // (15) 1 49 - oscWaveformB (0 - 63)
// (16) - (not available)
float_to_sysex1Byte(data[17], sysexCount, sysexData); // (17) 1 50 - pwmAmtA (0 - 0.99)
float_to_sysex1Byte(data[18], sysexCount, sysexData); // (18) 1 51 - pwmAmtB (0 - 0.99)
// (19) - (not available)
float_to_sysex2Bytes(data[20], sysexCount, sysexData); // (20) 2 52 - pwA (-1.00 - +1.00)
float_to_sysex2Bytes(data[21], sysexCount, sysexData); // (21) 2 54 - pwB (-1.00 - +1.00)
float_to_string(data[22], 4, sysexCount, sysexData); // (22) 4 56 - filterRes (0 - 15.0)
uint14_to_sysex2Bytes(data[23], sysexCount, sysexData); // (23) 2 60 - filterFreq (18 - 12000)
float_to_string(data[24], 4, sysexCount, sysexData); // (24) 4 62 - filterMix (0 - -99.0)
float_to_sysex2Bytes(data[25], sysexCount, sysexData); // (25) 2 66 - filterEnv (-1.00 - +1.00)
float_to_sysex5Bytes(data[26], sysexCount, sysexData); // (26) 5 67 - oscLfoAmt (0 - 1.00000)
float_to_sysex5Bytes(data[27], sysexCount, sysexData); // (27) 5 73 - oscLfoRate (0 - 40.0000)
uint8_to_sysex1Byte(data[28], sysexCount, sysexData); // (28) 1 78 - oscLFOWaveform (0 - 12)
uint8_to_sysex1Byte(data[29], sysexCount, sysexData); // (29) 1 79 - oscLfoRetrig (0 - 1)
// (30) - (not available)
uint8_to_sysex1Byte(data[31], sysexCount, sysexData); // (31) 1 80 - myFilterLFORateValue (1 - 127)
uint8_to_sysex1Byte(data[32], sysexCount, sysexData); // (32) 1 81 - filterLfoRetrig (0 - 1)
// (33) - (not available)
float_to_sysex5Bytes(data[34], sysexCount, sysexData); // (34) 5 82 - filterLfoAmt (0 - 1.00000)
uint8_to_sysex1Byte(data[35], sysexCount, sysexData); // (35) 1 87 - filterLFOWaveform (0 - 12)
uint14_to_sysex2Bytes(data[36], sysexCount, sysexData); // (36) 2 88 - filterAttack (0 - 11880)
uint14_to_sysex2Bytes(data[37], sysexCount, sysexData); // (37) 2 90 - filterDecay (0 - 11880)
float_to_sysex1Byte(data[38], sysexCount, sysexData); // (38) 1 92 - filterSustain (0 - 1.00)
uint14_to_sysex2Bytes(data[39], sysexCount, sysexData); // (39) 2 94 - filterRelease (0 - 11880)
uint14_to_sysex2Bytes(data[40], sysexCount, sysexData); // (40) 2 96 - ampAttack (0 - 11880)
uint14_to_sysex2Bytes(data[41], sysexCount, sysexData); // (41) 2 98 - ampDecay (0 - 11880)
float_to_sysex1Byte(data[42], sysexCount, sysexData); // (42) 1 100 - ampSustain (0 - 1.00)
uint14_to_sysex2Bytes(data[43], sysexCount, sysexData); // (43) 2 101 - ampRelease (0 - 11880)
// (44) - (not available)
// (45) - (not available)
// (46) - (not available)
uint8_to_sysex1Byte(data[47], sysexCount, sysexData); // (47) 1 102 - velocitySens (0-4)
uint8_to_sysex1Byte(data[48], sysexCount, sysexData); // (48) 1 103 - chordDetune (0 - 127)
uint8_to_sysex1Byte(data[49], sysexCount, sysexData); // (49) 1 104 - FxPot1value (0 - 127)
uint8_to_sysex1Byte(data[50], sysexCount, sysexData); // (50) 1 105 - FxPot2value (0 - 127)
uint8_to_sysex1Byte(data[51], sysexCount, sysexData); // (51) 1 106 - FxPot3value (0 - 127)
uint8_to_sysex1Byte(data[52], sysexCount, sysexData); // (52) 1 107 - FxPrgNo (0 - 15)
uint8_to_sysex1Byte(data[53], sysexCount, sysexData); // (53) 1 108 - FxMixValue (0 - 127)
float_to_sysex5Bytes(data[54], sysexCount, sysexData); // (54) 5 109 - FxMixValue (10000 - 60000)
uint8_to_sysex1Byte(data[55], sysexCount, sysexData); // (55) 1 114 - Osc1WaveBank (0 - 15)
uint8_to_sysex1Byte(data[56], sysexCount, sysexData); // (56) 1 115 - Osc1WaveBank (0 - 15)
uint8_to_sysex1Byte(data[57], sysexCount, sysexData); // (57) 1 116 - myBoost (0 - 1)
float_to_sysex5Bytes(data[58], sysexCount, sysexData); // (58) 5 117 - pitchEnvA (-1.00 - +1.00)
float_to_sysex5Bytes(data[59], sysexCount, sysexData); // (59) 5 122 - pitchEnvB (-1.00 - +1.00)
float_to_sysex2Bytes(data[60], sysexCount, sysexData); // (60) 2 127 - driveLevel (Osc level) (0.00 - 1.25)
float_to_sysex5Bytes(data[61], sysexCount, sysexData); // (61) 5 129 - myFilVelocity (0 - 1.00)
float_to_sysex5Bytes(data[62], sysexCount, sysexData); // (62) 5 134 - myAmpVelocity (0 - 1.00)
uint8_to_sysex1Byte(data[63], sysexCount, sysexData); // (63) 1 139 - myUnisono (0-2)
// (64) - (not available)
// (65) - (not available)
uint8_to_sysex1Byte(data[66], sysexCount, sysexData); // (66) 1 140 - WShaperNo (0-14)
float_to_sysex5Bytes(data[67], sysexCount, sysexData); // (67) 5 141 - WShaperDrive (0.10 - 5.00)
uint14_to_sysex2Bytes(data[68], sysexCount, sysexData); // (68) 2 146 - LFO1phase (0 - 180.0)
uint14_to_sysex2Bytes(data[69], sysexCount, sysexData); // (69) 2 148 - LFO2phase (0 - 180.0)
for (uint8_t i = 0; i < 16; i++) {
uint8_to_sysex1Byte(data[70+i], sysexCount, sysexData); // (70-85) 16 150 - SeqNote1Buf (0 - 127)
}
for (uint8_t i = 0; i < 16; i++) {
uint8_to_sysex1Byte(data[86+i], sysexCount, sysexData); // (86-101) 16 166 - SeqNoteBufStatus (0 - 1)
}
uint14_to_sysex2Bytes(data[102], sysexCount, sysexData); // (102) 2 182 - SEQbpmValue (101 - 462)
float_to_sysex5Bytes(data[103], sysexCount, sysexData); // (103) 5 184 - SEQdivValue (float)
uint8_to_sysex1Byte(data[104], sysexCount, sysexData); // (104) 1 189 - SEQstepNumbers (0 - 15)
float_to_sysex5Bytes(data[105], sysexCount, sysexData); // (105) 5 190 - SEQGateTime (float)
uint8_to_sysex1Byte(data[106], sysexCount, sysexData); // (106) 1 195 - SEQdirection (0 - 3)
uint8_to_sysex1Byte(data[107], sysexCount, sysexData); // (107) 1 196 - oscDetuneSync (0 - 1)
int8_to_sysex2Bytes(data[108], sysexCount, sysexData); // (108) 2 197 - oscPitchA (-12 - +12)
float_to_sysex5Bytes(data[109], sysexCount, sysexData); // (109) 5 199 - oscMasterTune (float)
float_to_sysex5Bytes(data[110], sysexCount, sysexData); // (110) 5 204 - OscVCFMOD (float)
for (uint8_t i = 0; i < 16; i++) {
uint8_to_sysex1Byte(data[111+i], sysexCount, sysexData); // (111-126) 16 209 - SeqVeloBuf (0 - 127)
}
for (uint8_t i = 0; i < 48; i++) {
uint8_to_sysex1Byte(data[127+i], sysexCount, sysexData); // (127-174) 48 225 - SeqNote1Buf (0 - 127)
}
for (uint8_t i = 0; i < 16; i++) {
uint8_to_sysex1Byte(data[175+i], sysexCount, sysexData); // (175-190) 16 273 - SeqNoteCount (0 - 3)
}
uint8_to_sysex1Byte(data[191], sysexCount, sysexData); // (191) 1 289 - SEQmode (0 - 2)
uint8_to_sysex1Byte(data[192], sysexCount, sysexData); // (192) 1 290 - SEQMidiClkSwitch (0 - 1)
uint8_to_sysex1Byte(data[193], sysexCount, sysexData); // (193) 1 291 - LadderFilterpassbandgain (0 - 127)
uint8_to_sysex1Byte(data[194], sysexCount, sysexData); // (194) 1 292 - LadderFilterDrive (1 - 127)
int8_to_sysex2Bytes(data[195], sysexCount, sysexData); // (195) 2 293 - envelopeType1 (-8 - +8)
int8_to_sysex2Bytes(data[196], sysexCount, sysexData); // (196) 2 295 - envelopeType2 (-8 - +8)
float_to_sysex5Bytes(data[197], sysexCount, sysexData); // (197) 5 297 - PitchWheelAmt (float)
float_to_sysex5Bytes(data[198], sysexCount, sysexData); // (198) 5 302 - MODWheelAmt (float)
uint8_to_sysex1Byte(data[199], sysexCount, sysexData); // (199) 1 307 - myFilter (1 - 2)
float_to_sysex5Bytes(data[200], sysexCount, sysexData); // (200) 5 308 - pwmRateA (-10.00 - + 10.00)
float_to_sysex5Bytes(data[201], sysexCount, sysexData); // (201) 5 313 - pwmRateB (-10.00 - + 10.00)
uint14_to_sysex2Bytes(data[202], sysexCount, sysexData); // (202) 2 318 - LFO1fadeTime (0 - 12000) Fade in
uint14_to_sysex2Bytes(data[203], sysexCount, sysexData); // (203) 2 320 - LFO1releaseTime (0 - 12000) Fade out
float_to_sysex5Bytes(data[204], sysexCount, sysexData); // (204) 5 322 - filterFM (0.00000 - 1.00000) Osc1
float_to_sysex5Bytes(data[205], sysexCount, sysexData); // (205) 5 327 - filterFM2 (0.00000 - 1.00000) Osc2
uint14_to_sysex2Bytes(data[206], sysexCount, sysexData); // (206) 2 332 - LFO2fadeTime (0 - 12000) Fade in
uint14_to_sysex2Bytes(data[207], sysexCount, sysexData); // (207) 2 334 - LFO2releaseTime (0 - 12000) Fade out
float_to_sysex5Bytes(data[208], sysexCount, sysexData); // (208) 5 336 - Osc1ModAmt (0.00000 - 1.00000) Fx Mod
int8_to_sysex2Bytes(data[209], sysexCount, sysexData); // (209) 2 341 - LFO1enCurve (-8 - +8)
int8_to_sysex2Bytes(data[210], sysexCount, sysexData); // (210) 2 343 - LFO2enCurve (-8 - +8)
uint8_to_sysex1Byte(data[211], sysexCount, sysexData); // (211) 1 345 - LFO1mode (0 - 1)
uint8_to_sysex1Byte(data[212], sysexCount, sysexData); // (212) 1 346 - LFO2mode (0 - 1)
sysexData[sysexCount++] = 0xF7; // 1 347 - End SysEx (0xF7)
// Send SysEx Dump
if (sysexDest == false) {
usbMIDI.sendSysEx(sysexCount, sysexData, true); // send SysEx Dump via USB (default)
} else {
MIDI.sendSysEx(sysexCount, sysexData, true); // send SysEx Dump via Midi
}
usb_midi_flush_output();
}