aboutsummaryrefslogtreecommitdiffstats
path: root/maximilian_examples/13.Advanced-Filters.cpp
blob: b04d3d871402f844886473be6087d346ecb5c1b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//Using BPF equation from http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
//Example contributed by Rebecca Fiebrink

#include "maximilian.h"

float xs[3], ys[3];
float a0, a1, a2, b0, b1, b2;
float f0 = 400; //THE FREQUENCY
float Q = 1.0;

maxiOsc mySwitchableOsc;

void setup() {//some inits
    double w0 = 2*PI*f0/44100;
    double alpha = sin(w0)/(2*Q);
    //Band-pass reson:
    //    b0 =   alpha;
    //     b1 =   0;
    //     b2 =  -1 * alpha;
    //     a0 =   1 + alpha;
    //     a1 =  -2*cos(w0);
    //     a2 =   1 - alpha;
    
    //Notch:
    b0 =   1;
    b1 =  -2*cos(w0);
    b2 =   1;
    a0 =   1 + alpha;
    a1 =  -2*cos(w0);
    a2 =   1 - alpha;
    
    //LPF:
    //    b0 =  (1 - cos(w0))/2;
    //    b1 =   1 - cos(w0);
    //    b2 =  (1 - cos(w0))/2;
    //    a0 =   1 + alpha;
    //    a1 =  -2*cos(w0);
    //    a2 =   1 - alpha;
}

void play(double *output) {
    xs[0] = mySwitchableOsc.sawn(400);
    ys[0] = (b0/a0)*xs[0] + (b1/a0)*xs[1] + (b2/a0)*xs[2]
    - (a1/a0)*ys[1] - (a2/a0)*ys[2];
    
    *output = ys[0];
    
    ys[2] = ys[1]; ys[1] = ys[0];
    xs[2] = xs[1]; xs[1] = xs[0];
}