diff options
Diffstat (limited to 'src/filters.h')
-rw-r--r-- | src/filters.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/filters.h b/src/filters.h new file mode 100644 index 0000000..3000870 --- /dev/null +++ b/src/filters.h @@ -0,0 +1,130 @@ +/* + Copyright (C) 2004-2009 Fons Adriaensen <fons@kokkinizita.net> + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef __FILTERS_H +#define __FILTERS_H + +#include <math.h> +#include "ladspaplugin.h" + + +class Paramsect +{ +public: + + enum { SECT, FREQ, BAND, GAIN }; + + void init (void) + { + _f = 0.25f; + _b = _g = 1.0f; + _a = _s1 = _s2 = _z1 = _z2 = 0.0f; + } + + void proc (int k, float *sig, float f, float b, float g) + { + float s1, s2, d1, d2, a, da, x, y; + bool u2 = false; + + s1 = _s1; + s2 = _s2; + a = _a; + d1 = 0; + d2 = 0; + da = 0; + + if (f != _f) + { + if (f < 0.5f * _f) f = 0.5f * _f; + else if (f > 2.0f * _f) f = 2.0f * _f; + _f = f; + _s1 = -cosf (6.283185f * f); + d1 = (_s1 - s1) / k; + u2 = true; + } + + if (g != _g) + { + if (g < 0.5f * _g) g = 0.5f * _g; + else if (g > 2.0f * _g) g = 2.0f * _g; + _g = g; + _a = 0.5f * (g - 1.0f); + da = (_a - a) / k; + u2 = true; + } + + if (b != _b) + { + if (b < 0.5f * _b) b = 0.5f * _b; + else if (b > 2.0f * _b) b = 2.0f * _b; + _b = b; + u2 = true; + } + + if (u2) + { + b *= 7 * f / sqrtf (g); + _s2 = (1 - b) / (1 + b); + d2 = (_s2 - s2) / k; + } + + while (k--) + { + s1 += d1; + s2 += d2; + a += da; + x = *sig; + y = x - s2 * _z2; + *sig++ -= a * (_z2 + s2 * y - x); + y -= s1 * _z1; + _z2 = _z1 + s1 * y; + _z1 = y + 1e-10f; + } + } + +private: + + float _f, _b, _g; + float _s1, _s2, _a; + float _z1, _z2; +}; + + +class Ladspa_Paramfilt : public LadspaPlugin +{ +public: + + enum { AIP, AOP, FILT, GAIN, SECT, NSECT = 4, NPORT = 20 }; + + Ladspa_Paramfilt (SampleRate fsam) : LadspaPlugin (fsam) {} + virtual void setport (PortIndex port, PortData *data); + virtual void active (bool act); + virtual void runproc (SampleCount len, bool add); + virtual ~Ladspa_Paramfilt (void) {} + +private: + + float *_port [NPORT]; + float _gain; + int _fade; + Paramsect _sect [NSECT]; +}; + + +#endif |