From cd750c4b37ee3127c8953ff414e9857a7f9bc2a1 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Fri, 22 May 2020 17:36:13 +0200 Subject: [PATCH] Fixing volume and distortion problems with buggy AudioAmplifier. --- MicroDexed.ino | 52 +++++++++++++++++--------------------------------- PluginFx.cpp | 24 ++++++++++++++++------- UI.hpp | 3 +-- config.h | 4 ++-- dexed.cpp | 4 +--- 5 files changed, 38 insertions(+), 49 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index 2663c95..ad2e1e2 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -36,15 +36,12 @@ #include "effect_modulated_delay.h" #include "effect_stereo_mono.h" #include "effect_mono_stereo.h" -#include "effect_dynamics.h" #include "PluginFx.h" #include "UI.hpp" #include "source_microdexed.h" // Audio engines AudioSourceMicroDexed* MicroDexed[NUM_DEXED]; -AudioEffectDynamics* dexed_dynamic[NUM_DEXED]; -AudioAmplifier* dexed_level[NUM_DEXED]; #if defined(USE_FX) AudioSynthWaveform* chorus_modulator[NUM_DEXED]; #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT @@ -138,17 +135,15 @@ AudioConnection patchCord13(stereo2mono, 1, dacOut, 1); // uint16_t nDynamic = 0; #if defined(USE_FX) && MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT -AudioConnection * dynamicConnections[NUM_DEXED * 18]; +AudioConnection * dynamicConnections[NUM_DEXED * 14]; #elif defined(USE_FX) && MOD_FILTER_OUTPUT == MOD_NO_FILTER_OUTPUT -AudioConnection * dynamicConnections[NUM_DEXED * 17]; +AudioConnection * dynamicConnections[NUM_DEXED * 13]; #else -AudioConnection * dynamicConnections[NUM_DEXED * 6]; +AudioConnection * dynamicConnections[NUM_DEXED * 4]; #endif void create_audio_engine_chain(uint8_t instance_id) { MicroDexed[instance_id] = new AudioSourceMicroDexed(SAMPLE_RATE); - dexed_dynamic[instance_id] = new AudioEffectDynamics(); - dexed_level[instance_id] = new AudioAmplifier(); mono2stereo[instance_id] = new AudioEffectMonoStereo(); #if defined(USE_FX) chorus_modulator[instance_id] = new AudioSynthWaveform(); @@ -163,11 +158,9 @@ void create_audio_engine_chain(uint8_t instance_id) #endif dynamicConnections[nDynamic++] = new AudioConnection(*MicroDexed[instance_id], 0, microdexed_peak_mixer, instance_id); - dynamicConnections[nDynamic++] = new AudioConnection(*MicroDexed[instance_id], 0, *dexed_dynamic[instance_id], 0); - dynamicConnections[nDynamic++] = new AudioConnection(*dexed_dynamic[instance_id], 0, *dexed_level[instance_id], 0); #if defined(USE_FX) - dynamicConnections[nDynamic++] = new AudioConnection(*dexed_level[instance_id], 0, *chorus_mixer[instance_id], 0); - dynamicConnections[nDynamic++] = new AudioConnection(*dexed_level[instance_id], 0, *modchorus[instance_id], 0); + dynamicConnections[nDynamic++] = new AudioConnection(*MicroDexed[instance_id], 0, *chorus_mixer[instance_id], 0); + dynamicConnections[nDynamic++] = new AudioConnection(*MicroDexed[instance_id], 0, *modchorus[instance_id], 0); #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT dynamicConnections[nDynamic++] = new AudioConnection(*chorus_modulator[instance_id], 0, *modchorus_filter[instance_id], 0); dynamicConnections[nDynamic++] = new AudioConnection(*modchorus_filter[instance_id], 0, *modchorus[instance_id], 1); @@ -184,7 +177,7 @@ void create_audio_engine_chain(uint8_t instance_id) dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 0, reverb_mixer_r, instance_id); dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 1, reverb_mixer_l, instance_id); #else - dynamicConnections[nDynamic++] = new AudioConnection(*dexed_level[instance_id], 0, *mono2stereo[instance_id], 0); + dynamicConnections[nDynamic++] = new AudioConnection(*MicoDexed[instance_id], 0, *mono2stereo[instance_id], 0); #endif dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 0, master_mixer_r, instance_id); dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 1, master_mixer_l, instance_id); @@ -450,22 +443,11 @@ void setup() show_cpu_and_mem_usage(); #endif - for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) - { - MicroDexed[instance_id]->fx.Gain = 1.0; - - // init dynamics for dexed - dexed_dynamic[instance_id]->limit(); - //dexed_dynamic[instance_id]->autoMakeupGain(); - //dexed_dynamic[instance_id]->compression(); - } // init master_mixer #if NUM_DEXED > 1 for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { - //master_mixer_r.gain(instance_id, pseudo_log_curve(0.5)); - //master_mixer_l.gain(instance_id, pseudo_log_curve(0.5)); master_mixer_r.gain(instance_id, 1.0); master_mixer_l.gain(instance_id, 1.0); } @@ -709,9 +691,8 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) MicroDexed[instance_id]->fx.Gain = mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX); #else*/ - // dexed_level[instance_id]->gain(pseudo_log_curve(mapfloat(map(inValue, 0, 0x7f, 0, configuration.dexed[instance_id].sound_intensity), SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX))); // That's not right... have to fix this! - dexed_level[instance_id]->gain(mapfloat(map(inValue, 0, 0x7f, 0, configuration.dexed[instance_id].sound_intensity), SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX)); - + //dexed_level[instance_id]->gain(pseudo_log_curve(mapfloat(map(inValue, 0, 0x7f, 0, configuration.dexed[instance_id].sound_intensity), SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX))); // That's not right... have to fix this! + MicroDexed[instance_id]->fx.Gain = mapfloat(map(inValue, 0, 0x7f, 0, configuration.dexed[instance_id].sound_intensity), SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX); //#endif if (LCDML.FUNC_getID() == LCDML.OTHER_getIDFromFunction(UI_func_sound_intensity)) { @@ -1774,7 +1755,6 @@ void set_fx_params(void) reverb_mixer_l.gain(instance_id, pseudo_log_curve(mapfloat(configuration.fx.reverb_send[instance_id], REVERB_SEND_MIN, REVERB_SEND_MAX, 0.0, 1.0))); // DEXED FILTER - //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); MicroDexed[instance_id]->doRefreshVoice(); @@ -1808,7 +1788,7 @@ void set_voiceconfig_params(uint8_t instance_id) MicroDexed[instance_id]->setMonoMode(configuration.sys.mono); // Dexed output level - dexed_level[instance_id]->gain(pseudo_log_curve(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX))); + MicroDexed[instance_id]->fx.Gain = mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX); // PANORAMA mono2stereo[instance_id]->panorama(mapfloat(configuration.dexed[instance_id].pan, PANORAMA_MIN, PANORAMA_MAX, -1.0, 1.0)); @@ -1844,14 +1824,16 @@ float pseudo_log_curve(float value) #endif */ - // return (mapfloat(_pseudo_log * arm_sin_f32(value), 0.0, _pseudo_log * arm_sin_f32(1.0), 0.0, 1.0)); + return (mapfloat(_pseudo_log * arm_sin_f32(value), 0.0, _pseudo_log * arm_sin_f32(1.0), 0.0, 1.0)); - float g = mapfloat(_pseudo_log * arm_sin_f32(value), 0.0, _pseudo_log * arm_sin_f32(1.0), 0.0, 1.0); + /* + float g = mapfloat(_pseudo_log * arm_sin_f32(value), 0.0, _pseudo_log * arm_sin_f32(1.0), 0.0, 1.0); - if (g == 0.0) - return (0.001); - else - return (g); + if (g == 0.0) + return (0.001); + else + return (g); + */ } uint32_t crc32(byte * calc_start, uint16_t calc_bytes) // base code from https://www.arduino.cc/en/Tutorial/EEPROMCrc diff --git a/PluginFx.cpp b/PluginFx.cpp index 1033dc7..b3887e4 100644 --- a/PluginFx.cpp +++ b/PluginFx.cpp @@ -23,6 +23,7 @@ */ #define _USE_MATH_DEFINES +#include "config.h" #include #include "PluginFx.h" #include "synth.h" @@ -53,9 +54,9 @@ static float logsc(float param, const float min, const float max, const float ro } PluginFx::PluginFx() { - Cutoff = 1; - Reso = 0; - Gain = 1; + Cutoff = 1.0; + Reso = 0.0; + Gain = 1.0; } void PluginFx::init(int sr) { @@ -113,17 +114,25 @@ void PluginFx::process(float *work, int sampleSize) { t_fd = work[i]; work[i] = work[i] - dc_id + dc_r * work[i - 1]; dc_id = t_fd; - } + dc_od = work[sampleSize - 1]; - if ( Gain != 1 ) { + // Gain + if (Gain == 0.0) + { + for (int i = 0; i < sampleSize; i++ ) + work[i] = 0.0; + } + else if ( Gain != 1.0) + { for (int i = 0; i < sampleSize; i++ ) work[i] *= Gain; } +#ifdef USE_FX // don't apply the LPF if the cutoff is to maximum - if ( Cutoff == 1 ) + if ( Cutoff == 1.0 ) return; if ( Cutoff != pCutoff || Reso != pReso ) { @@ -183,6 +192,7 @@ void PluginFx::process(float *work, int sampleSize) { //half volume comp work[i] = mc * (1 + R24 * 0.45); } +#endif } /* @@ -222,5 +232,5 @@ void PluginFx::process(float *work, int sampleSize) { float PluginFx::getGain(void) { - return(Gain); + return (Gain); } diff --git a/UI.hpp b/UI.hpp index c34ffa7..ddb82d8 100644 --- a/UI.hpp +++ b/UI.hpp @@ -64,7 +64,6 @@ extern void change_disp_sd(bool d); #endif extern AudioSourceMicroDexed* MicroDexed[NUM_DEXED]; -extern AudioAmplifier* dexed_level[NUM_DEXED]; #if defined(USE_FX) extern AudioSynthWaveform* chorus_modulator[NUM_DEXED]; extern AudioEffectModulatedDelay* modchorus[NUM_DEXED]; @@ -1888,7 +1887,7 @@ void UI_func_sound_intensity(uint8_t param) lcd_display_bar_int("Voice Level", configuration.dexed[selected_instance_id].sound_intensity, 1.0, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 3, false, false, false); - dexed_level[selected_instance_id]->gain(pseudo_log_curve(mapfloat(configuration.dexed[selected_instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX))); + MicroDexed[selected_instance_id]->fx.Gain = mapfloat(configuration.dexed[selected_instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX); } if (LCDML.FUNC_close()) // ****** STABLE END ********* diff --git a/config.h b/config.h index 47d779e..db59fd0 100644 --- a/config.h +++ b/config.h @@ -47,7 +47,7 @@ // amidi -p hw:2,0,0 -d -r /tmp/bkup1.syx // -#define VERSION "0.9.9i" +#define VERSION "0.9.9j" //************************************************************************************************* //* DEVICE SETTINGS @@ -95,7 +95,7 @@ #define DEXED_ENGINE DEXED_ENGINE_MODERN // DEXED_ENGINE_MARKI // DEXED_ENGINE_OPL // Number of Dexed instances -#define NUM_DEXED 1 // 1 or 2 - nothing else! +#define NUM_DEXED 2 // 1 or 2 - nothing else! // FX-CHAIN ENABLE/DISABLE #define USE_FX 1 // CHORUS parameters diff --git a/dexed.cpp b/dexed.cpp index 526c553..1034cf8 100644 --- a/dexed.cpp +++ b/dexed.cpp @@ -156,9 +156,7 @@ void Dexed::getSamples(uint16_t n_samples, int16_t* buffer) } } -#ifdef USE_FX - fx.process(sumbuf, n_samples); -#endif + fx.process(sumbuf, n_samples); // Needed for fx.Gain()!!! //arm_scale_f32(sumbuf, 0.00015, sumbuf, AUDIO_BLOCK_SAMPLES); arm_float_to_q15(sumbuf, buffer, AUDIO_BLOCK_SAMPLES);