slider1:50<0,100,0.01>Frequency (Scale)
slider2:0.707<0,4,0.001>Bandwidth
slider3:0<-12,12,0.1>Gain (dB)
slider4: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
slider5:0<-24,24,0.1>Output (dB)

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

@slider
// frequency slider scaling
tmpx = 16+slider1*1.20103;
tmpy = floor(exp(tmpx*log(1.059))*8.17742);

// filter calculation
f = 2*$pi * min(tmpy, 0.49 * srate) / srate;
q =max(min(slider2,4),0.01);
dB_gain = slider3;

outvol = 10^(slider5/20);

slider4==0?(
//LPF:
w0 = f;
cos_w0 = cos(w0);
alpha = sin(w0) / (2*q);

b1 = 1 - cos_w0;
b0 = b2 = 0.5 * b1;
a0 = 1 + alpha;
a1 = -2 * cos_w0;
a2 = 1 - alpha;
);

slider4==1?(
//HPF:
w0 = f;
cos_w0 = cos(w0);
alpha = sin(w0) / (2*q);

b1 = -1 - cos_w0;
b0 = b2 = -0.5 * b1;
a0 = 1 + alpha;
a1 = -2 * cos_w0;
a2 = 1 - alpha;
);

slider4==2?(
//BPF:
w0 = f;
alpha = sin(w0) / (2*q);

b0 = q * alpha;
b1 = 0;
b2 = -b0;
a0 = 1 + alpha;
a1 = -2 * cos(w0);
a2 = 1 - alpha;
);

slider4==3?(
//BPF2:
w0 = f;
alpha = sin(w0) / (2*q);

b0 = alpha;
b1 = 0;
b2 = -alpha;
a0 = 1 + alpha;
a1 = -2 * cos(w0);
a2 = 1 - alpha;
);

slider4==4?(
//NOTCH:
w0 = f;
alpha = sin(w0) / (2*q);

b0 = b2 = 1;
b1 = a1 = -2 * cos(w0);
a0 = 1 + alpha;
a2 = 1 - alpha;
);

slider4==5?(
//ALL-PASS:
w0 = f;
alpha = sin(w0) / (2*q);

b0 = a2 = 1 - alpha;
b1 = a1 = -2 * cos(w0);
b2 = a0 = 1 + alpha;
);

slider4==6?(
//PEQ:
w0 = f;
alpha = sin(w0) / (2*q);
a = 10^(db_gain / 40);

b0 = 1 + alpha * a;
b1 = a1 = -2 * cos(w0);
b2 = 1 - alpha * a;
a0 = 1 + alpha / a;
a2 = 1 - alpha / a;
);

slider4==7?(
//LSH:
w0 = f;
cos_w0 = cos(w0);
a = 10^(db_gain / 40);

tmp0 = 2 * sqrt(a) * sin(w0) / (2 * q);
tmp1 = (a + 1) - (a - 1) * cos_w0;
tmp2 = (a + 1) + (a - 1) * cos_w0;

b0 = a * (tmp1 + tmp0);
b1 = 2 * a * ((a - 1) - (a + 1) * cos_w0);
b2 = a * (tmp1 - tmp0);
a0 = tmp2 + tmp0;
a1 = -2 * ((a - 1) + (a + 1) * cos_w0);
a2 = tmp2 - tmp0;
);

slider4==8?(
//HSH:
w0 = f;
cos_w0 = cos(w0);
a = 10^(db_gain / 40);

tmp0 = 2 * sqrt(a) * sin(w0) / (2 * q);
tmp1 = (a + 1) - (a - 1) * cos_w0;
tmp2 = (a + 1) + (a - 1) * cos_w0;

b0 = a * (tmp2 + tmp0);
b1 = -2 * a * ((a - 1) + (a + 1) * cos_w0);
b2 = a * (tmp2 - tmp0);
a0 = tmp1 + tmp0;
a1 = 2 * ((a - 1) - (a + 1) * cos_w0);
a2 = tmp1 - tmp0;
);

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(tmpy,0);
gfx_drawchar($' ');
gfx_drawchar($'H');
gfx_drawchar($'z');
