// midi note to filter frequency

slider1:0.707<0.2,4,0.001>Bandwidth
slider2:0<-12,12,0.1>Gain (dB)
slider3:0<0,8,1{lpf (bw),hpf (bw),bpf (constant skirt gain) (bw),bpf2 (constant peak gain) (bw),notch (bw),all pass (bw),peak (bw;dB),lsf (bw;dB),hsf (bw;dB)}>Filter type
slider4:0<-24,24,0.1>Output (dB)
slider5:0<-4,4,1>Transpose incoming Midi (oct)
slider6:100<0,1000,10>Transition Time (ms)

in_pin:L in
in_pin:R in
out_pin:L out
out_pin:R out

@init
ext_noinit = 1;
tmpx = tmpy = 1000;

@slider
outvol = 10^(slider4/20);
transpose = slider5*12;

@block
while (
midirecv(ts,msg1,msg23) ? (
m=msg1&240;
//vel = (msg23/256)|0;
note=msg23&127;
(m == 9*16 || m == 8*16) ? (
tmpy = 440*(2^((note+transpose-69)/12));
tmpy = max(min(tmpy,srate/2-1),20);
):(
midisend(ts,msg1,msg23);
);
midisend(ts,msg1,msg23);
);
);

coeff = exp(-$pi/(slider6*0.001*samplesblock));
tmpx = tmpx*coeff + tmpy*(1-coeff);

// filter calculation
omega = 2*$pi*tmpx/srate;
slider3 < 8 ? (
K = tan(omega/2);
):(
K = tan(($pi-omega)/2); //HSF only
);
Q = max(min(slider1,4),0.2);
V = 10^(-slider2/20);

slider3==0?(
//LPF:
b0 = K^2;
b1 = 2*K^2;
b2 = K^2;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;
);

slider3==1?(
//HPF:
b0 = 1;
b1 = -2;
b2 = 1;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;
);

slider3==2?(
//BPF:
b0 = K;
b1 = 0;
b2 = -K;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;
);

slider3==3?(
//BPF2:
b0 = K/Q;
b1 = 0;
b2 = -K/Q;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;
);

slider3==4?(
//NOTCH:
b0 = 1 + K^2;
b1 = 2*(K^2 - 1);
b2 = 1 + K^2;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;
);

slider3==5?(
//ALL-PASS:
b0 = 1 - K/Q + K^2;
b1 = 2*(K^2 - 1);
b2 = 1 + K/Q + K^2;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;
);

slider3==6?(
//PEQ:
//boost:
b0 = 1 + V*K/Q + K^2;
b1 = 2*(K^2 - 1);
b2 = 1 - V*K/Q + K^2;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;

//cut:
b0 = 1 + K/Q + K^2;
b1 = 2*(K^2 - 1);
b2 = 1 - K/Q + K^2;
a0 = 1 + V*K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - V*K/Q + K^2;
);

slider3==7?(
//LSH:
//boost:
b0 = 1 + sqrt(V)*K/Q + V*K^2;
b1 = 2*(V*K^2 - 1);
b2 = 1 - sqrt(V)*K/Q + V*K^2;
a0 = 1 + K/Q + K^2;
a1 = 2*(K^2 - 1);
a2 = 1 - K/Q + K^2;

//cut:
b0 = 1 + K/Q + K^2;
b1 = 2*(K^2 - 1);
b2 = 1 - K/Q + K^2;
a0 = 1 + sqrt(V)*K/Q + V*K^2;
a1 = 2*(V*K^2 - 1);
a2 = 1 - sqrt(V)*K/Q + V*K^2;
);

slider3==8?(
//HSH:
//boost:
b0 = 1 + sqrt(V)*K/Q + V*K^2;
b1 = -2*(V*K^2 - 1);
b1 = 1 - sqrt(V)*K/Q + V*K^2;
a0 = 1 + K/Q + K^2;
a1 = -2*(K^2 - 1);
a2 = 1 - K/Q + K^2;

//cut:
b0 = 1 + K/Q + K^2;
b1 = -2*(K^2 - 1);
b2 = 1 - K/Q + K^2;
a0 = 1 + sqrt(V)*K/Q + V*K^2;
a1 = -2*(V*K^2 - 1);
a2 = 1 - sqrt(V)*K/Q + V*K^2;
);

a1 /= a0;
a2 /= a0;
b0 /= a0;
b1 /= a0;
b2 /= a0;

@sample
inA = spl0;
inB = spl1;

//Left
x2A = x1A;
x1A = x0A;
x0A = inA;

y2A = y1A;
y1A = y0A;
y0A = b0*x0A + b1*x1A + b2*x2A - a1*y1A - a2*y2A;

//Right
x2B = x1B;
x1B = x0B;
x0B = inB;

y2B = y1B;
y1B = y0B;
y0B = b0*x0B + b1*x1B + b2*x2B - a1*y1B - a2*y2B;

//Output
spl0 = y0A;
spl1 = y0B;

spl0 *= outvol;
spl1 *= outvol;

@gfx 0 26
gfx_x=gfx_y=10;
gfx_r=gfx_b=0;gfx_g=gfx_a=1;
gfx_drawchar($'F');
gfx_drawchar($' ');
gfx_drawchar($'=');
gfx_drawchar($' ');
gfx_drawnumber(tmpx,3);
gfx_drawchar($' ');
gfx_drawchar($'H');
gfx_drawchar($'z');
