/*
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{-------,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
log2db = 8.6858896380650365530225783783321;
RMS_MS = 350;
RED_DR = 60;

decay = exp(-1/(RMS_MS*srate*0.001));

DB_LO = -60;

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 371
T = (gfx_h-pxperdb*60)|0;
B = (gfx_h-pxperdb*0)|0;
pxperdb = (gfx_h-1)/60;

redpx = RED_DR*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 = i+1;
);

i = 0;
db = 60;
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 = i+1;
db > 0;
);

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