From 650c10d91423d464b504c662691811cf2787cffe Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Wed, 25 Sep 2019 11:46:42 +0200 Subject: [PATCH] Removes feedback and delay-offset completely. Added simple description how to test the hardware on Linux inside config.h Compile time option for using an output filter (and which type and cutoff) added inside config.h --- MicroMDAEPiano.ino | 99 +++++++----------- UI.hpp | 207 ++++++------------------------------- config.h | 32 +++--- effect_modulated_delay.cpp | 12 +-- effect_modulated_delay.h | 2 - 5 files changed, 90 insertions(+), 262 deletions(-) diff --git a/MicroMDAEPiano.ino b/MicroMDAEPiano.ino index 6e986df..8a6da1d 100644 --- a/MicroMDAEPiano.ino +++ b/MicroMDAEPiano.ino @@ -56,42 +56,43 @@ AudioAmplifier volume_l; AudioAmplifier inverter; AudioEffectModulatedDelay modchorus_r; AudioEffectModulatedDelay modchorus_l; -AudioMixer4 modchorus_fbk_mixer_r; -AudioMixer4 modchorus_fbk_mixer_l; +#if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT AudioFilterBiquad modchorus_filter_r; AudioFilterBiquad modchorus_filter_l; +#endif AudioSynthWaveform modulator; AudioConnection patchCord0(queue_r, peak_r); AudioConnection patchCord1(queue_l, peak_l); AudioConnection patchCord2(queue_r, freeverb_r); AudioConnection patchCord3(queue_l, freeverb_l); -AudioConnection patchCord4(queue_r, 0, modchorus_fbk_mixer_r, 0); -AudioConnection patchCord5(queue_l, 0, modchorus_fbk_mixer_l, 0); -AudioConnection patchCord6(modchorus_fbk_mixer_r, 0, modchorus_r, 0); -AudioConnection patchCord7(modchorus_fbk_mixer_l, 0, modchorus_l, 0); -AudioConnection patchCord8(modchorus_r, 0, modchorus_fbk_mixer_r, 1); -AudioConnection patchCord9(modchorus_l, 0, modchorus_fbk_mixer_l, 1); -AudioConnection patchCord10(modulator, 0, modchorus_r, 1); -AudioConnection patchCord11(modulator, inverter); -AudioConnection patchCord12(inverter, 0, modchorus_l, 1); -AudioConnection patchCord13(queue_r, 0, mixer_r, 0); -AudioConnection patchCord14(queue_l, 0, mixer_l, 0); -AudioConnection patchCord15(modchorus_r, modchorus_filter_r); -AudioConnection patchCord16(modchorus_l, modchorus_filter_l); -AudioConnection patchCord17(modchorus_filter_r, 0, mixer_r, 2); -AudioConnection patchCord18(modchorus_filter_l, 0, mixer_l, 2); -AudioConnection patchCord19(freeverb_r, 0, mixer_r, 1); -AudioConnection patchCord20(freeverb_l, 0, mixer_l, 1); -AudioConnection patchCord21(mixer_r, volume_r); -AudioConnection patchCord22(mixer_l, volume_l); +AudioConnection patchCord4(queue_r, 0, modchorus_r, 0); +AudioConnection patchCord5(queue_l, 0, modchorus_l, 0); +AudioConnection patchCord6(modulator, 0, modchorus_r, 1); +AudioConnection patchCord7(modulator, inverter); +AudioConnection patchCord8(inverter, 0, modchorus_l, 1); +AudioConnection patchCord9(queue_r, 0, mixer_r, 0); +AudioConnection patchCord10(queue_l, 0, mixer_l, 0); +#if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT +AudioConnection patchCord11(modchorus_r, modchorus_filter_r); +AudioConnection patchCord12(modchorus_l, modchorus_filter_l); +AudioConnection patchCord13(modchorus_filter_r, 0, mixer_r, 2); +AudioConnection patchCord14(modchorus_filter_l, 0, mixer_l, 2); +#else +AudioConnection patchCord11(modchorus_r, mixer_r); +AudioConnection patchCord12(modchorus_l, mixer_l); +#endif +AudioConnection patchCord15(freeverb_r, 0, mixer_r, 1); +AudioConnection patchCord16(freeverb_l, 0, mixer_l, 1); +AudioConnection patchCord17(mixer_r, volume_r); +AudioConnection patchCord18(mixer_l, volume_l); #ifdef USB_AUDIO AudioOutputUSB usb1; -AudioConnection patchCord23(volume_r, 0, usb1, 0); -AudioConnection patchCord24(volume_l, 0, usb1, 1); +AudioConnection patchCord19(volume_r, 0, usb1, 0); +AudioConnection patchCord20(volume_l, 0, usb1, 1); #endif AudioOutputI2S i2s1; -AudioConnection patchCord25(volume_r, 0, i2s1, 0); -AudioConnection patchCord26(volume_l, 0, i2s1, 1); +AudioConnection patchCord21(volume_r, 0, i2s1, 0); +AudioConnection patchCord22(volume_l, 0, i2s1, 1); AudioControlSGTL5000 sgtl5000_1; // Objects @@ -134,9 +135,7 @@ config_t configuration = { ENC_REVERB_DAMPING_DEFAULT, // reverb_damping ENC_REVERB_LEVEL_DEFAULT, // reverb_level ENC_CHORUS_FREQUENCY_DEFAULT, // chorus_frequency - ENC_CHORUS_DELAY_DEFAULT, // chorus_delay ENC_CHORUS_INTENSITY_DEFAULT, // chorus_intensity - ENC_CHORUS_FEEDBACK_DEFAULT, // chorus_feedback ENC_CHORUS_WAVEFORM_DEFAULT, // chorus_waveform ENC_CHORUS_LEVEL_DEFAULT, // chorus_level ENC_BASS_LR_LEVEL_DEFAULT, // bass_lr_level @@ -246,41 +245,21 @@ void setup() modulator.phase(0); modulator.amplitude(0.0); modulator.offset(0.0); -#ifdef DEBUG - Serial.print(F("Modulated delay buffer: ")); - Serial.print(SAMPLES2TIME_MS(MOD_DELAY_SAMPLE_BUFFER), 2); - Serial.print(F(" ms / ")); - Serial.print(MOD_DELAY_SAMPLE_BUFFER, DEC); - Serial.println(F(" samples")); - Serial.print(F("Max delay time: ")); - Serial.print(float(ENC_CHORUS_DELAY_MAX) / 10, 2); - Serial.print(F(" ms / ")); - Serial.print(uint16_t(TIME_MS2SAMPLES(float(ENC_CHORUS_DELAY_MAX) / 10)), DEC); - Serial.println(F(" samples")); - Serial.print(F("Default delay time: ")); - Serial.print(float(ENC_CHORUS_DELAY_DEFAULT) / 10, 2); - Serial.print(F(" ms / ")); - Serial.print(uint16_t(TIME_MS2SAMPLES(float(ENC_CHORUS_DELAY_DEFAULT) / 10)), DEC); - Serial.println(F(" samples")); -#endif - modchorus_r.offset(TIME_MS2SAMPLES(float(ENC_CHORUS_DELAY_MAX) / 10)); - modchorus_l.offset(TIME_MS2SAMPLES(float(ENC_CHORUS_DELAY_MAX) / 10)); +#if MOD_FILTER_OUTPUT == MOD_BUTTERWORTH_FILTER_OUTPUT // Butterworth filter, 12 db/octave - modchorus_filter_r.setLowpass(0, 6000, 0.707); - modchorus_filter_l.setLowpass(0, 6000, 0.707); + modchorus_filter_r.setLowpass(0, MOD_FILTER_CUTOFF_HZ, 0.707); + modchorus_filter_l.setLowpass(0, MOD_FILTER_CUTOFF_HZ, 0.707); +#elif MOD_FILTER_OUTPUT == MOD_LINKWITZ_RILEY_FILTER_OUTPUT // Linkwitz-Riley filter, 48 dB/octave - //modchorus_filter_r.setLowpass(0, 6000, 0.54); - //modchorus_filter_r.setLowpass(1, 6000, 1.3); - //modchorus_filter_r.setLowpass(2, 6000, 0.54); - //modchorus_filter_r.setLowpass(3, 6000, 1.3); - //modchorus_filter_l.setLowpass(0, 6000, 0.54); - //modchorus_filter_l.setLowpass(1, 6000, 1.3); - //modchorus_filter_l.setLowpass(2, 6000, 0.54); - //modchorus_filter_l.setLowpass(3, 6000, 1.3); - modchorus_fbk_mixer_r.gain(0, 1.0); - modchorus_fbk_mixer_l.gain(0, 1.0); - modchorus_fbk_mixer_r.gain(1, 0.0); - modchorus_fbk_mixer_l.gain(1, 0.0); + modchorus_filter_r.setLowpass(0, MOD_FILTER_CUTOFF_HZ, 0.54); + modchorus_filter_r.setLowpass(1, MOD_FILTER_CUTOFF_HZ, 1.3); + modchorus_filter_r.setLowpass(2, MOD_FILTER_CUTOFF_HZ, 0.54); + modchorus_filter_r.setLowpass(3, MOD_FILTER_CUTOFF_HZ, 1.3); + modchorus_filter_l.setLowpass(0, MOD_FILTER_CUTOFF_HZ, 0.54); + modchorus_filter_l.setLowpass(1, MOD_FILTER_CUTOFF_HZ, 1.3); + modchorus_filter_l.setLowpass(2, MOD_FILTER_CUTOFF_HZ, 0.54); + modchorus_filter_l.setLowpass(3, MOD_FILTER_CUTOFF_HZ, 1.3); +#endif // internal mixing of original signal(0), reverb(1) and chorus(2) mixer_r.gain(VOL_MAIN, 0.5); diff --git a/UI.hpp b/UI.hpp index bea5a41..9e13aeb 100644 --- a/UI.hpp +++ b/UI.hpp @@ -28,16 +28,16 @@ const uint8_t MAX_VARIABLES = 5; ///< @note Default: 5 /// Configures the number of available functions per line. - const uint8_t MAX_FUNCTIONS = 43; ///< @note Default: 8 + const uint8_t MAX_FUNCTIONS = 41; ///< @note Default: 8 /// Configures the number of available lines per screen. - const uint8_t MAX_LINES = 22; ///< @note Default: 12 + const uint8_t MAX_LINES = 20; ///< @note Default: 12 /// Configures the number of available screens per menu. const uint8_t MAX_SCREENS = 2; ///< @note Default: 14 /// Configures the number of available menus per menus system. - const uint8_t MAX_MENUS = 46; ///< @note Default: 8 + const uint8_t MAX_MENUS = 44; ///< @note Default: 8 */ @@ -56,7 +56,7 @@ int32_t encoder_value[NUM_ENCODER]; Bounce but[NUM_ENCODER] = {Bounce(BUT_L_PIN, BUT_DEBOUNCE_MS), Bounce(BUT_R_PIN, BUT_DEBOUNCE_MS)}; elapsedMillis back_to_main; -#define NUM_MENUS 46 +#define NUM_MENUS 44 #define MAIN 0 /*************************************/ @@ -90,25 +90,23 @@ elapsedMillis back_to_main; #define REV_DAMPING 26 #define REV_LEVEL 27 #define CHORUS_FREQ 28 -#define CHORUS_DELAY 29 -#define CHORUS_INTENSITY 30 -#define CHORUS_FEEDBACK 31 -#define CHORUS_WAVEFORM 32 -#define CHORUS_LEVEL 33 -#define BASS_LR_LEVEL 34 -#define BASS_MONO_LEVEL 35 -#define EQ_BASS 36 -#define EQ_TREBLE 37 +#define CHORUS_INTENSITY 29 +#define CHORUS_WAVEFORM 30 +#define CHORUS_LEVEL 31 +#define BASS_LR_LEVEL 32 +#define BASS_MONO_LEVEL 33 +#define EQ_BASS 34 +#define EQ_TREBLE 35 /*************************************/ -#define LOUDNESS 38 -#define MIDI_CHANNEL 39 -#define MIDI_SOFT_THRU 40 -#define MAX_POLY 41 -#define MONO 42 +#define LOUDNESS 36 +#define MIDI_CHANNEL 37 +#define MIDI_SOFT_THRU 38 +#define MAX_POLY 39 +#define MONO 40 /*************************************/ -#define STORE_QUESTION 43 +#define STORE_QUESTION 41 /*************************************/ -#define MASTER_VOLUME 44 +#define MASTER_VOLUME 42 /*************************************/ int8_t menu_position[NUM_MENUS]; @@ -127,8 +125,6 @@ extern AudioEffectFreeverb freeverb_l; extern AudioSynthWaveform modulator; extern AudioEffectModulatedDelay modchorus_r; extern AudioEffectModulatedDelay modchorus_l; -extern AudioMixer4 modchorus_fbk_mixer_r; -extern AudioMixer4 modchorus_fbk_mixer_l; extern AudioMixer4 mixer_r; extern AudioMixer4 mixer_l; extern AudioAmplifier volume_r; @@ -457,7 +453,7 @@ LiquidMenu velocity_sense_menu(lcd); /****************************************** EFFECTS MENU ******************************************/ -#define NUM_EFFECTS_MENUS 22 +#define NUM_EFFECTS_MENUS 20 const char effects_text1[] PROGMEM = "Pan/Trem Freq."; const char effects_text2[] PROGMEM = "Pan/Trem Level"; const char effects_text3[] PROGMEM = "Overdrive"; @@ -471,15 +467,13 @@ const char effects_text10[] PROGMEM = "Reverb Roomsize"; const char effects_text11[] PROGMEM = "Reverb Damping"; const char effects_text12[] PROGMEM = "Reverb Level"; const char effects_text13[] PROGMEM = "Chorus Freq."; -const char effects_text14[] PROGMEM = "Chorus Delay"; -const char effects_text15[] PROGMEM = "Chorus Intens."; -const char effects_text16[] PROGMEM = "Chorus Feedback"; -const char effects_text17[] PROGMEM = "Chorus Waveform"; -const char effects_text18[] PROGMEM = "Chorus Level"; -const char effects_text19[] PROGMEM = "Bass LR Level"; -const char effects_text20[] PROGMEM = "Bass M Level"; -const char effects_text21[] PROGMEM = "EQ Bass"; -const char effects_text22[] PROGMEM = "EQ Treble"; +const char effects_text14[] PROGMEM = "Chorus Intens."; +const char effects_text15[] PROGMEM = "Chorus Waveform"; +const char effects_text16[] PROGMEM = "Chorus Level"; +const char effects_text17[] PROGMEM = "Bass LR Level"; +const char effects_text18[] PROGMEM = "Bass M Level"; +const char effects_text19[] PROGMEM = "EQ Bass"; +const char effects_text20[] PROGMEM = "EQ Treble"; LiquidLine effects_line1(1, 0, effects_text1); LiquidLine effects_line2(1, 1, effects_text2); LiquidLine effects_line3(1, 1, effects_text3); @@ -500,8 +494,6 @@ LiquidLine effects_line17(1, 1, effects_text17); LiquidLine effects_line18(1, 1, effects_text18); LiquidLine effects_line19(1, 1, effects_text19); LiquidLine effects_line20(1, 1, effects_text20); -LiquidLine effects_line21(1, 1, effects_text21); -LiquidLine effects_line22(1, 1, effects_text22); LiquidScreen effects_screen; LiquidMenu effects_menu(lcd); @@ -637,16 +629,6 @@ LiquidLine chorus_frequency_line2(1, 1, get_chorus_frequency_value_text); LiquidScreen chorus_frequency_screen; LiquidMenu chorus_frequency_menu(lcd); -/****************************************** - CHORUS_DELAY MENU - ******************************************/ -#define NUM_CHORUS_DELAY_MENUS 1 -const char chorus_delay_text1[] PROGMEM = "Chorus Delay"; -LiquidLine chorus_delay_line1(1, 0, chorus_delay_text1); -LiquidLine chorus_delay_line2(1, 1, get_chorus_delay_value_text); -LiquidScreen chorus_delay_screen; -LiquidMenu chorus_delay_menu(lcd); - /****************************************** CHORUS_INTENSITY MENU ******************************************/ @@ -657,16 +639,6 @@ LiquidLine chorus_intensity_line2(1, 1, configuration.chorus_intensity); LiquidScreen chorus_intensity_screen; LiquidMenu chorus_intensity_menu(lcd); -/****************************************** - CHORUS_FEEDBACK MENU - ******************************************/ -#define NUM_CHORUS_FEEDBACK_MENUS 1 -const char chorus_feedback_text1[] PROGMEM = "Chorus Feedback"; -LiquidLine chorus_feedback_line1(1, 0, chorus_feedback_text1); -LiquidLine chorus_feedback_line2(1, 1, configuration.chorus_feedback); -LiquidScreen chorus_feedback_screen; -LiquidMenu chorus_feedback_menu(lcd); - /****************************************** CHORUS_WAVEFORM MENU ******************************************/ @@ -1170,18 +1142,6 @@ void callback_chorus_frequency_function(void) menu_system.update(); } -void callback_chorus_delay_function(void) -{ -#ifdef SHOW_DEBUG - Serial.println(F("callback_chorus_delay_function")); -#endif - menu_system.change_menu(chorus_delay_menu); - menu_position[EFFECTS] = encoder_value[RIGHT_ENCODER]; - encoder_value[RIGHT_ENCODER] = configuration.chorus_delay; - enc[RIGHT_ENCODER].write(configuration.chorus_delay, ENC_CHORUS_DELAY_MIN, ENC_CHORUS_DELAY_MAX); - menu_system.update(); -} - void callback_chorus_intensity_function(void) { #ifdef SHOW_DEBUG @@ -1194,18 +1154,6 @@ void callback_chorus_intensity_function(void) menu_system.update(); } -void callback_chorus_feedback_function(void) -{ -#ifdef SHOW_DEBUG - Serial.println(F("callback_chorus_feedback_function")); -#endif - menu_system.change_menu(chorus_feedback_menu); - menu_position[EFFECTS] = encoder_value[RIGHT_ENCODER]; - encoder_value[RIGHT_ENCODER] = configuration.chorus_feedback; - enc[RIGHT_ENCODER].write(configuration.chorus_feedback, ENC_CHORUS_FEEDBACK_MIN, ENC_CHORUS_FEEDBACK_MAX); - menu_system.update(); -} - void callback_chorus_waveform_function(void) { #ifdef SHOW_DEBUG @@ -1615,8 +1563,6 @@ void init_menus(void) effects_screen.add_line(effects_line18); effects_screen.add_line(effects_line19); effects_screen.add_line(effects_line20); - effects_screen.add_line(effects_line21); - effects_screen.add_line(effects_line22); effects_screen.set_displayLineCount(2); effects_menu.add_screen(effects_screen); @@ -1633,15 +1579,13 @@ void init_menus(void) effects_line11.attach_function(REV_DAMPING, callback_reverb_damping_function); effects_line12.attach_function(REV_LEVEL, callback_reverb_level_function); effects_line13.attach_function(CHORUS_FREQ, callback_chorus_frequency_function); - effects_line14.attach_function(CHORUS_DELAY, callback_chorus_delay_function); - effects_line15.attach_function(CHORUS_INTENSITY, callback_chorus_intensity_function); - effects_line16.attach_function(CHORUS_FEEDBACK, callback_chorus_feedback_function); - effects_line17.attach_function(CHORUS_WAVEFORM, callback_chorus_waveform_function); - effects_line18.attach_function(CHORUS_LEVEL, callback_chorus_level_function); - effects_line19.attach_function(BASS_LR_LEVEL, callback_bass_lr_level_function); - effects_line20.attach_function(BASS_MONO_LEVEL, callback_bass_mono_level_function); - effects_line21.attach_function(EQ_BASS, callback_eq_bass_function); - effects_line22.attach_function(EQ_TREBLE, callback_eq_treble_function); + effects_line14.attach_function(CHORUS_INTENSITY, callback_chorus_intensity_function); + effects_line15.attach_function(CHORUS_WAVEFORM, callback_chorus_waveform_function); + effects_line16.attach_function(CHORUS_LEVEL, callback_chorus_level_function); + effects_line17.attach_function(BASS_LR_LEVEL, callback_bass_lr_level_function); + effects_line18.attach_function(BASS_MONO_LEVEL, callback_bass_mono_level_function); + effects_line19.attach_function(EQ_BASS, callback_eq_bass_function); + effects_line20.attach_function(EQ_TREBLE, callback_eq_treble_function); // setup pan_trem_frequency menu pan_trem_frequency_screen.add_line(pan_trem_frequency_line1); @@ -1721,24 +1665,12 @@ void init_menus(void) chorus_frequency_screen.set_displayLineCount(2); chorus_frequency_menu.add_screen(chorus_frequency_screen); - // setup chorus_delay menu - chorus_delay_screen.add_line(chorus_delay_line1); - chorus_delay_screen.add_line(chorus_delay_line2); - chorus_delay_screen.set_displayLineCount(2); - chorus_delay_menu.add_screen(chorus_delay_screen); - // setup chorus_intensity menu chorus_intensity_screen.add_line(chorus_intensity_line1); chorus_intensity_screen.add_line(chorus_intensity_line2); chorus_intensity_screen.set_displayLineCount(2); chorus_intensity_menu.add_screen(chorus_intensity_screen); - // setup chorus_feedback menu - chorus_feedback_screen.add_line(chorus_feedback_line1); - chorus_feedback_screen.add_line(chorus_feedback_line2); - chorus_feedback_screen.set_displayLineCount(2); - chorus_feedback_menu.add_screen(chorus_feedback_screen); - // setup chorus_waveform menu chorus_waveform_screen.add_line(chorus_waveform_line1); chorus_waveform_screen.add_line(chorus_waveform_line2); @@ -1874,9 +1806,7 @@ void init_menus(void) menu_system.add_menu(reverb_damping_menu); menu_system.add_menu(reverb_level_menu); menu_system.add_menu(chorus_frequency_menu); - menu_system.add_menu(chorus_delay_menu); menu_system.add_menu(chorus_intensity_menu); - menu_system.add_menu(chorus_feedback_menu); menu_system.add_menu(chorus_waveform_menu); menu_system.add_menu(chorus_level_menu); menu_system.add_menu(bass_lr_level_menu); @@ -2222,27 +2152,6 @@ void set_chorus_frequency(uint8_t value) configuration.chorus_frequency = value; } -void set_chorus_delay(uint8_t value) -{ - if (value > ENC_CHORUS_DELAY_MAX) - value = ENC_CHORUS_DELAY_MAX; - else if (value < ENC_CHORUS_DELAY_MIN) - value = ENC_CHORUS_DELAY_MIN; -#ifdef SHOW_DEBUG - Serial.print(F("Set CHORUS_DELAY ")); - Serial.print(value); - Serial.print(F(" (")); - Serial.print(float(value) / 10); - Serial.print(F(" ms / ")); - Serial.print(uint16_t(TIME_MS2SAMPLES(float(value) / 10))); - Serial.print(F(" samples)")); - Serial.println(); -#endif - modchorus_r.offset(TIME_MS2SAMPLES(float(value) / 10)); - modchorus_l.offset(TIME_MS2SAMPLES(float(value) / 10)); - configuration.chorus_delay = value; -} - void set_chorus_intensity(uint8_t value) { if (value > ENC_CHORUS_INTENSITY_MAX) @@ -2255,22 +2164,6 @@ void set_chorus_intensity(uint8_t value) configuration.chorus_intensity = value; } -void set_chorus_feedback(uint8_t value) -{ - if (value > ENC_CHORUS_FEEDBACK_MAX) - value = ENC_CHORUS_FEEDBACK_MAX; -#ifdef SHOW_DEBUG - Serial.print(F("Set CHORUS_FEEDBACK ")); - Serial.println(value); -#endif - float tmp = mapfloat(float(value), ENC_CHORUS_FEEDBACK_MIN, ENC_CHORUS_FEEDBACK_MAX, 0.0, 0.5); - modchorus_fbk_mixer_r.gain(0, 1.0 - tmp); - modchorus_fbk_mixer_l.gain(0, 1.0 - tmp); - modchorus_fbk_mixer_r.gain(1, tmp); - modchorus_fbk_mixer_l.gain(1, tmp); - configuration.chorus_feedback = value; -} - void set_chorus_waveform(uint8_t value) { #ifdef SHOW_DEBUG @@ -2457,9 +2350,7 @@ void set_complete_configuration(void) set_reverb_damping(configuration.reverb_damping); set_reverb_level(configuration.reverb_level); set_chorus_frequency(configuration.chorus_frequency); - set_chorus_delay(configuration.chorus_delay); set_chorus_intensity(configuration.chorus_intensity); - set_chorus_feedback(configuration.chorus_feedback); set_chorus_waveform(configuration.chorus_waveform); set_chorus_level(configuration.chorus_level); set_bass_lr_level(configuration.bass_lr_level); @@ -2706,15 +2597,6 @@ void handle_ui(void) menu_system.update(); } } - else if (menu_system.get_currentScreen() == &chorus_delay_screen) - { - if (encoder_tmp != encoder_value[RIGHT_ENCODER]) - { - // value up/down - set_chorus_delay(encoder_tmp); - menu_system.update(); - } - } else if (menu_system.get_currentScreen() == &chorus_intensity_screen) { if (encoder_tmp != encoder_value[RIGHT_ENCODER]) @@ -2724,15 +2606,6 @@ void handle_ui(void) menu_system.update(); } } - else if (menu_system.get_currentScreen() == &chorus_feedback_screen) - { - if (encoder_tmp != encoder_value[RIGHT_ENCODER]) - { - // value up/down - set_chorus_feedback(encoder_tmp); - menu_system.update(); - } - } else if (menu_system.get_currentScreen() == &chorus_waveform_screen) { if (encoder_tmp != encoder_value[RIGHT_ENCODER]) @@ -3172,13 +3045,6 @@ void handle_ui(void) #endif goto_effects_menu(CHORUS_FREQ); } - else if (menu_system.get_currentScreen() == &chorus_delay_screen) // chorus_delay menu - { -#ifdef SHOW_DEBUG - Serial.println(F("from chorus_delay to effects")); -#endif - goto_effects_menu(CHORUS_DELAY); - } else if (menu_system.get_currentScreen() == &chorus_intensity_screen) // chorus_intensity menu { #ifdef SHOW_DEBUG @@ -3186,13 +3052,6 @@ void handle_ui(void) #endif goto_effects_menu(CHORUS_INTENSITY); } - else if (menu_system.get_currentScreen() == &chorus_feedback_screen) // chorus_feedback menu - { -#ifdef SHOW_DEBUG - Serial.println(F("from chorus_feedback to effects")); -#endif - goto_effects_menu(CHORUS_FEEDBACK); - } else if (menu_system.get_currentScreen() == &chorus_waveform_screen) // chorus_waveform menu { #ifdef SHOW_DEBUG diff --git a/config.h b/config.h index 2c9d50e..ea9165c 100644 --- a/config.h +++ b/config.h @@ -30,8 +30,12 @@ // ATTENTION! For better latency you have to redefine AUDIO_BLOCK_SAMPLES from // 128 to 64 in /cores/teensy3/AudioStream.h -// arecord -f cd -Dhw:1,0 /tmp/bla.wav -// aplaymidi -p 20:0 test.mid +// If you want to test the system with Linux and withous any keyboard and/or audio equipment, you can do the following: +// 1. In Arduino-IDE enable "Tools->USB-Type->Serial + MIDI + Audio" +// 2. Build the firmware with "MIDI_DEVICE_USB" enabled in config.h. +// 3. Afterconnecting to a Linux system there should be a MIDI an audio device available that is called "MicroMDAEPiano", so you can start the following: +// $ aplaymidi -p 20:0 # e.g. test.mid +// $ arecord -f cd -Dhw:1,0 /tmp/bla.wav //************************************************************************************************* //* DEVICE SETTINGS @@ -58,12 +62,11 @@ #define REDUCE_LOUDNESS 0 #define USE_XFADE_DATA 1 -/* HELPER MACROS */ -#define TIME_MS2SAMPLES(x) floor(uint32_t(x) * AUDIO_SAMPLE_RATE / 1000) -#define SAMPLES2TIME_MS(x) float(uint32_t(x) * 1000 / AUDIO_SAMPLE_RATE) // CHORUS parameters -#define MOD_DELAY_SAMPLE_BUFFER int32_t(TIME_MS2SAMPLES(10.0)) +#define MOD_DELAY_SAMPLE_BUFFER int32_t(TIME_MS2SAMPLES(20.0)) // 10.0 ms delay buffer. #define MOD_WAVEFORM WAVEFORM_TRIANGLE // WAVEFORM_SINE WAVEFORM_TRIANGLE WAVEFORM_SAWTOOTH WAVEFORM_SAWTOOTH_REVERSE +#define MOD_FILTER_OUTPUT MOD_LINKWITZ_RILEY_FILTER_OUTPUT // MOD_LINKWITZ_RILEY_FILTER_OUTPUT MOD_BUTTERWORTH_FILTER_OUTPUT MOD_NO_FILTER_OUTPUT +#define MOD_FILTER_CUTOFF_HZ 3000 //************************************************************************************************* //* DEBUG OUTPUT SETTINGS @@ -143,6 +146,13 @@ #define MICRO_MDAEPIANO_VERSION "0.9.9" +/* HELPER MACROS */ +#define TIME_MS2SAMPLES(x) floor(uint32_t(x) * AUDIO_SAMPLE_RATE / 1000) +#define SAMPLES2TIME_MS(x) float(uint32_t(x) * 1000 / AUDIO_SAMPLE_RATE) +#define MOD_NO_FILTER_OUTPUT 0 +#define MOD_BUTTERWORTH_FILTER_OUTPUT 1 +#define MOD_LINKWITZ_RILEY_FILTER_OUTPUT 2 + #define MAX_SOUNDS min(99,int((4096-EEPROM_CONFIGURATIONS)/sizeof(config_t))) #define CONTROL_RATE_MS 100 @@ -237,21 +247,11 @@ #define ENC_CHORUS_FREQUENCY_MIN 0 #define ENC_CHORUS_FREQUENCY_MAX 200 #define ENC_CHORUS_FREQUENCY_DEFAULT 30 -// -#define ENC_CHORUS_DELAY_MIN uint8_t(SAMPLES2TIME_MS(MOD_DELAY_SAMPLE_BUFFER>>2)*10+0.5) -#define ENC_CHORUS_DELAY_MAX uint8_t(SAMPLES2TIME_MS(MOD_DELAY_SAMPLE_BUFFER>>2)*30+0.5) -//#define ENC_CHORUS_DELAY_DEFAULT uint8_t(SAMPLES2TIME_MS(MOD_DELAY_SAMPLE_BUFFER>>2)*20+0.5) -#define ENC_CHORUS_DELAY_DEFAULT 0 - // #define ENC_CHORUS_INTENSITY_MIN 0 #define ENC_CHORUS_INTENSITY_MAX 100 #define ENC_CHORUS_INTENSITY_DEFAULT 50 // -#define ENC_CHORUS_FEEDBACK_MIN 0 -#define ENC_CHORUS_FEEDBACK_MAX 10 -#define ENC_CHORUS_FEEDBACK_DEFAULT 0 -// #define ENC_CHORUS_WAVEFORM_MIN 1 #define ENC_CHORUS_WAVEFORM_MAX 2 #define ENC_CHORUS_WAVEFORM_DEFAULT 1 diff --git a/effect_modulated_delay.cpp b/effect_modulated_delay.cpp index 1925fc8..84d220a 100644 --- a/effect_modulated_delay.cpp +++ b/effect_modulated_delay.cpp @@ -47,7 +47,6 @@ boolean AudioEffectModulatedDelay::begin(short *delayline, uint16_t d_length) _delayline = NULL; _delay_length = 0; - _delay_offset = 0; _cb_index = 0; if (delayline == NULL) { @@ -64,13 +63,6 @@ boolean AudioEffectModulatedDelay::begin(short *delayline, uint16_t d_length) return (true); } -void AudioEffectModulatedDelay::offset(uint16_t offset_value) // in % -{ - if (offset_value > 100) - offset_value = 100; - _delay_offset = floor(offset_value / 200.0 * _delay_length); -} - uint16_t AudioEffectModulatedDelay::get_delay_length(void) { return (_delay_length); @@ -109,11 +101,11 @@ void AudioEffectModulatedDelay::update(void) _delayline[_cb_index] = *bp; // calculate the modulation-index as a floating point number for interpolation - mod_index = *mp * (_delay_length >> 2); + mod_index = *mp * (_delay_length >> 1); mod_fraction = modff(mod_index, &mod_number); // split float of mod_index into integer (= mod_number) and fraction part // calculate modulation index into circular buffer - cb_mod_index = (_cb_index - (_delay_offset + mod_number)); + cb_mod_index = _cb_index - mod_number; if (cb_mod_index < 0) // check for negative offsets and correct them cb_mod_index += _delay_length; diff --git a/effect_modulated_delay.h b/effect_modulated_delay.h index 826b5c3..5874e6f 100644 --- a/effect_modulated_delay.h +++ b/effect_modulated_delay.h @@ -44,7 +44,6 @@ class AudioEffectModulatedDelay : boolean begin(short *delayline, uint16_t delay_length); virtual void update(void); - virtual void offset(uint16_t offset_value); virtual uint16_t get_delay_length(void); private: @@ -52,7 +51,6 @@ class AudioEffectModulatedDelay : audio_block_t *inputQueueArray[2]; int16_t *_delayline; // pointer for the circular buffer uint16_t _cb_index; // current write pointer of the circular buffer - uint16_t _delay_offset; // number of samples for the read offset of the modulation inside the circular buffer uint16_t _delay_length; // calculated number of samples of the delay int16_t cb_mod_index; // current read pointer with modulation for the circular buffer };