Upload and storing of a bank via SYSEX.

pull/32/head
Holger Wirtz 5 years ago
parent 9299eb43d9
commit 7e4608b953
  1. 107
      MicroDexed.ino
  2. 9
      UI.hpp
  3. 37
      UI_1.h
  4. 73
      UI_1_FX.h
  5. 132
      UI_2.h
  6. 180
      UI_2_FX.h
  7. 52
      dexed_sd.cpp
  8. 1
      dexed_sd.h
  9. 36
      doc/menu-structure.txt

@ -217,6 +217,7 @@ char version_string[LCD_cols + 1];
char sd_string[LCD_cols + 1]; char sd_string[LCD_cols + 1];
char g_voice_name[NUM_DEXED][VOICE_NAME_LEN]; char g_voice_name[NUM_DEXED][VOICE_NAME_LEN];
char g_bank_name[NUM_DEXED][BANK_NAME_LEN]; char g_bank_name[NUM_DEXED][BANK_NAME_LEN];
char receive_bank_filename[FILENAME_LEN];
#if defined(USE_FX) #if defined(USE_FX)
// Allocate the delay lines for chorus // Allocate the delay lines for chorus
@ -383,6 +384,7 @@ void setup()
memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN); memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN);
memset(g_bank_name[instance_id], 0, BANK_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; 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 #ifdef DEBUG
Serial.print(F("INSTANCE ")); Serial.print(F("INSTANCE "));
Serial.print(instance_id, DEC); Serial.print(instance_id, DEC);
@ -810,13 +826,6 @@ void handleSystemExclusive(byte * sysex, uint len)
#endif #endif
return; return;
} }
if (sysex[6] != 0xf7)
{
#ifdef DEBUG
Serial.println(F("E: SysEx end status byte not detected."));
#endif
return;
}
sysex[4] &= 0x7f; sysex[4] &= 0x7f;
sysex[5] &= 0x7f; sysex[5] &= 0x7f;
@ -921,14 +930,6 @@ void handleSystemExclusive(byte * sysex, uint len)
Serial.println(F("One Voice bulk upload")); Serial.println(F("One Voice bulk upload"));
#endif #endif
if (sysex[162] != 0xf7)
{
#ifdef DEBUG
Serial.println(F("E: Found no SysEx end marker."));
#endif
return;
}
if ((sysex[3] & 0x7f) != 0) if ((sysex[3] & 0x7f) != 0)
{ {
#ifdef DEBUG #ifdef DEBUG
@ -964,6 +965,13 @@ void handleSystemExclusive(byte * sysex, uint len)
return; 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 // load sysex-data into voice memory
MicroDexed[instance_id]->loadVoiceParameters(&sysex[6]); MicroDexed[instance_id]->loadVoiceParameters(&sysex[6]);
@ -972,16 +980,75 @@ void handleSystemExclusive(byte * sysex, uint len)
#endif #endif
// show voice name // 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); strncpy(g_voice_name[instance_id], (char*)&sysex[151], VOICE_NAME_LEN - 1);
LCDML.OTHER_updateFunc(); LCDML.OTHER_updateFunc();
LCDML.loop_menu(); 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 #ifdef DEBUG
else else
Serial.println(F("E: SysEx parameter length wrong.")); Serial.println(F("E: SysEx parameter length wrong."));

@ -89,6 +89,7 @@ extern AudioSynthWaveformDc* pan[NUM_DEXED];
extern char sd_string[LCD_cols + 1]; extern char sd_string[LCD_cols + 1];
extern char g_voice_name[NUM_DEXED][VOICE_NAME_LEN]; extern char g_voice_name[NUM_DEXED][VOICE_NAME_LEN];
extern char g_bank_name[NUM_DEXED][BANK_NAME_LEN]; extern char g_bank_name[NUM_DEXED][BANK_NAME_LEN];
extern char receive_bank_filename[FILENAME_LEN];
/*********************************************************************** /***********************************************************************
GLOBAL GLOBAL
@ -4109,9 +4110,11 @@ void UI_func_save_voice(uint8_t param)
{ {
static bool yesno; static bool yesno;
static uint8_t mode; static uint8_t mode;
uint8_t instance_id = 0; uint8_t instance_id = 0;
if (LCDML.FUNC_getID() > MENU_ID_OF_INSTANCE_2)
instance_id = 1;
if (LCDML.FUNC_setup()) // ****** SETUP ********* if (LCDML.FUNC_setup()) // ****** SETUP *********
{ {
encoderDir[ENC_R].reset(); encoderDir[ENC_R].reset();
@ -4207,13 +4210,15 @@ void UI_func_save_voice(uint8_t param)
{ {
if (yesno == true) if (yesno == true)
{ {
#ifdef DEBUG
bool ret = save_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id); bool ret = save_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id);
#ifdef DEBUG
if (ret == true) if (ret == true)
Serial.println(F("Saving voice OK.")); Serial.println(F("Saving voice OK."));
else else
Serial.println(F("Error while saving voice.")); Serial.println(F("Error while saving voice."));
#else
save_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id);
#endif #endif
lcd.show(1, 0, 16, "Done."); lcd.show(1, 0, 16, "Done.");

@ -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(48, LCDML_0_1_7, 4, "OP4", UI_func_OP4);
LCDML_add(49, LCDML_0_1_7, 5, "OP5", UI_func_OP5); 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(50, LCDML_0_1_7, 6, "OP6", UI_func_OP6);
LCDML_add(51, LCDML_0, 2, "Load/Save", NULL); LCDML_add(51, LCDML_0_1, 8, "Save Voice", UI_func_save_voice);
LCDML_add(52, LCDML_0_2, 1, "Performance", NULL); LCDML_add(52, LCDML_0, 2, "Load/Save", NULL);
LCDML_add(53, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance); LCDML_add(53, LCDML_0_2, 1, "Performance", NULL);
LCDML_add(54, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance); LCDML_add(54, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance);
LCDML_add(55, LCDML_0_2, 2, "Voice Config", NULL); LCDML_add(55, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance);
LCDML_add(56, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); LCDML_add(56, LCDML_0_2, 2, "Voice Config", NULL);
LCDML_add(57, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); LCDML_add(57, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig);
LCDML_add(58, LCDML_0_2, 3, "Voice", NULL); LCDML_add(58, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig);
LCDML_add(59, LCDML_0_2_3, 1, "Save Voice", UI_func_save_voice); LCDML_add(59, LCDML_0_2, 4, "MIDI", NULL);
LCDML_add(60, 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, 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_2_4, 2, "MIDI Send Bank", UI_func_sysex_send_bank); LCDML_add(62, LCDML_0, 3, "System", NULL);
LCDML_add(63, LCDML_0_2, 5, "EEPROM Reset", UI_func_eeprom_reset); LCDML_add(63, LCDML_0_3, 1, "Volume", UI_func_volume);
LCDML_add(64, LCDML_0, 3, "System", NULL); LCDML_add(64, LCDML_0_3, 2, "Stereo/Mono", UI_func_stereo_mono);
LCDML_add(65, LCDML_0_3, 3, "Volume", UI_func_volume); LCDML_add(65, LCDML_0_3, 3, "MIDI Soft THRU", UI_func_midi_soft_thru);
LCDML_add(66, LCDML_0_3, 1, "Stereo/Mono", UI_func_stereo_mono); LCDML_add(66, LCDML_0_3, 4, "EEPROM Reset", UI_func_eeprom_reset);
LCDML_add(67, LCDML_0_3, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); LCDML_add(67, LCDML_0, 4, "Info", UI_func_information);
LCDML_add(68, LCDML_0, 4, "Info", UI_func_information); #define _LCDML_DISP_cnt 67
#define _LCDML_DISP_cnt 68
#define MENU_ID_OF_INSTANCE_2 51 #define MENU_ID_OF_INSTANCE_2 51
#endif #endif

@ -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(55, LCDML_0_1_7, 4, "OP4", UI_func_OP4);
LCDML_add(56, LCDML_0_1_7, 5, "OP5", UI_func_OP5); 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(57, LCDML_0_1_7, 6, "OP6", UI_func_OP6);
LCDML_add(58, LCDML_0, 2, "Effects", NULL); LCDML_add(58, LCDML_0_1, 8, "Save Voice", UI_func_save_voice);
LCDML_add(59, LCDML_0_2, 1, "Chorus", NULL); LCDML_add(59, LCDML_0, 2, "Effects", NULL);
LCDML_add(60, LCDML_0_2_1, 1, "Frequency", UI_func_chorus_frequency); LCDML_add(60, LCDML_0_2, 1, "Chorus", NULL);
LCDML_add(61, LCDML_0_2_1, 2, "Waveform", UI_func_chorus_waveform); LCDML_add(61, LCDML_0_2_1, 1, "Frequency", UI_func_chorus_frequency);
LCDML_add(62, LCDML_0_2_1, 3, "Depth", UI_func_chorus_depth); LCDML_add(62, LCDML_0_2_1, 2, "Waveform", UI_func_chorus_waveform);
LCDML_add(63, LCDML_0_2_1, 4, "Level", UI_func_chorus_level); LCDML_add(63, LCDML_0_2_1, 3, "Depth", UI_func_chorus_depth);
LCDML_add(64, LCDML_0_2, 2, "Delay", NULL); LCDML_add(64, LCDML_0_2_1, 4, "Level", UI_func_chorus_level);
LCDML_add(65, LCDML_0_2_2, 1, "Time", UI_func_delay_time); LCDML_add(65, LCDML_0_2, 2, "Delay", NULL);
LCDML_add(66, LCDML_0_2_2, 2, "Feedback", UI_func_delay_feedback); LCDML_add(66, LCDML_0_2_2, 1, "Time", UI_func_delay_time);
LCDML_add(67, LCDML_0_2_2, 3, "Level", UI_func_delay_level); LCDML_add(67, LCDML_0_2_2, 2, "Feedback", UI_func_delay_feedback);
LCDML_add(68, LCDML_0_2, 3, "Reverb", NULL); LCDML_add(68, LCDML_0_2_2, 3, "Level", UI_func_delay_level);
LCDML_add(69, LCDML_0_2_3, 1, "Roomsize", UI_func_reverb_roomsize); LCDML_add(69, LCDML_0_2, 3, "Reverb", NULL);
LCDML_add(70, LCDML_0_2_3, 2, "Damping", UI_func_reverb_damping); LCDML_add(70, LCDML_0_2_3, 1, "Roomsize", UI_func_reverb_roomsize);
LCDML_add(71, LCDML_0_2_3, 3, "Level", UI_func_reverb_level); LCDML_add(71, LCDML_0_2_3, 2, "Damping", UI_func_reverb_damping);
LCDML_add(72, LCDML_0, 3, "Load/Save", NULL); LCDML_add(72, LCDML_0_2_3, 3, "Level", UI_func_reverb_level);
LCDML_add(73, LCDML_0_3, 1, "Performance", NULL); LCDML_add(73, LCDML_0, 3, "Load/Save", NULL);
LCDML_add(74, LCDML_0_3_1, 1, "Load Perf.", UI_func_load_performance); LCDML_add(74, LCDML_0_3, 1, "Performance", NULL);
LCDML_add(75, LCDML_0_3_1, 2, "Save Perf.", UI_func_save_performance); LCDML_add(75, LCDML_0_3_1, 1, "Load Perf.", UI_func_load_performance);
LCDML_add(76, LCDML_0_3, 2, "Voice Config", NULL); LCDML_add(76, LCDML_0_3_1, 2, "Save Perf.", UI_func_save_performance);
LCDML_add(77, LCDML_0_3_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); LCDML_add(77, LCDML_0_3, 2, "Voice Config", NULL);
LCDML_add(78, LCDML_0_3_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); LCDML_add(78, LCDML_0_3_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig);
LCDML_add(79, LCDML_0_3, 3, "Effects", NULL); LCDML_add(79, LCDML_0_3_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig);
LCDML_add(80, LCDML_0_3_3, 1, "Load Effects Cfg", UI_func_load_fx); LCDML_add(80, LCDML_0_3, 3, "Effects", NULL);
LCDML_add(81, LCDML_0_3_3, 2, "Save Effects Cfg", UI_func_save_fx); LCDML_add(81, LCDML_0_3_3, 1, "Load Effects Cfg", UI_func_load_fx);
LCDML_add(82, LCDML_0_3, 4, "Voice", NULL); LCDML_add(82, LCDML_0_3_3, 2, "Save Effects Cfg", UI_func_save_fx);
LCDML_add(83, LCDML_0_3_4, 1, "Save Voice", UI_func_save_voice); LCDML_add(83, LCDML_0_3, 5, "MIDI", NULL);
LCDML_add(84, 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, 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_3_5, 2, "MIDI Send Bank", UI_func_sysex_send_bank); LCDML_add(86, LCDML_0, 4, "System", NULL);
LCDML_add(87, LCDML_0_3, 6, "EEPROM Reset", UI_func_eeprom_reset); LCDML_add(87, LCDML_0_4, 1, "Volume", UI_func_volume);
LCDML_add(88, LCDML_0, 4, "System", NULL); LCDML_add(88, LCDML_0_4, 2, "Stereo/Mono", UI_func_stereo_mono);
LCDML_add(89, LCDML_0_4, 3, "Volume", UI_func_volume); LCDML_add(89, LCDML_0_4, 3, "MIDI Soft THRU", UI_func_midi_soft_thru);
LCDML_add(90, LCDML_0_4, 1, "Stereo/Mono", UI_func_stereo_mono); LCDML_add(90, LCDML_0_4, 4, "EEPROM Reset", UI_func_eeprom_reset);
LCDML_add(91, LCDML_0_4, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); LCDML_add(91, LCDML_0, 6, "Info", UI_func_information);
LCDML_add(92, LCDML_0, 6, "Info", UI_func_information); #define _LCDML_DISP_cnt 91
#define _LCDML_DISP_cnt 92 #define MENU_ID_OF_INSTANCE_2 59
#define MENU_ID_OF_INSTANCE_2 58
#endif #endif

132
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(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(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(51, LCDML_0_1_1_7, 6, "OP6", UI_func_OP6);
LCDML_add(52, LCDML_0_1, 2, "Instance 2", NULL); LCDML_add(52, LCDML_0_1_1, 8, "Save Voice", UI_func_save_voice);
LCDML_add(53, LCDML_0_1_2, 1, "Select", UI_func_voice_select); LCDML_add(53, LCDML_0_1, 2, "Instance 2", NULL);
LCDML_add(54, LCDML_0_1_2, 2, "Audio", NULL); LCDML_add(54, LCDML_0_1_2, 1, "Select", UI_func_voice_select);
LCDML_add(55, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity); LCDML_add(55, LCDML_0_1_2, 2, "Audio", NULL);
LCDML_add(56, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama); LCDML_add(56, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity);
LCDML_add(57, LCDML_0_1_2, 3, "Controller", NULL); LCDML_add(57, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama);
LCDML_add(58, LCDML_0_1_2_3, 1, "Pitchbend", NULL); LCDML_add(58, LCDML_0_1_2, 3, "Controller", NULL);
LCDML_add(59, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range); LCDML_add(59, LCDML_0_1_2_3, 1, "Pitchbend", NULL);
LCDML_add(60, LCDML_0_1_2_3_1, 2, "PB Step", UI_func_pb_step); LCDML_add(60, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range);
LCDML_add(61, LCDML_0_1_2_3, 2, "Mod Wheel", NULL); 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, 1, "MW Range", UI_func_mw_range); LCDML_add(62, LCDML_0_1_2_3, 2, "Mod Wheel", NULL);
LCDML_add(63, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign); 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, 3, "MW Mode", UI_func_mw_mode); LCDML_add(64, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign);
LCDML_add(65, LCDML_0_1_2_3, 3, "Aftertouch", NULL); 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, 1, "AT Range", UI_func_at_range); LCDML_add(66, LCDML_0_1_2_3, 3, "Aftertouch", NULL);
LCDML_add(67, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign); 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, 3, "AT Mode", UI_func_at_mode); LCDML_add(68, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign);
LCDML_add(69, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL); 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, 1, "FC Range", UI_func_fc_range); LCDML_add(70, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL);
LCDML_add(71, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign); 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, 3, "FC Mode", UI_func_fc_mode); LCDML_add(72, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign);
LCDML_add(73, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL); 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, 1, "BC Range", UI_func_bc_range); LCDML_add(74, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL);
LCDML_add(75, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign); 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, 3, "BC Mode", UI_func_bc_mode); LCDML_add(76, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign);
LCDML_add(77, LCDML_0_1_2, 4, "MIDI", NULL); LCDML_add(77, LCDML_0_1_2_3_5, 3, "BC Mode", UI_func_bc_mode);
LCDML_add(78, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel); LCDML_add(78, LCDML_0_1_2, 4, "MIDI", NULL);
LCDML_add(79, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note); LCDML_add(79, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel);
LCDML_add(80, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note); LCDML_add(80, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note);
LCDML_add(81, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice); LCDML_add(81, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note);
LCDML_add(82, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice); LCDML_add(82, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice);
LCDML_add(83, LCDML_0_1_2, 5, "Setup", NULL); LCDML_add(83, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice);
LCDML_add(84, LCDML_0_1_2_5, 1, "Portamento", NULL); LCDML_add(84, LCDML_0_1_2, 5, "Setup", NULL);
LCDML_add(85, LCDML_0_1_2_5_1, 1, "Port. Mode", UI_func_portamento_mode); LCDML_add(85, LCDML_0_1_2_5, 1, "Portamento", NULL);
LCDML_add(86, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando); 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, 3, "Port. Time", UI_func_portamento_time); LCDML_add(87, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando);
LCDML_add(88, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony); LCDML_add(88, LCDML_0_1_2_5_1, 3, "Port. Time", UI_func_portamento_time);
LCDML_add(89, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose); LCDML_add(89, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony);
LCDML_add(90, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune); LCDML_add(90, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose);
LCDML_add(91, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly); LCDML_add(91, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune);
LCDML_add(92, LCDML_0_1_2, 6, "Internal", NULL); LCDML_add(92, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly);
LCDML_add(93, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh); LCDML_add(93, LCDML_0_1_2, 6, "Internal", NULL);
LCDML_add(94, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level); LCDML_add(94, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh);
LCDML_add(95, LCDML_0_1_2_6, 3, "Engine", UI_func_engine); LCDML_add(95, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level);
LCDML_add(96, LCDML_0_1_2, 7, "Operator", NULL); LCDML_add(96, LCDML_0_1_2_6, 3, "Engine", UI_func_engine);
LCDML_add(97, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1); LCDML_add(97, LCDML_0_1_2, 7, "Operator", NULL);
LCDML_add(98, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2); LCDML_add(98, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1);
LCDML_add(99, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3); LCDML_add(99, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2);
LCDML_add(100, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4); LCDML_add(100, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3);
LCDML_add(101, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5); LCDML_add(101, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4);
LCDML_add(102, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6); LCDML_add(102, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5);
LCDML_add(103, LCDML_0, 2, "Load/Save", NULL); LCDML_add(103, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6);
LCDML_add(104, LCDML_0_2, 1, "Performance", NULL); LCDML_add(104, LCDML_0_1_2, 8, "Save Voice", UI_func_save_voice);
LCDML_add(105, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance); LCDML_add(105, LCDML_0, 2, "Load/Save", NULL);
LCDML_add(106, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance); LCDML_add(106, LCDML_0_2, 1, "Performance", NULL);
LCDML_add(107, LCDML_0_2, 2, "Voice Config", NULL); LCDML_add(107, LCDML_0_2_1, 1, "Load Perf.", UI_func_load_performance);
LCDML_add(108, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); LCDML_add(108, LCDML_0_2_1, 2, "Save Perf.", UI_func_save_performance);
LCDML_add(109, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); LCDML_add(109, LCDML_0_2, 2, "Voice Config", NULL);
LCDML_add(110, LCDML_0_2, 3, "Voice", NULL); LCDML_add(110, LCDML_0_2_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig);
LCDML_add(111, LCDML_0_2_3, 1, "Save Voice", UI_func_save_voice); 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(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(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(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(116, LCDML_0, 3, "System", NULL);
LCDML_add(117, LCDML_0_3, 3, "Volume", UI_func_volume); LCDML_add(117, LCDML_0_3, 1, "Volume", UI_func_volume);
LCDML_add(118, LCDML_0_3, 1, "Stereo/Mono", UI_func_stereo_mono); LCDML_add(118, LCDML_0_3, 2, "Stereo/Mono", UI_func_stereo_mono);
LCDML_add(119, LCDML_0_3, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); LCDML_add(119, LCDML_0_3, 3, "MIDI Soft THRU", UI_func_midi_soft_thru);
LCDML_add(120, LCDML_0, 4, "Info", UI_func_information); LCDML_add(120, LCDML_0_2, 4, "EEPROM Reset", UI_func_eeprom_reset);
#define _LCDML_DISP_cnt 120 LCDML_add(121, LCDML_0, 4, "Info", UI_func_information);
#define _LCDML_DISP_cnt 121
#define MENU_ID_OF_INSTANCE_2 52 #define MENU_ID_OF_INSTANCE_2 52
#endif #endif

@ -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(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(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(58, LCDML_0_1_1_7, 6, "OP6", UI_func_OP6);
LCDML_add(59, LCDML_0_1, 2, "Instance 2", NULL); LCDML_add(59, LCDML_0_1_1, 8, "Save Voice", UI_func_save_voice);
LCDML_add(60, LCDML_0_1_2, 1, "Select", UI_func_voice_select); LCDML_add(60, LCDML_0_1, 2, "Instance 2", NULL);
LCDML_add(61, LCDML_0_1_2, 2, "Audio", NULL); LCDML_add(61, LCDML_0_1_2, 1, "Select", UI_func_voice_select);
LCDML_add(62, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity); LCDML_add(62, LCDML_0_1_2, 2, "Audio", NULL);
LCDML_add(63, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama); LCDML_add(63, LCDML_0_1_2_2, 1, "Voice Level", UI_func_sound_intensity);
LCDML_add(64, LCDML_0_1_2_2, 3, "Effects Send", NULL); LCDML_add(64, LCDML_0_1_2_2, 2, "Panorama", UI_func_panorama);
LCDML_add(65, LCDML_0_1_2_2_3, 1, "Chorus Send", UI_func_chorus_send); LCDML_add(65, LCDML_0_1_2_2, 3, "Effects Send", NULL);
LCDML_add(66, LCDML_0_1_2_2_3, 2, "Delay Send", UI_func_delay_send); 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, 3, "Reverb Send", UI_func_reverb_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, 4, "Filter", NULL); 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, 1, "Cutoff", UI_func_filter_cutoff); LCDML_add(69, LCDML_0_1_2_2, 4, "Filter", NULL);
LCDML_add(70, LCDML_0_1_2_2_4, 2, "Resonance", UI_func_filter_resonance); LCDML_add(70, LCDML_0_1_2_2_4, 1, "Cutoff", UI_func_filter_cutoff);
LCDML_add(71, LCDML_0_1_2, 3, "Controller", NULL); LCDML_add(71, LCDML_0_1_2_2_4, 2, "Resonance", UI_func_filter_resonance);
LCDML_add(72, LCDML_0_1_2_3, 1, "Pitchbend", NULL); LCDML_add(72, LCDML_0_1_2, 3, "Controller", NULL);
LCDML_add(73, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range); LCDML_add(73, LCDML_0_1_2_3, 1, "Pitchbend", NULL);
LCDML_add(74, LCDML_0_1_2_3_1, 2, "PB Step", UI_func_pb_step); LCDML_add(74, LCDML_0_1_2_3_1, 1, "PB Range", UI_func_pb_range);
LCDML_add(75, LCDML_0_1_2_3, 2, "Mod Wheel", NULL); 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, 1, "MW Range", UI_func_mw_range); LCDML_add(76, LCDML_0_1_2_3, 2, "Mod Wheel", NULL);
LCDML_add(77, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign); 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, 3, "MW Mode", UI_func_mw_mode); LCDML_add(78, LCDML_0_1_2_3_2, 2, "MW Assign", UI_func_mw_assign);
LCDML_add(79, LCDML_0_1_2_3, 3, "Aftertouch", NULL); 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, 1, "AT Range", UI_func_at_range); LCDML_add(80, LCDML_0_1_2_3, 3, "Aftertouch", NULL);
LCDML_add(81, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign); 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, 3, "AT Mode", UI_func_at_mode); LCDML_add(82, LCDML_0_1_2_3_3, 2, "AT Assign", UI_func_at_assign);
LCDML_add(83, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL); 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, 1, "FC Range", UI_func_fc_range); LCDML_add(84, LCDML_0_1_2_3, 4, "Foot Ctrl", NULL);
LCDML_add(85, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign); 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, 3, "FC Mode", UI_func_fc_mode); LCDML_add(86, LCDML_0_1_2_3_4, 2, "FC Assign", UI_func_fc_assign);
LCDML_add(87, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL); 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, 1, "BC Range", UI_func_bc_range); LCDML_add(88, LCDML_0_1_2_3, 5, "Breath Ctrl", NULL);
LCDML_add(89, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign); 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, 3, "BC Mode", UI_func_bc_mode); LCDML_add(90, LCDML_0_1_2_3_5, 2, "BC Assign", UI_func_bc_assign);
LCDML_add(91, LCDML_0_1_2, 4, "MIDI", NULL); LCDML_add(91, LCDML_0_1_2_3_5, 3, "BC Mode", UI_func_bc_mode);
LCDML_add(92, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel); LCDML_add(92, LCDML_0_1_2, 4, "MIDI", NULL);
LCDML_add(93, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note); LCDML_add(93, LCDML_0_1_2_4, 1, "MIDI Channel", UI_func_midi_channel);
LCDML_add(94, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note); LCDML_add(94, LCDML_0_1_2_4, 2, "Lowest Note", UI_func_lowest_note);
LCDML_add(95, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice); LCDML_add(95, LCDML_0_1_2_4, 3, "Highest Note", UI_func_highest_note);
LCDML_add(96, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice); LCDML_add(96, LCDML_0_1_2_4, 4, "Send Voice", UI_func_sysex_send_voice);
LCDML_add(97, LCDML_0_1_2, 5, "Setup", NULL); LCDML_add(97, LCDML_0_1_2_4, 5, "Receive Voice", UI_func_sysex_receive_voice);
LCDML_add(98, LCDML_0_1_2_5, 1, "Portamento", NULL); LCDML_add(98, LCDML_0_1_2, 5, "Setup", NULL);
LCDML_add(99, LCDML_0_1_2_5_1, 1, "Port. Mode", UI_func_portamento_mode); LCDML_add(99, LCDML_0_1_2_5, 1, "Portamento", NULL);
LCDML_add(100, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando); 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, 3, "Port. Time", UI_func_portamento_time); LCDML_add(101, LCDML_0_1_2_5_1, 2, "Port. Gliss", UI_func_portamento_glissando);
LCDML_add(102, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony); LCDML_add(102, LCDML_0_1_2_5_1, 3, "Port. Time", UI_func_portamento_time);
LCDML_add(103, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose); LCDML_add(103, LCDML_0_1_2_5, 2, "Polyphony", UI_func_polyphony);
LCDML_add(104, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune); LCDML_add(104, LCDML_0_1_2_5, 3, "Transpose", UI_func_transpose);
LCDML_add(105, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly); LCDML_add(105, LCDML_0_1_2_5, 4, "Fine Tune", UI_func_tune);
LCDML_add(106, LCDML_0_1_2, 6, "Internal", NULL); LCDML_add(106, LCDML_0_1_2_5, 5, "Mono/Poly", UI_func_mono_poly);
LCDML_add(107, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh); LCDML_add(107, LCDML_0_1_2, 6, "Internal", NULL);
LCDML_add(108, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level); LCDML_add(108, LCDML_0_1_2_6, 1, "Note Refresh", UI_func_note_refresh);
LCDML_add(109, LCDML_0_1_2_6, 3, "Engine", UI_func_engine); LCDML_add(109, LCDML_0_1_2_6, 2, "Velocity Lvl", UI_func_velocity_level);
LCDML_add(110, LCDML_0_1_2, 7, "Operator", NULL); LCDML_add(110, LCDML_0_1_2_6, 3, "Engine", UI_func_engine);
LCDML_add(111, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1); LCDML_add(111, LCDML_0_1_2, 7, "Operator", NULL);
LCDML_add(112, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2); LCDML_add(112, LCDML_0_1_2_7, 1, "OP1", UI_func_OP1);
LCDML_add(113, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3); LCDML_add(113, LCDML_0_1_2_7, 2, "OP2", UI_func_OP2);
LCDML_add(114, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4); LCDML_add(114, LCDML_0_1_2_7, 3, "OP3", UI_func_OP3);
LCDML_add(115, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5); LCDML_add(115, LCDML_0_1_2_7, 4, "OP4", UI_func_OP4);
LCDML_add(116, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6); LCDML_add(116, LCDML_0_1_2_7, 5, "OP5", UI_func_OP5);
LCDML_add(117, LCDML_0, 3, "Effects", NULL); LCDML_add(117, LCDML_0_1_2_7, 6, "OP6", UI_func_OP6);
LCDML_add(118, LCDML_0_3, 1, "Chorus", NULL); LCDML_add(118, LCDML_0_1_2, 8, "Save Voice", UI_func_save_voice);
LCDML_add(119, LCDML_0_3_1, 1, "Frequency", UI_func_chorus_frequency); LCDML_add(119, LCDML_0, 3, "Effects", NULL);
LCDML_add(120, LCDML_0_3_1, 2, "Waveform", UI_func_chorus_waveform); LCDML_add(120, LCDML_0_3, 1, "Chorus", NULL);
LCDML_add(121, LCDML_0_3_1, 3, "Depth", UI_func_chorus_depth); LCDML_add(121, LCDML_0_3_1, 1, "Frequency", UI_func_chorus_frequency);
LCDML_add(122, LCDML_0_3_1, 4, "Level", UI_func_chorus_level); LCDML_add(122, LCDML_0_3_1, 2, "Waveform", UI_func_chorus_waveform);
LCDML_add(123, LCDML_0_3, 2, "Delay", NULL); LCDML_add(123, LCDML_0_3_1, 3, "Depth", UI_func_chorus_depth);
LCDML_add(124, LCDML_0_3_2, 1, "Time", UI_func_delay_time); LCDML_add(124, LCDML_0_3_1, 4, "Level", UI_func_chorus_level);
LCDML_add(125, LCDML_0_3_2, 2, "Feedback", UI_func_delay_feedback); LCDML_add(125, LCDML_0_3, 2, "Delay", NULL);
LCDML_add(126, LCDML_0_3_2, 3, "Level", UI_func_delay_level); LCDML_add(126, LCDML_0_3_2, 1, "Time", UI_func_delay_time);
LCDML_add(127, LCDML_0_3, 3, "Reverb", NULL); LCDML_add(127, LCDML_0_3_2, 2, "Feedback", UI_func_delay_feedback);
LCDML_add(128, LCDML_0_3_3, 1, "Roomsize", UI_func_reverb_roomsize); LCDML_add(128, LCDML_0_3_2, 3, "Level", UI_func_delay_level);
LCDML_add(129, LCDML_0_3_3, 2, "Damping", UI_func_reverb_damping); LCDML_add(129, LCDML_0_3, 3, "Reverb", NULL);
LCDML_add(130, LCDML_0_3_3, 3, "Level", UI_func_reverb_level); LCDML_add(130, LCDML_0_3_3, 1, "Roomsize", UI_func_reverb_roomsize);
LCDML_add(131, LCDML_0, 4, "Load/Save", NULL); LCDML_add(131, LCDML_0_3_3, 2, "Damping", UI_func_reverb_damping);
LCDML_add(132, LCDML_0_4, 1, "Performance", NULL); LCDML_add(132, LCDML_0_3_3, 3, "Level", UI_func_reverb_level);
LCDML_add(133, LCDML_0_4_1, 1, "Load Perf.", UI_func_load_performance); LCDML_add(133, LCDML_0, 4, "Load/Save", NULL);
LCDML_add(134, LCDML_0_4_1, 2, "Save Perf.", UI_func_save_performance); LCDML_add(134, LCDML_0_4, 1, "Performance", NULL);
LCDML_add(135, LCDML_0_4, 2, "Voice Config", NULL); LCDML_add(135, LCDML_0_4_1, 1, "Load Perf.", UI_func_load_performance);
LCDML_add(136, LCDML_0_4_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig); LCDML_add(136, LCDML_0_4_1, 2, "Save Perf.", UI_func_save_performance);
LCDML_add(137, LCDML_0_4_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig); LCDML_add(137, LCDML_0_4, 2, "Voice Config", NULL);
LCDML_add(138, LCDML_0_4, 3, "FX", NULL); LCDML_add(138, LCDML_0_4_2, 1, "Load Voice Cfg", UI_func_load_voiceconfig);
LCDML_add(139, LCDML_0_4_3, 1, "Load Effects Cfg", UI_func_load_fx); LCDML_add(139, LCDML_0_4_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig);
LCDML_add(140, LCDML_0_4_3, 2, "Save Effects Cfg", UI_func_save_fx); LCDML_add(140, LCDML_0_4, 3, "FX", NULL);
LCDML_add(141, LCDML_0_4, 4, "Voice", NULL); LCDML_add(141, LCDML_0_4_3, 1, "Load Effects Cfg", UI_func_load_fx);
LCDML_add(142, LCDML_0_4_4, 1, "Save Voice", UI_func_save_voice); 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(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(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(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(146, LCDML_0, 5, "System", NULL);
LCDML_add(147, LCDML_0, 5, "System", NULL); LCDML_add(147, LCDML_0_5, 1, "Volume", UI_func_volume);
LCDML_add(148, LCDML_0_5, 3, "Volume", UI_func_volume); LCDML_add(148, LCDML_0_5, 2, "Stereo/Mono", UI_func_stereo_mono);
LCDML_add(149, LCDML_0_5, 1, "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, 2, "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); LCDML_add(151, LCDML_0, 6, "Info", UI_func_information);
#define _LCDML_DISP_cnt 151 #define _LCDML_DISP_cnt 151
#define MENU_ID_OF_INSTANCE_2 59 #define MENU_ID_OF_INSTANCE_2 60
#endif #endif

@ -289,6 +289,58 @@ bool put_sd_voice(File sysex, uint8_t voice_number, uint8_t* data)
return (true); 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 /<b>/<bank_name>.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 SD VOICECONFIG
******************************************************************************/ ******************************************************************************/

@ -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 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 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 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 load_sd_voiceconfig(uint8_t vc, uint8_t instance_id);
bool save_sd_voiceconfig(uint8_t vc, uint8_t instance_id); bool save_sd_voiceconfig(uint8_t vc, uint8_t instance_id);

@ -1,7 +1,7 @@
Voice Voice
Select Select
Audio Audio
Volume Voice Level
Panorama Panorama
Effect Send Effect Send
Reverb Send Reverb Send
@ -10,10 +10,6 @@ Voice
Filter Filter
Cutoff Cutoff
Resonance Resonance
MIDI
MIDI Channel
Lowest Note
Highest Note
Controller Controller
Pitchbend Pitchbend
PB Range PB Range
@ -34,18 +30,24 @@ Voice
BC Range BC Range
BC Assign BC Assign
BC Mode BC Mode
MIDI
MIDI Channel
Lowest Note
Highest Note
Send Voice
Receive Voice
Setup Setup
Portamento Portamento
Port. Mode Port. Mode
Port. Gliss Port. Gliss
Port. Time Port. Time
Transpose
Tune
Polyphony Polyphony
Transpose
Fine Tune
Mono/Poly Mono/Poly
Internal Internal
Velocity Lvl
Note Refresh Note Refresh
Velocity Lvl
Engine Engine
Operator Operator
OP1 OP1
@ -54,6 +56,7 @@ Voice
OP4 OP4
OP5 OP5
OP6 OP6
Save Voice
Effect Effect
Chorus Chorus
Frequency Frequency
@ -69,10 +72,21 @@ Effect
Damping Damping
Level Level
Load/Save Load/Save
Load Performance
Save Load Perf.
Firmware reset 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 System
Volume
Stereo/Mono Stereo/Mono
MIDI Soft THRU MIDI Soft THRU
EEPROM Reset
Info Info

Loading…
Cancel
Save