From ba84fbc9d61a9529e25be0c788630ab842242845 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 25 Apr 2019 14:52:27 +0200 Subject: [PATCH] Exchanged double to float data types in PluginFX. Removed Teensy filter (is replaced by the Dexed internal filter) and antialias filter. --- MicroDexed.ino | 34 ++--- PluginFx.cpp | 358 ++++++++++++++++++++++++------------------------- PluginFx.h | 6 +- UI.cpp | 9 +- UI.h | 1 - 5 files changed, 198 insertions(+), 210 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index deedcd4..6ebf1cd 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -51,21 +51,14 @@ uint8_t ui_main_state = UI_MAIN_VOICE; AudioPlayQueue queue1; AudioAnalyzePeak peak1; -AudioFilterStateVariable filter1; AudioEffectDelay delay1; AudioMixer4 mixer1; AudioMixer4 mixer2; -AudioFilterBiquad antialias; AudioConnection patchCord0(queue1, peak1); -AudioConnection patchCord1(queue1, antialias); -AudioConnection patchCord2(antialias, 0, filter1, 0); -AudioConnection patchCord3(filter1, 0, delay1, 0); -AudioConnection patchCord4(filter1, 0, mixer1, 0); -AudioConnection patchCord5(filter1, 0, mixer2, 0); +AudioConnection patchCord9(queue1, 0, mixer1, 0); AudioConnection patchCord6(delay1, 0, mixer1, 1); AudioConnection patchCord7(delay1, 0, mixer2, 2); AudioConnection patchCord8(mixer1, delay1); -AudioConnection patchCord9(queue1, 0, mixer1, 3); // for disabling the filter AudioConnection patchCord10(mixer1, 0, mixer2, 1); #if defined(TEENSY_AUDIO_BOARD) AudioOutputI2S i2s1; @@ -225,25 +218,18 @@ void setup() #endif // Init effects - antialias.setLowpass(0, 6000, 0.707); - filter1.frequency(EXP_FUNC((float)map(effect_filter_frq, 0, ENC_FILTER_FRQ_STEPS, 0, 1024) / 150.0) * 10.0 + 80.0); - //filter1.resonance(mapfloat(effect_filter_resonance, 0, ENC_FILTER_RES_STEPS, 0.7, 5.0)); - filter1.resonance(EXP_FUNC(mapfloat(effect_filter_resonance, 0, ENC_FILTER_RES_STEPS, 0.7, 5.0)) * 0.044 + 0.61); - filter1.octaveControl(mapfloat(effect_filter_octave, 0, ENC_FILTER_OCT_STEPS, 0.0, 7.0)); delay1.delay(0, mapfloat(effect_delay_feedback, 0, ENC_DELAY_TIME_STEPS, 0.0, DELAY_MAX_TIME)); // mixer1 is the feedback-adding mixer, mixer2 the whole delay (with/without feedback) mixer mixer1.gain(0, 1.0); // original signal mixer1.gain(1, mapfloat(effect_delay_feedback, 0, ENC_DELAY_FB_STEPS, 0.0, 1.0)); // amount of feedback - mixer1.gain(0, 0.0); // filtered signal off - mixer1.gain(3, 1.0); // original signal on mixer2.gain(0, 1.0 - mapfloat(effect_delay_volume, 0, ENC_DELAY_VOLUME_STEPS, 0.0, 1.0)); // original signal mixer2.gain(1, mapfloat(effect_delay_volume, 0, ENC_DELAY_VOLUME_STEPS, 0.0, 1.0)); // delayed signal (including feedback) mixer2.gain(2, mapfloat(effect_delay_volume, 0, ENC_DELAY_VOLUME_STEPS, 0.0, 1.0)); // only delayed signal (without feedback) // just for testing: - dexed->fx.uiReso = 0.5; - dexed->fx.uiGain = 0.5; - dexed->fx.uiCutoff = 0.5; + dexed->fx.Reso = 0.5; + dexed->fx.Gain = 0.5; + dexed->fx.Cutoff = 0.5; // load default SYSEX data load_sysex(configuration.bank, configuration.voice); @@ -433,7 +419,7 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) } break; case 102: // CC 102: filter frequency - effect_filter_frq = map(inValue, 0, 127, 0, ENC_FILTER_FRQ_STEPS); +/* effect_filter_frq = map(inValue, 0, 127, 0, ENC_FILTER_FRQ_STEPS); if (effect_filter_frq == ENC_FILTER_FRQ_STEPS) { // turn "off" filter @@ -447,17 +433,17 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) mixer1.gain(3, 0.0); // original signal off } filter1.frequency(EXP_FUNC((float)map(effect_filter_frq, 0, ENC_FILTER_FRQ_STEPS, 0, 1024) / 150.0) * 10.0 + 80.0); - handle_ui(); + handle_ui(); */ break; case 103: // CC 103: filter resonance - effect_filter_resonance = map(inValue, 0, 127, 0, ENC_FILTER_RES_STEPS); +/* effect_filter_resonance = map(inValue, 0, 127, 0, ENC_FILTER_RES_STEPS); filter1.resonance(EXP_FUNC(mapfloat(effect_filter_resonance, 0, ENC_FILTER_RES_STEPS, 0.7, 5.0)) * 0.044 + 0.61); - handle_ui(); + handle_ui(); */ break; case 104: // CC 104: filter octave - effect_filter_octave = map(inValue, 0, 127, 0, ENC_FILTER_OCT_STEPS); +/* effect_filter_octave = map(inValue, 0, 127, 0, ENC_FILTER_OCT_STEPS); filter1.octaveControl(mapfloat(effect_filter_octave, 0, ENC_FILTER_OCT_STEPS, 0.0, 7.0)); - handle_ui(); + handle_ui(); */ break; case 105: // CC 105: delay time effect_delay_time = map(inValue, 0, 127, 0, ENC_DELAY_TIME_STEPS); diff --git a/PluginFx.cpp b/PluginFx.cpp index c474565..2616ffd 100644 --- a/PluginFx.cpp +++ b/PluginFx.cpp @@ -1,26 +1,26 @@ /** - * - * Copyright (c) 2013-2014 Pascal Gauthier. - * Copyright (c) 2013-2014 Filatov Vadim. - * - * Filter taken from the Obxd project : - * https://github.com/2DaT/Obxd - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ + + Copyright (c) 2013-2014 Pascal Gauthier. + Copyright (c) 2013-2014 Filatov Vadim. + + Filter taken from the Obxd project : + https://github.com/2DaT/Obxd + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ #define _USE_MATH_DEFINES #include @@ -28,189 +28,189 @@ const float dc = 1e-18; -inline static float tptpc(float& state,float inp,float cutoff) { - double v = (inp - state) * cutoff / (1 + cutoff); - double res = v + state; - state = res + v; - return res; +inline static float tptpc(float& state, float inp, float cutoff) { + float v = (inp - state) * cutoff / (1 + cutoff); + float res = v + state; + state = res + v; + return res; } inline static float tptlpupw(float & state , float inp , float cutoff , float srInv) { - cutoff = (cutoff * srInv)*M_PI; - double v = (inp - state) * cutoff / (1 + cutoff); - double res = v + state; - state = res + v; - return res; + cutoff = (cutoff * srInv) * M_PI; + float v = (inp - state) * cutoff / (1 + cutoff); + float res = v + state; + state = res + v; + return res; } //static float linsc(float param,const float min,const float max) { // return (param) * (max - min) + min; //} -static float logsc(float param, const float min,const float max,const float rolloff = 19.0f) { - return ((expf(param * logf(rolloff+1)) - 1.0f) / (rolloff)) * (max-min) + min; +static float logsc(float param, const float min, const float max, const float rolloff = 19.0f) { + return ((expf(param * logf(rolloff + 1)) - 1.0f) / (rolloff)) * (max - min) + min; } PluginFx::PluginFx() { - uiCutoff = 1; - uiReso = 0; - uiGain = 1; + Cutoff = 1; + Reso = 0; + Gain = 1; } void PluginFx::init(int sr) { - mm=0; - s1=s2=s3=s4=c=d=0; - R24=0; - - mmch = (int)(mm * 3); - mmt = mm*3-mmch; - - sampleRate = sr; - sampleRateInv = 1/sampleRate; - float rcrate =sqrt((44000/sampleRate)); - rcor24 = (970.0 / 44000)*rcrate; - rcor24Inv = 1 / rcor24; - - bright = tan((sampleRate*0.5f-10) * M_PI * sampleRateInv); - - R = 1; - rcor = (480.0 / 44000)*rcrate; - rcorInv = 1 / rcor; - bandPassSw = false; - - pCutoff = -1; - pReso = -1; - - dc_r = 1.0-(126.0/sr); - dc_id = 0; - dc_od = 0; + mm = 0; + s1 = s2 = s3 = s4 = c = d = 0; + R24 = 0; + + mmch = (int)(mm * 3); + mmt = mm * 3 - mmch; + + sampleRate = sr; + sampleRateInv = 1 / sampleRate; + float rcrate = sqrt((44000 / sampleRate)); + rcor24 = (970.0 / 44000) * rcrate; + rcor24Inv = 1 / rcor24; + + bright = tanf((sampleRate * 0.5f - 10) * M_PI * sampleRateInv); + + R = 1; + rcor = (480.0 / 44000) * rcrate; + rcorInv = 1 / rcor; + bandPassSw = false; + + pCutoff = -1; + pReso = -1; + + dc_r = 1.0 - (126.0 / sr); + dc_id = 0; + dc_od = 0; } -inline float PluginFx::NR24(float sample,float g,float lpc) { - float ml = 1 / (1+g); - float S = (lpc*(lpc*(lpc*s1 + s2) + s3) +s4)*ml; - float G = lpc*lpc*lpc*lpc; - float y = (sample - R24 * S) / (1 + R24*G); - return y + 1e-8; +inline float PluginFx::NR24(float sample, float g, float lpc) { + float ml = 1 / (1 + g); + float S = (lpc * (lpc * (lpc * s1 + s2) + s3) + s4) * ml; + float G = lpc * lpc * lpc * lpc; + float y = (sample - R24 * S) / (1 + R24 * G); + return y + 1e-8; }; inline float PluginFx::NR(float sample, float g) { - float y = ((sample- R * s1*2 - g*s1 - s2)/(1+ g*(2*R + g))) + dc; - return y; + float y = ((sample - R * s1 * 2 - g * s1 - s2) / (1 + g * (2 * R + g))) + dc; + return y; } void PluginFx::process(float *work, int sampleSize) { - // very basic DC filter - float t_fd = work[0]; - work[0] = work[0] - dc_id + dc_r * dc_od; + // very basic DC filter + float t_fd = work[0]; + work[0] = work[0] - dc_id + dc_r * dc_od; + dc_id = t_fd; + for (int i = 1; i < sampleSize; i++) { + t_fd = work[i]; + work[i] = work[i] - dc_id + dc_r * work[i - 1]; dc_id = t_fd; - for (int i=1; i ENC_FILTER_FRQ_STEPS) enc[i].write(ENC_FILTER_FRQ_STEPS); @@ -314,9 +314,10 @@ void handle_ui(void) Serial.print(F("Setting filter frequency to: ")); Serial.println(EXP_FUNC((float)map(effect_filter_frq, 0, ENC_FILTER_FRQ_STEPS, 0, 1024) / 150.0) * 10.0 + 80.0, DEC); #endif +*/ break; case UI_MAIN_FILTER_RES: - if (enc[i].read() <= 0) +/* if (enc[i].read() <= 0) enc[i].write(0); else if (enc[i].read() > ENC_FILTER_RES_STEPS) enc[i].write(ENC_FILTER_RES_STEPS); @@ -328,9 +329,10 @@ void handle_ui(void) Serial.print(F("Setting filter resonance to: ")); Serial.println(EXP_FUNC(mapfloat(effect_filter_resonance, 0, ENC_FILTER_RES_STEPS, 0.7, 5.0)) * 0.044 + 0.61, 2); #endif +*/ break; case UI_MAIN_FILTER_OCT: - if (enc[i].read() <= 0) +/* if (enc[i].read() <= 0) enc[i].write(0); else if (enc[i].read() > ENC_FILTER_OCT_STEPS) enc[i].write(ENC_FILTER_OCT_STEPS); @@ -340,6 +342,7 @@ void handle_ui(void) Serial.print(F("Setting filter octave control to: ")); Serial.println(mapfloat(effect_filter_octave, 0, ENC_FILTER_OCT_STEPS, 0.0, 7.0), 2); #endif +*/ break; } ui_show_effects_filter(); diff --git a/UI.h b/UI.h index 3d5dd35..47fcc9e 100644 --- a/UI.h +++ b/UI.h @@ -54,7 +54,6 @@ extern uint8_t effect_delay_time; extern uint8_t effect_delay_feedback; extern uint8_t effect_delay_volume; extern bool effect_delay_sync; -extern AudioFilterStateVariable filter1; extern AudioEffectDelay delay1; extern AudioMixer4 mixer1; extern AudioMixer4 mixer2;