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;
