diff --git a/MicroDexed.ino b/MicroDexed.ino index 172f379..bbbae5f 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -217,6 +217,7 @@ char version_string[LCD_cols + 1]; char sd_string[LCD_cols + 1]; char g_voice_name[NUM_DEXED][VOICE_NAME_LEN]; char g_bank_name[NUM_DEXED][BANK_NAME_LEN]; +char receive_bank_filename[FILENAME_LEN]; #if defined(USE_FX) // Allocate the delay lines for chorus @@ -383,6 +384,7 @@ void setup() memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN); memset(g_bank_name[instance_id], 0, BANK_NAME_LEN); + memset(receive_bank_filename, 0, FILENAME_LEN); } } @@ -772,6 +774,20 @@ void handleSystemExclusive(byte * sysex, uint len) return; } +#ifdef DEBUG + Serial.print(F("SysEx data length: ")); + Serial.println(len); +#endif + + // Check for SYSEX end byte + if (sysex[len - 1] != 0xf7) + { +#ifdef DEBUG + Serial.println(F("E: SysEx end status byte not detected.")); +#endif + return; + } + #ifdef DEBUG Serial.print(F("INSTANCE ")); Serial.print(instance_id, DEC); @@ -810,13 +826,6 @@ void handleSystemExclusive(byte * sysex, uint len) #endif return; } - if (sysex[6] != 0xf7) - { -#ifdef DEBUG - Serial.println(F("E: SysEx end status byte not detected.")); -#endif - return; - } sysex[4] &= 0x7f; sysex[5] &= 0x7f; @@ -921,14 +930,6 @@ void handleSystemExclusive(byte * sysex, uint len) Serial.println(F("One Voice bulk upload")); #endif - if (sysex[162] != 0xf7) - { -#ifdef DEBUG - Serial.println(F("E: Found no SysEx end marker.")); -#endif - return; - } - if ((sysex[3] & 0x7f) != 0) { #ifdef DEBUG @@ -964,6 +965,13 @@ void handleSystemExclusive(byte * sysex, uint len) return; } + // fix voice name + for (uint8_t i = 0; i < 10; i++) + { + if (sysex[151 + i] > 126) // filter characters + sysex[151 + i] = 32; + } + // load sysex-data into voice memory MicroDexed[instance_id]->loadVoiceParameters(&sysex[6]); @@ -972,16 +980,75 @@ void handleSystemExclusive(byte * sysex, uint len) #endif // show voice name - for (uint8_t i = 0; i < 10; i++) - { - if (sysex[151 + i] > 126) // filter characters - sysex[151 + i] = 32; - } strncpy(g_voice_name[instance_id], (char*)&sysex[151], VOICE_NAME_LEN - 1); LCDML.OTHER_updateFunc(); LCDML.loop_menu(); } + else if (len == 4104 && strlen(receive_bank_filename) > 0) + { + int32_t bulk_checksum_calc = 0; + int8_t bulk_checksum = sysex[4102]; + + // 1 Voice bulk upload +#ifdef DEBUG + Serial.println(F("Bank bulk upload")); +#endif + + if ((sysex[3] & 0x7f) != 9) + { +#ifdef DEBUG + Serial.println(F("E: Not a SysEx bank bulk upload.")); +#endif + return; + } + + if (((sysex[4] << 7) | sysex[5]) != 0x1000) + { +#ifdef DEBUG + Serial.println(F("E: Wrong length for SysEx bank bulk upload (not 4096).")); +#endif + return; + } + + // checksum calculation + for (uint8_t i = 0; i < 4096 ; i++) + { + bulk_checksum_calc -= sysex[i + 6]; + } + bulk_checksum_calc &= 0x7f; + + if (bulk_checksum_calc != bulk_checksum) + { +#ifdef DEBUG + Serial.print(F("E: Checksum error for bank [0x")); + Serial.print(bulk_checksum, HEX); + Serial.print(F("/0x")); + Serial.print(bulk_checksum_calc, HEX); + Serial.println(F("]")); +#endif + return; + } + +#ifdef DEBUG + if (save_sd_bank(receive_bank_filename, sysex)) + { + Serial.print(F("Bank saved as [")); + Serial.print(receive_bank_filename); + Serial.println(F("]")); + } + else + { + Serial.println(F("Error during saving bank as [")); + Serial.print(receive_bank_filename); + Serial.println(F("]")); + } +#else + save_sd_bank(receive_bank_filename, sysex); +#endif + + memset(receive_bank_filename, 0, FILENAME_LEN); + } #ifdef DEBUG else Serial.println(F("E: SysEx parameter length wrong.")); diff --git a/UI.hpp b/UI.hpp index 5b6eaac..1b68dea 100644 --- a/UI.hpp +++ b/UI.hpp @@ -89,6 +89,7 @@ extern AudioSynthWaveformDc* pan[NUM_DEXED]; extern char sd_string[LCD_cols + 1]; extern char g_voice_name[NUM_DEXED][VOICE_NAME_LEN]; extern char g_bank_name[NUM_DEXED][BANK_NAME_LEN]; +extern char receive_bank_filename[FILENAME_LEN]; /*********************************************************************** GLOBAL @@ -4109,9 +4110,11 @@ void UI_func_save_voice(uint8_t param) { static bool yesno; static uint8_t mode; - uint8_t instance_id = 0; + if (LCDML.FUNC_getID() > MENU_ID_OF_INSTANCE_2) + instance_id = 1; + if (LCDML.FUNC_setup()) // ****** SETUP ********* { encoderDir[ENC_R].reset(); @@ -4207,13 +4210,15 @@ void UI_func_save_voice(uint8_t param) { if (yesno == true) { +#ifdef DEBUG bool ret = save_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); -#ifdef DEBUG if (ret == true) Serial.println(F("Saving voice OK.")); else Serial.println(F("Error while saving voice.")); +#else + save_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); #endif lcd.show(1, 0, 16, "Done."); diff --git a/UI_1.h b/UI_1.h index 44347ec..b083f21 100644 --- a/UI_1.h +++ b/UI_1.h @@ -76,25 +76,24 @@ LCDML_add(47, LCDML_0_1_7, 3, "OP3", UI_func_OP3); LCDML_add(48, LCDML_0_1_7, 4, "OP4", UI_func_OP4); LCDML_add(49, LCDML_0_1_7, 5, "OP5", UI_func_OP5); LCDML_add(50, LCDML_0_1_7, 6, "OP6", UI_func_OP6); -LCDML_add(51, LCDML_0, 2, "Load/Save", NULL); -LCDML_add(52, LCDML_0_2, 1, "Performance", NULL); -LCDML_add(53, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance); -LCDML_add(54, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance); -LCDML_add(55, LCDML_0_2, 2, "Voice Config", NULL); -LCDML_add(56, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); -LCDML_add(57, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); -LCDML_add(58, LCDML_0_2, 3, "Voice", NULL); -LCDML_add(59, LCDML_0_2_3, 1, "Save Voice", UI_func_save_voice); -LCDML_add(60, LCDML_0_2, 4, "MIDI", NULL); -LCDML_add(61, LCDML_0_2_4, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); -LCDML_add(62, LCDML_0_2_4, 2, "MIDI Send Bank", UI_func_sysex_send_bank); -LCDML_add(63, LCDML_0_2, 5, "EEPROM Reset", UI_func_eeprom_reset); -LCDML_add(64, LCDML_0, 3, "System", NULL); -LCDML_add(65, LCDML_0_3, 3, "Volume", UI_func_volume); -LCDML_add(66, LCDML_0_3, 1, "Stereo/Mono", UI_func_stereo_mono); -LCDML_add(67, LCDML_0_3, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); -LCDML_add(68, LCDML_0, 4, "Info", UI_func_information); -#define _LCDML_DISP_cnt 68 +LCDML_add(51, LCDML_0_1, 8, "Save Voice", UI_func_save_voice); +LCDML_add(52, LCDML_0, 2, "Load/Save", NULL); +LCDML_add(53, LCDML_0_2, 1, "Performance", NULL); +LCDML_add(54, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance); +LCDML_add(55, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance); +LCDML_add(56, LCDML_0_2, 2, "Voice Config", NULL); +LCDML_add(57, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); +LCDML_add(58, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); +LCDML_add(59, LCDML_0_2, 4, "MIDI", NULL); +LCDML_add(60, LCDML_0_2_4, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); +LCDML_add(61, LCDML_0_2_4, 2, "MIDI Send Bank", UI_func_sysex_send_bank); +LCDML_add(62, LCDML_0, 3, "System", NULL); +LCDML_add(63, LCDML_0_3, 1, "Volume", UI_func_volume); +LCDML_add(64, LCDML_0_3, 2, "Stereo/Mono", UI_func_stereo_mono); +LCDML_add(65, LCDML_0_3, 3, "MIDI Soft THRU", UI_func_midi_soft_thru); +LCDML_add(66, LCDML_0_3, 4, "EEPROM Reset", UI_func_eeprom_reset); +LCDML_add(67, LCDML_0, 4, "Info", UI_func_information); +#define _LCDML_DISP_cnt 67 #define MENU_ID_OF_INSTANCE_2 51 #endif diff --git a/UI_1_FX.h b/UI_1_FX.h index 8f0ef1a..635c7fc 100644 --- a/UI_1_FX.h +++ b/UI_1_FX.h @@ -83,41 +83,40 @@ LCDML_add(54, LCDML_0_1_7, 3, "OP3", UI_func_OP3); LCDML_add(55, LCDML_0_1_7, 4, "OP4", UI_func_OP4); LCDML_add(56, LCDML_0_1_7, 5, "OP5", UI_func_OP5); LCDML_add(57, LCDML_0_1_7, 6, "OP6", UI_func_OP6); -LCDML_add(58, LCDML_0, 2, "Effects", NULL); -LCDML_add(59, LCDML_0_2, 1, "Chorus", NULL); -LCDML_add(60, LCDML_0_2_1, 1, "Frequency", UI_func_chorus_frequency); -LCDML_add(61, LCDML_0_2_1, 2, "Waveform", UI_func_chorus_waveform); -LCDML_add(62, LCDML_0_2_1, 3, "Depth", UI_func_chorus_depth); -LCDML_add(63, LCDML_0_2_1, 4, "Level", UI_func_chorus_level); -LCDML_add(64, LCDML_0_2, 2, "Delay", NULL); -LCDML_add(65, LCDML_0_2_2, 1, "Time", UI_func_delay_time); -LCDML_add(66, LCDML_0_2_2, 2, "Feedback", UI_func_delay_feedback); -LCDML_add(67, LCDML_0_2_2, 3, "Level", UI_func_delay_level); -LCDML_add(68, LCDML_0_2, 3, "Reverb", NULL); -LCDML_add(69, LCDML_0_2_3, 1, "Roomsize", UI_func_reverb_roomsize); -LCDML_add(70, LCDML_0_2_3, 2, "Damping", UI_func_reverb_damping); -LCDML_add(71, LCDML_0_2_3, 3, "Level", UI_func_reverb_level); -LCDML_add(72, LCDML_0, 3, "Load/Save", NULL); -LCDML_add(73, LCDML_0_3, 1, "Performance", NULL); -LCDML_add(74, LCDML_0_3_1, 1, "Load Perf.", UI_func_load_performance); -LCDML_add(75, LCDML_0_3_1, 2, "Save Perf.", UI_func_save_performance); -LCDML_add(76, LCDML_0_3, 2, "Voice Config", NULL); -LCDML_add(77, LCDML_0_3_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); -LCDML_add(78, LCDML_0_3_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); -LCDML_add(79, LCDML_0_3, 3, "Effects", NULL); -LCDML_add(80, LCDML_0_3_3, 1, "Load Effects Cfg", UI_func_load_fx); -LCDML_add(81, LCDML_0_3_3, 2, "Save Effects Cfg", UI_func_save_fx); -LCDML_add(82, LCDML_0_3, 4, "Voice", NULL); -LCDML_add(83, LCDML_0_3_4, 1, "Save Voice", UI_func_save_voice); -LCDML_add(84, LCDML_0_3, 5, "MIDI", NULL); -LCDML_add(85, LCDML_0_3_5, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); -LCDML_add(86, LCDML_0_3_5, 2, "MIDI Send Bank", UI_func_sysex_send_bank); -LCDML_add(87, LCDML_0_3, 6, "EEPROM Reset", UI_func_eeprom_reset); -LCDML_add(88, LCDML_0, 4, "System", NULL); -LCDML_add(89, LCDML_0_4, 3, "Volume", UI_func_volume); -LCDML_add(90, LCDML_0_4, 1, "Stereo/Mono", UI_func_stereo_mono); -LCDML_add(91, LCDML_0_4, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); -LCDML_add(92, LCDML_0, 6, "Info", UI_func_information); -#define _LCDML_DISP_cnt 92 -#define MENU_ID_OF_INSTANCE_2 58 +LCDML_add(58, LCDML_0_1, 8, "Save Voice", UI_func_save_voice); +LCDML_add(59, LCDML_0, 2, "Effects", NULL); +LCDML_add(60, LCDML_0_2, 1, "Chorus", NULL); +LCDML_add(61, LCDML_0_2_1, 1, "Frequency", UI_func_chorus_frequency); +LCDML_add(62, LCDML_0_2_1, 2, "Waveform", UI_func_chorus_waveform); +LCDML_add(63, LCDML_0_2_1, 3, "Depth", UI_func_chorus_depth); +LCDML_add(64, LCDML_0_2_1, 4, "Level", UI_func_chorus_level); +LCDML_add(65, LCDML_0_2, 2, "Delay", NULL); +LCDML_add(66, LCDML_0_2_2, 1, "Time", UI_func_delay_time); +LCDML_add(67, LCDML_0_2_2, 2, "Feedback", UI_func_delay_feedback); +LCDML_add(68, LCDML_0_2_2, 3, "Level", UI_func_delay_level); +LCDML_add(69, LCDML_0_2, 3, "Reverb", NULL); +LCDML_add(70, LCDML_0_2_3, 1, "Roomsize", UI_func_reverb_roomsize); +LCDML_add(71, LCDML_0_2_3, 2, "Damping", UI_func_reverb_damping); +LCDML_add(72, LCDML_0_2_3, 3, "Level", UI_func_reverb_level); +LCDML_add(73, LCDML_0, 3, "Load/Save", NULL); +LCDML_add(74, LCDML_0_3, 1, "Performance", NULL); +LCDML_add(75, LCDML_0_3_1, 1, "Load Perf.", UI_func_load_performance); +LCDML_add(76, LCDML_0_3_1, 2, "Save Perf.", UI_func_save_performance); +LCDML_add(77, LCDML_0_3, 2, "Voice Config", NULL); +LCDML_add(78, LCDML_0_3_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); +LCDML_add(79, LCDML_0_3_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); +LCDML_add(80, LCDML_0_3, 3, "Effects", NULL); +LCDML_add(81, LCDML_0_3_3, 1, "Load Effects Cfg", UI_func_load_fx); +LCDML_add(82, LCDML_0_3_3, 2, "Save Effects Cfg", UI_func_save_fx); +LCDML_add(83, LCDML_0_3, 5, "MIDI", NULL); +LCDML_add(84, LCDML_0_3_5, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); +LCDML_add(85, LCDML_0_3_5, 2, "MIDI Send Bank", UI_func_sysex_send_bank); +LCDML_add(86, LCDML_0, 4, "System", NULL); +LCDML_add(87, LCDML_0_4, 1, "Volume", UI_func_volume); +LCDML_add(88, LCDML_0_4, 2, "Stereo/Mono", UI_func_stereo_mono); +LCDML_add(89, LCDML_0_4, 3, "MIDI Soft THRU", UI_func_midi_soft_thru); +LCDML_add(90, LCDML_0_4, 4, "EEPROM Reset", UI_func_eeprom_reset); +LCDML_add(91, LCDML_0, 6, "Info", UI_func_information); +#define _LCDML_DISP_cnt 91 +#define MENU_ID_OF_INSTANCE_2 59 #endif diff --git a/UI_2.h b/UI_2.h index beb2fbd..ba6c54c 100644 --- a/UI_2.h +++ b/UI_2.h @@ -77,76 +77,76 @@ LCDML_add(48, LCDML_0_1_1_7, 3, "OP3", UI_func_OP3); LCDML_add(49, LCDML_0_1_1_7, 4, "OP4", UI_func_OP4); LCDML_add(50, LCDML_0_1_1_7, 5, "OP5", UI_func_OP5); LCDML_add(51, LCDML_0_1_1_7, 6, "OP6", UI_func_OP6); -LCDML_add(52, LCDML_0_1, 2, "Instance 2", NULL); -LCDML_add(53, LCDML_0_1_2, 1, "Select", UI_func_voice_select); -LCDML_add(54, LCDML_0_1_2, 2, "Audio", NULL); -LCDML_add(55, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity); -LCDML_add(56, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama); -LCDML_add(57, LCDML_0_1_2, 3, "Controller", NULL); -LCDML_add(58, LCDML_0_1_2_3, 1, "Pitchbend", NULL); -LCDML_add(59, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range); -LCDML_add(60, LCDML_0_1_2_3_1, 2, "PB Step", UI_func_pb_step); -LCDML_add(61, LCDML_0_1_2_3, 2, "Mod Wheel", NULL); -LCDML_add(62, LCDML_0_1_2_3_2, 1, "MW Range", UI_func_mw_range); -LCDML_add(63, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign); -LCDML_add(64, LCDML_0_1_2_3_2, 3, "MW Mode", UI_func_mw_mode); -LCDML_add(65, LCDML_0_1_2_3, 3, "Aftertouch", NULL); -LCDML_add(66, LCDML_0_1_2_3_3, 1, "AT Range", UI_func_at_range); -LCDML_add(67, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign); -LCDML_add(68, LCDML_0_1_2_3_3, 3, "AT Mode", UI_func_at_mode); -LCDML_add(69, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL); -LCDML_add(70, LCDML_0_1_2_3_4, 1, "FC Range", UI_func_fc_range); -LCDML_add(71, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign); -LCDML_add(72, LCDML_0_1_2_3_4, 3, "FC Mode", UI_func_fc_mode); -LCDML_add(73, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL); -LCDML_add(74, LCDML_0_1_2_3_5, 1, "BC Range", UI_func_bc_range); -LCDML_add(75, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign); -LCDML_add(76, LCDML_0_1_2_3_5, 3, "BC Mode", UI_func_bc_mode); -LCDML_add(77, LCDML_0_1_2, 4, "MIDI", NULL); -LCDML_add(78, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel); -LCDML_add(79, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note); -LCDML_add(80, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note); -LCDML_add(81, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice); -LCDML_add(82, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice); -LCDML_add(83, LCDML_0_1_2, 5, "Setup", NULL); -LCDML_add(84, LCDML_0_1_2_5, 1, "Portamento", NULL); -LCDML_add(85, LCDML_0_1_2_5_1, 1, "Port. Mode", UI_func_portamento_mode); -LCDML_add(86, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando); -LCDML_add(87, LCDML_0_1_2_5_1, 3, "Port. Time", UI_func_portamento_time); -LCDML_add(88, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony); -LCDML_add(89, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose); -LCDML_add(90, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune); -LCDML_add(91, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly); -LCDML_add(92, LCDML_0_1_2, 6, "Internal", NULL); -LCDML_add(93, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh); -LCDML_add(94, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level); -LCDML_add(95, LCDML_0_1_2_6, 3, "Engine", UI_func_engine); -LCDML_add(96, LCDML_0_1_2, 7, "Operator", NULL); -LCDML_add(97, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1); -LCDML_add(98, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2); -LCDML_add(99, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3); -LCDML_add(100, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4); -LCDML_add(101, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5); -LCDML_add(102, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6); -LCDML_add(103, LCDML_0, 2, "Load/Save", NULL); -LCDML_add(104, LCDML_0_2, 1, "Performance", NULL); -LCDML_add(105, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance); -LCDML_add(106, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance); -LCDML_add(107, LCDML_0_2, 2, "Voice Config", NULL); -LCDML_add(108, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); -LCDML_add(109, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); -LCDML_add(110, LCDML_0_2, 3, "Voice", NULL); -LCDML_add(111, LCDML_0_2_3, 1, "Save Voice", UI_func_save_voice); +LCDML_add(52, LCDML_0_1_1, 8, "Save Voice", UI_func_save_voice); +LCDML_add(53, LCDML_0_1, 2, "Instance 2", NULL); +LCDML_add(54, LCDML_0_1_2, 1, "Select", UI_func_voice_select); +LCDML_add(55, LCDML_0_1_2, 2, "Audio", NULL); +LCDML_add(56, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity); +LCDML_add(57, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama); +LCDML_add(58, LCDML_0_1_2, 3, "Controller", NULL); +LCDML_add(59, LCDML_0_1_2_3, 1, "Pitchbend", NULL); +LCDML_add(60, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range); +LCDML_add(61, LCDML_0_1_2_3_1, 2, "PB Step", UI_func_pb_step); +LCDML_add(62, LCDML_0_1_2_3, 2, "Mod Wheel", NULL); +LCDML_add(63, LCDML_0_1_2_3_2, 1, "MW Range", UI_func_mw_range); +LCDML_add(64, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign); +LCDML_add(65, LCDML_0_1_2_3_2, 3, "MW Mode", UI_func_mw_mode); +LCDML_add(66, LCDML_0_1_2_3, 3, "Aftertouch", NULL); +LCDML_add(67, LCDML_0_1_2_3_3, 1, "AT Range", UI_func_at_range); +LCDML_add(68, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign); +LCDML_add(69, LCDML_0_1_2_3_3, 3, "AT Mode", UI_func_at_mode); +LCDML_add(70, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL); +LCDML_add(71, LCDML_0_1_2_3_4, 1, "FC Range", UI_func_fc_range); +LCDML_add(72, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign); +LCDML_add(73, LCDML_0_1_2_3_4, 3, "FC Mode", UI_func_fc_mode); +LCDML_add(74, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL); +LCDML_add(75, LCDML_0_1_2_3_5, 1, "BC Range", UI_func_bc_range); +LCDML_add(76, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign); +LCDML_add(77, LCDML_0_1_2_3_5, 3, "BC Mode", UI_func_bc_mode); +LCDML_add(78, LCDML_0_1_2, 4, "MIDI", NULL); +LCDML_add(79, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel); +LCDML_add(80, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note); +LCDML_add(81, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note); +LCDML_add(82, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice); +LCDML_add(83, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice); +LCDML_add(84, LCDML_0_1_2, 5, "Setup", NULL); +LCDML_add(85, LCDML_0_1_2_5, 1, "Portamento", NULL); +LCDML_add(86, LCDML_0_1_2_5_1, 1, "Port. Mode", UI_func_portamento_mode); +LCDML_add(87, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando); +LCDML_add(88, LCDML_0_1_2_5_1, 3, "Port. Time", UI_func_portamento_time); +LCDML_add(89, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony); +LCDML_add(90, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose); +LCDML_add(91, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune); +LCDML_add(92, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly); +LCDML_add(93, LCDML_0_1_2, 6, "Internal", NULL); +LCDML_add(94, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh); +LCDML_add(95, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level); +LCDML_add(96, LCDML_0_1_2_6, 3, "Engine", UI_func_engine); +LCDML_add(97, LCDML_0_1_2, 7, "Operator", NULL); +LCDML_add(98, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1); +LCDML_add(99, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2); +LCDML_add(100, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3); +LCDML_add(101, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4); +LCDML_add(102, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5); +LCDML_add(103, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6); +LCDML_add(104, LCDML_0_1_2, 8, "Save Voice", UI_func_save_voice); +LCDML_add(105, LCDML_0, 2, "Load/Save", NULL); +LCDML_add(106, LCDML_0_2, 1, "Performance", NULL); +LCDML_add(107, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance); +LCDML_add(108, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance); +LCDML_add(109, LCDML_0_2, 2, "Voice Config", NULL); +LCDML_add(110, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); +LCDML_add(111, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); LCDML_add(112, LCDML_0_2, 4, "MIDI", NULL); LCDML_add(113, LCDML_0_2_4, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); LCDML_add(114, LCDML_0_2_4, 2, "MIDI Send Bank", UI_func_sysex_send_bank); -LCDML_add(115, LCDML_0_2, 5, "EEPROM Reset", UI_func_eeprom_reset); LCDML_add(116, LCDML_0, 3, "System", NULL); -LCDML_add(117, LCDML_0_3, 3, "Volume", UI_func_volume); -LCDML_add(118, LCDML_0_3, 1, "Stereo/Mono", UI_func_stereo_mono); -LCDML_add(119, LCDML_0_3, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); -LCDML_add(120, LCDML_0, 4, "Info", UI_func_information); -#define _LCDML_DISP_cnt 120 +LCDML_add(117, LCDML_0_3, 1, "Volume", UI_func_volume); +LCDML_add(118, LCDML_0_3, 2, "Stereo/Mono", UI_func_stereo_mono); +LCDML_add(119, LCDML_0_3, 3, "MIDI Soft THRU", UI_func_midi_soft_thru); +LCDML_add(120, LCDML_0_2, 4, "EEPROM Reset", UI_func_eeprom_reset); +LCDML_add(121, LCDML_0, 4, "Info", UI_func_information); +#define _LCDML_DISP_cnt 121 #define MENU_ID_OF_INSTANCE_2 52 #endif diff --git a/UI_2_FX.h b/UI_2_FX.h index 31ced02..fa8ac6c 100644 --- a/UI_2_FX.h +++ b/UI_2_FX.h @@ -84,100 +84,100 @@ LCDML_add(55, LCDML_0_1_1_7, 3, "OP3", UI_func_OP3); LCDML_add(56, LCDML_0_1_1_7, 4, "OP4", UI_func_OP4); LCDML_add(57, LCDML_0_1_1_7, 5, "OP5", UI_func_OP5); LCDML_add(58, LCDML_0_1_1_7, 6, "OP6", UI_func_OP6); -LCDML_add(59, LCDML_0_1, 2, "Instance 2", NULL); -LCDML_add(60, LCDML_0_1_2, 1, "Select", UI_func_voice_select); -LCDML_add(61, LCDML_0_1_2, 2, "Audio", NULL); -LCDML_add(62, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity); -LCDML_add(63, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama); -LCDML_add(64, LCDML_0_1_2_2, 3, "Effects Send", NULL); -LCDML_add(65, LCDML_0_1_2_2_3, 1, "Chorus Send", UI_func_chorus_send); -LCDML_add(66, LCDML_0_1_2_2_3, 2, "Delay Send", UI_func_delay_send); -LCDML_add(67, LCDML_0_1_2_2_3, 3, "Reverb Send", UI_func_reverb_send); -LCDML_add(68, LCDML_0_1_2_2, 4, "Filter", NULL); -LCDML_add(69, LCDML_0_1_2_2_4, 1, "Cutoff", UI_func_filter_cutoff); -LCDML_add(70, LCDML_0_1_2_2_4, 2, "Resonance", UI_func_filter_resonance); -LCDML_add(71, LCDML_0_1_2, 3, "Controller", NULL); -LCDML_add(72, LCDML_0_1_2_3, 1, "Pitchbend", NULL); -LCDML_add(73, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range); -LCDML_add(74, LCDML_0_1_2_3_1, 2, "PB Step", UI_func_pb_step); -LCDML_add(75, LCDML_0_1_2_3, 2, "Mod Wheel", NULL); -LCDML_add(76, LCDML_0_1_2_3_2, 1, "MW Range", UI_func_mw_range); -LCDML_add(77, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign); -LCDML_add(78, LCDML_0_1_2_3_2, 3, "MW Mode", UI_func_mw_mode); -LCDML_add(79, LCDML_0_1_2_3, 3, "Aftertouch", NULL); -LCDML_add(80, LCDML_0_1_2_3_3, 1, "AT Range", UI_func_at_range); -LCDML_add(81, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign); -LCDML_add(82, LCDML_0_1_2_3_3, 3, "AT Mode", UI_func_at_mode); -LCDML_add(83, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL); -LCDML_add(84, LCDML_0_1_2_3_4, 1, "FC Range", UI_func_fc_range); -LCDML_add(85, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign); -LCDML_add(86, LCDML_0_1_2_3_4, 3, "FC Mode", UI_func_fc_mode); -LCDML_add(87, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL); -LCDML_add(88, LCDML_0_1_2_3_5, 1, "BC Range", UI_func_bc_range); -LCDML_add(89, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign); -LCDML_add(90, LCDML_0_1_2_3_5, 3, "BC Mode", UI_func_bc_mode); -LCDML_add(91, LCDML_0_1_2, 4, "MIDI", NULL); -LCDML_add(92, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel); -LCDML_add(93, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note); -LCDML_add(94, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note); -LCDML_add(95, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice); -LCDML_add(96, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice); -LCDML_add(97, LCDML_0_1_2, 5, "Setup", NULL); -LCDML_add(98, LCDML_0_1_2_5, 1, "Portamento", NULL); -LCDML_add(99, LCDML_0_1_2_5_1, 1, "Port. Mode", UI_func_portamento_mode); -LCDML_add(100, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando); -LCDML_add(101, LCDML_0_1_2_5_1, 3, "Port. Time", UI_func_portamento_time); -LCDML_add(102, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony); -LCDML_add(103, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose); -LCDML_add(104, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune); -LCDML_add(105, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly); -LCDML_add(106, LCDML_0_1_2, 6, "Internal", NULL); -LCDML_add(107, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh); -LCDML_add(108, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level); -LCDML_add(109, LCDML_0_1_2_6, 3, "Engine", UI_func_engine); -LCDML_add(110, LCDML_0_1_2, 7, "Operator", NULL); -LCDML_add(111, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1); -LCDML_add(112, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2); -LCDML_add(113, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3); -LCDML_add(114, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4); -LCDML_add(115, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5); -LCDML_add(116, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6); -LCDML_add(117, LCDML_0, 3, "Effects", NULL); -LCDML_add(118, LCDML_0_3, 1, "Chorus", NULL); -LCDML_add(119, LCDML_0_3_1, 1, "Frequency", UI_func_chorus_frequency); -LCDML_add(120, LCDML_0_3_1, 2, "Waveform", UI_func_chorus_waveform); -LCDML_add(121, LCDML_0_3_1, 3, "Depth", UI_func_chorus_depth); -LCDML_add(122, LCDML_0_3_1, 4, "Level", UI_func_chorus_level); -LCDML_add(123, LCDML_0_3, 2, "Delay", NULL); -LCDML_add(124, LCDML_0_3_2, 1, "Time", UI_func_delay_time); -LCDML_add(125, LCDML_0_3_2, 2, "Feedback", UI_func_delay_feedback); -LCDML_add(126, LCDML_0_3_2, 3, "Level", UI_func_delay_level); -LCDML_add(127, LCDML_0_3, 3, "Reverb", NULL); -LCDML_add(128, LCDML_0_3_3, 1, "Roomsize", UI_func_reverb_roomsize); -LCDML_add(129, LCDML_0_3_3, 2, "Damping", UI_func_reverb_damping); -LCDML_add(130, LCDML_0_3_3, 3, "Level", UI_func_reverb_level); -LCDML_add(131, LCDML_0, 4, "Load/Save", NULL); -LCDML_add(132, LCDML_0_4, 1, "Performance", NULL); -LCDML_add(133, LCDML_0_4_1, 1, "Load Perf.", UI_func_load_performance); -LCDML_add(134, LCDML_0_4_1, 2, "Save Perf.", UI_func_save_performance); -LCDML_add(135, LCDML_0_4, 2, "Voice Config", NULL); -LCDML_add(136, LCDML_0_4_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); -LCDML_add(137, LCDML_0_4_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); -LCDML_add(138, LCDML_0_4, 3, "FX", NULL); -LCDML_add(139, LCDML_0_4_3, 1, "Load Effects Cfg", UI_func_load_fx); -LCDML_add(140, LCDML_0_4_3, 2, "Save Effects Cfg", UI_func_save_fx); -LCDML_add(141, LCDML_0_4, 4, "Voice", NULL); -LCDML_add(142, LCDML_0_4_4, 1, "Save Voice", UI_func_save_voice); +LCDML_add(59, LCDML_0_1_1, 8, "Save Voice", UI_func_save_voice); +LCDML_add(60, LCDML_0_1, 2, "Instance 2", NULL); +LCDML_add(61, LCDML_0_1_2, 1, "Select", UI_func_voice_select); +LCDML_add(62, LCDML_0_1_2, 2, "Audio", NULL); +LCDML_add(63, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity); +LCDML_add(64, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama); +LCDML_add(65, LCDML_0_1_2_2, 3, "Effects Send", NULL); +LCDML_add(66, LCDML_0_1_2_2_3, 1, "Chorus Send", UI_func_chorus_send); +LCDML_add(67, LCDML_0_1_2_2_3, 2, "Delay Send", UI_func_delay_send); +LCDML_add(68, LCDML_0_1_2_2_3, 3, "Reverb Send", UI_func_reverb_send); +LCDML_add(69, LCDML_0_1_2_2, 4, "Filter", NULL); +LCDML_add(70, LCDML_0_1_2_2_4, 1, "Cutoff", UI_func_filter_cutoff); +LCDML_add(71, LCDML_0_1_2_2_4, 2, "Resonance", UI_func_filter_resonance); +LCDML_add(72, LCDML_0_1_2, 3, "Controller", NULL); +LCDML_add(73, LCDML_0_1_2_3, 1, "Pitchbend", NULL); +LCDML_add(74, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range); +LCDML_add(75, LCDML_0_1_2_3_1, 2, "PB Step", UI_func_pb_step); +LCDML_add(76, LCDML_0_1_2_3, 2, "Mod Wheel", NULL); +LCDML_add(77, LCDML_0_1_2_3_2, 1, "MW Range", UI_func_mw_range); +LCDML_add(78, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign); +LCDML_add(79, LCDML_0_1_2_3_2, 3, "MW Mode", UI_func_mw_mode); +LCDML_add(80, LCDML_0_1_2_3, 3, "Aftertouch", NULL); +LCDML_add(81, LCDML_0_1_2_3_3, 1, "AT Range", UI_func_at_range); +LCDML_add(82, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign); +LCDML_add(83, LCDML_0_1_2_3_3, 3, "AT Mode", UI_func_at_mode); +LCDML_add(84, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL); +LCDML_add(85, LCDML_0_1_2_3_4, 1, "FC Range", UI_func_fc_range); +LCDML_add(86, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign); +LCDML_add(87, LCDML_0_1_2_3_4, 3, "FC Mode", UI_func_fc_mode); +LCDML_add(88, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL); +LCDML_add(89, LCDML_0_1_2_3_5, 1, "BC Range", UI_func_bc_range); +LCDML_add(90, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign); +LCDML_add(91, LCDML_0_1_2_3_5, 3, "BC Mode", UI_func_bc_mode); +LCDML_add(92, LCDML_0_1_2, 4, "MIDI", NULL); +LCDML_add(93, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel); +LCDML_add(94, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note); +LCDML_add(95, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note); +LCDML_add(96, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice); +LCDML_add(97, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice); +LCDML_add(98, LCDML_0_1_2, 5, "Setup", NULL); +LCDML_add(99, LCDML_0_1_2_5, 1, "Portamento", NULL); +LCDML_add(100, LCDML_0_1_2_5_1, 1, "Port. Mode", UI_func_portamento_mode); +LCDML_add(101, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando); +LCDML_add(102, LCDML_0_1_2_5_1, 3, "Port. Time", UI_func_portamento_time); +LCDML_add(103, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony); +LCDML_add(104, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose); +LCDML_add(105, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune); +LCDML_add(106, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly); +LCDML_add(107, LCDML_0_1_2, 6, "Internal", NULL); +LCDML_add(108, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh); +LCDML_add(109, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level); +LCDML_add(110, LCDML_0_1_2_6, 3, "Engine", UI_func_engine); +LCDML_add(111, LCDML_0_1_2, 7, "Operator", NULL); +LCDML_add(112, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1); +LCDML_add(113, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2); +LCDML_add(114, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3); +LCDML_add(115, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4); +LCDML_add(116, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5); +LCDML_add(117, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6); +LCDML_add(118, LCDML_0_1_2, 8, "Save Voice", UI_func_save_voice); +LCDML_add(119, LCDML_0, 3, "Effects", NULL); +LCDML_add(120, LCDML_0_3, 1, "Chorus", NULL); +LCDML_add(121, LCDML_0_3_1, 1, "Frequency", UI_func_chorus_frequency); +LCDML_add(122, LCDML_0_3_1, 2, "Waveform", UI_func_chorus_waveform); +LCDML_add(123, LCDML_0_3_1, 3, "Depth", UI_func_chorus_depth); +LCDML_add(124, LCDML_0_3_1, 4, "Level", UI_func_chorus_level); +LCDML_add(125, LCDML_0_3, 2, "Delay", NULL); +LCDML_add(126, LCDML_0_3_2, 1, "Time", UI_func_delay_time); +LCDML_add(127, LCDML_0_3_2, 2, "Feedback", UI_func_delay_feedback); +LCDML_add(128, LCDML_0_3_2, 3, "Level", UI_func_delay_level); +LCDML_add(129, LCDML_0_3, 3, "Reverb", NULL); +LCDML_add(130, LCDML_0_3_3, 1, "Roomsize", UI_func_reverb_roomsize); +LCDML_add(131, LCDML_0_3_3, 2, "Damping", UI_func_reverb_damping); +LCDML_add(132, LCDML_0_3_3, 3, "Level", UI_func_reverb_level); +LCDML_add(133, LCDML_0, 4, "Load/Save", NULL); +LCDML_add(134, LCDML_0_4, 1, "Performance", NULL); +LCDML_add(135, LCDML_0_4_1, 1, "Load Perf.", UI_func_load_performance); +LCDML_add(136, LCDML_0_4_1, 2, "Save Perf.", UI_func_save_performance); +LCDML_add(137, LCDML_0_4, 2, "Voice Config", NULL); +LCDML_add(138, LCDML_0_4_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); +LCDML_add(139, LCDML_0_4_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); +LCDML_add(140, LCDML_0_4, 3, "FX", NULL); +LCDML_add(141, LCDML_0_4_3, 1, "Load Effects Cfg", UI_func_load_fx); +LCDML_add(142, LCDML_0_4_3, 2, "Save Effects Cfg", UI_func_save_fx); LCDML_add(143, LCDML_0_4, 5, "MIDI", NULL); LCDML_add(144, LCDML_0_4_5, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); LCDML_add(145, LCDML_0_4_5, 2, "MIDI Send Bank", UI_func_sysex_send_bank); -LCDML_add(146, LCDML_0_4, 6, "EEPROM Reset", UI_func_eeprom_reset); -LCDML_add(147, LCDML_0, 5, "System", NULL); -LCDML_add(148, LCDML_0_5, 3, "Volume", UI_func_volume); -LCDML_add(149, LCDML_0_5, 1, "Stereo/Mono", UI_func_stereo_mono); -LCDML_add(150, LCDML_0_5, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); +LCDML_add(146, LCDML_0, 5, "System", NULL); +LCDML_add(147, LCDML_0_5, 1, "Volume", UI_func_volume); +LCDML_add(148, LCDML_0_5, 2, "Stereo/Mono", UI_func_stereo_mono); +LCDML_add(149, LCDML_0_5, 3, "MIDI Soft THRU", UI_func_midi_soft_thru); +LCDML_add(150, LCDML_0_5, 4, "EEPROM Reset", UI_func_eeprom_reset); LCDML_add(151, LCDML_0, 6, "Info", UI_func_information); #define _LCDML_DISP_cnt 151 -#define MENU_ID_OF_INSTANCE_2 59 +#define MENU_ID_OF_INSTANCE_2 60 #endif diff --git a/dexed_sd.cpp b/dexed_sd.cpp index eec53ba..5d5eeb3 100644 --- a/dexed_sd.cpp +++ b/dexed_sd.cpp @@ -289,6 +289,58 @@ bool put_sd_voice(File sysex, uint8_t voice_number, uint8_t* data) return (true); } +bool save_sd_bank(const char* bank_filename, uint8_t* data) +{ + char tmp[FILENAME_LEN]; + int bank_number; + File root, entry; + + if (sd_card > 0) + { + // first remove old bank + sscanf(bank_filename, "/%d/%s", &bank_number, tmp); + sprintf(tmp, "/%d", bank_number); + root = SD.open(tmp); + while (42 == 42) + { + entry = root.openNextFile(); + if (entry) + { + if (!entry.isDirectory()) + { +#ifdef DEBUG + Serial.print(F("Removing ")); + Serial.print(tmp); + Serial.print(F("/")); + Serial.println(entry.name()); +#endif + SD.remove(entry.name()); + entry.close(); + } + } + else + { + break; + } + } + root.close(); + + // store new bank at //.syx + root = SD.open(bank_filename); + root.write(data, 4104); + root.close(); +#ifdef DEBUG + Serial.print(F("Storing bank as ")); + Serial.print(bank_filename); + Serial.println(F(".")); +#endif + } + else + return (false); + + return (true); +} + /****************************************************************************** SD VOICECONFIG ******************************************************************************/ diff --git a/dexed_sd.h b/dexed_sd.h index 0c48a1d..9ed47ec 100644 --- a/dexed_sd.h +++ b/dexed_sd.h @@ -51,6 +51,7 @@ bool load_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id); bool save_sd_voice(uint8_t b, uint8_t v, uint8_t instance_id); bool get_sd_voice(File sysex, uint8_t voice_number, uint8_t* data); bool put_sd_voice(File sysex, uint8_t voice_number, uint8_t* data); +bool save_sd_bank(const char* bank_filename, uint8_t* data); bool load_sd_voiceconfig(uint8_t vc, uint8_t instance_id); bool save_sd_voiceconfig(uint8_t vc, uint8_t instance_id); diff --git a/doc/menu-structure.txt b/doc/menu-structure.txt index ccad526..2e5301c 100644 --- a/doc/menu-structure.txt +++ b/doc/menu-structure.txt @@ -1,7 +1,7 @@ Voice Select Audio - Volume + Voice Level Panorama Effect Send Reverb Send @@ -10,10 +10,6 @@ Voice Filter Cutoff Resonance - MIDI - MIDI Channel - Lowest Note - Highest Note Controller Pitchbend PB Range @@ -34,18 +30,24 @@ Voice BC Range BC Assign BC Mode + MIDI + MIDI Channel + Lowest Note + Highest Note + Send Voice + Receive Voice Setup Portamento Port. Mode Port. Gliss Port. Time - Transpose - Tune Polyphony + Transpose + Fine Tune Mono/Poly Internal - Velocity Lvl Note Refresh + Velocity Lvl Engine Operator OP1 @@ -54,6 +56,7 @@ Voice OP4 OP5 OP6 + Save Voice Effect Chorus Frequency @@ -69,10 +72,21 @@ Effect Damping Level Load/Save - Load - Save - Firmware reset + Performance + Load Perf. + Save Perf. + Voice Config + Load Voice Cfg + Save Voice Cfg + Effects + Load Effects Cfg + Save Effects Cfg + MIDI + MIDI Recv Bank + MIDI Send Bank System + Volume Stereo/Mono MIDI Soft THRU + EEPROM Reset Info