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 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."));

@ -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.");

@ -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

@ -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

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(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

@ -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

@ -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 /<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
******************************************************************************/

@ -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);

@ -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

Loading…
Cancel
Save