diff --git a/MicroDexed.ino b/MicroDexed.ino index c568080..13d84a5 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -35,8 +35,11 @@ #include "effect_modulated_delay.h" #include "effect_stereo_mono.h" #include "effect_mono_stereo.h" -//#include "effect_freeverbf.h" +#ifdef USE_PLATEREVERB #include "effect_platervbstereo.h" +#else +#include "effect_freeverbf.h" +#endif #include "PluginFx.h" #include "UI.hpp" #include "source_microdexed.h" @@ -61,13 +64,12 @@ AudioAnalyzePeak microdexed_peak; #if defined(USE_FX) AudioMixer4 reverb_mixer_r; AudioMixer4 reverb_mixer_l; -//AudioEffectFreeverb freeverb_r; -//AudioEffectFreeverb freeverb_l; -//#if defined(REVERB_ANTIALIAS_FRQ) -//AudioFilterBiquad freeverb_antialias_r; -//AudioFilterBiquad freeverb_antialias_l; -//#endif +#ifdef USE_PLATEREVERB AudioEffectPlateReverb reverb; +#else +AudioEffectFreeverb freeverb_r; +AudioEffectFreeverb freeverb_l; +#endif #endif AudioMixer4 master_mixer_r; AudioMixer4 master_mixer_l; @@ -87,21 +89,17 @@ AudioMixer4 audio_thru_mixer_l; // Audio chain tail #if defined(USE_FX) -//AudioConnection patchCord0(reverb_mixer_r, freeverb_r); -//AudioConnection patchCord1(reverb_mixer_l, freeverb_l); +#ifdef USE_PLATEREVERB AudioConnection patchCord0(reverb_mixer_r, 0, reverb, 0); AudioConnection patchCord1(reverb_mixer_l, 0, reverb, 1); AudioConnection patchCord2(reverb, 0, master_mixer_r, 3); AudioConnection patchCord3(reverb, 0, master_mixer_l, 3); -//#if defined(REVERB_ANTIALIAS_FRQ) -//AudioConnection patchCord2(freeverb_r, freeverb_antialias_r); -//AudioConnection patchCord3(freeverb_l, freeverb_antialias_l); -//AudioConnection patchCord4(freeverb_antialias_r, 0, master_mixer_r, 3); -//AudioConnection patchCord5(freeverb_antialias_l, 0, master_mixer_l, 3); -//#else -//AudioConnection patchCord2(freeverb_r, 0, master_mixer_r, 3); -//AudioConnection patchCord3(freeverb_l, 0, master_mixer_l, 3); -//#endif +#else +AudioConnection patchCord0(reverb_mixer_r, freeverb_r); +AudioConnection patchCord1(reverb_mixer_l, freeverb_l); +AudioConnection patchCord2(freeverb_r, 0, master_mixer_r, 3); +AudioConnection patchCord3(freeverb_l, 0, master_mixer_l, 3); +#endif #endif #if defined(ANTIALIAS_FRQ) AudioConnection patchCord6(master_mixer_r, antialias_r); @@ -409,17 +407,6 @@ void setup() #endif #endif -#if defined(USE_FX) && defined(REVERB_ANTIALIAS_FRQ) - freeverb_antialias_r.setLowpass(0, REVERB_ANTIALIAS_FRQ, 0.54); - freeverb_antialias_r.setLowpass(1, REVERB_ANTIALIAS_FRQ, 1.3); - freeverb_antialias_r.setLowpass(2, REVERB_ANTIALIAS_FRQ, 0.54); - freeverb_antialias_r.setLowpass(3, REVERB_ANTIALIAS_FRQ, 1.3); - freeverb_antialias_l.setLowpass(0, REVERB_ANTIALIAS_FRQ, 0.54); - freeverb_antialias_l.setLowpass(1, REVERB_ANTIALIAS_FRQ, 1.3); - freeverb_antialias_l.setLowpass(2, REVERB_ANTIALIAS_FRQ, 0.54); - freeverb_antialias_l.setLowpass(3, REVERB_ANTIALIAS_FRQ, 1.3); -#endif - #if defined(ANTIALIAS_FRQ) antialias_r.setLowpass(0, ANTIALIAS_FRQ, 0.54); antialias_r.setLowpass(1, ANTIALIAS_FRQ, 1.3); @@ -1883,15 +1870,19 @@ void set_fx_params(void) } // REVERB - //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)); +#ifdef USE_PLATEREVERB reverb.size(mapfloat(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); // max reverb length reverb.lowpass(0.3); // sets the reverb master lowpass filter reverb.lodamp(0.1); // amount of low end loss in the reverb tail reverb.hidamp(mapfloat(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); // amount of treble loss in the reverb tail reverb.diffusion(1.0); // 1.0 is the detault setting, lower it to create more "echoey" reverb +#else + 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 + master_mixer_r.gain(3, pseudo_log_curve(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0))); master_mixer_l.gain(3, pseudo_log_curve(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0))); #endif diff --git a/UI.hpp b/UI.hpp index a8add44..e3fb1db 100644 --- a/UI.hpp +++ b/UI.hpp @@ -25,13 +25,17 @@ #ifdef ENABLE_LCD_UI #ifndef _UI_HPP_ #define _UI_HPP_ +#endif #include "config.h" #include "Disp_Plus.h" #include "effect_modulated_delay.h" #include "effect_stereo_mono.h" -//#include "effect_freeverbf.h" +#ifdef USE_PLATEREVERB #include "effect_platervbstereo.h" +#else +#include "effect_freeverbf.h" +#endif #include "dexed.h" #include @@ -82,9 +86,12 @@ extern AudioAnalyzePeak microdexed_peak; #if defined(USE_FX) extern AudioMixer4 reverb_mixer_r; extern AudioMixer4 reverb_mixer_l; -//extern AudioEffectFreeverb freeverb_r; -//extern AudioEffectFreeverb freeverb_l; +#ifdef USE_PLATEREVERB extern AudioEffectPlateReverb reverb; +#else +extern AudioEffectFreeverb freeverb_r; +extern AudioEffectFreeverb freeverb_l; +#endif #endif extern AudioMixer4 master_mixer_r; extern AudioMixer4 master_mixer_l; @@ -912,9 +919,12 @@ void UI_func_reverb_roomsize(uint8_t param) } lcd_display_bar_int("Reverb Room", configuration.fx.reverb_roomsize, 1.0, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 3, false, false, false); - //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)); +#ifdef USE_PLATEREVERB reverb.size(mapfloat(configuration.fx.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); +#else + 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)); +#endif } if (LCDML.FUNC_close()) // ****** STABLE END ********* @@ -947,9 +957,12 @@ void UI_func_reverb_damping(uint8_t param) lcd_display_bar_int("Reverb Damp.", configuration.fx.reverb_damping, 1.0, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 3, false, false, false); - //freeverb_l.damping(mapfloat(configuration.fx.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)); +#ifdef USE_PLATEREVERB reverb.hidamp(mapfloat(configuration.fx.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); +#else + freeverb_l.damping(mapfloat(configuration.fx.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)); +#endif } if (LCDML.FUNC_close()) // ****** STABLE END ********* @@ -5832,4 +5845,3 @@ void string_trim(char *s) } #endif -#endif diff --git a/config.h b/config.h index 93fb936..c7ded39 100644 --- a/config.h +++ b/config.h @@ -100,7 +100,7 @@ #define SHOW_CPU_LOAD_MSEC 5000 //************************************************************************************************* -//* DEXED AND EFECTS SETTINGS +//* DEXED AND EFFECTS SETTINGS //************************************************************************************************* #define DEXED_ENGINE DEXED_ENGINE_MODERN // DEXED_ENGINE_MARKI // DEXED_ENGINE_OPL @@ -113,16 +113,15 @@ #define MOD_WAVEFORM WAVEFORM_TRIANGLE // WAVEFORM_SINE WAVEFORM_TRIANGLE WAVEFORM_SAWTOOTH WAVEFORM_SAWTOOTH_REVERSE #define MOD_FILTER_OUTPUT MOD_BUTTERWORTH_FILTER_OUTPUT // MOD_LINKWITZ_RILEY_FILTER_OUTPUT MOD_BUTTERWORTH_FILTER_OUTPUT MOD_NO_FILTER_OUTPUT #define MOD_FILTER_CUTOFF_HZ 2000 -// REVERB parameters -//#define REVERB_ANTIALIAS_FRQ 7500 -// ANTIALIAS frequency -//#define ANTIALIAS_FRQ 15000 // SGTL5000 #ifdef TEENSY_AUDIO_BOARD #define SGTL5000_AUDIO_ENHANCE 1 //#define SGTL5000_AUDIO_THRU 1 #define SGTL5000_HEADPHONE_VOLUME 0.8 #endif +#if defined(TEENSY4) +#define USE_PLATEREVERB 1 +#endif //************************************************************************************************* //* AUDIO SOFTWARE SETTINGS diff --git a/effect_platervbstereo.cpp b/effect_platervbstereo.cpp index baa2435..32b3c1c 100644 --- a/effect_platervbstereo.cpp +++ b/effect_platervbstereo.cpp @@ -34,12 +34,12 @@ #include "utility/dspinst.h" #include "synth_waveform.h" -#define INP_ALLP_COEFF (0.65) -#define LOOP_ALLOP_COEFF (0.65) +#define INP_ALLP_COEFF (0.65f) +#define LOOP_ALLOP_COEFF (0.65f) -#define HI_LOSS_FREQ (0.3) -#define HI_LOSS_FREQ_MAX (0.08) -#define LO_LOSS_FREQ (0.06) +#define HI_LOSS_FREQ (0.3f) +#define HI_LOSS_FREQ_MAX (0.08f) +#define LO_LOSS_FREQ (0.06f) #define LFO_AMPL_BITS (5) // 2^LFO_AMPL_BITS will be the LFO amplitude #define LFO_AMPL ((1<data, input_blockL, AUDIO_BLOCK_SAMPLES); arm_q15_to_float((q15_t *)blockR->data, input_blockR, AUDIO_BLOCK_SAMPLES); @@ -385,10 +415,10 @@ void AudioEffectPlateReverb::update() if (temp16 >= sizeof(lp_dly1_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly1_buf[temp16]; // sample next input = (float32_t)(lfo1_out_cos & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc = (temp1*(1.0-input) + temp2*input)* 0.8; + acc = (temp1*(1.0f-input) + temp2*input)* 0.8f; #else temp16 = (lp_dly1_idx + lp_dly1_offset_L) % (sizeof(lp_dly1_buf)/sizeof(float32_t)); - acc = lp_dly1_buf[temp16]* 0.8; + acc = lp_dly1_buf[temp16]* 0.8f; #endif @@ -398,10 +428,10 @@ void AudioEffectPlateReverb::update() if (temp16 >= sizeof(lp_dly2_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly2_buf[temp16]; input = (float32_t)(lfo1_out_sin & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc += (temp1*(1.0-input) + temp2*input)* 0.7; + acc += (temp1*(1.0f-input) + temp2*input)* 0.7f; #else temp16 = (lp_dly2_idx + lp_dly2_offset_L) % (sizeof(lp_dly2_buf)/sizeof(float32_t)); - acc += (temp1*(1.0-input) + temp2*input)* 0.6; + acc += (temp1*(1.0f-input) + temp2*input)* 0.6f; #endif temp16 = (lp_dly3_idx + lp_dly3_offset_L + (lfo2_out_cos>>LFO_FRAC_BITS)) % (sizeof(lp_dly3_buf)/sizeof(float32_t)); @@ -409,20 +439,20 @@ void AudioEffectPlateReverb::update() if (temp16 >= sizeof(lp_dly3_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly3_buf[temp16]; input = (float32_t)(lfo2_out_cos & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc += (temp1*(1.0-input) + temp2*input)* 0.6; + acc += (temp1*(1.0f-input) + temp2*input)* 0.6f; temp16 = (lp_dly4_idx + lp_dly4_offset_L + (lfo2_out_sin>>LFO_FRAC_BITS)) % (sizeof(lp_dly4_buf)/sizeof(float32_t)); temp1 = lp_dly4_buf[temp16++]; if (temp16 >= sizeof(lp_dly4_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly4_buf[temp16]; input = (float32_t)(lfo2_out_sin & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc += (temp1*(1.0-input) + temp2*input)* 0.5; + acc += (temp1*(1.0f-input) + temp2*input)* 0.5f; // Master lowpass filter temp1 = acc - master_lowpass_l; master_lowpass_l += temp1 * master_lowpass_f; - outblockL->data[i] =(int16_t)(master_lowpass_l * 32767.0); //sat16(output * 30, 0); + outblockL->data[i] =(int16_t)(master_lowpass_l * 32767.0f); //sat16(output * 30, 0); // Channel R #ifdef TAP1_MODULATED @@ -432,10 +462,10 @@ void AudioEffectPlateReverb::update() temp2 = lp_dly1_buf[temp16]; // sample next input = (float32_t)(lfo2_out_cos & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc = (temp1*(1.0-input) + temp2*input)* 0.8; + acc = (temp1*(1.0f-input) + temp2*input)* 0.8f; #else temp16 = (lp_dly1_idx + lp_dly1_offset_R) % (sizeof(lp_dly1_buf)/sizeof(float32_t)); - acc = lp_dly1_buf[temp16] * 0.8; + acc = lp_dly1_buf[temp16] * 0.8f; #endif #ifdef TAP2_MODULATED temp16 = (lp_dly2_idx + lp_dly2_offset_R + (lfo1_out_cos>>LFO_FRAC_BITS)) % (sizeof(lp_dly2_buf)/sizeof(float32_t)); @@ -443,29 +473,29 @@ void AudioEffectPlateReverb::update() if (temp16 >= sizeof(lp_dly2_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly2_buf[temp16]; input = (float32_t)(lfo1_out_cos & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc += (temp1*(1.0-input) + temp2*input)* 0.7; + acc += (temp1*(1.0f-input) + temp2*input)* 0.7f; #else temp16 = (lp_dly2_idx + lp_dly2_offset_R) % (sizeof(lp_dly2_buf)/sizeof(float32_t)); - acc += (temp1*(1.0-input) + temp2*input)* 0.7; + acc += (temp1*(1.0f-input) + temp2*input)* 0.7f; #endif temp16 = (lp_dly3_idx + lp_dly3_offset_R + (lfo2_out_sin>>LFO_FRAC_BITS)) % (sizeof(lp_dly3_buf)/sizeof(float32_t)); temp1 = lp_dly3_buf[temp16++]; if (temp16 >= sizeof(lp_dly3_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly3_buf[temp16]; input = (float32_t)(lfo2_out_sin & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc += (temp1*(1.0-input) + temp2*input)* 0.6; + acc += (temp1*(1.0f-input) + temp2*input)* 0.6f; temp16 = (lp_dly4_idx + lp_dly4_offset_R + (lfo1_out_sin>>LFO_FRAC_BITS)) % (sizeof(lp_dly4_buf)/sizeof(float32_t)); temp1 = lp_dly4_buf[temp16++]; if (temp16 >= sizeof(lp_dly4_buf)/sizeof(float32_t)) temp16 = 0; temp2 = lp_dly4_buf[temp16]; input = (float32_t)(lfo2_out_cos & LFO_FRAC_MASK) / ((float32_t)LFO_FRAC_MASK); // interp. k - acc += (temp1*(1.0-input) + temp2*input)* 0.5; + acc += (temp1*(1.0f-input) + temp2*input)* 0.5f; // Master lowpass filter temp1 = acc - master_lowpass_r; master_lowpass_r += temp1 * master_lowpass_f; - outblockR->data[i] =(int16_t)(master_lowpass_r * 32767.0); + outblockR->data[i] =(int16_t)(master_lowpass_r * 32767.0f); } transmit(outblockL, 0); diff --git a/effect_platervbstereo.h b/effect_platervbstereo.h index 9a0a170..f4d7391 100644 --- a/effect_platervbstereo.h +++ b/effect_platervbstereo.h @@ -69,51 +69,55 @@ public: void size(float n) { - n = constrain(n, 0.0, 1.0); - n = map (n, 0.0, 1.0, 0.2, rv_time_k_max); - float32_t attn = 0.5 * map(n, 0.0, rv_time_k_max, 0.5, 1.0); - AudioNoInterrupts(); + n = constrain(n, 0.0f, 1.0f); + n = map (n, 0.0f, 1.0f, 0.2f, rv_time_k_max); + float32_t attn = 0.5f * map(n, 0.0f, rv_time_k_max, 0.5f, 1.0f); + __disable_irq(); rv_time_k = n; input_attn = attn; - AudioInterrupts(); + __enable_irq(); } void hidamp(float n) { - n = constrain(n, 0.0, 1.0); - AudioNoInterrupts(); - lp_hidamp_k = 1.0 - n; - AudioInterrupts(); + n = constrain(n, 0.0f, 1.0f); + __disable_irq(); + lp_hidamp_k = 1.0f - n; + __enable_irq(); } void lodamp(float n) { - n = constrain(n, 0.0, 1.0); - AudioNoInterrupts(); + n = constrain(n, 0.0f, 1.0f); + __disable_irq(); lp_lodamp_k = -n; - rv_time_scaler = 1.0 - n * 0.12; // limit the max reverb time, otherwise it will clip - AudioInterrupts(); + rv_time_scaler = 1.0f - n * 0.12f; // limit the max reverb time, otherwise it will clip + __enable_irq(); } void lowpass(float n) { - n = constrain(n, 0.0, 1.0); - n = map(n*n*n, 0.0, 1.0, 0.05, 1.0); + n = constrain(n, 0.0f, 1.0f); + n = map(n*n*n, 0.0f, 1.0f, 0.05f, 1.0f); master_lowpass_f = n; } void diffusion(float n) { - n = constrain(n, 0.0, 1.0); - n = map(n, 0.0, 1.0, 0.005, 0.65); - AudioNoInterrupts(); + n = constrain(n, 0.0f, 1.0f); + n = map(n, 0.0f, 1.0f, 0.005f, 0.65f); + __disable_irq(); in_allp_k = n; loop_allp_k = n; - AudioInterrupts(); + __enable_irq(); } float32_t get_size(void) {return rv_time_k;} + bool get_bypass(void) {return bypass;} + void set_bypass(bool state) {bypass = state;}; + void tgl_bypass(void) {bypass ^=1;} private: + bool bypass = false; audio_block_t *inputQueueArray[2]; #ifndef REVERB_USE_DMAMEM float32_t input_blockL[AUDIO_BLOCK_SAMPLES]; @@ -145,10 +149,10 @@ private: uint16_t in_allp4_idxR; float32_t in_allp_out_R; // R allpass chain output #ifndef REVERB_USE_DMAMEM - float32_t lp_allp1_buf[1303]; // loop allpass buffers - float32_t lp_allp2_buf[1905]; - float32_t lp_allp3_buf[1175]; - float32_t lp_allp4_buf[1398]; + float32_t lp_allp1_buf[2303]; // loop allpass buffers + float32_t lp_allp2_buf[2905]; + float32_t lp_allp3_buf[3175]; + float32_t lp_allp4_buf[2398]; #endif uint16_t lp_allp1_idx; uint16_t lp_allp2_idx; @@ -157,10 +161,10 @@ private: float32_t loop_allp_k; // loop allpass coeff (default 0.6) float32_t lp_allp_out; #ifndef REVERB_USE_DMAMEM - float32_t lp_dly1_buf[1423]; - float32_t lp_dly2_buf[1589]; - float32_t lp_dly3_buf[1365]; - float32_t lp_dly4_buf[1698]; + float32_t lp_dly1_buf[3423]; + float32_t lp_dly2_buf[4589]; + float32_t lp_dly3_buf[4365]; + float32_t lp_dly4_buf[3698]; #endif uint16_t lp_dly1_idx; uint16_t lp_dly2_idx; @@ -197,7 +201,7 @@ private: float32_t master_lowpass_l; float32_t master_lowpass_r; - const float32_t rv_time_k_max = 0.95; + const float32_t rv_time_k_max = 0.95f; float32_t rv_time_k; // reverb time coeff float32_t rv_time_scaler; // with high lodamp settings lower the max reverb time to avoid clipping