// This code is based on loser's auto_level_setting js plugin.
// It can only read max values.
// So push the rescan button while scanning and playing back
// when you are doing some changes in your fx chain.

// sender --> fx chain --> receiver
// You have to bypass your fx chain with these plugins.
// So for a simple chain, set your track channels to 4.
// (Always two more channels than your fx chain is actually using.)

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

slider1:0<0,1,1{OFF,ON}>Scan
slider2:0<-60,60,1>Pre FXchain volume (dB)
slider3:0<-60,60,1>Post FXchain volume (dB)
slider4:0<-60,60,1>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,10>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;
