desc:REA-2A

// version 0.16
// 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:269<1,1000,1>-Release
slider5:0<0,100,1>-Gain
slider6:0<0,100,0>-Knee
slider7:-3<-9,0,1>-Histerezis
slider8:1<0,1,1{Old,New}>-Mode


@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;
H=10^(slider7/20);


@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;

slider8==0 ? (ind>tresh ? (a=a-((a-tresh/ind)*att)):(a=a+(1-a)*release);Mode=0);
/*
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) ; a0=a;

slider8==1 ? (
T=min((tresh/ind)^(1-1/ratio),1);
T>a ? aaa=1;
T<a ? (a=a-((a-T)*att);a0=a):
                          a0>a^(1/H) ? a=a-((a-T)*att/3):(a=a+(1-a)*release);mode=1);


 
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;
  gr = s2;
  while(
    gfx_x=gfx_w + log10(gr)*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(gr)*20,0);
      gfx_drawchar($'d');
      gfx_drawchar($'B');
    );
    gr*=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');
