/*
auto_level_send  ---> FXchain --->  auto_level_receive


The sender should route your signal to an unused channel pair.
The receiver should receive from that channel pair.
So if your track has only two channels, set the track to have 4 channels
and set the sender to output to 3+4 and the receiver to receive from 3+4.
*/

desc: Trigger0=scan ON/OFF // Trigger1=rescan // Trigger2=reset

slider1:0<0,1,1{OFF,ON}>scan
slider2:0,pre FXchain volume (dB)
slider3:0,post FXchain volume (dB)
slider4:0,applied volume (dB)
slider5:1<0,31,1{-------,3+4,5+6,7+8,9+10,11+12,13+14,15+16,17+18,19+20,21+22,23+24,25+26,27+28,29+30,31+32,33+34,35+36,37+38,39+40,41+42,43+44,45+46,47+48,49+50,51+52,53+54,55+56,57+58,59+60,61+62,63+64}>in channel
slider6:0<0,1000,1>rms window (ms)
slider7:1<0,1,1{pre FXchain,post FXchain}>listen to...

@init
c = 20/log(10);
splmax0 = 0;
splmax1 = 0;

rc = 0.0033; // tweak the RC time constant to adjust the smoothness
a = 1 / (rc * srate + 1);

@slider
v0 = 10^(slider4/20);

channel = slider5*2;
in = channel;
in2 = in+1;

win_len = slider6*srate*0.001;
b1 = exp(-1/win_len);
a0 = 1 - b1;

@block
trigger & 1 ? (
trigger -= 1;
slider1 = (slider1-1)*-1;
);

trigger & (2^1) ? (
v0 = 1;
v1 = 1;
v2 = 1;
splmax0 = 0;
splmax1 = 0;
slider2 = 0;
slider3 = 0;
slider4 = 0;
);

trigger & (2^2) ? (
slider1 = 0;
v0 = 1;
v1 = 1;
v2 = 1;
splmax0 = 0;
splmax1 = 0;
slider2 = 0;
slider3 = 0;
slider4 = 0;
);

@sample
cur_spl0 = spl0;
fout0 = a0*(cur_spl0*cur_spl0) + b1*fout0;
rms0 = sqrt(fout0);

cur_spl1 = spl1;
fout1 = a0*(cur_spl1*cur_spl1) + b1*fout1;
rms1 = sqrt(fout1);

cur_splA = spl(in);
foutA = a0*(cur_splA*cur_splA) + b1*foutA;
rmsA = sqrt(foutA);

cur_splB = spl(in2);
foutB = a0*(cur_splB*cur_splB) + b1*foutB;
rmsB = sqrt(foutB);

slider1 ? (
splmax0 = max( max(abs(rms0),abs(rms1)) , splmax0);
splmax1 = max( max(abs(rmsA),abs(rmsB)) , splmax1);
v0 = splmax1/(splmax0-0.000000001);
v1 = splmax0;
v2 = splmax1;
slider2=log(v2)*c;
sliderchange(slider2);
slider3=log(v1)*c;
sliderchange(slider3);
slider4=log(v0)*c;
sliderchange(slider4);
);

lp += a * (slider7 - lp);
dry = 1 - lp;
wet = lp;

spl0 = dry * cur_splA + wet * spl0 * v0;
spl1 = dry * cur_splB + wet * spl1 * v0;
