diff --git a/MicroDexed.ino b/MicroDexed.ino index 8c662da..4f6aedd 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -200,12 +200,10 @@ char voice_name[NUM_DEXED][VOICE_NAME_LEN]; char bank_names[NUM_DEXED][MAX_BANKS][BANK_NAME_LEN]; char voice_names[NUM_DEXED][MAX_VOICES][VOICE_NAME_LEN]; uint8_t dexed_setup_number = 1; -elapsedMillis autostore; uint8_t midi_timing_counter = 0; // 24 per qarter elapsedMillis midi_timing_timestep; uint16_t midi_timing_quarter = 0; elapsedMillis long_button_pressed; -//elapsedMicros fill_audio_buffer; elapsedMillis control_rate; uint8_t active_voices[NUM_DEXED]; #ifdef SHOW_CPU_LOAD_MSEC @@ -217,7 +215,6 @@ uint32_t peak_dexed = 0; float peak_dexed_value = 0.0; uint32_t peak_r = 0; uint32_t peak_l = 0; -bool eeprom_update_flag = false; config_t configuration; const uint8_t cs_pins[] = { SDCARD_TEENSY_CS_PIN, SDCARD_AUDIO_CS_PIN }; const uint8_t mosi_pins[] = { SDCARD_TEENSY_MOSI_PIN, SDCARD_AUDIO_MOSI_PIN }; @@ -232,12 +229,12 @@ int16_t delayline_l[MOD_DELAY_SAMPLE_BUFFER]; #endif #ifdef ENABLE_LCD_UI -/*********************************************************************** - LCDMenuLib2 - ***********************************************************************/ extern LCDMenuLib2 LCDML; #endif +/*********************************************************************** + SETUP + ***********************************************************************/ void setup() { // Start audio system @@ -606,12 +603,14 @@ void loop() { control_rate = 0; - // EEPROM update handling - if (autostore >= AUTOSTORE_MS && eeprom_update_flag == true) - { - // only store configuration data to EEPROM when AUTOSTORE_MS is reached and no voices are activated anymore - eeprom_update_sys(); - } + /* + // EEPROM update handling + if (autostore >= AUTOSTORE_MS && eeprom_update_flag == true) + { + // only store configuration data to EEPROM when AUTOSTORE_MS is reached and no voices are activated anymore + eeprom_update_sys(); + } + */ // check for value changes, unused voices and CPU overload for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) @@ -709,7 +708,7 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) if (inValue < MAX_BANKS - 1) { configuration.performance.bank[instance_id] = inValue; - eeprom_write(); + //eeprom_write(); } break; case 1: @@ -737,7 +736,7 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) case 5: // Portamento time configuration.dexed[instance_id].portamento_time = inValue; MicroDexed[instance_id]->setPortamentoMode(configuration.dexed[instance_id].portamento_mode, configuration.dexed[instance_id].portamento_glissando, configuration.dexed[instance_id].portamento_time); - eeprom_write(); + //eeprom_write(); break; case 7: // Instance Volume #ifdef DEBUG @@ -749,7 +748,7 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) #else dexed_level[instance_id]->gain(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX)); #endif - eeprom_write(); + //eeprom_write(); break; case 10: // Pan #ifdef DEBUG @@ -757,14 +756,14 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) #endif configuration.dexed[instance_id].pan = map(inValue, 0, 0x7f, PANORAMA_MIN, PANORAMA_MAX); mono2stereo[instance_id]->panorama(mapfloat(configuration.dexed[instance_id].pan, PANORAMA_MIN, PANORAMA_MAX, -1.0, 1.0)); - eeprom_write(); + //eeprom_write(); break; case 32: // BankSelect LSB #ifdef DEBUG Serial.println(F("BANK-SELECT CC")); #endif configuration.performance.bank[instance_id] = inValue; - eeprom_write(); + //eeprom_write(); break; case 64: MicroDexed[instance_id]->setSustain(inValue > 63); @@ -782,37 +781,37 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) break; case 65: MicroDexed[instance_id]->setPortamentoMode(configuration.dexed[instance_id].portamento_mode, configuration.dexed[instance_id].portamento_glissando, configuration.dexed[instance_id].portamento_time); - eeprom_write(); + //eeprom_write(); break; #if defined(USE_FX) case 103: // CC 103: filter resonance configuration.dexed[instance_id].filter_resonance = map(inValue, 0, 0x7f, FILTER_RESONANCE_MIN, FILTER_RESONANCE_MAX); MicroDexed[instance_id]->fx.Reso = mapfloat(configuration.dexed[instance_id].filter_resonance, FILTER_RESONANCE_MIN, FILTER_RESONANCE_MAX, 1.0, 0.0); - eeprom_write(); + //eeprom_write(); break; case 104: // CC 104: filter cutoff configuration.dexed[instance_id].filter_cutoff = map(inValue, 0, 0x7f, FILTER_CUTOFF_MIN, FILTER_CUTOFF_MAX); MicroDexed[instance_id]->fx.Cutoff = mapfloat(configuration.dexed[instance_id].filter_cutoff, FILTER_CUTOFF_MIN, FILTER_CUTOFF_MAX, 1.0, 0.0); - eeprom_write(); + //eeprom_write(); break; case 105: // CC 105: delay time configuration.fx.delay_time = map(inValue, 0, 0x7f, DELAY_TIME_MIN, DELAY_TIME_MAX); delay_r.delay(0, configuration.fx.delay_time * 10); delay_l.delay(0, configuration.fx.delay_time * 10); - eeprom_write(); + //eeprom_write(); case 106: // CC 106: delay feedback configuration.fx.delay_feedback = map(inValue, 0, 0x7f, DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX); //delay_fb_mixer_r.gain(0, 1.0); // original signal delay_fb_mixer_r.gain(1, mapfloat(configuration.fx.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback //delay_fb_mixer_l.gain(0, 1.0); // original signal delay_fb_mixer_l.gain(1, mapfloat(configuration.fx.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback - eeprom_write(); + //eeprom_write(); break; case 107: // CC 107: delay volume configuration.dexed[instance_id].delay_send = map(inValue, 0, 0x7f, DELAY_SEND_MIN, DELAY_SEND_MAX); master_mixer_r.gain(DELAY, mapfloat(configuration.fx.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); master_mixer_l.gain(DELAY, mapfloat(configuration.fx.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - eeprom_write(); + //eeprom_write(); break; #endif case 120: @@ -826,11 +825,11 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) break; case 126: MicroDexed[instance_id]->setMonoMode(true); - eeprom_write(); + //eeprom_write(); break; case 127: MicroDexed[instance_id]->setMonoMode(false); - eeprom_write(); + //eeprom_write(); break; } } @@ -1256,6 +1255,18 @@ void set_volume(uint8_t v, uint8_t m) void initial_values_from_eeprom(bool init) { + uint32_t _m_ = 0x0000; + + EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, _marker_), _m_); + if (_m_ != EEPROM_MARKER) + { +#ifdef DEBUG + Serial.println(F("Found wrong EEPROM marker, initializing EEPROM...")); +#endif + init = true; + configuration._marker_ = EEPROM_MARKER; + } + if (init == true) init_configuration(); else @@ -1267,10 +1278,11 @@ void initial_values_from_eeprom(bool init) eeprom_get_sys(); eeprom_get_fx(); eeprom_get_performance(); - for (uint8_t i = 0; i < NUM_DEXED; i++) eeprom_get_dexed(i); + show_configuration(); + check_configuration(); for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) @@ -1344,10 +1356,11 @@ void check_configuration(void) for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { - configuration.dexed[instance_id].midi_channel = constrain(configuration.dexed[instance_id].midi_channel, MIDI_CHANNEL_MIN, MIDI_CHANNEL_MAX); configuration.performance.bank[instance_id] = constrain(configuration.performance.bank[instance_id], 0, MAX_BANKS - 1); configuration.performance.voice[instance_id] = constrain(configuration.performance.voice[instance_id], 0, MAX_VOICES - 1); configuration.performance.voiceconfig_number[instance_id] = constrain(configuration.performance.voiceconfig_number[instance_id], VOICECONFIG_NUM_MIN, VOICECONFIG_NUM_MAX); + + configuration.dexed[instance_id].midi_channel = constrain(configuration.dexed[instance_id].midi_channel, MIDI_CHANNEL_MIN, MIDI_CHANNEL_MAX); configuration.dexed[instance_id].lowest_note = constrain(configuration.dexed[instance_id].lowest_note, INSTANCE_LOWEST_NOTE_MIN, INSTANCE_LOWEST_NOTE_MAX); configuration.dexed[instance_id].highest_note = constrain(configuration.dexed[instance_id].highest_note, INSTANCE_HIGHEST_NOTE_MIN, INSTANCE_HIGHEST_NOTE_MAX); configuration.dexed[instance_id].reverb_send = constrain(configuration.dexed[instance_id].reverb_send, REVERB_SEND_MIN, REVERB_SEND_MAX); @@ -1398,14 +1411,14 @@ void init_configuration(void) Serial.println(F("INITIALIZING CONFIGURATION")); #endif - configuration.sys.checksum = 0xffff; + //configuration.sys.checksum = 0xffff; configuration.sys.instances = INSTANCES_DEFAULT; configuration.sys.vol = VOLUME_DEFAULT; configuration.sys.mono = MONO_DEFAULT; configuration.sys.soft_midi_thru = SOFT_MIDI_THRU_DEFAULT; configuration.sys.performance_number = PERFORMANCE_NUM_DEFAULT; - configuration.fx.checksum = 0xffff; + //configuration.fx.checksum = 0xffff; configuration.fx.reverb_roomsize = REVERB_ROOMSIZE_DEFAULT; configuration.fx.reverb_damping = REVERB_DAMPING_DEFAULT; configuration.fx.reverb_level = REVERB_LEVEL_DEFAULT; @@ -1417,16 +1430,17 @@ void init_configuration(void) configuration.fx.delay_feedback = DELAY_FEEDBACK_DEFAULT; configuration.fx.delay_level = DELAY_LEVEL_DEFAULT; - configuration.performance.checksum = 0xffff; + //configuration.performance.checksum = 0xffff; configuration.performance.fx_number = FX_NUM_DEFAULT; for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { - configuration.dexed[instance_id].checksum = 0xffff; - configuration.dexed[instance_id].midi_channel = DEFAULT_MIDI_CHANNEL; configuration.performance.bank[instance_id] = SYSEXBANK_DEFAULT; configuration.performance.voice[instance_id] = SYSEXSOUND_DEFAULT; configuration.performance.voiceconfig_number[instance_id] = VOICECONFIG_NUM_DEFAULT; + + //configuration.dexed[instance_id].checksum = 0xffff; + configuration.dexed[instance_id].midi_channel = DEFAULT_MIDI_CHANNEL; configuration.dexed[instance_id].lowest_note = INSTANCE_LOWEST_NOTE_MIN; configuration.dexed[instance_id].highest_note = INSTANCE_HIGHEST_NOTE_MAX; configuration.dexed[instance_id].reverb_send = REVERB_SEND_DEFAULT; @@ -1474,63 +1488,42 @@ void init_configuration(void) } set_volume(configuration.sys.vol, configuration.sys.mono); - eeprom_update_sys(); - eeprom_update_fx(); - eeprom_update_performance(); - for (uint8_t i = 0; i < NUM_DEXED; i++) - eeprom_update_dexed(i); + eeprom_update(); } -void eeprom_write(void) +void eeprom_update(void) { - autostore = 0; - eeprom_update_flag = true; + uint8_t* c = (uint8_t*)&configuration; + for (uint16_t i = 0; i < sizeof(configuration); i++) + EEPROM.update(EEPROM_START_ADDRESS + i, c[i]); } void eeprom_update_sys(void) { - for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) - { - if (active_voices[instance_id] > 0) - autostore = 0; - else - { - eeprom_update_flag = false; - configuration.sys.checksum = crc32((byte*)&configuration.sys + 4, sizeof(configuration.sys) - 4); - EEPROM.put(EEPROM_SYS_START_ADDRESS, configuration.sys); + uint8_t* c = (uint8_t*)&configuration.sys; + + for (uint16_t i = 0; i < sizeof(configuration.sys); i++) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, sys) + i, c[i]); + #ifdef DEBUG - Serial.println(F("Updating EEPROM sys.")); + Serial.println(F("Updating EEPROM sys.")); #endif - } - } } bool eeprom_get_sys(void) { - EEPROM.get(EEPROM_SYS_START_ADDRESS, configuration.sys); - uint32_t checksum = crc32((byte*)&configuration.sys + 4, sizeof(configuration.sys) - 4); - - if (checksum != configuration.sys.checksum) - { -#ifdef DEBUG - Serial.println(F("Checksum error reading EEPROM sys.")); -#endif - return (false); - } - else - { -#ifdef DEBUG - Serial.print(F("EEPROM sys loaded.")); -#endif - return (true); - } + EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, sys), configuration.sys); + return (true); } void eeprom_update_fx(void) { - configuration.fx.checksum = crc32((byte*)&configuration.fx + 4, sizeof(configuration.fx) - 4); - EEPROM.put(EEPROM_FX_START_ADDRESS, configuration.fx); + uint8_t* c = (uint8_t*)&configuration.fx; + + for (uint16_t i = 0; i < sizeof(configuration.fx); i++) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx) + i, c[i]); + #ifdef DEBUG Serial.println(F("Updating EEPROM fx.")); #endif @@ -1538,29 +1531,34 @@ void eeprom_update_fx(void) bool eeprom_get_fx(void) { - EEPROM.get(EEPROM_FX_START_ADDRESS, configuration.fx); - uint32_t checksum = crc32((byte*)&configuration.fx + 4, sizeof(configuration.fx) - 4); + EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, fx), configuration.fx); + return (true); +} - if (checksum != configuration.fx.checksum) - { -#ifdef DEBUG - Serial.println(F("Checksum error reading EEPROM fx.")); -#endif - return (false); - } +void eeprom_update_dexed(uint8_t instance_id) +{ +#if NUM_DEXED == 1 + uint8_t* c = (uint8_t*)&configuration.dexed[0]; + + for (uint16_t i = 0; i < sizeof(configuration.dexed[0]); i++) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0]) + i, c[i]); +#else + uint8_t* c; + + if (instance_id == 0) + c = (uint8_t*)&configuration.dexed[0]; else + c = (uint8_t*)&configuration.dexed[1]; + + for (uint16_t i = 0; i < sizeof(configuration.dexed[instance_id]); i++) { -#ifdef DEBUG - Serial.print(F("EEPROM fx loaded.")); -#endif - return (true); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0]) + i, c[i]); + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1]) + i, c[i]); } -} +#endif -void eeprom_update_dexed(uint8_t instance_id) -{ - configuration.dexed[instance_id].checksum = crc32((byte*)&configuration.dexed[instance_id] + 4, sizeof(configuration.dexed[instance_id]) - 4); - EEPROM.put(EEPROM_DEXED_START_ADDRESS + instance_id * sizeof(dexed_t), configuration.dexed[instance_id]); #ifdef DEBUG Serial.print(F("Updating EEPROM dexed (instance ")); Serial.print(instance_id); @@ -1570,33 +1568,18 @@ void eeprom_update_dexed(uint8_t instance_id) bool eeprom_get_dexed(uint8_t instance_id) { - EEPROM.get(EEPROM_DEXED_START_ADDRESS + instance_id * sizeof(dexed_t), configuration.dexed[instance_id]); - uint32_t checksum = crc32((byte*)&configuration.dexed[instance_id] + 4, sizeof(configuration.dexed[instance_id]) - 4); - - if (checksum != configuration.dexed[instance_id].checksum) - { -#ifdef DEBUG - Serial.print(F("Checksum error reading EEPROM dexed (instance ")); - Serial.print(instance_id); - Serial.println(F(")")); -#endif - return (false); - } - else - { -#ifdef DEBUG - Serial.print(F("EEPROM dexed (instance ")); - Serial.print(instance_id); - Serial.println(F(") loaded.")); +#if NUM_DEXED>1 + EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1]), configuration.dexed[1]); +#else + EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0]), configuration.dexed[0]); #endif - return (true); - } + return (true); } void eeprom_update_performance() { - configuration.performance.checksum = crc32((byte*)&configuration.performance + 4, sizeof(configuration.performance) - 4); - EEPROM.put(EEPROM_PERFORMANCE_START_ADDRESS, configuration.performance); + //configuration.performance.checksum = crc32((byte*)&configuration.performance + 4, sizeof(configuration.performance) - 4); + EEPROM.put(EEPROM_START_ADDRESS + offsetof(configuration_s, performance), configuration.performance); #ifdef DEBUG Serial.println(F("Updating EEPROM performance.")); #endif @@ -1604,23 +1587,8 @@ void eeprom_update_performance() bool eeprom_get_performance() { - EEPROM.get(EEPROM_PERFORMANCE_START_ADDRESS, configuration.performance); - uint32_t checksum = crc32((byte*)&configuration.performance + 4, sizeof(configuration.performance) - 4); - - if (checksum != configuration.performance.checksum) - { -#ifdef DEBUG - Serial.println(F("Checksum error reading EEPROM performance.")); -#endif - return (false); - } - else - { -#ifdef DEBUG - Serial.println(F("EEPROM performance loaded.")); -#endif - return (true); - } + EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, performance), configuration.performance); + return (true); } /****************************************************************************** @@ -1868,13 +1836,13 @@ void show_configuration(void) Serial.println(); Serial.println(F("CONFIGURATION:")); Serial.println(F("System")); - Serial.print(F(" Checksum 0x")); Serial.println(configuration.sys.checksum, HEX); + //Serial.print(F(" Checksum 0x")); Serial.println(configuration.sys.checksum, HEX); Serial.print(F(" Instances ")); Serial.println(configuration.sys.instances, DEC); Serial.print(F(" Volume ")); Serial.println(configuration.sys.vol, DEC); Serial.print(F(" Mono ")); Serial.println(configuration.sys.mono, DEC); Serial.print(F(" Soft MIDI Thru ")); Serial.println(configuration.sys.soft_midi_thru, DEC); Serial.println(F("FX")); - Serial.print(F(" Checksum 0x")); Serial.println(configuration.fx.checksum, HEX); + //Serial.print(F(" Checksum 0x")); Serial.println(configuration.fx.checksum, HEX); Serial.print(F(" Reverb Roomsize ")); Serial.println(configuration.fx.reverb_roomsize, DEC); Serial.print(F(" Reverb Damping ")); Serial.println(configuration.fx.reverb_damping, DEC); Serial.print(F(" Reverb Level ")); Serial.println(configuration.fx.reverb_level, DEC); @@ -1890,10 +1858,8 @@ void show_configuration(void) { Serial.print(F("Dexed instance ")); Serial.println(instance_id, DEC); - Serial.print(F(" Checksum 0x")); Serial.println(configuration.dexed[instance_id].checksum, HEX); + //Serial.print(F(" Checksum 0x")); Serial.println(configuration.dexed[instance_id].checksum, HEX); Serial.print(F(" MIDI-Channel ")); Serial.println(configuration.dexed[instance_id].midi_channel, DEC); - Serial.print(F(" Bank ")); Serial.println(configuration.performance.bank[instance_id], DEC); - Serial.print(F(" Voice ")); Serial.println(configuration.performance.voice[instance_id], DEC); Serial.print(F(" Lowest Note ")); Serial.println(configuration.dexed[instance_id].lowest_note, DEC); Serial.print(F(" Highest Note ")); Serial.println(configuration.dexed[instance_id].highest_note, DEC); Serial.print(F(" Reverb Send ")); Serial.println(configuration.dexed[instance_id].reverb_send, DEC); @@ -1931,7 +1897,7 @@ void show_configuration(void) } Serial.println(F("Performance")); - Serial.print(F(" Checksum 0x")); Serial.println(configuration.performance.checksum, HEX); + //Serial.print(F(" Checksum 0x")); Serial.println(configuration.performance.checksum, HEX); for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { Serial.print(F(" Bank ")); Serial.print(instance_id, DEC); Serial.print(" "); Serial.println(configuration.performance.bank[instance_id], DEC); diff --git a/UI.hpp b/UI.hpp index 0ac0825..f7d7bad 100644 --- a/UI.hpp +++ b/UI.hpp @@ -54,12 +54,16 @@ extern char bank_name[NUM_DEXED][BANK_NAME_LEN]; extern char voice_name[NUM_DEXED][VOICE_NAME_LEN]; extern char voice_names[NUM_DEXED][MAX_VOICES][VOICE_NAME_LEN]; extern void strip_extension(char* s, char *target); -extern void eeprom_write(void); +//extern void eeprom_write(void); extern bool get_voice_names_from_bank(uint8_t b, uint8_t instance_id); extern bool load_sysex(uint8_t b, uint8_t v); extern void generate_version_string(char* buffer, uint8_t len); extern void initial_values_from_eeprom(bool init); extern void _softRestart(void); +extern void eeprom_update_sys(void); +extern void eeprom_update_performance(void); +extern void eeprom_update_fx(void); +extern void eeprom_update_dexed(uint8_t instance_id); #ifdef DISPLAY_LCD_SPI extern void change_disp_sd(bool d); @@ -228,6 +232,7 @@ void lcd_display_bar_float(const char* title, float value, float factor, int32_t void lcd_display_meter_int(const char* title, uint32_t value, float factor, float offset, int32_t min_value, int32_t max_value, uint8_t size, bool zeros, bool brackets, bool sign, bool init); void lcd_display_meter_float(const char* title, float value, float factor, float offset, int32_t min_value, int32_t max_value, uint8_t size_number, uint8_t size_fraction, bool zeros, bool brackets, bool sign, bool init); void lcd_special_chars(uint8_t mode); +void eeprom_update_var(uint16_t pos, uint8_t val, const char* val_string); // normal menu LCDMenuLib2_menu LCDML_0(255, 0, 0, NULL, NULL); // normal root menu element (do not change) @@ -473,7 +478,7 @@ void lcdml_menu_control(void) encoderDir[ENC_L].reset(); encoderDir[ENC_R].reset(); - eeprom_write(); + //eeprom_write(); if (LCDML.MENU_getLastActivFunctionID() < 0xff) LCDML.OTHER_jumpToID(LCDML.MENU_getLastActivFunctionID()); @@ -849,6 +854,7 @@ void UI_func_reverb_roomsize(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.reverb_roomsize), configuration.fx.reverb_roomsize); } } @@ -882,6 +888,7 @@ void UI_func_reverb_damping(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.reverb_damping), configuration.fx.reverb_damping); } } @@ -920,6 +927,12 @@ void UI_func_reverb_send(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].reverb_send), configuration.dexed[0].reverb_send); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].reverb_send), configuration.dexed[1].reverb_send); +#endif } } @@ -953,6 +966,7 @@ void UI_func_reverb_level(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.reverb_level), configuration.fx.reverb_level); } } @@ -985,6 +999,7 @@ void UI_func_chorus_frequency(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.chorus_frequency), configuration.fx.chorus_frequency); } } @@ -1025,8 +1040,8 @@ void UI_func_chorus_waveform(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - // you can here reset some global vars or do nothing encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.chorus_waveform), configuration.fx.chorus_waveform); } } @@ -1059,6 +1074,7 @@ void UI_func_chorus_depth(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.chorus_depth), configuration.fx.chorus_depth); } } @@ -1097,6 +1113,12 @@ void UI_func_chorus_send(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].chorus_send), configuration.dexed[0].chorus_send); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].chorus_send), configuration.dexed[1].chorus_send); +#endif } } @@ -1130,6 +1152,7 @@ void UI_func_chorus_level(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.chorus_level), configuration.fx.chorus_level); } } @@ -1163,6 +1186,7 @@ void UI_func_delay_time(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.delay_time), configuration.fx.delay_time); } } @@ -1197,6 +1221,7 @@ void UI_func_delay_feedback(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.delay_feedback), configuration.fx.delay_feedback); } } @@ -1235,6 +1260,12 @@ void UI_func_delay_send(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].delay_send), configuration.dexed[0].delay_send); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].delay_send), configuration.dexed[1].delay_send); +#endif } } @@ -1268,6 +1299,7 @@ void UI_func_delay_level(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, fx.delay_level), configuration.fx.delay_level); } } @@ -1305,6 +1337,12 @@ void UI_func_filter_cutoff(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].filter_cutoff), configuration.dexed[0].filter_cutoff); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].filter_cutoff), configuration.dexed[1].filter_cutoff); +#endif } } @@ -1342,6 +1380,12 @@ void UI_func_filter_resonance(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].filter_resonance), configuration.dexed[0].filter_resonance); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].filter_resonance), configuration.dexed[1].filter_resonance); +#endif } } #endif @@ -1381,6 +1425,12 @@ void UI_func_transpose(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].transpose), configuration.dexed[0].transpose); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].transpose), configuration.dexed[1].transpose); +#endif } } @@ -1419,6 +1469,12 @@ void UI_func_tune(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].tune), configuration.dexed[0].tune); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].tune), configuration.dexed[1].tune); +#endif } } @@ -1459,6 +1515,12 @@ void UI_func_midi_channel(uint8_t param) { // you can here reset some global vars or do nothing encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].midi_channel), configuration.dexed[0].midi_channel); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].midi_channel), configuration.dexed[1].midi_channel); +#endif } } @@ -1510,6 +1572,12 @@ void UI_func_lowest_note(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].lowest_note), configuration.dexed[0].lowest_note); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].lowest_note), configuration.dexed[1].lowest_note); +#endif } } @@ -1552,6 +1620,12 @@ void UI_func_highest_note(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].highest_note), configuration.dexed[0].highest_note); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].highest_note), configuration.dexed[1].highest_note); +#endif } } @@ -1590,6 +1664,12 @@ void UI_func_sound_intensity(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].sound_intensity), configuration.dexed[0].sound_intensity); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].sound_intensity), configuration.dexed[1].sound_intensity); +#endif } } @@ -1634,6 +1714,12 @@ void UI_func_panorama(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].pan), configuration.dexed[0].pan); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].pan), configuration.dexed[1].pan); +#endif } } @@ -1699,8 +1785,8 @@ void UI_func_stereo_mono(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, sys.vol), configuration.sys.vol); } } @@ -1738,6 +1824,12 @@ void UI_func_polyphony(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].polyphony), configuration.dexed[0].polyphony); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].polyphony), configuration.dexed[1].polyphony); +#endif } } @@ -1786,6 +1878,12 @@ void UI_func_engine(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].engine), configuration.dexed[0].engine); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].engine), configuration.dexed[1].engine); +#endif } } @@ -1831,6 +1929,12 @@ void UI_func_mono_poly(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].monopoly), configuration.dexed[0].monopoly); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].monopoly), configuration.dexed[1].monopoly); +#endif } } @@ -1876,6 +1980,12 @@ void UI_func_note_refresh(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].note_refresh), configuration.dexed[0].note_refresh); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].note_refresh), configuration.dexed[1].note_refresh); +#endif } } @@ -1913,6 +2023,12 @@ void UI_func_pb_range(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].pb_range), configuration.dexed[0].pb_range); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].pb_range), configuration.dexed[1].pb_range); +#endif } } @@ -1950,6 +2066,12 @@ void UI_func_pb_step(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].pb_step), configuration.dexed[0].pb_step); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].pb_step), configuration.dexed[1].pb_step); +#endif } } @@ -1987,6 +2109,12 @@ void UI_func_mw_range(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].mw_range), configuration.dexed[0].mw_range); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].mw_range), configuration.dexed[1].mw_range); +#endif } } @@ -2050,6 +2178,12 @@ void UI_func_mw_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].mw_assign), configuration.dexed[0].mw_assign); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].mw_assign), configuration.dexed[1].mw_assign); +#endif } } @@ -2099,6 +2233,12 @@ void UI_func_mw_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].mw_mode), configuration.dexed[0].mw_mode); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].mw_mode), configuration.dexed[1].mw_mode); +#endif } } @@ -2134,9 +2274,14 @@ void UI_func_fc_range(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - // you can here reset some global vars or do nothing lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].fc_range), configuration.dexed[0].fc_range); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].fc_range), configuration.dexed[1].fc_range); +#endif } } @@ -2200,6 +2345,12 @@ void UI_func_fc_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].fc_assign), configuration.dexed[0].fc_assign); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].fc_assign), configuration.dexed[1].fc_assign); +#endif } } @@ -2249,6 +2400,12 @@ void UI_func_fc_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].fc_mode), configuration.dexed[0].fc_mode); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].fc_mode), configuration.dexed[1].fc_mode); +#endif } } @@ -2286,6 +2443,12 @@ void UI_func_bc_range(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].bc_range), configuration.dexed[0].bc_range); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].bc_range), configuration.dexed[1].bc_range); +#endif } } @@ -2349,6 +2512,12 @@ void UI_func_bc_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].bc_assign), configuration.dexed[0].bc_assign); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].bc_assign), configuration.dexed[1].bc_assign); +#endif } } @@ -2398,6 +2567,12 @@ void UI_func_bc_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].bc_mode), configuration.dexed[0].bc_mode); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].bc_mode), configuration.dexed[1].bc_mode); +#endif } } @@ -2435,6 +2610,12 @@ void UI_func_at_range(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].at_range), configuration.dexed[0].at_range); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].at_range), configuration.dexed[1].at_range); +#endif } } @@ -2498,6 +2679,12 @@ void UI_func_at_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].at_assign), configuration.dexed[0].at_assign); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].at_assign), configuration.dexed[1].at_assign); +#endif } } @@ -2547,6 +2734,12 @@ void UI_func_at_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].at_mode), configuration.dexed[0].at_mode); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].at_mode), configuration.dexed[1].at_mode); +#endif } } @@ -2598,6 +2791,12 @@ void UI_func_portamento_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].portamento_mode), configuration.dexed[0].portamento_mode); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].portamento_mode), configuration.dexed[1].portamento_mode); +#endif } } @@ -2643,6 +2842,12 @@ void UI_func_portamento_glissando(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].portamento_glissando), configuration.dexed[0].portamento_glissando); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].portamento_glissando), configuration.dexed[1].portamento_glissando); +#endif } } @@ -2680,6 +2885,12 @@ void UI_func_portamento_time(uint8_t param) { lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].portamento_time), configuration.dexed[0].portamento_time); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].portamento_time), configuration.dexed[1].portamento_time); +#endif } } @@ -2797,6 +3008,12 @@ void UI_handle_OP(uint8_t param, uint8_t op, uint8_t instance_id) if (LCDML.FUNC_close()) // ****** STABLE END ********* { encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].op_enabled), configuration.dexed[0].op_enabled); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].op_enabled), configuration.dexed[1].op_enabled); +#endif } } @@ -2861,8 +3078,9 @@ void UI_func_midi_soft_thru(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); + //eeprom_write(); encoderDir[ENC_R].reset(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, sys.soft_midi_thru), configuration.sys.soft_midi_thru); } } @@ -2896,9 +3114,14 @@ void UI_func_velocity_level(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - // you can here reset some global vars or do nothing lcd_special_chars(SCROLLBAR); encoderDir[ENC_R].reset(); + if (instance_id == 0) + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0].velocity_level), configuration.dexed[0].velocity_level); +#if NUM_DEXED > 1 + else + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1].velocity_level), configuration.dexed[1].velocity_level); +#endif } } @@ -2963,6 +3186,8 @@ void UI_func_eeprom_reset(uint8_t param) } } +extern void show_configuration(void); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void UI_func_voice_select(uint8_t param) { uint8_t instance_id = 0; @@ -3020,7 +3245,7 @@ void UI_func_voice_select(uint8_t param) #ifdef DISPLAY_LCD_SPI change_disp_sd(true); #endif - eeprom_write(); + //eeprom_write(); break; case MENU_VOICE_SOUND: voice_tmp = configuration.performance.voice[instance_id] - ENCODER[ENC_R].speed(); @@ -3045,7 +3270,7 @@ void UI_func_voice_select(uint8_t param) #ifdef DISPLAY_LCD_SPI change_disp_sd(true); #endif - eeprom_write(); + //eeprom_write(); break; } else if (LCDML.BT_checkDown()) @@ -3063,7 +3288,7 @@ void UI_func_voice_select(uint8_t param) #ifdef DISPLAY_LCD_SPI change_disp_sd(true); #endif - eeprom_write(); + //eeprom_write(); break; case MENU_VOICE_SOUND: voice_tmp = configuration.performance.voice[instance_id] + ENCODER[ENC_R].speed(); @@ -3087,7 +3312,7 @@ void UI_func_voice_select(uint8_t param) #ifdef DISPLAY_LCD_SPI change_disp_sd(true); #endif - eeprom_write(); + //eeprom_write(); break; } @@ -3123,12 +3348,28 @@ void UI_func_voice_select(uint8_t param) break; } } + } - if (LCDML.FUNC_close()) // ****** STABLE END ********* + if (LCDML.FUNC_close()) // ****** STABLE END ********* + { + //eeprom_write(); + encoderDir[ENC_R].reset(); + if (instance_id == 0) { - eeprom_write(); - encoderDir[ENC_R].reset(); + eeprom_update_var(offsetof(configuration_s, performance.voice[0]), configuration.performance.voice[0], "configuration.performance.voice[0]"); + eeprom_update_var(offsetof(configuration_s, performance.bank[0]), configuration.performance.bank[0], "configuration.performance.bank[0]"); + show_configuration(); + + //EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.voice[0]), configuration.performance.voice[0]); + //EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.bank[0]), configuration.performance.bank[0]); } +#if NUM_DEXED > 1 + else + { + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.voice[1]), configuration.performance.voice[1]); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.bank[1]), configuration.performance.bank[1]); + } +#endif } } @@ -3168,7 +3409,8 @@ void UI_func_volume(uint8_t param) { lcd_special_chars(SCROLLBAR); - eeprom_write(); + //eeprom_write(); + EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, sys.vol), configuration.sys.vol); encoderDir[ENC_L].reset(); } } @@ -3212,7 +3454,7 @@ void UI_func_load_performance(uint8_t param) { mode = 0xff; - eeprom_write(); + //eeprom_write(); lcd.setCursor(0, 1); if (load_sd_performance(configuration.sys.performance_number) == false) lcd.print("Does not exist."); @@ -3246,6 +3488,8 @@ void UI_func_load_performance(uint8_t param) lcd.print("Canceled "); delay(500); } + else + eeprom_update_performance(); encoderDir[ENC_R].reset(); } @@ -3313,7 +3557,7 @@ void UI_func_save_performance(uint8_t param) else { mode = 0xff; - eeprom_write(); + //eeprom_write(); if (overwrite == false || yesno == true) { save_sd_performance(configuration.performance.fx_number); @@ -3472,6 +3716,8 @@ void UI_func_load_voiceconfig(uint8_t param) lcd.print("Canceled "); delay(500); } + else + eeprom_update_dexed(instance_id); encoderDir[ENC_R].reset(); } @@ -3556,7 +3802,7 @@ void UI_func_save_voiceconfig(uint8_t param) else { mode = 0xff; - eeprom_write(); + //eeprom_write(); if (overwrite == false || yesno == true) { save_sd_voiceconfig(configuration.performance.voiceconfig_number[instance_id], instance_id); @@ -3659,7 +3905,7 @@ void UI_func_load_fx(uint8_t param) else if (LCDML.BT_checkEnter()) { mode = 0xff; - eeprom_write(); + //eeprom_write(); if (load_sd_fx(configuration.performance.fx_number) == false) lcd.print("Does not exist."); @@ -3693,6 +3939,8 @@ void UI_func_load_fx(uint8_t param) lcd.print("Canceled "); delay(500); } + else + eeprom_update_fx(); encoderDir[ENC_R].reset(); } @@ -3760,7 +4008,7 @@ void UI_func_save_fx(uint8_t param) else { mode = 0xff; - eeprom_write(); + //eeprom_write(); if (overwrite == false || yesno == true) { save_sd_fx(configuration.performance.fx_number); @@ -3899,7 +4147,7 @@ void UI_func_sysex_receive_bank(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); + //eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -3933,7 +4181,7 @@ void UI_func_sysex_send_bank(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); + //eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -3967,7 +4215,7 @@ void UI_func_sysex_send_voice(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); + //eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -4001,7 +4249,7 @@ void UI_func_sysex_receive_voice(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); + //eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -4263,5 +4511,16 @@ void lcd_special_chars(uint8_t mode) break; } } + +void eeprom_update_var(uint16_t pos, uint8_t val, const char* val_string) +{ +#ifdef DEBUG + char tmp[80]; + sprintf(tmp, "EEPROM update '%s' at position %d with value %d.", val_string, pos, val); + Serial.println(tmp); +#endif + EEPROM.update(EEPROM_START_ADDRESS + pos, val); +} + #endif #endif diff --git a/config.h b/config.h index e5af379..72c6843 100644 --- a/config.h +++ b/config.h @@ -242,10 +242,7 @@ enum { DEXED, CHORUS, DELAY, REVERB}; #define CONTROL_RATE_MS 100 -#define EEPROM_SYS_START_ADDRESS EEPROM_START_ADDRESS -#define EEPROM_FX_START_ADDRESS EEPROM_START_ADDRESS + sizeof(configuration.sys) -#define EEPROM_DEXED_START_ADDRESS EEPROM_START_ADDRESS + sizeof(configuration.sys) + sizeof(configuration.fx) -#define EEPROM_PERFORMANCE_START_ADDRESS EEPROM_START_ADDRESS + sizeof(configuration.sys) + sizeof(configuration.fx) + NUM_DEXED * sizeof(configuration.dexed) +#define EEPROM_MARKER 0x4242 // MIDI #ifdef MIDI_DEVICE_USB @@ -524,8 +521,7 @@ enum { DEXED, CHORUS, DELAY, REVERB}; #define VOICECONFIG_NUM_DEFAULT 0 // -typedef struct { - uint32_t checksum; +typedef struct dexed_s { uint8_t lowest_note; uint8_t highest_note; uint8_t reverb_send; @@ -563,8 +559,7 @@ typedef struct { uint8_t midi_channel; } dexed_t; -typedef struct { - uint32_t checksum; +typedef struct fx_s { uint8_t reverb_roomsize; uint8_t reverb_damping; uint8_t reverb_level; @@ -577,16 +572,14 @@ typedef struct { uint8_t delay_level; } fx_t; -typedef struct { - uint32_t checksum; +typedef struct performance_s { uint8_t bank[NUM_DEXED]; uint8_t voice[NUM_DEXED]; uint8_t voiceconfig_number[NUM_DEXED]; uint8_t fx_number; } performance_t; -typedef struct { - uint32_t checksum; +typedef struct sys_s { uint8_t instances; uint8_t vol; uint8_t mono; @@ -594,11 +587,12 @@ typedef struct { uint8_t performance_number; } sys_t; -typedef struct { +typedef struct configuration_s { sys_t sys; fx_t fx; performance_t performance; dexed_t dexed[NUM_DEXED]; + uint32_t _marker_; } config_t; #if !defined(_MAPFLOAT) diff --git a/dexed_sd.cpp b/dexed_sd.cpp index 1156acc..e13f6aa 100644 --- a/dexed_sd.cpp +++ b/dexed_sd.cpp @@ -200,7 +200,7 @@ bool load_sd_voiceconfig(uint8_t vc, uint8_t instance_id) if (sysex) { get_sd_data(sysex, 0x42, (uint8_t*)&configuration.dexed[instance_id]); - configuration.dexed[instance_id].checksum = crc32((uint8_t*)&configuration.dexed[instance_id] + 4, sizeof(configuration.dexed[instance_id]) - 4); + eeprom_update_dexed(instance_id); return (true); } #ifdef DEBUG @@ -297,7 +297,7 @@ bool load_sd_fx(uint8_t fx) if (sysex) { get_sd_data(sysex, 0x43, (uint8_t*)&configuration.fx); - configuration.fx.checksum = crc32((uint8_t*)&configuration.fx + 4, sizeof(configuration.fx) - 4); + eeprom_update_fx(); return (true); } #ifdef DEBUG @@ -392,7 +392,7 @@ bool load_sd_performance(uint8_t p) if (sysex) { get_sd_data(sysex, 0x44, (uint8_t*)&configuration.performance); - configuration.performance.checksum = crc32((uint8_t*)&configuration.performance + 4, sizeof(configuration.performance) - 4); + eeprom_update_performance(); return (true); } #ifdef DEBUG diff --git a/dexed_sd.h b/dexed_sd.h index 71e7115..84b7fc9 100644 --- a/dexed_sd.h +++ b/dexed_sd.h @@ -44,6 +44,9 @@ extern uint8_t ui_state; extern uint8_t ui_main_state; extern config_t configuration; extern uint32_t crc32(byte * calc_start, uint16_t calc_bytes); +extern void eeprom_update_dexed(uint8_t instance_id); +extern void eeprom_update_performance(void); +extern void eeprom_update_fx(void); bool load_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);