1
#ifndef INCLUDED_AUDIOFX_FILTER_H
2
#define INCLUDED_AUDIOFX_FILTER_H
9
#include "samplebuffer_iterators.h"
12
* Virtual base for filter effects.
13
* @author Kai Vehmanen
15
class EFFECT_FILTER : public EFFECT_BASE {
18
virtual ~EFFECT_FILTER(void);
22
* Base class for butterworth filter effects.
24
* Based on SPKit Butterworth algorithms.
25
* (for more info, see http://www.music.helsinki.fi/research/spkit)
27
class EFFECT_BW_FILTER : public EFFECT_FILTER {
31
SAMPLE_SPECS::sample_t outputSample;
32
SAMPLE_ITERATOR_CHANNELS i;
34
std::vector<std::vector<SAMPLE_SPECS::sample_t> > sin;
35
std::vector<std::vector<SAMPLE_SPECS::sample_t> > sout;
37
void init_values(void);
41
std::vector<SAMPLE_SPECS::sample_t> a;
42
std::vector<SAMPLE_SPECS::sample_t> b;
46
void process_notused(SAMPLE_BUFFER* sbuf);
47
virtual void init(SAMPLE_BUFFER *insample);
48
virtual void process(void);
50
virtual EFFECT_BW_FILTER* clone(void) const = 0;
52
// EFFECT_BW_FILTER(void) : sin(2), sout(2), a(3), b(2) {
54
EFFECT_BW_FILTER(void) : a(3), b(2) {
62
* Based on SPKit Butterworth algorithms
63
* (for more info, see http://www.music.helsinki.fi/research/spkit)
65
class EFFECT_BANDPASS: public EFFECT_BW_FILTER {
77
virtual std::string name(void) const { return("Bandpass filter"); }
78
virtual std::string parameter_names(void) const { return("center-freq,width"); }
80
virtual void set_parameter(int param, parameter_t value);
81
virtual parameter_t get_parameter(int param) const;
83
EFFECT_BANDPASS* clone(void) const { return new EFFECT_BANDPASS(*this); }
84
EFFECT_BANDPASS* new_expr(void) const { return new EFFECT_BANDPASS(); }
85
EFFECT_BANDPASS (parameter_t centerf = 1000.0, parameter_t width = 1000.0);
91
* Based on SPKit Butterworth algorithms
92
* (for more info, see http://www.music.helsinki.fi/research/spkit)
94
class EFFECT_BANDREJECT: public EFFECT_BW_FILTER {
106
virtual std::string name(void) const { return("Bandreject filter"); }
107
virtual std::string parameter_names(void) const { return("center-freq,width"); }
109
virtual void set_parameter(int param, parameter_t value);
110
virtual parameter_t get_parameter(int param) const;
112
EFFECT_BANDREJECT* clone(void) const { return new EFFECT_BANDREJECT(*this); }
113
EFFECT_BANDREJECT* new_expr(void) const { return new EFFECT_BANDREJECT(); }
114
EFFECT_BANDREJECT (parameter_t centerf = 1000.0, parameter_t width = 1000.0);
120
* Based on SPKit Butterworth algorithms
121
* (for more info, see http://www.music.helsinki.fi/research/spkit)
123
class EFFECT_HIGHPASS : public EFFECT_BW_FILTER {
127
parameter_t cutOffFreq;
132
virtual std::string name(void) const { return("Highpass filter"); }
133
virtual std::string parameter_names(void) const { return("cutoff-freq"); }
135
virtual void set_parameter(int param, parameter_t value);
136
virtual parameter_t get_parameter(int param) const;
138
EFFECT_HIGHPASS* clone(void) const { return new EFFECT_HIGHPASS(*this); }
139
EFFECT_HIGHPASS* new_expr(void) const { return new EFFECT_HIGHPASS(); }
140
EFFECT_HIGHPASS (parameter_t cutoff = 1000.0);
146
class EFFECT_ALLPASS_FILTER : public EFFECT_FILTER {
148
std::vector<std::deque<SAMPLE_SPECS::sample_t> > inbuf, outbuf;
149
SAMPLE_ITERATOR_CHANNELS i;
151
parameter_t feedback_gain;
156
virtual std::string name(void) const { return("Allpass filter"); }
157
virtual std::string parameter_names(void) const { return("delay-samples,feedback-%"); }
159
virtual void set_parameter(int param, parameter_t value);
160
virtual parameter_t get_parameter(int param) const;
162
virtual void init(SAMPLE_BUFFER *insample);
163
virtual void process(void);
165
EFFECT_ALLPASS_FILTER* clone(void) const { return new EFFECT_ALLPASS_FILTER(*this); }
166
EFFECT_ALLPASS_FILTER* new_expr(void) const { return new EFFECT_ALLPASS_FILTER(); }
167
EFFECT_ALLPASS_FILTER (void) { }
174
* The basic theory behind this can be found from Ken Steiglitz's book
175
* "A digital signal processing primer", page 103.
177
class EFFECT_COMB_FILTER : public EFFECT_FILTER {
179
std::vector<std::deque<SAMPLE_SPECS::sample_t> > buffer;
180
std::vector<SAMPLE_SPECS::sample_t> temp;
181
SAMPLE_ITERATOR_CHANNELS i;
188
virtual std::string name(void) const { return("Comb filter"); }
189
virtual std::string parameter_names(void) const { return("delay-samples,radius"); }
191
virtual void set_parameter(int param, parameter_t value);
192
virtual parameter_t get_parameter(int param) const;
194
virtual void init(SAMPLE_BUFFER *insample);
195
virtual void process(void);
197
EFFECT_COMB_FILTER* clone(void) const { return new EFFECT_COMB_FILTER(*this); }
198
EFFECT_COMB_FILTER* new_expr(void) const { return new EFFECT_COMB_FILTER(); }
199
EFFECT_COMB_FILTER (int delay_in_samples = 1, parameter_t constant = 1.0);
203
* Inverse comb filter
205
* The basic theory behind this can be found from Ken Steiglitz's book
206
* "A digital signal processing primer", page 77.
208
class EFFECT_INVERSE_COMB_FILTER : public EFFECT_FILTER {
210
std::vector<parameter_t> laskuri;
211
std::vector<std::deque<SAMPLE_SPECS::sample_t> > buffer;
212
std::vector<SAMPLE_SPECS::sample_t> temp;
213
SAMPLE_ITERATOR_CHANNELS i;
220
virtual std::string name(void) const { return("Inverse comb filter"); }
221
virtual std::string parameter_names(void) const { return("delay-samples,radius"); }
223
virtual void set_parameter(int param, parameter_t value);
224
virtual parameter_t get_parameter(int param) const;
226
virtual void init(SAMPLE_BUFFER *insample);
227
virtual void process(void);
229
EFFECT_INVERSE_COMB_FILTER* clone(void) const { return new EFFECT_INVERSE_COMB_FILTER(*this); }
230
EFFECT_INVERSE_COMB_FILTER* new_expr(void) const { return new EFFECT_INVERSE_COMB_FILTER(); }
231
EFFECT_INVERSE_COMB_FILTER (int delay_in_samples = 10, parameter_t constant = 1.0);
237
* Based on SPKit Butterworth algorithms
238
* (for more info, see http://www.music.helsinki.fi/research/spkit)
240
class EFFECT_LOWPASS: public EFFECT_BW_FILTER {
244
parameter_t cutOffFreq;
250
virtual std::string name(void) const { return("Lowpass filter"); }
251
virtual std::string parameter_names(void) const { return("cutoff-freq"); }
253
virtual void set_parameter(int param, parameter_t value);
254
virtual parameter_t get_parameter(int param) const;
256
void set_cutoff(parameter_t value, long int srate);
258
EFFECT_LOWPASS* clone(void) const { return new EFFECT_LOWPASS(*this); }
259
EFFECT_LOWPASS* new_expr(void) const { return new EFFECT_LOWPASS(); }
260
EFFECT_LOWPASS (parameter_t cutoff = 1000.0);
264
* A simple lowpass filter
266
* Algorithm: 1nd order filter.
267
* From Fugue source code:
269
* output[N] = input[N] * A + input[N-1] * B
271
* A = 2.0 * pi * center
272
* B = exp(-A / frequency)
274
class EFFECT_LOWPASS_SIMPLE : public EFFECT_FILTER {
278
parameter_t cutOffFreq;
280
std::vector<SAMPLE_SPECS::sample_t> outhist, tempin, temphist;
281
SAMPLE_ITERATOR_CHANNELS i;
285
virtual std::string name(void) const { return("Simple lowpass filter"); }
286
virtual std::string parameter_names(void) const { return("cutoff-freq"); }
288
virtual void init(SAMPLE_BUFFER *insample);
289
virtual void process(void);
291
virtual void set_parameter(int param, parameter_t value);
292
virtual parameter_t get_parameter(int param) const;
294
EFFECT_LOWPASS_SIMPLE* clone(void) const { return new EFFECT_LOWPASS_SIMPLE(*this); }
295
EFFECT_LOWPASS_SIMPLE* new_expr(void) const { return new EFFECT_LOWPASS_SIMPLE(); }
296
EFFECT_LOWPASS_SIMPLE (parameter_t cutoff = 1000.0);
300
* Resonant bandpass filter
302
class EFFECT_RESONANT_BANDPASS : public EFFECT_FILTER {
306
std::vector<SAMPLE_SPECS::sample_t> outhist1, outhist2;
311
parameter_t a, b, c, R;
312
parameter_t pole_angle;
314
SAMPLE_ITERATOR_CHANNELS i;
318
virtual std::string name(void) const { return("Resonant bandpass filter"); }
319
virtual std::string parameter_names(void) const { return("center-freq,width"); }
321
virtual void set_parameter(int param, parameter_t value);
322
virtual parameter_t get_parameter(int param) const;
324
virtual void init(SAMPLE_BUFFER *insample);
325
virtual void process(void);
327
EFFECT_RESONANT_BANDPASS* clone(void) const { return new EFFECT_RESONANT_BANDPASS(*this); }
328
EFFECT_RESONANT_BANDPASS* new_expr(void) const { return new EFFECT_RESONANT_BANDPASS(); }
329
EFFECT_RESONANT_BANDPASS (parameter_t centerf = 1000.0, parameter_t width = 1000.0);
333
* Resonant lowpass filter
335
* Algorithm is based on a sample filter-routine (iir_filter) posted to comp.dsp.
337
class EFFECT_RESONANT_LOWPASS : public EFFECT_FILTER {
339
SAMPLE_ITERATOR_CHANNELS i;
341
std::vector<SAMPLE_SPECS::sample_t> outhist0, outhist1, outhist2, outhist3;
342
std::vector<SAMPLE_SPECS::sample_t> newhist0, newhist1;
346
parameter_t a0, a1, a2; // numerator coefficients
347
parameter_t b0, b1, b2; // denominator coefficients
352
parameter_t A, B, C, D; // filter coefficients
355
std::vector<TRIPLE_COEFS> ProtoCoef; // Filter prototype coefficients,
356
// for each filter section
357
std::vector<FILTER_COEFS> Coef;
359
parameter_t cutoff, Q, gain, gain_orig;
363
parameter_t ad, bd, wp; // for szxform()
365
void szxform(int section);
366
void refresh_values(void);
370
virtual std::string name(void) const { return("Resonant lowpass filter"); }
371
virtual std::string parameter_names(void) const { return("cutoff-freq,resonance,gain"); }
373
virtual void set_parameter(int param, parameter_t value);
374
virtual parameter_t get_parameter(int param) const;
376
virtual void init(SAMPLE_BUFFER *insample);
377
virtual void process(void);
379
EFFECT_RESONANT_LOWPASS* clone(void) const { return new EFFECT_RESONANT_LOWPASS(*this); }
380
EFFECT_RESONANT_LOWPASS* new_expr(void) const { return new EFFECT_RESONANT_LOWPASS(); }
381
EFFECT_RESONANT_LOWPASS (parameter_t cutoff = 1000.0,
382
parameter_t resonance = 1.0,
383
parameter_t gain = 1.0);
387
* Resonating bandpass filter
389
* Based on a second order all-pole (IIR) band-pass filter from SPKit
390
* (for more info, see: http://www.music.helsinki.fi/research/spkit)
392
class EFFECT_RESONATOR : public EFFECT_FILTER {
396
SAMPLE_ITERATOR_CHANNELS i;
401
std::vector<SAMPLE_SPECS::sample_t> cona;
402
std::vector<SAMPLE_SPECS::sample_t> conb;
404
std::vector<SAMPLE_SPECS::sample_t> saout0, saout1;
408
virtual std::string name(void) const { return("Resonator filter"); }
409
virtual std::string parameter_names(void) const { return("center-freq,width"); }
411
virtual void set_parameter(int param, parameter_t value);
412
virtual parameter_t get_parameter(int param) const;
414
virtual void init(SAMPLE_BUFFER *insample);
415
virtual void process(void);
417
EFFECT_RESONATOR* clone(void) const { return new EFFECT_RESONATOR(*this); }
418
EFFECT_RESONATOR* new_expr(void) const { return new EFFECT_RESONATOR(); }
419
EFFECT_RESONATOR (parameter_t center = 1000.0, parameter_t width = 1000.0);