// based on a js chorus plugin
// proccessed signal will be delayed...

desc: Mono.

slider1:1<0,4,0.1>(0=Sync) Rate (Hz)
slider2:50<10,1000,1>Length (ms)
slider3:25<20,100,1>Pitch (%)
slider4:50<0,100,1>Width (%)
slider5:0<-60,12,0.1>Output (dB)
slider6:0.5<0.0625,4,0.0625>Sync (fraction of whole note)

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

@init
bpos = 0;
bufofs = 4096;

i = 0;
loop(1,
i[0] = (i+1)/1 * $pi;
i += 1;
);

@slider
len = (slider2*srate*0.001)|0;
size = ((len/1)*slider3*0.01);
smoothing = (slider4*0.0049);
gain = slider5 <= -60.0 ? 0.0 : 10^(slider5/20);

@block
slider1==0 ? (
rateadj = tempo/(240*slider6)*2*$pi/srate;
):(
rateadj = slider1*2*$pi/srate;
);

@sample
os0 = (spl0+spl1)*0.5;
out = 0;

i = 0;
loop(1,
tpos = bpos - (0.5 + smoothing*sin( i[0] += rateadj)) * (i+1) * size;
tpos < 0 ? tpos += len;

frac = tpos-(0|tpos);
ntpos = tpos >= (len-1) ? 0 : tpos+1;

out += (bufofs[tpos]*(1-frac) + bufofs[ntpos]*frac ) * gain;
i += 1;
);

bufofs[bpos] = os0;
bpos += 1;
bpos >= len ? bpos = 0;

spl0 = out;
spl1 = out;
