// delay which responds to tempo and time signature changes...
// resampling method doesn't really like 'gradual' delaytime/tempo changes...

slider1:250<10,1000,1>(read only) 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:1<0,1,1{off,on}>Sync
slider7:120<40,240,1>Tempo
slider8:4<1,8,1>Numerator
slider9:4<1,8,1>Denominator
slider10:1<0,1,1{off,on}>Resample on length change

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

@init
delaypos=0;

@slider
wetmix = slider2 <= -30.0 ? 0.0 : 10^(slider2/20);
drymix = slider3 <= -30.0 ? 0.0 : 10^(slider3/20);
wetmix2 = slider4 <= -30.0 ? 0.0 : 10^(slider4/20);
drymix2 = slider5 <= -30.0 ? 0.0 : 10^(slider5/20);

@block
slider6 == 0 ? (
ts_num=slider8;
ts_denom=slider9;
samplesperbeat=(60*srate/slider7)/(ts_denom*0.25);
):(
slider7=tempo;
sliderchange(slider7);
slider8=ts_num;
sliderchange(slider8);
slider9=ts_denom;
sliderchange(slider9);
samplesperbeat=(60*srate/tempo)/(ts_denom*0.25);
);

grid=samplesperbeat*ts_num*0.01;
slider1=grid;

odelay=delaylen;
delaylen=grid*srate*0.001|0;

odelay != delaylen ? (

slider10 && odelay > delaylen ? (
// resample down delay buffer, heh
rspos=0;
rspos2=0;
drspos=odelay/delaylen;

loop(delaylen,
tpos=((rspos)|0)*2;
rspos2[0]=tpos[0];
rspos2[1]=tpos[1];
rspos2+=2;
rspos+=drspos;
);

delaypos/=drspos;
delaypos|=0;
delaypos<0?delaypos=0;

) : (

slider10 && odelay < delaylen ? (
// resample up delay buffer, heh
drspos=odelay/delaylen;
rspos=odelay;
rspos2=delaylen*2;

loop(delaylen,
rspos-=drspos;
rspos2-=2;
tpos=((rspos)|0)*2;
rspos2[0]=tpos[0];
rspos2[1]=tpos[1];
);

delaypos/=drspos;
delaypos|=0;
delaypos<0?delaypos=0;

) : (

!slider10 && delaypos >= delaylen ? delaypos = 0);
);

freembuf(delaylen*8); // increased freembuf size...
);

@sample
dpint = delaypos*2;

os1=dpint[0];
os2=dpint[1];

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

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

spl0 = spl0*drymix2 + os1*wetmix2;
spl1 = spl1*drymix2 + os2*wetmix2;
