// set feedback to 0dB --> 'Feedback' is inf, 'Mix in' is muted, 'Wet' value is at fixed -6dB

slider1:1000<100,4000,1>Length (ms)
slider2:20<1,50,1>Overlap (%)
slider3:-6<-30,0,0.1>Feedback (dB)
slider4:0<-30,12,0.1>Mix in (dB)
slider5:-6<-30,12,0.1>Wet (dB)
slider6:0<-30,12,0.1>Dry (dB)
slider7:0<0,1,1{free,sync}>Sync mode
slider8:7<0,14,1{2 d,2,2 t,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}>Sync
slider9:0<0,1,1{dry only,dry + wet fade-out}>'Dry' mode

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

@init
pos = 0;

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

wet == 1 ? (
dry = 0;
wet2 = 0.9;
);

@block
slider8==0?(
grid=3;
);
slider8==1?(
grid=2;
);
slider8==2?(
grid=4/3;
);
slider8==3?(
grid=3/2;
);
slider8==4?(
grid=1;
);
slider8==5?(
grid=2/3;
);
slider8==6?(
grid=3/4;
);
slider8==7?(
grid=1/2;
);
slider8==8?(
grid=1/3;
);
slider8==9?(
grid=3/8;
);
slider8==10?(
grid=1/4;
);
slider8==11?(
grid=1/6;
);
slider8==12?(
grid=3/16;
);
slider8==13?(
grid=1/8;
);
slider8==14?(
grid=1/12;
);

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

slider7 == 0 ? (
temp = slider1;
):(
temp = sync;
slider1 = temp;
);

olen = len;
len = srate*temp*0.001|0;
fadelen = len*slider2*0.005|0;
halflen = len*0.5|0;
olen != len ? freembuf(len*2);

@sample
os1 = (pos*2)[0];
os2 = (pos*2)[1];

s0 = ((len-pos)*2)[0];
s1 = ((len-pos)*2)[1];
(pos*2)[0] = min(max(spl0*dry + os1*wet,-4),4);
(pos*2)[1] = min(max(spl1*dry + os2*wet,-4),4);

pp = len-pos;
w2 = pp<fadelen ? pp/fadelen : (pp>len-fadelen ? (len-pp)/fadelen : 1);
w2 == 1 ? (
pp = abs(halflen-pos);
w2 = pp<fadelen ? pp/fadelen : 1;
);

slider9 == 1 ? (
os1 = s0*w2;
os2 = s1*w2;
spl0 = os1*wet2 + spl0*(dry2 + 1-w2);
spl1 = os2*wet2 + spl1*(dry2 + 1-w2);
):(
os1 = s0*w2;
os2 = s1*w2;
spl0 = os1*wet2 + spl0*dry2;
spl1 = os2*wet2 + spl1*dry2;
);

(pos += 1) >= len ? pos = 0;
