// not optimized, delay time changes produces clicks...
// set feedback to 0dB --> 'Feedback' is inf, 'Mix in' is muted, 'Wet' value is at fixed -6dB

slider1:250<10,1000,1>Delay (ms)
slider2:10<0,100,10>Amount (%)
slider3:10<0,100,10>Smooth (%)
slider4:-6<-30,0,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)

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

@init
ext_noinit = 1;
delaypos = 0;
delaylen = srate;

@slider
oseekto = seekto;
seekfrom = seekpos|0;
seekto = slider1 * 0.001 * delaylen|0;
seekcnt = 0;
oseekto != seekto ? freembuf(delaylen*2);

amount = 0.5 + slider2 * 0.005;
smooth = 1 + slider3 * 0.01;

wetmix = slider4 <= -30.0 ? 0.0 : 10^(slider4/20);
drymix = slider5 <= -30.0 ? 0.0 : 10^(slider5/20);
wetmix2 = slider6 <= -30.0 ? 0.0 : 10^(slider6/20);
drymix2 = slider7 <= -30.0 ? 0.0 : 10^(slider7/20);

wetmix == 1 ? (
drymix = 0;
wetmix2 = 0.5;
);

@sample
seekpos != seekto ? (
seekcnt += 2/(srate);
t = ((sin(seekcnt*$pi*amount - $pi/2)+1)^smooth)*0.5;
seekpos = (t*(seekto-seekfrom)+seekfrom);
seekcnt >= 1 ? seekpos = seekto;
);

dpint = delaypos-seekpos;
dpint < 0 ? dpint += delaylen;

dpinto = dpint;
dpint = (0|dpint);
frac = dpinto-dpint;
dpint2 = dpint >= (delaylen-1) ? 0 : (dpint+1);
dpint += dpint;
dpint2 += dpint2;

os1 = dpint[0]*(1-frac)+frac*dpint2[0];
os2 = dpint[1]*(1-frac)+frac*dpint2[1];

dpint = delaypos*2;

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;
