From 3f7c7937454a7dcbcbe99963cae2fc45b47e798a Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Sat, 1 Mar 2014 02:05:52 -0500 Subject: [PATCH] OBXd LPF implementation --- .../UserInterfaceState.xcuserstate | Bin 95256 -> 94897 bytes README.md | 16 +- Source/PluginFx.cpp | 235 +++++++++++++----- Source/PluginFx.h | 64 +++-- 4 files changed, 225 insertions(+), 90 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index a9d124ba65b9575bd9d01234e9d5681c85e16efb..0e6b8fb63df0a02c9d61fd21850941885a736d54 100644 GIT binary patch literal 94897 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 z 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 X_=k=^(Xwy8wi*4+*Z=<=sp{ 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 S!` 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 D+`9%? diff --git a/README.md b/README.md index d23ac44..8e5a930 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,12 @@ Features * Each operator have a realtime VU meter to know wich one is active * Can load/save any DX7/TX7 sysex programs. It is also possible to save a single program into a different sysex file. +Changelog +--------- +* Version 0.4.0 (current sprint) +** Modulatioin wheel support +** Now using the [OBxd](https://obxd.wordpress.com) 4-pole lowpass filter implementation + Binary downloads ---------------- Dexed is not a finished product but it is stable enough to be used in a DAW environment: @@ -51,18 +57,18 @@ valid checksum for your DX7 keyboard. I'm in now way responsible if this breaks Credits & thanks ---------------- -Raph Levien and the msfa team, markusthegeek, Jean-Marc Desprez and all the crew who made these historic -DX programs: (Dave Benson, Frank Carvalho, Tim Conrardy, Jack Deckard, Chris Dodunski, Tim Garrett, -Hitaye, Stephan Ibsen, Christian Jezreel, Narfman, Godric Wilkie) +* DX Synth engine : Raph Levien and the [msfa](https://code.google.com/p/music-synthesizer-for-android) team +* LP Filter : Filatov Vadim (2DaT); taken from the excellent [OBxd](https://obxd.wordpress.com) project +* Original DX7 compilation : Jean-Marc Desprez [SynprezFM](http://www.synprez.com/SynprezFM) and to all the all crew who made these historic DX programs: Dave Benson, Frank Carvalho, Tim Conrardy, Jack Deckard, Chris Dodunski, Tim Garrett, Hitaye, Stephan Ibsen, Christian Jezreel, Narfman, Godric Wilkie +* markusthegeek direct implication for this project TODO - Dexed ------------ * Implement a better DX look and feel (amp, pitch, algo) -* Better implementation of the LPF filter * Various code cleanup * Standalone executable (for full support of the editor) TODO - msfa ----------- -* LFO Amplitude +* LFO/Mod-wheel Amplitude * Algo 4 & 6 feedback diff --git a/Source/PluginFx.cpp b/Source/PluginFx.cpp index 9403a3d..65e140e 100644 --- a/Source/PluginFx.cpp +++ b/Source/PluginFx.cpp @@ -1,95 +1,194 @@ -/* - ============================================================================== - - PluginFx.cpp - Created: 26 Dec 2013 7:13:29pm - Author: Pascal Gauthier +/** + * + * 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 2 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. + */ - The LPF is taken from the PD moog~ object. (David Lowenfels) - Code is based off of Tim Stilson's moog filter code - - ============================================================================== -*/ #define _USE_MATH_DEFINES #include #include "PluginFx.h" #include "PluginProcessor.h" -static float gaintable[199] = { - 0.999969, 0.990082, 0.980347, 0.970764, 0.961304, 0.951996, 0.94281, 0.933777, 0.924866, 0.916077, 0.90741, 0.898865, 0.890442, - 0.882141, 0.873962, 0.865906, 0.857941, 0.850067, 0.842346, 0.834686, 0.827148, 0.819733, 0.812378, 0.805145, 0.798004, 0.790955, - 0.783997, 0.77713, 0.770355, 0.763672, 0.75708 , 0.75058, 0.744141, 0.737793, 0.731537, 0.725342, 0.719238, 0.713196, 0.707245, - 0.701355, 0.695557, 0.689819, 0.684174, 0.678558, 0.673035, 0.667572, 0.66217, 0.65686, 0.651581, 0.646393, 0.641235, 0.636169, - 0.631134, 0.62619, 0.621277, 0.616425, 0.611633, 0.606903, 0.602234, 0.597626, 0.593048, 0.588531, 0.584045, 0.579651, 0.575287, - 0.570953, 0.566681, 0.562469, 0.558289, 0.554169, 0.550079, 0.546051, 0.542053, 0.538116, 0.53421, 0.530334, 0.52652, 0.522736, - 0.518982, 0.515289, 0.511627, 0.507996 , 0.504425, 0.500885, 0.497375, 0.493896, 0.490448, 0.487061, 0.483704, 0.480377, 0.477081, - 0.473816, 0.470581, 0.467377, 0.464203, 0.46109, 0.457977, 0.454926, 0.451874, 0.448883, 0.445892, 0.442932, 0.440033, 0.437134, - 0.434265, 0.431427, 0.428619, 0.425842, 0.423096, 0.42038, 0.417664, 0.415009, 0.412354, 0.409729, 0.407135, 0.404572, 0.402008, - 0.399506, 0.397003, 0.394501, 0.392059, 0.389618, 0.387207, 0.384827, 0.382477, 0.380127, 0.377808, 0.375488, 0.37323, 0.370972, - 0.368713, 0.366516, 0.364319, 0.362122, 0.359985, 0.357849, 0.355713, 0.353607, 0.351532, 0.349457, 0.347412, 0.345398, 0.343384, - 0.34137, 0.339417, 0.337463, 0.33551, 0.333588, 0.331665, 0.329773, 0.327911, 0.32605, 0.324188, 0.322357, 0.320557, 0.318756, - 0.316986, 0.315216, 0.313446, 0.311707, 0.309998, 0.308289, 0.30658, 0.304901, 0.303223, 0.301575, 0.299927, 0.298309, 0.296692, - 0.295074, 0.293488, 0.291931, 0.290375, 0.288818, 0.287262, 0.285736, 0.284241, 0.282715, 0.28125, 0.279755, 0.27829, 0.276825, - 0.275391, 0.273956, 0.272552, 0.271118, 0.269745, 0.268341, 0.266968, 0.265594, 0.264252, 0.262909, 0.261566, 0.260223, 0.258911, - 0.257599, 0.256317, 0.255035, 0.25375 -}; +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 tptlpupw(float & state , float inp , float cutoff , float srInv) { + cutoff = (cutoff * srInv)*juce::float_Pi; + double v = (inp - state) * cutoff / (1 + cutoff); + double res = v + state; + state = res + v; + return res; +} -static inline float saturate(float input) { //clamp without branching -#define _limit 0.95 - float x1 = fabsf( input + _limit ); - float x2 = fabsf( input - _limit ); - return 0.5 * (x1 - x2); +static float linsc(float param,const float min,const float max) { + return (param) * (max - min) + min; } -static inline float crossfade(float amount, float a, float b) { - return (1-amount) * a + amount * b; +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; } -void PluginFx::init(int sampleRate) { +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) * juce::float_Pi * sampleRateInv); + + R = 1; + rcor = (480.0 / 44000)*rcrate; + rcorInv = 1 / rcor; + bandPassSw = false; + uiCutoff = 1; uiReso = 0; - srate = sampleRate; - output = 0; - for(int i=0;i<4;i++) - state[i] = 0; + + pCutoff = -1; + pReso = -1; } -void PluginFx::process(float *work, int sampleSize) { +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; +} +void PluginFx::process(float *work, int sampleSize) { // don't apply the LPF if the cutoff is to maximum if ( uiCutoff == 1 ) return; - // the UI values haved changed - if ( uiCutoff != pCutoff || uiReso != pReso) { - // calc cutoff - // mel scale freq : http://www.speech.kth.se/~giampi/auditoryscales/ - float freqCutoff = 700 * (pow(M_E,(uiCutoff*4000/1127)-1)) + 20; - float fc = 2 * freqCutoff / srate; - float x2 = fc*fc; - float x3 = fc*x2; - p = -0.69346 * x3 - 0.59515 * x2 + 3.2937 * fc - 1.0072; //cubic fit - - // calc reso - float ix = p * 99; - int ixint = floor( ix ); - float ixfrac = ix - ixint; - Q = uiReso * crossfade( ixfrac, gaintable[ ixint + 99 ], gaintable[ ixint + 100 ] ); - + if ( uiCutoff != pCutoff || uiReso != pReso ) { + rReso = (0.991-logsc(1-uiReso,0,0.991,40)); + R24 = 3.5 * rReso; + + float cutoffNorm = logsc(uiCutoff,60,19000,30); + rCutoff = (float)tan(cutoffNorm * sampleRateInv * juce::float_Pi); + pCutoff = uiCutoff; pReso = uiReso; + + R = 1 - rReso; } - - for (int i=0; i < sampleSize; i++ ) { - output = 0.10 * ( work[i] - output ); //negative feedback - for(int pole=0; pole < 4; pole++) { - float temp = state[pole]; - output = saturate( output + p * (output - temp)); - state[pole] = output; - output = saturate( output + temp ); + + // THIS IS MY FAVORITE 4POLE OBXd filter + + // maybe smooth this value + float g = rCutoff; + + for(int i=0; i < sampleSize; i++ ) { + float s = work[i]; + s = s - 0.45*tptlpupw(c,s,15,sampleRateInv); + s = tptpc(d,s,bright); + + float lpc = g / (1 + g); + + float y0 = NR24(s,g,lpc); + + //first low pass in cascade + double v = (y0 - s1) * lpc; + double res = v + s1; + s1 = res + v; + + //damping + s1 =atan(s1*rcor24)*rcor24Inv; + float y1= res; + float y2 = tptpc(s2,y1,g); + float y3 = tptpc(s3,y2,g); + float y4 = tptpc(s4,y3,g); + float mc; + + switch(mmch) { + case 0: + mc = ((1 - mmt) * y4 + (mmt) * y3); + break; + case 1: + mc = ((1 - mmt) * y3 + (mmt) * y2); + break; + case 2: + mc = ((1 - mmt) * y2 + (mmt) * y1); + break; + case 3: + mc = y1; + break; } - work[i] = output; - output *= Q; //scale the feedback + + //half volume comp + work[i] = mc * (1 + R24 * 0.45); } } +/* + + // THIS IS THE 2POLE FILTER + + for(int i=0; i < sampleSize; i++ ) { + float s = work[i]; + s = s - 0.45*tptlpupw(c,s,15,sampleRateInv); + s = tptpc(d,s,bright); + + //float v = ((sample- R * s1*2 - g2*s1 - s2)/(1+ R*g1*2 + g1*g2)); + float v = NR(s,g); + float y1 = v*g + s1; + //damping + s1 = atan(s1 * rcor) * rcorInv; + + float y2 = y1*g + s2; + s2 = y2 + y1*g; + + double mc; + if(!bandPassSw) + mc = (1-mm)*y2 + (mm)*v; + else + { + + mc =2 * ( mm < 0.5 ? + ((0.5 - mm) * y2 + (mm) * y1): + ((1-mm) * y1 + (mm-0.5) * v) + ); + } + + work[i] = mc; + } + +*/ diff --git a/Source/PluginFx.h b/Source/PluginFx.h index edbaec4..125978b 100644 --- a/Source/PluginFx.h +++ b/Source/PluginFx.h @@ -1,29 +1,59 @@ -/* - ============================================================================== - - PluginFx.h - Created: 26 Dec 2013 7:13:29pm - Author: Pascal Gauthier - - ============================================================================== -*/ +/** + * + * Copyright (c) 2013 Pascal Gauthier. + * + * 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 2 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. + */ #ifndef PLUGINFX_H_INCLUDED #define PLUGINFX_H_INCLUDED class PluginFx { - /** - * Used for the 4pole LFP - */ - // process and ui values + float s1,s2,s3,s4; + float sampleRate; + float sampleRateInv; + float d, c; + float R24; + float rcor24,rcor24Inv; + float bright; + + //24 db multimode + float mm; + float mmt; + int mmch; + inline float NR24(float sample,float g,float lpc); + + // preprocess value from the UI + float rCutoff; + float rReso; + + // thread values; if these are different from the UI, + // it needs to be recalculated. float pReso; float pCutoff; - float p, Q; - int srate; - float state[4]; - float output; + + // I am still keeping the 2pole w/multimode filter + inline float NR(float sample, float g); + bool bandPassSw; + float rcor,rcorInv; + int R; + public: + // this is set directly by the ui / parameter float uiCutoff; float uiReso;