slider1:250<10,1000,1>Delay (ms)
slider2:-6<-30,-1,0.1>Feedback (dB)
slider3:0<-30,12,0.1>Mix in (dB)
slider4:-6<-30,12,0.1>Wet (dB)
slider5:0<-30,12,0.1>Dry (dB)
slider6:0<0,1,1{free,sync}>Sync mode
slider7:10<0,17,1{1 d,1,1 t,1/2 d,1/2,1/2 t,1/4 d,1/4,1/4 t,1/8 d,1/8,1/8 t,1/16 d,1/16,1/16 t,1/32 d,1/32,1/32 t}>Sync

slider9:0<0,100,1>Saturation (%)
slider10:0<0,100,0.01>HPF (Scale)
slider11:0.8<0.8,8,0.01>Resonance
slider12:100<0,100,0.01>LPF (Scale)
slider13:0.8<0.8,8,0.01>Resonance

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

@init
b = 0;

@slider
vf = slider2 <= -30.0 ? 0.0 : 10^(slider2/20);
vm = slider3 <= -30.0 ? 0.0 : 10^(slider3/20);
vw = slider4 <= -30.0 ? 0.0 : 10^(slider4/20);
vd = slider5 <= -30.0 ? 0.0 : 10^(slider5/20);

foo = slider9/200*$pi;
bar = sin(slider9/200*$pi);

(old_s10 != slider10 && slider10 > slider12) ? slider12 = slider10;
(old_s12 != slider12 && slider12 < slider10) ? slider10 = slider12;
old_s10 = slider10;
old_s12 = slider12;

//LPF:
// frequency slider scaling
tmpxA = 16+slider12*1.20103;
tmpyA = floor(exp(tmpxA*log(1.059))*8.17742);

// filter calculation
fA = 2*$pi * min(tmpyA, 0.49 * srate) / srate;
qA = slider13;

w0A = fA;
cos_w0A = cos(w0A);
alphaA = sin(w0A) / (2*qA);

b1A = 1 - cos_w0A;
b0A = b2A = 0.5 * b1A;
a0A = 1 + alphaA;
a1A = -2 * cos_w0A;
a2A = 1 - alphaA;

a1A /= a0A;
a2A /= a0A;
b0A /= a0A;
b1A /= a0A;
b2A /= a0A;

//HPF:
// frequency slider scaling
tmpxB = 16+slider10*1.20103;
tmpyB = floor(exp(tmpxB*log(1.059))*8.17742);

// filter calculation
fB = 2*$pi * min(tmpyB, 0.49 * srate) / srate;
qB = slider11;

w0B = fB;
cos_w0B = cos(w0B);
alphaB = sin(w0B) / (2*qB);

b1B = -1 - cos_w0B;
b0B = b2B = -0.5 * b1B;
a0B = 1 + alphaB;
a1B = -2 * cos_w0B;
a2B = 1 - alphaB;

a1B /= a0B;
a2B /= a0B;
b0B /= a0B;
b1B /= a0B;
b2B /= a0B;

@block
slider7==0?(
grid=3/2;
);
slider7==1?(
grid=1;
);
slider7==2?(
grid=2/3;
);
slider7==3?(
grid=3/4;
);
slider7==4?(
grid=1/2;
);
slider7==5?(
grid=1/3;
);
slider7==6?(
grid=3/8;
);
slider7==7?(
grid=1/4;
);
slider7==8?(
grid=1/6;
);
slider7==9?(
grid=3/16;
);
slider7==10?(
grid=1/8;
);
slider7==11?(
grid=1/12;
);
slider7==12?(
grid=3/32;
);
slider7==13?(
grid=1/16;
);
slider7==14?(
grid=1/24;
);
slider7==15?(
grid=3/64;
);
slider7==16?(
grid=1/32;
);
slider7==17?(
grid=1/48;
);

sync = ((grid*240)/tempo)*1000;

slider6 == 0 ? (
tmp2 = slider1;
):(
tmp2 = sync;
slider1 = tmp2;
);

tmp = bs;
bs = (tmp2 * srate / 1000)|0;
tmp < bs ? freembuf(bs*2+1);

@sample
slider9 ? (
b[0] = min(max( sin(max(min(spl0*vm+b[0]*vf,0.1),-0.1)*foo)/bar ,-0.1) ,0.1);
b[1] = min(max( sin(max(min(spl1*vm+b[1]*vf,0.1),-0.1)*foo)/bar ,-0.1) ,0.1);
):(
b[0] = spl0*vm+b[0]*vf;
b[1] = spl1*vm+b[1]*vf;
);
(b+=2) >= (bs*2) ? b=0;

//Left
x2AA = x1AA;
x1AA = x0AA;
x0AA = b[0];

y2AA = y1AA;
y1AA = y0AA;
y0AA = b0A*x0AA + b1A*x1AA + b2A*x2AA - a1A*y1AA - a2A*y2AA;

//Right
x2BA = x1BA;
x1BA = x0BA;
x0BA = b[1];

y2BA = y1BA;
y1BA = y0BA;
y0BA = b0A*x0BA + b1A*x1BA + b2A*x2BA - a1A*y1BA - a2A*y2BA;

//Output
out0 = y0AA;
out1 = y0BA;

//Left
x2AB = x1AB;
x1AB = x0AB;
x0AB = out0;

y2AB = y1AB;
y1AB = y0AB;
y0AB = b0B*x0AB + b1B*x1AB + b2B*x2AB - a1B*y1AB - a2B*y2AB;

//Right
x2BB = x1BB;
x1BB = x0BB;
x0BB = out1;

y2BB = y1BB;
y1BB = y0BB;
y0BB = b0B*x0BB + b1B*x1BB + b2B*x2BB - a1B*y1BB - a2B*y2BB;

//Output
out2 = y0AB;
out3 = y0BB;

spl0 = spl0*vd+out2*vw;
spl1 = spl1*vd+out3*vw;

@gfx 0 46
gfx_x=gfx_y=10;
gfx_r=gfx_b=0;gfx_g=gfx_a=1;
gfx_drawchar($'H');
gfx_drawchar($'P');
gfx_drawchar($'F');
gfx_drawchar($' ');
gfx_drawchar($'=');
gfx_drawchar($' ');
gfx_drawnumber(tmpyB,0);
gfx_drawchar($' ');
gfx_drawchar($'H');
gfx_drawchar($'z');
gfx_x=10;gfx_y=30;
gfx_drawchar($'L');
gfx_drawchar($'P');
gfx_drawchar($'F');
gfx_drawchar($' ');
gfx_drawchar($'=');
gfx_drawchar($' ');
gfx_drawnumber(tmpyA,0);
gfx_drawchar($' ');
gfx_drawchar($'H');
gfx_drawchar($'z');
