slider1:250<0,1000,1>(0=Sync) Delay (ms)
slider2:3<0,5,1{1,1/2,1/4,1/8,1/16,1/32}>Sync
slider3:0<0,2,1{default,dotted,triplet}>Mode
slider4:-6<-30,-1,0.1>Feedback (dB)
slider5:0<-30,12,0.1>Mix in (dB)
slider6:-6<-30,12,0.1>Wet (dB)
slider7:0<-30,12,0.1>Dry (dB)
slider8:0<0,1.2,0.01>Xtra Feedback
slider9:800<30,8000,10>BP Freq (Hz)
slider10:1<0.8,2.8,0.05>(narrow<>wide) BP Q

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

@init
delaypos = 0;

fd1_l=fd2_l=fd1_r=fd2_r=0;

@slider
wet = slider4 <= -30.0 ? 0.0 : 10^(slider4/20);
dry = slider5 <= -30.0 ? 0.0 : 10^(slider5/20);
wet2 = slider6 <= -30.0 ? 0.0 : 10^(slider6/20);
dry2 = slider7 <= -30.0 ? 0.0 : 10^(slider7/20);

xtra = slider8;

damp = slider10*0.999+0.001;
c = (1/tan($pi*slider9/srate));
a2 = 1+c*(c+damp);
fa1 = 2*(1-c*c)/a2;
fa0 = (1+c*(c-damp))/a2;
fk = c*damp/a2;

@block
odelay = delaylen;

slider2==0?(
grid=1;
);
slider2==1?(
grid=1/2;
);
slider2==2?(
grid=1/4;
);
slider2==3?(
grid=1/8;
);
slider2==4?(
grid=1/16;
);
slider2==5?(
grid=1/32;
);

slider1 >0 ? (
delaylen = min(slider1*srate/1000,500000)|0;
):(
slider3 == 0 ? (
delaylen = min(((grid*240)/tempo)*srate,500000)|0;
);
slider3 == 1 ? (
delaylen = min((((grid*(3/2))*240/tempo))*srate,500000)|0;
);
slider3 == 2 ? (
delaylen = min((((grid*(2/3))*240/tempo))*srate,500000)|0;
);
);

odelay != delaylen ? freembuf(delaylen*2);

@sample
dpint = delaypos*2;

os1 = min(max(dpint[0]+ospl0,-0.707),0.707);
os2 = min(max(dpint[1]+ospl1,-0.707),0.707);

dpint[0] = min(max(spl0*dry + os1*wet,-4),4);
dpint[1] = min(max(spl1*dry + os2*wet,-4),4);

(delaypos+=1) >= delaylen ? delaypos=0;

d0_l = fk*os1 - (fa1*fd1_l + fa0*fd2_l);
d0_r = fk*os2 - (fa1*fd1_r + fa0*fd2_r);

os1 = (d0_l - fd2_l);
os2 = (d0_r - fd2_r);

fd2_l = fd1_l;
fd2_r = fd1_r;

fd1_l = d0_l;
fd1_r = d0_r;

spl0 = spl0*dry2 + os1*wet2;
spl1 = spl1*dry2 + os2*wet2;

ospl0 = os1*wet2*xtra;
ospl1 = os2*wet2*xtra;
