zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 71f88a7d5f2c5a149bd13350c07b32111b6eb76d
parent f8dcc25131537c341bfa7da7827f2a0b8b88adf5
Author: friedolino78 <34608315+friedolino78@users.noreply.github.com>
Date:   Fri, 11 Jun 2021 23:40:55 +0200

add sallen-key lp filter to oscilgen (#124)

* add sallen-key lp filter to oscilgen

* tweak param value range for lpsk2 filter
and make it 3rd order

* reduce q range and freq dependency
change name to lpsk

* complete renaming to lpsk

Authored-by: Friedolino <mkirchn@freenet.de>
Diffstat:
Msrc/Synth/OscilGen.cpp | 17+++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/Synth/OscilGen.cpp b/src/Synth/OscilGen.cpp @@ -22,6 +22,7 @@ #include <cmath> #include <cstdio> #include <cstddef> +#include <complex> #include <unistd.h> @@ -30,6 +31,7 @@ namespace zyn { + #define rObject OscilGen const rtosc::Ports OscilGen::non_realtime_ports = { rSelf(OscilGen), @@ -70,7 +72,7 @@ const rtosc::Ports OscilGen::non_realtime_ports = { "Shape of distortion to be applied"), rOption(Pfiltertype, rShort("filter"), rOptions(No Filter, lp, hp1, hp1b, bp1, bs1, lp2, hp2, bp2, bs2, - cos, sin, low_shelf, s), rDefaultId(No Filter), "Harmonic Filter"), + cos, sin, low_shelf, s, lpsk), rDefaultId(No Filter), "Harmonic Filter"), rParamZyn(Pfilterpar1, rShort("p1"), rDefault(64), "Filter parameter"), rParamZyn(Pfilterpar2, rShort("p2"), rDefault(64), "Filter parameter"), rToggle(Pfilterbeforews, rShort("pre/post"), rDefault(false), @@ -1861,6 +1863,16 @@ FILTER(s) gain = powf(2.0f, par2 * par2 * 8.0f); return gain; } + +FILTER(lpsk) +{ + float tmp2PIf = 2.0f * PI * (1.05f-par)*64.0f; + std::complex<float> s (0.0f,2.0f*PI*i); + float vOut = tmp2PIf * tmp2PIf; + std::complex<float> vIn = s*s + tmp2PIf*s/((par2)+(2.0f*par*par2)+0.5f) + tmp2PIf*tmp2PIf; + return std::abs((vOut*vOut*vOut) / (vIn*vIn*vIn)); + +} #undef FILTER filter_func_t *getFilter(unsigned char func) @@ -1878,7 +1890,8 @@ filter_func_t *getFilter(unsigned char func) osc_cos, osc_sin, osc_low_shelf, - osc_s + osc_s, + osc_lpsk }; if(!func)