/*
You can add any FX to the 'delay feedback mix' of this plugin.

Set your track to 4 channels, then...

ReaEq (in 1+2, out 3+4)  -->  e.g. chorus (in 3+4, out 3+4)  -->  delay_2_sidechain (in 1+2, in 3+4, out 1+2)

Output ch 3+4 disabled.
*/

slider1:250<10,1000,1>Delay (ms)
slider2:-6<-30,-1,0.1>Feedback (dB)
slider3:-30<-30,12,0.1>Mix in (dB)
slider4:0<-30,12,0.1>Sidechain 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:10<0,17,1{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,1/16 d,1/16,1/16 t,1/32 d,1/32,1/32 t}>Sync
slider9:0<0,1,1{inside feedback loop,before feedback loop}>Sidechain Mode

in_pin:L in
in_pin:R in
in_pin:L Sidechain
in_pin:R Sidechain
out_pin:L out
out_pin:R out
out_pin:xxx
out_pin:xxx

@init
delaypos = 0;

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

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

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

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

odelay = delaylen;
delaylen = (temp * srate / 1000)|0;
odelay != delaylen ? freembuf(delaylen*2);

@sample
dpint = delaypos*2;

slider9 == 1 ? (
os1 = dpint[0] + spl2*drymixsc;
os2 = dpint[1] + spl3*drymixsc;
dpint[0] = min(max(spl0*drymix + os1*wetmix,-4),4);
dpint[1] = min(max(spl1*drymix + os2*wetmix,-4),4);
):(
os1 = dpint[0];
os2 = dpint[1];
dpint[0] = min(max(spl0*drymix + spl2*drymixsc + os1*wetmix,-4),4);
dpint[1] = min(max(spl1*drymix + spl3*drymixsc + os2*wetmix,-4),4);
);

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

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

spl2 = 0;
spl3 = 0;
