Advanced Filters

var a = new maximJs.maxiOsc();
var xs = [0,0,0], ys = [0,0,0];
var a0, a1, a2, b0, b1, b2;
var f0 = 400; //THE FREQUENCY
var Q = 1.0;

var mySwitchableOsc = new maximJs.maxiOsc();

function setup() {//some inits
    var cos = Math.cos;
    var w0 = 2*Math.PI*f0/44100;
    var alpha = Math.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;
}

function play() {//this is where the magic happens. Very slow magic.
    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];
}