/*
diff_meter_send  ---> FXchain --->  diff_meter_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.
*/

slider1:1<0,31,1{1+2,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
slider2:0<-40,40,0.01>volume (dB)

@init
// change these if you like
RMS_MS = 350;
DB_LO = -60; // divisible by 6
// ----------------------------

decay = exp(-1/(RMS_MS*srate*0.001));
DB_LOW = DB_LO*-1;
log2db = 8.6858896380650365530225783783321;

peak2=spl(in);
peak3=spl(in2);

peak0 = peak1 = peak2 = peak3 = 0;
peakdb0 = peakdb1 = peakdb2 = peakdb3 = DB_LO;

src_vol = tgt_vol = 10^(slider2/20);

@slider
channel = slider1*2;
in = channel;
in2 = in+1;

tgt_vol= 10^(slider2/20);

@block
peak0 <= 0 ? peakdb0 = DB_LO : peakdb0 = log2db*log(peak0);
peak2 <= 0 ? peakdb2 = DB_LO : peakdb2 = log2db*log(peak2);
peak1 <= 0 ? peakdb1 = DB_LO : peakdb1 = log2db*log(peak1);
peak3 <= 0 ? peakdb3 = DB_LO : peakdb3 = log2db*log(peak3);

d_vol = (tgt_vol-src_vol)/samplesblock;
tvol = src_vol;
src_vol = tgt_vol;

@sample
tvol += d_vol;
adj = tvol;

new = abs(spl0)*adj;
new > peak0 ? peak0 = new : peak0 = peak0*decay;
new = abs(spl(in));
new > peak2 ? peak2 = new : peak2 = peak2*decay;

new = abs(spl1)*adj;
new > peak1 ? peak1 = new : peak1 = peak1*decay;
new = abs(spl(in2));
new > peak3 ? peak3 = new : peak3 = peak3*decay;

spl0*=adj;
spl1*=adj;

@gfx 0 376
pxperdb = (gfx_h-1)/(DB_LOW+6);
T = (gfx_h-pxperdb*DB_LOW)|0;
B = (gfx_h)|0;

redpx = DB_LOW*pxperdb;

xw = -gfx_w*3/64;
xs = -gfx_w/16;

gfx_a = 1;

i = 0;
loop(2,
i == 0 ? (
tpeak0 = peakdb0;
tpeak1 = peakdb2;
):(
tpeak0 = peakdb1;
tpeak1 = peakdb3;
);

peaky0 = B-pxperdb*(tpeak0-DB_LO);
peaky0 < T ? peaky0 = T : peaky0 > B ? peakY0 = B;
peaky1 = B-pxperdb*(tpeak1-DB_LO);
peaky1 < T ? peaky1 = T : peaky1 > B ? peaky1 = B;

d = (peaky1-peaky0-redpx);
d < 0 ? d = 0 : d > 1 ? d = 1;
gfx_r = 1-d;
gfx_g = d;
gfx_b = 0;

gfx_x = gfx_w/2+xw/4;
gfx_y = peaky1;
gfx_rectto(gfx_x+xw, peaky0);

(peaky1-peaky0) <=0 ? (
gfx_r = 0.2;
gfx_g = 0.8;
gfx_b = 0.3;
):(
gfx_r = 0.8;
gfx_g = 0.8;
gfx_b = 0.1;
);

gfx_x = gfx_x+xs;
gfx_rectto(gfx_x+xw, B);
gfx_x = gfx_x+xs;
gfx_rectto(gfx_x+xw, peaky1);

xw = -xw;
xs = -xs;
i += 1;
);

i = 0;
db = DB_LOW;
while (
i%2 ? gfx_r=gfx_g=gfx_b=0 : gfx_r=gfx_g=gfx_b=0.375;
gfx_x = 4;
gfx_y = gfx_h-pxperdb*db-0.5;
gfx_lineto(gfx_w-4, gfx_y, 0);
db = db-3;
i += 1;
db > 0;
);

gfx_h>98 ? (
i = 0;
db = DB_LOW;
while (
gfx_r=gfx_g=gfx_b=0.375;
gfx_x = 4;
gfx_y = pxperdb*db-9;
gfx_drawnumber(-db+6,0);
db = db-6;
i += 1;
db > 0;
);
);
