desc:REA-2A

// version 0.15
// Belov Vladimir
// 24.12.2020

slider1:-10<-100,0,1>Treshold
slider2:0<0,1,1{4,Lim}>Ratio
slider3:13<0.1,100,1>-Attack
slider4:300<1,1000,1>-Release
slider5:0<0,100,1>-Gain
slider6:0<0,100,0>-Knee
//slider7:0<0,1,0.001>GR_Meter


@init
bpos=0;
a=c=1;
n=3*srate;
gr_meter=1;
in=ind=0.000001;

@slider
tresh=10^(slider1/20);
ratio=4*(1-slider2)+10000*slider2;
att=1000/srate/slider3;
release=1000/srate/slider4;
//GR_Meter=slider7;


@block
blah+=samplesblock;

@sample
in=max(abs(spl0),abs(spl1));//in=in/2;
ind>in? (ind=ind-ind*1000/srate/20): (ind=in);
//ind=in; 
b=1-1/srate;
q=ind/tresh;
qq=1/q;

//ind>tresh ? (a=a-((a-tresh/ind)*att)):(a=a+(1-a)*release);
/*
ind>tresh ? (a=a-((a-(tresh/ind)^(1-1/ratio))*att)):(a=a+(1-a)*release);
c=min(c,a);

spl0=spl0*a;
spl1=spl1*a;
*/

//gain < max(tresh,ind) ?  gain=gain+(

rms=sqrt(( rms^2+in^2-rm[0]^2)/n); rm[0]=in; rm+=1; rm>n? (rm=0) ; irms=rms;

ind>tresh ? (a=a-((a-(tresh/ind)^(1-1/ratio))*att)):(a=a+(1-a)*release);
c=min(c,a);


 
spl0=spl0*a;
spl1=spl1*a;

@gfx 0 32 // request horizontal/vertical heights (0 means dont care)

  gr_meter<a ? gr_meter *= exp(1/120):gr_meter=a; 
  gr_meter>1?gr_meter=1; // decay meter here so if the audio processing stops it doesnt "stick"
  gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;
  
  meter_bot=20;
  meter_h=min(gfx_h,32);
  xscale=gfx_w*20/meter_bot;

  gfx_y=0;
  gfx_x=gfx_w + log10(gr_meter)*xscale;
  gfx_rectto(gfx_w,meter_h);

  gfx_r=gfx_g=gfx_b=1.0; gfx_a=0.6;

  s2=sqrt(2)/2;
  g = s2;
  while(
    gfx_x=gfx_w + log10(g)*xscale;
    gfx_x >= 0 ? 
    (
      gfx_y=0;
      gfx_lineto(gfx_x,meter_h,0);
      gfx_y=meter_h-gfx_texth;
      gfx_x+=2;
      gfx_drawnumber(log10(g)*20,0);
      gfx_drawchar($'d');
      gfx_drawchar($'B');
    );
    g*=s2;
    gfx_x >=0;
  );
  gfx_a=1;

  gfx_x=0; gfx_y=meter_h/2 - gfx_texth/2;
  gfx_drawchar($'-');
  gfx_drawnumber(abs(log10(gr_meter)*20)   ,1);
  gfx_drawchar($'d');
  gfx_drawchar($'B');
