diff --git a/MicroDexed.ino b/MicroDexed.ino index c9005e3..95060cd 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -446,12 +446,12 @@ void setup() master_mixer_r.gain(DEXED, 1.0); master_mixer_l.gain(DEXED, 1.0); - master_mixer_r.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_r.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_r.gain(CHORUS, mapfloat(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(CHORUS, mapfloat(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + 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)); + master_mixer_r.gain(REVERB, mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(REVERB, mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { @@ -492,16 +492,16 @@ void setup() #if defined(USE_FX) // DELAY - delay_r.delay(0, mapfloat(configuration.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); - delay_l.delay(0, mapfloat(configuration.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); + delay_r.delay(0, mapfloat(configuration.fx.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); + delay_l.delay(0, mapfloat(configuration.fx.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); // delay_fb_mixer is the feedback-adding mixer delay_fb_mixer_r.gain(0, 1.0); // original signal - delay_fb_mixer_r.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback + 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.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback + delay_fb_mixer_l.gain(1, mapfloat(configuration.fx.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback // CHORUS - switch (configuration.chorus_waveform) + switch (configuration.fx.chorus_waveform) { case 0: chorus_modulator.begin(WAVEFORM_TRIANGLE); @@ -513,8 +513,8 @@ void setup() chorus_modulator.begin(WAVEFORM_TRIANGLE); } chorus_modulator.phase(0); - chorus_modulator.frequency(configuration.chorus_frequency / 10.0); - chorus_modulator.amplitude(mapfloat(configuration.chorus_depth, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX, 0.0, 1.0)); + chorus_modulator.frequency(configuration.fx.chorus_frequency / 10.0); + chorus_modulator.amplitude(mapfloat(configuration.fx.chorus_depth, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX, 0.0, 1.0)); chorus_modulator.offset(0.0); #if MOD_FILTER_OUTPUT == MOD_BUTTERWORTH_FILTER_OUTPUT // Butterworth filter, 12 db/octave @@ -533,20 +533,20 @@ void setup() #endif // REVERB - freeverb_r.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); - freeverb_r.damping(mapfloat(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); - freeverb_l.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); - freeverb_l.damping(mapfloat(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); + freeverb_r.roomsize(mapfloat(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); + freeverb_r.damping(mapfloat(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); + freeverb_l.roomsize(mapfloat(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); + freeverb_l.damping(mapfloat(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); #endif // MONO/STEREO - if (configuration.mono == 0) + if (configuration.sys.mono == 0) modchorus_inverter.gain(-1.0); // stereo mode else modchorus_inverter.gain(1.0); // mono mode // set initial volume - set_volume(configuration.vol, configuration.mono); + set_volume(configuration.sys.vol, configuration.sys.mono); // Initialize processor and memory measurements AudioProcessorUsageMaxReset(); @@ -610,7 +610,7 @@ void loop() 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(); + eeprom_update_sys(); } // check for value changes, unused voices and CPU overload @@ -631,7 +631,6 @@ void loop() Serial.println(F(".")); #endif configuration.dexed[instance_id].polyphony = MicroDexed[instance_id]->getMaxNotes(); - eeprom_update(); // useful to do this??? } #endif } @@ -797,22 +796,22 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) eeprom_write(); break; case 105: // CC 105: delay time - configuration.delay_time = map(inValue, 0, 0x7f, DELAY_TIME_MIN, DELAY_TIME_MAX); - delay_r.delay(0, configuration.delay_time * 10); - delay_l.delay(0, configuration.delay_time * 10); + 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(); case 106: // CC 106: delay feedback - configuration.delay_feedback = map(inValue, 0, 0x7f, DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX); + 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.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback + 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.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback + 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(); 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.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); + 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(); break; #endif @@ -1205,12 +1204,12 @@ bool checkMidiChannel(byte inChannel, uint8_t instance_id) void set_volume(uint8_t v, uint8_t m) { - configuration.vol = v; + configuration.sys.vol = v; - if (configuration.vol > 100) - configuration.vol = 100; + if (configuration.sys.vol > 100) + configuration.sys.vol = 100; - configuration.mono = m; + configuration.sys.mono = m; #ifdef DEBUG Serial.print(F("Setting volume: VOL=")); @@ -1257,68 +1256,49 @@ void set_volume(uint8_t v, uint8_t m) void initial_values_from_eeprom(bool init) { - uint32_t checksum; - config_t tmp_conf; - if (init == true) init_configuration(); else { #ifdef DEBUG - Serial.println(F("Loading inital data from EEPROM.")); + Serial.println(F("Loading inital system data from EEPROM.")); #endif - EEPROM.get(EEPROM_START_ADDRESS, tmp_conf); - checksum = crc32((byte*)&tmp_conf + 4, sizeof(tmp_conf) - 4); + eeprom_get_sys(); + eeprom_get_fx(); + for (uint8_t i = 0; i < NUM_DEXED; i++) + eeprom_get_dexed(i); -#ifdef DEBUG - Serial.print(F("EEPROM checksum: 0x")); - Serial.print(tmp_conf.checksum, HEX); - Serial.print(F(" / 0x")); - Serial.println(checksum, HEX); -#endif + check_configuration(); - if (checksum != tmp_conf.checksum) - { -#ifdef DEBUG - Serial.println(F("Checksum mismatch -> initializing EEPROM!")); -#endif - init_configuration(); - } - else + for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { - EEPROM.get(EEPROM_START_ADDRESS, configuration); - check_configuration(); - - for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) - { - MicroDexed[instance_id]->setPBController(configuration.dexed[instance_id].pb_range, configuration.dexed[instance_id].pb_step); - MicroDexed[instance_id]->setMWController(configuration.dexed[instance_id].mw_range, configuration.dexed[instance_id].mw_assign, configuration.dexed[instance_id].mw_mode); - MicroDexed[instance_id]->setFCController(configuration.dexed[instance_id].fc_range, configuration.dexed[instance_id].fc_assign, configuration.dexed[instance_id].fc_mode); - MicroDexed[instance_id]->setBCController(configuration.dexed[instance_id].bc_range, configuration.dexed[instance_id].bc_assign, configuration.dexed[instance_id].bc_mode); - MicroDexed[instance_id]->setATController(configuration.dexed[instance_id].at_range, configuration.dexed[instance_id].at_assign, configuration.dexed[instance_id].at_mode); - MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled); - MicroDexed[instance_id]->doRefreshVoice(); + MicroDexed[instance_id]->setPBController(configuration.dexed[instance_id].pb_range, configuration.dexed[instance_id].pb_step); + MicroDexed[instance_id]->setMWController(configuration.dexed[instance_id].mw_range, configuration.dexed[instance_id].mw_assign, configuration.dexed[instance_id].mw_mode); + MicroDexed[instance_id]->setFCController(configuration.dexed[instance_id].fc_range, configuration.dexed[instance_id].fc_assign, configuration.dexed[instance_id].fc_mode); + MicroDexed[instance_id]->setBCController(configuration.dexed[instance_id].bc_range, configuration.dexed[instance_id].bc_assign, configuration.dexed[instance_id].bc_mode); + MicroDexed[instance_id]->setATController(configuration.dexed[instance_id].at_range, configuration.dexed[instance_id].at_assign, configuration.dexed[instance_id].at_mode); + MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled); + MicroDexed[instance_id]->doRefreshVoice(); #if defined(USE_FX) - chorus_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].chorus_send / 100.0); - chorus_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].chorus_send / 100.0); - delay_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].delay_send / 100.0); - delay_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].delay_send / 100.0); - delay_fb_mixer_r.gain(0, 1.0); // original signal - delay_fb_mixer_r.gain(1, mapfloat(configuration.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.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback - reverb_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].reverb_send / 100.0); - reverb_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].reverb_send / 100.0); - // MicroDexed[instance_id]->fx.Gain = configuration.dexed[instance_id].sound_intensity / 100.0; - MicroDexed[instance_id]->fx.Gain = 1.0; - MicroDexed[instance_id]->fx.Reso = mapfloat(configuration.dexed[instance_id].filter_resonance, FILTER_RESONANCE_MIN, FILTER_RESONANCE_MAX, 1.0, 0.0); - MicroDexed[instance_id]->fx.Cutoff = mapfloat(configuration.dexed[instance_id].filter_cutoff, FILTER_CUTOFF_MIN, FILTER_CUTOFF_MAX, 1.0, 0.0); -#endif - MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled); - dexed_level[instance_id]->gain(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX)); - } + chorus_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].chorus_send / 100.0); + chorus_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].chorus_send / 100.0); + delay_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].delay_send / 100.0); + delay_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].delay_send / 100.0); + 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 + reverb_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].reverb_send / 100.0); + reverb_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].reverb_send / 100.0); + // MicroDexed[instance_id]->fx.Gain = configuration.dexed[instance_id].sound_intensity / 100.0; + MicroDexed[instance_id]->fx.Gain = 1.0; + MicroDexed[instance_id]->fx.Reso = mapfloat(configuration.dexed[instance_id].filter_resonance, FILTER_RESONANCE_MIN, FILTER_RESONANCE_MAX, 1.0, 0.0); + MicroDexed[instance_id]->fx.Cutoff = mapfloat(configuration.dexed[instance_id].filter_cutoff, FILTER_CUTOFF_MIN, FILTER_CUTOFF_MAX, 1.0, 0.0); +#endif + MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled); + dexed_level[instance_id]->gain(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX)); } #ifdef DEBUG Serial.println(F("OK, loaded!")); @@ -1326,14 +1306,14 @@ void initial_values_from_eeprom(bool init) master_mixer_r.gain(DEXED, 1.0); master_mixer_l.gain(DEXED, 1.0); - master_mixer_r.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_r.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); - - set_volume(configuration.vol, configuration.mono); + master_mixer_r.gain(CHORUS, mapfloat(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(CHORUS, mapfloat(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + 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)); + master_mixer_r.gain(REVERB, mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(REVERB, mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + + set_volume(configuration.sys.vol, configuration.sys.mono); } #ifdef DEBUG show_configuration(); @@ -1342,20 +1322,21 @@ void initial_values_from_eeprom(bool init) void check_configuration(void) { - configuration.instances = constrain(configuration.instances, INSTANCES_MIN, INSTANCES_MAX); - configuration.vol = constrain(configuration.vol, VOLUME_MIN, VOLUME_MAX); - configuration.mono = constrain(configuration.mono, MONO_MIN, MONO_MAX); - configuration.reverb_roomsize = constrain(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX); - configuration.reverb_damping = constrain(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX); - configuration.reverb_level = constrain(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX); - configuration.chorus_frequency = constrain(configuration.chorus_frequency, CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX); - configuration.chorus_waveform = constrain(configuration.chorus_waveform, CHORUS_WAVEFORM_MIN, CHORUS_WAVEFORM_MAX); - configuration.chorus_depth = constrain(configuration.chorus_depth, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX); - configuration.chorus_level = constrain(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX); - configuration.delay_time = constrain(configuration.delay_time, DELAY_TIME_MIN / 10, DELAY_TIME_MAX / 10); - configuration.delay_feedback = constrain(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX); - configuration.delay_level = constrain(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX); - configuration.soft_midi_thru = constrain(configuration.soft_midi_thru, SOFT_MIDI_THRU_MIN, SOFT_MIDI_THRU_MAX); + configuration.sys.instances = constrain(configuration.sys.instances, INSTANCES_MIN, INSTANCES_MAX); + configuration.sys.vol = constrain(configuration.sys.vol, VOLUME_MIN, VOLUME_MAX); + configuration.sys.mono = constrain(configuration.sys.mono, MONO_MIN, MONO_MAX); + configuration.sys.soft_midi_thru = constrain(configuration.sys.soft_midi_thru, SOFT_MIDI_THRU_MIN, SOFT_MIDI_THRU_MAX); + + configuration.fx.reverb_roomsize = constrain(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX); + configuration.fx.reverb_damping = constrain(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX); + configuration.fx.reverb_level = constrain(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX); + configuration.fx.chorus_frequency = constrain(configuration.fx.chorus_frequency, CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX); + configuration.fx.chorus_waveform = constrain(configuration.fx.chorus_waveform, CHORUS_WAVEFORM_MIN, CHORUS_WAVEFORM_MAX); + configuration.fx.chorus_depth = constrain(configuration.fx.chorus_depth, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX); + configuration.fx.chorus_level = constrain(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX); + configuration.fx.delay_time = constrain(configuration.fx.delay_time, DELAY_TIME_MIN / 10, DELAY_TIME_MAX / 10); + configuration.fx.delay_feedback = constrain(configuration.fx.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX); + configuration.fx.delay_level = constrain(configuration.fx.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX); for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { @@ -1398,12 +1379,12 @@ void check_configuration(void) configuration.dexed[instance_id].op_enabled = constrain(configuration.dexed[instance_id].op_enabled, OP_ENABLED_MIN, OP_ENABLED_MAX); } - master_mixer_r.gain(CHORUS, mapfloat(configuration.delay_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(CHORUS, mapfloat(configuration.delay_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_r.gain(REVERB, mapfloat(configuration.delay_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(REVERB, mapfloat(configuration.delay_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_r.gain(CHORUS, mapfloat(configuration.fx.delay_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(CHORUS, mapfloat(configuration.fx.delay_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + 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)); + master_mixer_r.gain(REVERB, mapfloat(configuration.fx.delay_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(REVERB, mapfloat(configuration.fx.delay_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); } void init_configuration(void) @@ -1412,25 +1393,26 @@ void init_configuration(void) Serial.println(F("INITIALIZING CONFIGURATION")); #endif - configuration.checksum = 0xffff; - configuration.instances = INSTANCES_DEFAULT; - configuration.vol = VOLUME_DEFAULT; - configuration.mono = MONO_DEFAULT; - configuration.reverb_roomsize = REVERB_ROOMSIZE_DEFAULT; - configuration.reverb_damping = REVERB_DAMPING_DEFAULT; - configuration.reverb_level = REVERB_LEVEL_DEFAULT; - configuration.chorus_frequency = CHORUS_FREQUENCY_DEFAULT; - configuration.chorus_waveform = CHORUS_WAVEFORM_DEFAULT; - configuration.chorus_depth = CHORUS_DEPTH_DEFAULT; - configuration.chorus_level = CHORUS_LEVEL_DEFAULT; - configuration.delay_time = DELAY_TIME_DEFAULT / 10; - configuration.delay_feedback = DELAY_FEEDBACK_DEFAULT; - configuration.delay_level = DELAY_LEVEL_DEFAULT; - configuration.soft_midi_thru = SOFT_MIDI_THRU_DEFAULT; - strcpy(configuration.config_name, "INITCONFIG"); + configuration.sys.checksum = 0xffff; + configuration.sys.instances = INSTANCES_DEFAULT; + configuration.sys.vol = VOLUME_DEFAULT; + configuration.sys.mono = MONO_DEFAULT; + 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; + configuration.fx.chorus_frequency = CHORUS_FREQUENCY_DEFAULT; + configuration.fx.chorus_waveform = CHORUS_WAVEFORM_DEFAULT; + configuration.fx.chorus_depth = CHORUS_DEPTH_DEFAULT; + configuration.fx.chorus_level = CHORUS_LEVEL_DEFAULT; + configuration.fx.delay_time = DELAY_TIME_DEFAULT / 10; + configuration.fx.delay_feedback = DELAY_FEEDBACK_DEFAULT; + configuration.fx.delay_level = DELAY_LEVEL_DEFAULT; + configuration.sys.soft_midi_thru = SOFT_MIDI_THRU_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.dexed[instance_id].bank = SYSEXBANK_DEFAULT; configuration.dexed[instance_id].voice = SYSEXSOUND_DEFAULT; @@ -1471,8 +1453,11 @@ void init_configuration(void) MicroDexed[instance_id]->controllers.refresh(); } - set_volume(configuration.vol, configuration.mono); - eeprom_update(); + set_volume(configuration.sys.vol, configuration.sys.mono); + eeprom_update_sys(); + eeprom_update_fx(); + for (uint8_t i = 0; i < NUM_DEXED; i++) + eeprom_update_dexed(i); } void eeprom_write(void) @@ -1481,7 +1466,7 @@ void eeprom_write(void) eeprom_update_flag = true; } -void eeprom_update(void) +void eeprom_update_sys(void) { for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { @@ -1490,16 +1475,108 @@ void eeprom_update(void) else { eeprom_update_flag = false; - configuration.checksum = crc32((byte*)&configuration + 4, sizeof(configuration) - 4); - EEPROM.put(EEPROM_START_ADDRESS, configuration); + configuration.sys.checksum = crc32((byte*)&configuration.sys + 4, sizeof(configuration.sys) - 4); + EEPROM.put(EEPROM_SYS_START_ADDRESS, configuration.sys); #ifdef DEBUG - Serial.println(F("Updating EEPROM")); + Serial.println(F("Updating EEPROM sys")); show_configuration(); #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.")); + show_configuration(); +#endif + 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); +#ifdef DEBUG + Serial.println(F("Updating EEPROM fx")); + show_configuration(); +#endif +} + +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); + + if (checksum != configuration.fx.checksum) + { +#ifdef DEBUG + Serial.println(F("Checksum error reading EEPROM fx.")); +#endif + return (false); + } + else + { +#ifdef DEBUG + Serial.print(F("EEPROM fx loaded.")); + show_configuration(); +#endif + return (true); + } +} + +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); + Serial.println(F(")")); + show_configuration(); +#endif +} + +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.")); + show_configuration(); +#endif + return (true); + } +} + /****************************************************************************** HELPERS ******************************************************************************/ @@ -1744,27 +1821,29 @@ void show_configuration(void) { Serial.println(); Serial.println(F("CONFIGURATION:")); - Serial.print(F("Checksum 0x")); Serial.println(configuration.checksum, HEX); - Serial.print(F("Instances ")); Serial.println(configuration.instances, DEC); - Serial.print(F("Volume ")); Serial.println(configuration.vol, DEC); - Serial.print(F("Mono ")); Serial.println(configuration.mono, DEC); - Serial.print(F("Reverb Roomsize ")); Serial.println(configuration.reverb_roomsize, DEC); - Serial.print(F("Reverb Damping ")); Serial.println(configuration.reverb_damping, DEC); - Serial.print(F("Reverb Level ")); Serial.println(configuration.reverb_level, DEC); - Serial.print(F("Chorus Frequency ")); Serial.println(configuration.chorus_frequency, DEC); - Serial.print(F("Chorus Waveform ")); Serial.println(configuration.chorus_waveform, DEC); - Serial.print(F("Chorus Depth ")); Serial.println(configuration.chorus_depth, DEC); - Serial.print(F("Chorus Level ")); Serial.println(configuration.chorus_level, DEC); - Serial.print(F("Delay Time ")); Serial.println(configuration.delay_time, DEC); - Serial.print(F("Delay Feedback ")); Serial.println(configuration.delay_feedback, DEC); - Serial.print(F("Delay Level ")); Serial.println(configuration.delay_level, DEC); - Serial.print(F("Soft MIDI Thru ")); Serial.println(configuration.soft_midi_thru, DEC); - + Serial.println(F("System")); + 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(" 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); + Serial.print(F(" Chorus Frequency ")); Serial.println(configuration.fx.chorus_frequency, DEC); + Serial.print(F(" Chorus Waveform ")); Serial.println(configuration.fx.chorus_waveform, DEC); + Serial.print(F(" Chorus Depth ")); Serial.println(configuration.fx.chorus_depth, DEC); + Serial.print(F(" Chorus Level ")); Serial.println(configuration.fx.chorus_level, DEC); + Serial.print(F(" Delay Time ")); Serial.println(configuration.fx.delay_time, DEC); + Serial.print(F(" Delay Feedback ")); Serial.println(configuration.fx.delay_feedback, DEC); + Serial.print(F(" Delay Level ")); Serial.println(configuration.fx.delay_level, DEC); for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { - Serial.print(F("=== DEXED INSTANCE ")); - Serial.print(instance_id, DEC); - Serial.println(" ==="); + 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(" MIDI-Channel ")); Serial.println(configuration.dexed[instance_id].midi_channel, DEC); Serial.print(F(" Bank ")); Serial.println(configuration.dexed[instance_id].bank, DEC); Serial.print(F(" Voice ")); Serial.println(configuration.dexed[instance_id].voice, DEC); diff --git a/UI.hpp b/UI.hpp index 4bc8490..3f244a3 100644 --- a/UI.hpp +++ b/UI.hpp @@ -206,6 +206,7 @@ void UI_func_volume(uint8_t param); void UI_func_load_performance(uint8_t param); void UI_func_save_performance(uint8_t param); void UI_func_save_config(uint8_t param); +void UI_func_save_config_default(uint8_t param); void UI_func_midi_soft_thru(uint8_t param); void UI_func_velocity_level(uint8_t param); void UI_func_eeprom_reset(uint8_t param); @@ -822,7 +823,7 @@ void UI_func_reverb_roomsize(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Reverb Room", configuration.reverb_roomsize, 1.0, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 3, false, false, false, true); + lcd_display_bar_int("Reverb Room", configuration.fx.reverb_roomsize, 1.0, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -830,21 +831,20 @@ void UI_func_reverb_roomsize(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.reverb_roomsize = constrain(configuration.reverb_roomsize + ENCODER[ENC_R].speed(), REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX); + configuration.fx.reverb_roomsize = constrain(configuration.fx.reverb_roomsize + ENCODER[ENC_R].speed(), REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX); else if (LCDML.BT_checkUp()) - configuration.reverb_roomsize = constrain(configuration.reverb_roomsize - ENCODER[ENC_R].speed(), REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX); + configuration.fx.reverb_roomsize = constrain(configuration.fx.reverb_roomsize - ENCODER[ENC_R].speed(), REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX); - lcd_display_bar_int("Reverb Room", configuration.reverb_roomsize, 1.0, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 3, false, false, false, false); + lcd_display_bar_int("Reverb Room", configuration.fx.reverb_roomsize, 1.0, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 3, false, false, false, false); - freeverb_r.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); - freeverb_l.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); + freeverb_r.roomsize(mapfloat(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); + freeverb_l.roomsize(mapfloat(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -856,7 +856,7 @@ void UI_func_reverb_damping(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Reverb Damp.", configuration.reverb_damping, 1.0, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 3, false, false, false, true); + lcd_display_bar_int("Reverb Damp.", configuration.fx.reverb_damping, 1.0, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -864,21 +864,20 @@ void UI_func_reverb_damping(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.reverb_damping = constrain(configuration.reverb_damping + ENCODER[ENC_R].speed(), REVERB_DAMPING_MIN, REVERB_DAMPING_MAX); + configuration.fx.reverb_damping = constrain(configuration.fx.reverb_damping + ENCODER[ENC_R].speed(), REVERB_DAMPING_MIN, REVERB_DAMPING_MAX); else if (LCDML.BT_checkUp()) - configuration.reverb_damping = constrain(configuration.reverb_damping - ENCODER[ENC_R].speed(), REVERB_DAMPING_MIN, REVERB_DAMPING_MAX); + configuration.fx.reverb_damping = constrain(configuration.fx.reverb_damping - ENCODER[ENC_R].speed(), REVERB_DAMPING_MIN, REVERB_DAMPING_MAX); - lcd_display_bar_int("Reverb Damp.", configuration.reverb_damping, 1.0, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 3, false, false, false, false); + lcd_display_bar_int("Reverb Damp.", configuration.fx.reverb_damping, 1.0, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 3, false, false, false, false); - freeverb_r.damping(mapfloat(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); - freeverb_l.damping(mapfloat(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); + freeverb_r.damping(mapfloat(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); + freeverb_l.damping(mapfloat(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -917,7 +916,6 @@ void UI_func_reverb_send(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -929,7 +927,7 @@ void UI_func_reverb_level(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Reverb Level", configuration.reverb_level, 1.0, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 3, false, false, false, true); + lcd_display_bar_int("Reverb Level", configuration.fx.reverb_level, 1.0, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -937,21 +935,20 @@ void UI_func_reverb_level(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.reverb_level = constrain(configuration.reverb_level + ENCODER[ENC_R].speed(), REVERB_LEVEL_MIN, REVERB_LEVEL_MAX); + configuration.fx.reverb_level = constrain(configuration.fx.reverb_level + ENCODER[ENC_R].speed(), REVERB_LEVEL_MIN, REVERB_LEVEL_MAX); else if (LCDML.BT_checkUp()) - configuration.reverb_level = constrain(configuration.reverb_level - ENCODER[ENC_R].speed(), REVERB_LEVEL_MIN, REVERB_LEVEL_MAX); + configuration.fx.reverb_level = constrain(configuration.fx.reverb_level - ENCODER[ENC_R].speed(), REVERB_LEVEL_MIN, REVERB_LEVEL_MAX); - lcd_display_bar_int("Reverb Level", configuration.reverb_level, 1.0, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 3, false, false, false, true); + lcd_display_bar_int("Reverb Level", configuration.fx.reverb_level, 1.0, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 3, false, false, false, true); - master_mixer_r.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_r.gain(REVERB, mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(REVERB, mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -963,7 +960,7 @@ void UI_func_chorus_frequency(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_float("Chorus Frq.", configuration.chorus_frequency, 0.1, CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX, 2, 1, false, false, false, true); + lcd_display_bar_float("Chorus Frq.", configuration.fx.chorus_frequency, 0.1, CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX, 2, 1, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -971,20 +968,19 @@ void UI_func_chorus_frequency(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.chorus_frequency = constrain(configuration.chorus_frequency + ENCODER[ENC_R].speed(), CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX); + configuration.fx.chorus_frequency = constrain(configuration.fx.chorus_frequency + ENCODER[ENC_R].speed(), CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX); else if (LCDML.BT_checkUp()) - configuration.chorus_frequency = constrain(configuration.chorus_frequency - ENCODER[ENC_R].speed(), CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX); + configuration.fx.chorus_frequency = constrain(configuration.fx.chorus_frequency - ENCODER[ENC_R].speed(), CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX); - lcd_display_bar_float("Chorus Frq.", configuration.chorus_frequency, 0.1, CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX, 2, 1, false, false, false, false); + lcd_display_bar_float("Chorus Frq.", configuration.fx.chorus_frequency, 0.1, CHORUS_FREQUENCY_MIN, CHORUS_FREQUENCY_MAX, 2, 1, false, false, false, false); - chorus_modulator.frequency(configuration.chorus_frequency / 10.0); + chorus_modulator.frequency(configuration.fx.chorus_frequency / 10.0); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1002,12 +998,12 @@ void UI_func_chorus_waveform(uint8_t param) if (LCDML.FUNC_loop()) // ****** LOOP ********* { if (LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) - configuration.chorus_waveform = constrain(configuration.chorus_waveform + 1, CHORUS_WAVEFORM_MIN, CHORUS_WAVEFORM_MAX); + configuration.fx.chorus_waveform = constrain(configuration.fx.chorus_waveform + 1, CHORUS_WAVEFORM_MIN, CHORUS_WAVEFORM_MAX); else if (LCDML.BT_checkUp() && encoderDir[ENC_R].Up()) - configuration.chorus_waveform = constrain(configuration.chorus_waveform - 1, CHORUS_WAVEFORM_MIN, CHORUS_WAVEFORM_MAX); + configuration.fx.chorus_waveform = constrain(configuration.fx.chorus_waveform - 1, CHORUS_WAVEFORM_MIN, CHORUS_WAVEFORM_MAX); lcd.setCursor(0, 1); - switch (configuration.chorus_waveform) + switch (configuration.fx.chorus_waveform) { case 0: chorus_modulator.begin(WAVEFORM_TRIANGLE); @@ -1027,7 +1023,6 @@ void UI_func_chorus_waveform(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { // you can here reset some global vars or do nothing - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1039,7 +1034,7 @@ void UI_func_chorus_depth(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Chorus Dpt.", configuration.chorus_depth, 1.0, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX, 3, false, false, false, true); + lcd_display_bar_int("Chorus Dpt.", configuration.fx.chorus_depth, 1.0, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -1047,20 +1042,19 @@ void UI_func_chorus_depth(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.chorus_depth = constrain(configuration.chorus_depth + ENCODER[ENC_R].speed(), CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX); + configuration.fx.chorus_depth = constrain(configuration.fx.chorus_depth + ENCODER[ENC_R].speed(), CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX); else if (LCDML.BT_checkUp()) - configuration.chorus_depth = constrain(configuration.chorus_depth - ENCODER[ENC_R].speed(), CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX); + configuration.fx.chorus_depth = constrain(configuration.fx.chorus_depth - ENCODER[ENC_R].speed(), CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX); - lcd_display_bar_int("Chorus Dpt.", configuration.chorus_depth, 1.0, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX, 3, false, false, false, false); + lcd_display_bar_int("Chorus Dpt.", configuration.fx.chorus_depth, 1.0, CHORUS_DEPTH_MIN, CHORUS_DEPTH_MAX, 3, false, false, false, false); - chorus_modulator.amplitude(configuration.chorus_depth / 100.0); + chorus_modulator.amplitude(configuration.fx.chorus_depth / 100.0); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1099,7 +1093,6 @@ void UI_func_chorus_send(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1111,7 +1104,7 @@ void UI_func_chorus_level(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Chorus Lvl.", configuration.chorus_level, 1.0, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 3, false, false, false, true); + lcd_display_bar_int("Chorus Lvl.", configuration.fx.chorus_level, 1.0, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -1119,21 +1112,20 @@ void UI_func_chorus_level(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.chorus_level = constrain(configuration.chorus_level + ENCODER[ENC_R].speed(), CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX); + configuration.fx.chorus_level = constrain(configuration.fx.chorus_level + ENCODER[ENC_R].speed(), CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX); else if (LCDML.BT_checkUp()) - configuration.chorus_level = constrain(configuration.chorus_level - ENCODER[ENC_R].speed(), CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX); + configuration.fx.chorus_level = constrain(configuration.fx.chorus_level - ENCODER[ENC_R].speed(), CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX); - lcd_display_bar_int("Chorus Lvl.", configuration.chorus_level, 1.0, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 3, false, false, false, false); + lcd_display_bar_int("Chorus Lvl.", configuration.fx.chorus_level, 1.0, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 3, false, false, false, false); - master_mixer_r.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + master_mixer_r.gain(CHORUS, mapfloat(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); + master_mixer_l.gain(CHORUS, mapfloat(configuration.fx.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1145,7 +1137,7 @@ void UI_func_delay_time(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Delay Time", configuration.delay_time, 10.0, DELAY_TIME_MIN, DELAY_TIME_MAX, 3, false, false, false, true); + lcd_display_bar_int("Delay Time", configuration.fx.delay_time, 10.0, DELAY_TIME_MIN, DELAY_TIME_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -1153,21 +1145,20 @@ void UI_func_delay_time(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.delay_time = constrain(configuration.delay_time + ENCODER[ENC_R].speed(), DELAY_TIME_MIN, DELAY_TIME_MAX); + configuration.fx.delay_time = constrain(configuration.fx.delay_time + ENCODER[ENC_R].speed(), DELAY_TIME_MIN, DELAY_TIME_MAX); else if (LCDML.BT_checkUp()) - configuration.delay_time = constrain(configuration.delay_time - ENCODER[ENC_R].speed(), DELAY_TIME_MIN, DELAY_TIME_MAX); + configuration.fx.delay_time = constrain(configuration.fx.delay_time - ENCODER[ENC_R].speed(), DELAY_TIME_MIN, DELAY_TIME_MAX); - lcd_display_bar_int("Delay Time", configuration.delay_time, 10.0, DELAY_TIME_MIN, DELAY_TIME_MAX, 3, false, false, false, true); + lcd_display_bar_int("Delay Time", configuration.fx.delay_time, 10.0, DELAY_TIME_MIN, DELAY_TIME_MAX, 3, false, false, false, true); - delay_r.delay(0, configuration.delay_time * 10); - delay_l.delay(0, configuration.delay_time * 10); + delay_r.delay(0, configuration.fx.delay_time * 10); + delay_l.delay(0, configuration.fx.delay_time * 10); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1179,7 +1170,7 @@ void UI_func_delay_feedback(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Delay Feedb.", configuration.delay_feedback, 1.0, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 3, false, false, false, true); + lcd_display_bar_int("Delay Feedb.", configuration.fx.delay_feedback, 1.0, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -1187,22 +1178,21 @@ void UI_func_delay_feedback(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.delay_feedback = constrain(configuration.delay_feedback + ENCODER[ENC_R].speed(), DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX); + configuration.fx.delay_feedback = constrain(configuration.fx.delay_feedback + ENCODER[ENC_R].speed(), DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX); else if (LCDML.BT_checkUp()) - configuration.delay_feedback = constrain(configuration.delay_feedback - ENCODER[ENC_R].speed(), DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX); + configuration.fx.delay_feedback = constrain(configuration.fx.delay_feedback - ENCODER[ENC_R].speed(), DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX); - lcd_display_bar_int("Delay Feedb.", configuration.delay_feedback, 1.0, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 3, false, false, false, false); + lcd_display_bar_int("Delay Feedb.", configuration.fx.delay_feedback, 1.0, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 3, false, false, false, false); - delay_fb_mixer_r.gain(1, configuration.delay_feedback / 100.0); // amount of feedback - delay_fb_mixer_l.gain(1, configuration.delay_feedback / 100.0); // amount of feedback - //delay_fb_mixer.gain(0, 1.0 - configuration.delay_feedback / 200.0); // original signal + delay_fb_mixer_r.gain(1, configuration.fx.delay_feedback / 100.0); // amount of feedback + delay_fb_mixer_l.gain(1, configuration.fx.delay_feedback / 100.0); // amount of feedback + //delay_fb_mixer.gain(0, 1.0 - configuration.fx.delay_feedback / 200.0); // original signal } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1241,7 +1231,6 @@ void UI_func_delay_send(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1253,7 +1242,7 @@ void UI_func_delay_level(uint8_t param) encoderDir[ENC_R].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Delay Lvl.", configuration.delay_level, 1.0, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 3, false, false, false, true); + lcd_display_bar_int("Delay Lvl.", configuration.fx.delay_level, 1.0, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 3, false, false, false, true); } if (LCDML.FUNC_loop()) // ****** LOOP ********* @@ -1261,21 +1250,20 @@ void UI_func_delay_level(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.delay_level = constrain(configuration.delay_level + ENCODER[ENC_R].speed(), DELAY_LEVEL_MIN, DELAY_LEVEL_MAX); + configuration.fx.delay_level = constrain(configuration.fx.delay_level + ENCODER[ENC_R].speed(), DELAY_LEVEL_MIN, DELAY_LEVEL_MAX); else if (LCDML.BT_checkUp()) - configuration.delay_level = constrain(configuration.delay_level - ENCODER[ENC_R].speed(), DELAY_LEVEL_MIN, DELAY_LEVEL_MAX); + configuration.fx.delay_level = constrain(configuration.fx.delay_level - ENCODER[ENC_R].speed(), DELAY_LEVEL_MIN, DELAY_LEVEL_MAX); - lcd_display_bar_int("Delay Lvl.", configuration.delay_level, 1.0, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 3, false, false, false, false); + lcd_display_bar_int("Delay Lvl.", configuration.fx.delay_level, 1.0, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 3, false, false, false, false); - master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); - master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); + 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)); } } if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1313,7 +1301,6 @@ void UI_func_filter_cutoff(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1351,7 +1338,6 @@ void UI_func_filter_resonance(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1391,7 +1377,6 @@ void UI_func_transpose(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1430,7 +1415,6 @@ void UI_func_tune(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1471,7 +1455,6 @@ void UI_func_midi_channel(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { // you can here reset some global vars or do nothing - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1523,7 +1506,6 @@ void UI_func_lowest_note(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1566,7 +1548,6 @@ void UI_func_highest_note(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1605,7 +1586,6 @@ void UI_func_sound_intensity(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1621,7 +1601,7 @@ void UI_func_panorama(uint8_t param) { encoderDir[ENC_R].reset(); - if (configuration.mono > 0) + if (configuration.sys.mono > 0) { lcd.setCursor(0, 0); lcd.print(F("Panorama")); @@ -1635,12 +1615,12 @@ void UI_func_panorama(uint8_t param) if (LCDML.FUNC_loop()) // ****** LOOP ********* { - if (LCDML.BT_checkDown() && configuration.mono == 0) + if (LCDML.BT_checkDown() && configuration.sys.mono == 0) configuration.dexed[instance_id].pan = constrain(configuration.dexed[instance_id].pan + ENCODER[ENC_R].speed(), PANORAMA_MIN, PANORAMA_MAX); - else if (LCDML.BT_checkUp() && configuration.mono == 0) + else if (LCDML.BT_checkUp() && configuration.sys.mono == 0) configuration.dexed[instance_id].pan = constrain(configuration.dexed[instance_id].pan - ENCODER[ENC_R].speed(), PANORAMA_MIN, PANORAMA_MAX); - if (configuration.mono == 0) + if (configuration.sys.mono == 0) { lcd_display_meter_float("Panorama", configuration.dexed[instance_id].pan, 0.05, -20.0, PANORAMA_MIN, PANORAMA_MAX, 3, 1, false, false, true, false); mono2stereo[instance_id]->panorama(mapfloat(configuration.dexed[instance_id].pan, PANORAMA_MIN, PANORAMA_MAX, -1.0, 1.0)); @@ -1650,7 +1630,6 @@ void UI_func_panorama(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1664,7 +1643,7 @@ void UI_func_stereo_mono(uint8_t param) lcd.setCursor(0, 0); lcd.print(F("Stereo/Mono")); lcd.setCursor(0, 1); - switch (configuration.mono) + switch (configuration.sys.mono) { case 0: lcd.print(F("[STEREO]")); @@ -1688,12 +1667,12 @@ void UI_func_stereo_mono(uint8_t param) if (LCDML.FUNC_loop()) // ****** LOOP ********* { if (LCDML.BT_checkDown()) - configuration.mono = constrain(configuration.mono + 1, MONO_MIN, MONO_MAX); + configuration.sys.mono = constrain(configuration.sys.mono + 1, MONO_MIN, MONO_MAX); else if (LCDML.BT_checkUp()) - configuration.mono = constrain(configuration.mono - 1, MONO_MIN, MONO_MAX); + configuration.sys.mono = constrain(configuration.sys.mono - 1, MONO_MIN, MONO_MAX); lcd.setCursor(0, 1); - switch (configuration.mono) + switch (configuration.sys.mono) { case 0: lcd.print(F("[STEREO]")); @@ -1712,7 +1691,7 @@ void UI_func_stereo_mono(uint8_t param) stereo2mono.stereo(false); break; } - set_volume(configuration.vol, configuration.mono); + set_volume(configuration.sys.vol, configuration.sys.mono); } if (LCDML.FUNC_close()) // ****** STABLE END ********* @@ -1755,7 +1734,6 @@ void UI_func_polyphony(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1804,7 +1782,6 @@ void UI_func_engine(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1850,7 +1827,6 @@ void UI_func_mono_poly(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1896,7 +1872,6 @@ void UI_func_note_refresh(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1934,7 +1909,6 @@ void UI_func_pb_range(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -1972,7 +1946,6 @@ void UI_func_pb_step(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2010,7 +1983,6 @@ void UI_func_mw_range(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2074,7 +2046,6 @@ void UI_func_mw_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2124,7 +2095,6 @@ void UI_func_mw_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2163,7 +2133,6 @@ void UI_func_fc_range(uint8_t param) { // you can here reset some global vars or do nothing lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2227,7 +2196,6 @@ void UI_func_fc_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2277,7 +2245,6 @@ void UI_func_fc_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2315,7 +2282,6 @@ void UI_func_bc_range(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2379,7 +2345,6 @@ void UI_func_bc_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2429,7 +2394,6 @@ void UI_func_bc_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2467,7 +2431,6 @@ void UI_func_at_range(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2531,7 +2494,6 @@ void UI_func_at_assign(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2581,7 +2543,6 @@ void UI_func_at_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2633,7 +2594,6 @@ void UI_func_portamento_mode(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2679,7 +2639,6 @@ void UI_func_portamento_glissando(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2717,7 +2676,6 @@ void UI_func_portamento_time(uint8_t param) if (LCDML.FUNC_close()) // ****** STABLE END ********* { lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2835,7 +2793,6 @@ void UI_handle_OP(uint8_t param, uint8_t op, uint8_t instance_id) if (LCDML.FUNC_close()) // ****** STABLE END ********* { - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -2883,12 +2840,12 @@ void UI_func_midi_soft_thru(uint8_t param) if ((LCDML.BT_checkDown() && encoderDir[ENC_R].Down()) || (LCDML.BT_checkUp() && encoderDir[ENC_R].Up())) { if (LCDML.BT_checkDown()) - configuration.soft_midi_thru = constrain(configuration.soft_midi_thru + 1, SOFT_MIDI_THRU_MIN, SOFT_MIDI_THRU_MAX); + configuration.sys.soft_midi_thru = constrain(configuration.sys.soft_midi_thru + 1, SOFT_MIDI_THRU_MIN, SOFT_MIDI_THRU_MAX); else if (LCDML.BT_checkUp()) - configuration.soft_midi_thru = constrain(configuration.soft_midi_thru - 1, SOFT_MIDI_THRU_MIN, SOFT_MIDI_THRU_MAX); + configuration.sys.soft_midi_thru = constrain(configuration.sys.soft_midi_thru - 1, SOFT_MIDI_THRU_MIN, SOFT_MIDI_THRU_MAX); } lcd.setCursor(0, 1); - switch (configuration.soft_midi_thru) + switch (configuration.sys.soft_midi_thru) { case 0: lcd.print(F("[OFF]")); @@ -2938,7 +2895,6 @@ void UI_func_velocity_level(uint8_t param) { // you can here reset some global vars or do nothing lcd_special_chars(SCROLLBAR); - eeprom_write(); encoderDir[ENC_R].reset(); } } @@ -3173,7 +3129,7 @@ void UI_func_volume(uint8_t param) encoderDir[ENC_L].reset(); lcd_special_chars(BLOCKBAR); - lcd_display_bar_int("Master Vol.", configuration.vol, 1.0, VOLUME_MIN, VOLUME_MAX, 3, false, false, false, true); + lcd_display_bar_int("Master Vol.", configuration.sys.vol, 1.0, VOLUME_MIN, VOLUME_MAX, 3, false, false, false, true); back_from_volume = 0; } @@ -3186,16 +3142,16 @@ void UI_func_volume(uint8_t param) if (LCDML.BT_checkDown()) { - configuration.vol = constrain(configuration.vol + ENCODER[ENC_L].speed(), VOLUME_MIN, VOLUME_MAX); + configuration.sys.vol = constrain(configuration.sys.vol + ENCODER[ENC_L].speed(), VOLUME_MIN, VOLUME_MAX); } else if (LCDML.BT_checkUp()) { - configuration.vol = constrain(configuration.vol - ENCODER[ENC_L].speed(), VOLUME_MIN, VOLUME_MAX); + configuration.sys.vol = constrain(configuration.sys.vol - ENCODER[ENC_L].speed(), VOLUME_MIN, VOLUME_MAX); } } - lcd_display_bar_int("Master Vol.", configuration.vol, 1.0, VOLUME_MIN, VOLUME_MAX, 3, false, false, false, false); - set_volume(configuration.vol, configuration.mono); + lcd_display_bar_int("Master Vol.", configuration.sys.vol, 1.0, VOLUME_MIN, VOLUME_MAX, 3, false, false, false, false); + set_volume(configuration.sys.vol, configuration.sys.mono); } if (LCDML.FUNC_close()) // ****** STABLE END ********* @@ -3290,7 +3246,7 @@ void UI_func_save_config(uint8_t param) encoderDir[ENC_R].reset(); lcd.setCursor(0, 0); - lcd.print(F("Save Config SD")); + lcd.print(F("Save Cfg SD")); #if NUMDEXED > 1 instance_id = -1; @@ -3359,7 +3315,7 @@ void UI_func_save_config(uint8_t param) if (yesno == true) { LCDML.DISP_clear(); - lcd.print(F("Storing config")); + lcd.print(F("Save Cfg SD")); save_sd_voiceconfig(configuration.dexed[instance_id].bank, configuration.dexed[instance_id].voice, instance_id); @@ -3372,6 +3328,56 @@ void UI_func_save_config(uint8_t param) } } +void UI_func_save_config_default(uint8_t param) +{ + static bool yesno; + + if (LCDML.FUNC_setup()) // ****** SETUP ********* + { + encoderDir[ENC_R].reset(); + + lcd.setCursor(0, 0); + lcd.print(F("Save Cfg default")); + lcd.setCursor(0, 1); + lcd.print(F("[NO ]")); + + if (LCDML.FUNC_loop()) // ****** LOOP ********* + { + if ((LCDML.BT_checkDown() || LCDML.BT_checkUp())) + { + yesno = !yesno; + if (yesno == true) + { + lcd.setCursor(1, 1); + lcd.print(F("YES")); + } + else + { + lcd.setCursor(1, 1); + lcd.print(F("NO ")); + } + } + } + + if (LCDML.FUNC_close()) // ****** STABLE END ********* + { + if (yesno == true) + { + LCDML.DISP_clear(); + lcd.print(F("Save Cfg default")); + + // EEPROM!!! + + lcd.setCursor(0, 1); + lcd.print(F("Done.")); + delay(500); + } + + encoderDir[ENC_R].reset(); + } + } +} + void UI_func_sysex_send_voice(uint8_t param) { if (LCDML.FUNC_setup()) // ****** SETUP ********* diff --git a/UI_1_FX.h b/UI_1_FX.h index 14b1e36..1dde518 100644 --- a/UI_1_FX.h +++ b/UI_1_FX.h @@ -98,19 +98,23 @@ 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, 2, "Load Perf. SD", UI_func_load_performance); -//LCDML_add(74, LCDML_0_3, 2, "Save Perf. SD", UI_func_save_performance); -LCDML_add(73, LCDML_0_3, 1, "Save Config SD", UI_func_save_config); -LCDML_add(74, LCDML_0_3, 3, "Save Voice SD", UI_func_save_voice); -LCDML_add(75, LCDML_0_3, 4, "MIDI Recv Bank", UI_func_sysex_receive_bank); -LCDML_add(76, LCDML_0_3, 5, "MIDI Send Bank", UI_func_sysex_send_bank); -LCDML_add(77, LCDML_0_3, 6, "EEPROM Reset", UI_func_eeprom_reset); -LCDML_add(78, LCDML_0, 4, "System", NULL); -LCDML_add(79, LCDML_0_4, 3, "Volume", UI_func_volume); -LCDML_add(80, LCDML_0_4, 1, "Stereo/Mono", UI_func_stereo_mono); -LCDML_add(81, LCDML_0_4, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); -LCDML_add(82, LCDML_0, 6, "Info", UI_func_information); -#define _LCDML_DISP_cnt 82 +LCDML_add(73, LCDML_0_3, 1, "Performance", NULL); +LCDML_add(74, LCDML_0_3_1, 1, "Load Perf. SD", UI_func_load_performance); +LCDML_add(75, LCDML_0_3_1, 2, "Save Perf. SD", UI_func_save_performance); +LCDML_add(76, LCDML_0_3, 2, "Voice", NULL); +LCDML_add(77, LCDML_0_3_2, 1, "Save Cfg SD", UI_func_save_config); +LCDML_add(78, LCDML_0_3_2, 2, "Save Cfg default", UI_func_save_config_default); +LCDML_add(79, LCDML_0_3_2, 3, "Save Voice SD", UI_func_save_voice); +LCDML_add(80, LCDML_0_3, 3, "MIDI", NULL); +LCDML_add(81, LCDML_0_3_3, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank); +LCDML_add(82, LCDML_0_3_3, 2, "MIDI Send Bank", UI_func_sysex_send_bank); +LCDML_add(83, LCDML_0_3, 6, "EEPROM Reset", UI_func_eeprom_reset); +LCDML_add(84, LCDML_0, 4, "System", NULL); +LCDML_add(85, LCDML_0_4, 3, "Volume", UI_func_volume); +LCDML_add(86, LCDML_0_4, 1, "Stereo/Mono", UI_func_stereo_mono); +LCDML_add(87, LCDML_0_4, 2, "MIDI Soft THRU", UI_func_midi_soft_thru); +LCDML_add(88, LCDML_0, 6, "Info", UI_func_information); +#define _LCDML_DISP_cnt 88 #define MENU_ID_OF_INSTANCE_2 58 -#define VOLUME_MENU_ID 79 +#define VOLUME_MENU_ID 85 #endif diff --git a/config.h b/config.h index 2b8a1bf..e075cf2 100644 --- a/config.h +++ b/config.h @@ -237,6 +237,10 @@ 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) + // MIDI #ifdef MIDI_DEVICE_USB #define USBCON 1 @@ -503,6 +507,7 @@ enum { DEXED, CHORUS, DELAY, REVERB}; // typedef struct { + uint32_t checksum; uint8_t lowest_note; uint8_t highest_note; uint8_t reverb_send; @@ -542,12 +547,8 @@ typedef struct { uint8_t voice; } dexed_t; -// struct for holding the current configuration typedef struct { uint32_t checksum; - uint8_t instances; - uint8_t vol; - uint8_t mono; uint8_t reverb_roomsize; uint8_t reverb_damping; uint8_t reverb_level; @@ -558,9 +559,20 @@ typedef struct { uint8_t delay_time; uint8_t delay_feedback; uint8_t delay_level; +} fx_t; + +typedef struct { + uint32_t checksum; + uint8_t instances; + uint8_t vol; + uint8_t mono; uint8_t soft_midi_thru; +} sys_t; + +typedef struct { + sys_t sys; + fx_t fx; dexed_t dexed[NUM_DEXED]; - char config_name[11]; } config_t; #if !defined(_MAPFLOAT) diff --git a/dexed_sd.cpp b/dexed_sd.cpp index 523e0e0..514f462 100644 --- a/dexed_sd.cpp +++ b/dexed_sd.cpp @@ -202,7 +202,7 @@ bool load_sd_voiceconfig(uint8_t b, uint8_t v, uint8_t instance_id) Serial.print(filename); Serial.println(F(" on SD.")); #endif - return (get_sd_voiceconfig(sysex, (uint8_t*)&configuration.dexed[instance_id])); + return (get_sd_voiceconfig(sysex, (uint8_t*)&configuration.dexed[instance_id], instance_id)); } } else @@ -218,7 +218,7 @@ bool load_sd_voiceconfig(uint8_t b, uint8_t v, uint8_t instance_id) return (false); } -bool get_sd_voiceconfig(File sysex, uint8_t* conf) +bool get_sd_voiceconfig(File sysex, uint8_t* conf, uint8_t instance_id) { uint16_t n; int32_t bulk_checksum_calc = 0; @@ -287,7 +287,7 @@ bool get_sd_voiceconfig(File sysex, uint8_t* conf) #ifdef DEBUG Serial.println(F("Voice config loaded.")); #endif - configuration.checksum = crc32((uint8_t*)&configuration + 4, sizeof(configuration) - 4); + configuration.dexed[instance_id].checksum = crc32((uint8_t*)&configuration.dexed[instance_id] + 4, sizeof(configuration.dexed[instance_id]) - 4); return (true); } diff --git a/dexed_sd.h b/dexed_sd.h index 0b0c6fb..e924876 100644 --- a/dexed_sd.h +++ b/dexed_sd.h @@ -49,7 +49,7 @@ 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); bool load_sd_voiceconfig(uint8_t b, uint8_t v, uint8_t instance_id); -bool get_sd_voiceconfig(File sysex, uint8_t* conf); +bool get_sd_voiceconfig(File sysex, uint8_t* conf, uint8_t instance_id); bool save_sd_voiceconfig(uint8_t b, uint8_t v, uint8_t instance_id); bool write_sd_voiceconfig(File sysex, uint8_t* data, uint16_t len); diff --git a/midi_devices.hpp b/midi_devices.hpp index 4f109ed..f4f2cff 100644 --- a/midi_devices.hpp +++ b/midi_devices.hpp @@ -79,7 +79,7 @@ void handleNoteOn_MIDI_DEVICE_DIN(byte inChannel, byte inNumber, byte inVelocity #ifdef DEBUG Serial.print(F("[MIDI_DIN] NoteOn")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendNoteOn(inNumber, inVelocity, inChannel); @@ -105,7 +105,7 @@ void handleNoteOff_MIDI_DEVICE_DIN(byte inChannel, byte inNumber, byte inVelocit #ifdef DEBUG Serial.print(F("[MIDI_DIN] NoteOff")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendNoteOff(inNumber, inVelocity, inChannel); @@ -131,7 +131,7 @@ void handleControlChange_MIDI_DEVICE_DIN(byte inChannel, byte inData1, byte inDa #ifdef DEBUG Serial.print(F("[MIDI_DIN] CC")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendControlChange(inData1, inData2, inChannel); @@ -157,7 +157,7 @@ void handleAfterTouch_MIDI_DEVICE_DIN(byte inChannel, byte inPressure) #ifdef DEBUG Serial.print(F("[MIDI_DIN] AT")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendAfterTouch(inPressure, inChannel); @@ -183,7 +183,7 @@ void handlePitchBend_MIDI_DEVICE_DIN(byte inChannel, int inPitch) #ifdef DEBUG Serial.print(F("[MIDI_DIN] PB")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendPitchBend(inPitch, inChannel); @@ -209,7 +209,7 @@ void handleProgramChange_MIDI_DEVICE_DIN(byte inChannel, byte inProgram) #ifdef DEBUG Serial.print(F("[MIDI_DIN] PC")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendProgramChange(inProgram, inChannel); @@ -235,7 +235,7 @@ void handleSystemExclusive_MIDI_DEVICE_DIN(byte * data, uint len) #ifdef DEBUG Serial.print(F("[MIDI_DIN] SysEx")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendSysEx(len, data); @@ -261,7 +261,7 @@ void handleSystemExclusive_MIDI_DEVICE_DIN(byte * data, uint len) #ifdef DEBUG Serial.print(F("[MIDI_DIN] SysExChunk")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendSysEx(len, data, last); @@ -287,7 +287,7 @@ void handleTimeCodeQuarterFrame_MIDI_DEVICE_DIN(byte data) #ifdef DEBUG Serial.print(F("[MIDI_DIN] TimeCodeQuarterFrame")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendTimeCodeQuarterFrame(0xF1, data); @@ -313,7 +313,7 @@ void handleAfterTouchPoly_MIDI_DEVICE_DIN(byte inChannel, byte inNumber, byte in #ifdef DEBUG Serial.print(F("[MIDI_DIN] AT-Poly")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendAfterTouch(inNumber, inVelocity, inChannel); @@ -339,7 +339,7 @@ void handleSongSelect_MIDI_DEVICE_DIN(byte inSong) #ifdef DEBUG Serial.print(F("[MIDI_DIN] SongSelect")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendSongSelect(inSong); @@ -365,7 +365,7 @@ void handleTuneRequest_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] TuneRequest")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendTuneRequest(); @@ -391,7 +391,7 @@ void handleClock_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] Clock")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(midi::Clock); @@ -417,7 +417,7 @@ void handleStart_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] Start")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(midi::Start); @@ -443,7 +443,7 @@ void handleContinue_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] Continue")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(midi::Continue); @@ -469,7 +469,7 @@ void handleStop_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] Stop")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(midi::Stop); @@ -495,7 +495,7 @@ void handleActiveSensing_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] ActiveSensing")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(midi::ActiveSensing); @@ -521,7 +521,7 @@ void handleSystemReset_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] SystemReset")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(midi::SystemReset); @@ -547,7 +547,7 @@ void handleSystemReset_MIDI_DEVICE_DIN(void) #ifdef DEBUG Serial.print(F("[MIDI_DIN] RealTimeSystem")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_USB_HOST midi_usb.sendRealTime(inRealTime); @@ -578,7 +578,7 @@ void handleNoteOn_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNumber, byte inVel #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] NoteOn")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendNoteOn(inNumber, inVelocity, inChannel); @@ -604,7 +604,7 @@ void handleNoteOff_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNumber, byte inVe #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] NoteOff")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendNoteOff(inNumber, inVelocity, inChannel); @@ -630,7 +630,7 @@ void handleControlChange_MIDI_DEVICE_USB_HOST(byte inChannel, byte inData1, byte #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] CC")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendControlChange(inData1, inData2, inChannel); @@ -656,7 +656,7 @@ void handleAfterTouch_MIDI_DEVICE_USB_HOST(byte inChannel, byte inPressure) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] AT")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendAfterTouch(inPressure, inChannel); @@ -682,7 +682,7 @@ void handlePitchBend_MIDI_DEVICE_USB_HOST(byte inChannel, int inPitch) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] PB")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendPitchBend(inPitch, inChannel); @@ -708,7 +708,7 @@ void handleProgramChange_MIDI_DEVICE_USB_HOST(byte inChannel, byte inProgram) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] PC")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendProgramChange(inProgram, inChannel); @@ -734,7 +734,7 @@ void handleSystemExclusive_MIDI_DEVICE_USB_HOST(byte * data, uint len) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] SysEx")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendSysEx(len, data); @@ -760,7 +760,7 @@ void handleSystemExclusive_MIDI_DEVICE_USB_HOST(byte * data, uint len) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] SysExChunk")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendSysEx(len, data, last); @@ -786,7 +786,7 @@ void handleTimeCodeQuarterFrame_MIDI_DEVICE_USB_HOST(midi::DataByte data) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] TimeCodeQuarterFrame")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendTimeCodeQuarterFrame(data); @@ -812,7 +812,7 @@ void handleAfterTouchPoly_MIDI_DEVICE_USB_HOST(byte inChannel, byte inNumber, by #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] AT-Poly")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendAfterTouch(inNumber, inVelocity, inChannel); @@ -838,7 +838,7 @@ void handleSongSelect_MIDI_DEVICE_USB_HOST(byte inSong) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] SongSelect")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendSongSelect(inSong); @@ -864,7 +864,7 @@ void handleTuneRequest_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] TuneRequest")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendTuneRequest(); @@ -890,7 +890,7 @@ void handleClock_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] Clock")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Clock); @@ -916,7 +916,7 @@ void handleStart_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] Start")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Start); @@ -942,7 +942,7 @@ void handleContinue_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] Continue")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Continue); @@ -968,7 +968,7 @@ void handleStop_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] Stop")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Stop); @@ -994,7 +994,7 @@ void handleActiveSensing_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] ActiveSensing")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::ActiveSensing); @@ -1020,7 +1020,7 @@ void handleSystemReset_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] SystemReset")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::SystemReset); @@ -1046,7 +1046,7 @@ void handleSystemReset_MIDI_DEVICE_USB_HOST(void) #ifdef DEBUG Serial.print(F("[MIDI_USB_HOST] RealTimeSystem")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(inRealTime); @@ -1077,7 +1077,7 @@ void handleNoteOn_MIDI_DEVICE_USB(byte inChannel, byte inNumber, byte inVelocity #ifdef DEBUG Serial.print(F("[MIDI_USB] NoteOn")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendNoteOn(inNumber, inVelocity, inChannel); @@ -1103,7 +1103,7 @@ void handleNoteOff_MIDI_DEVICE_USB(byte inChannel, byte inNumber, byte inVelocit #ifdef DEBUG Serial.print(F("[MIDI_USB] NoteOff")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendNoteOff(inNumber, inVelocity, inChannel); @@ -1129,7 +1129,7 @@ void handleControlChange_MIDI_DEVICE_USB(byte inChannel, byte inData1, byte inDa #ifdef DEBUG Serial.print(F("[MIDI_USB] CC")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendControlChange(inData1, inData2, inChannel); @@ -1155,7 +1155,7 @@ void handleAfterTouch_MIDI_DEVICE_USB(byte inChannel, byte inPressure) #ifdef DEBUG Serial.print(F("[MIDI_USB] AT")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendAfterTouch(inPressure, inChannel); @@ -1181,7 +1181,7 @@ void handlePitchBend_MIDI_DEVICE_USB(byte inChannel, int inPitch) #ifdef DEBUG Serial.print(F("[MIDI_USB] PB")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendPitchBend(inPitch, inChannel); @@ -1207,7 +1207,7 @@ void handleProgramChange_MIDI_DEVICE_USB(byte inChannel, byte inProgram) #ifdef DEBUG Serial.print(F("[MIDI_USB] PC")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendProgramChange(inProgram, inChannel); @@ -1233,7 +1233,7 @@ void handleSystemExclusive_MIDI_DEVICE_USB(byte * data, uint len) #ifdef DEBUG Serial.print(F("[MIDI_USB] SysEx")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendSysEx(len, data); @@ -1259,7 +1259,7 @@ void handleSystemExclusive_MIDI_DEVICE_USB(byte * data, uint len) #ifdef DEBUG Serial.print(F("[MIDI_USB] SysExChunk")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendSysEx(len, data, last); @@ -1285,7 +1285,7 @@ void handleTimeCodeQuarterFrame_MIDI_DEVICE_USB(midi::DataByte data) #ifdef DEBUG Serial.print(F("[MIDI_USB] TimeCodeQuarterFrame")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendTimeCodeQuarterFrame(data); @@ -1311,7 +1311,7 @@ void handleAfterTouchPoly_MIDI_DEVICE_USB(byte inChannel, byte inNumber, byte in #ifdef DEBUG Serial.print(F("[MIDI_USB] AT-Poly")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendAfterTouch(inNumber, inVelocity, inChannel); @@ -1337,7 +1337,7 @@ void handleSongSelect_MIDI_DEVICE_USB(byte inSong) #ifdef DEBUG Serial.print(F("[MIDI_USB] SongSelect")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendSongSelect(inSong); @@ -1363,7 +1363,7 @@ void handleTuneRequest_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] TuneRequest")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendTuneRequest(); @@ -1389,7 +1389,7 @@ void handleClock_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] Clock")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Clock); @@ -1415,7 +1415,7 @@ void handleStart_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] Start")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Start); @@ -1441,7 +1441,7 @@ void handleContinue_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] Continue")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Continue); @@ -1467,7 +1467,7 @@ void handleStop_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] Stop")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::Stop); @@ -1493,7 +1493,7 @@ void handleActiveSensing_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] ActiveSensing")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::ActiveSensing); @@ -1519,7 +1519,7 @@ void handleSystemReset_MIDI_DEVICE_USB(void) #ifdef DEBUG Serial.print(F("[MIDI_USB] SystemReset")); #endif - if (configuration.soft_midi_thru == 1) + if (configuration.sys.soft_midi_thru == 1) { #ifdef MIDI_DEVICE_DIN midi_serial.sendRealTime(midi::SystemReset);