  desc:HyperSat HD
author: Belovw
V0.17 19.03.2022
V0.21 04.05.2022 Pererabotan algoritm chetnyh garmonik
V0.22 05.05.2022 DC Offset dlya chetnyh garmonik
V0.23 05.05.2022 Bag Compute Kni
V0.24 05.05.2022 Even Harm Behavior
V0.25 05.05.2022 Global ON<>OFF
V0.26 09.05.2022 Tuning Indicator, 0 dB Start Saturate

V0.27 10.05.2022 Start Make Hyper Sat HD Version

Version reset
V0.01 10.05.2022 Init Hyper Saturator HD 

slider1:0<-20,24>HyperSat (dB)
slider2:0<0,1> Even Harm
slider3:0<0,17>Kni L 
slider4:0<0,17>Kni R
slider6:0<0,1,{ON,OFF}>Global

in_pin:left input
in_pin:right input
out_pin:left output
out_pin:right output

@init
ext_noinit=1;


//fmax=3000;
fmax=srate/15;

Q=1;//0.46; // 0.5 // 0.8

knid0=0.00001;
knid1=0.00001;
countmax=srate/10;

aa=exp(-log(9)*1000/srate/30);
ar=exp(-log(9)*1000/srate/3000);

@slider
_global.hypersathd=slider6;

HS=10^(slider1/20);
HS2=HS*2;
f=fmax;//-100*HS;

/////////////////////////
/// Bi Quad High Pass ///
/// DC Offset         ///
/////////////////////////

w=2*$pi*20/srate; // High Pass 20 Hz
a=sin(w)/(2*0.7); // Q=0.7

b1=-1-cos(w);
b0=b2=-b1/2;

a0=1+a;
a1=-2*cos(w);
a2=1-a;

////////////////////////////
// Privedennye koeficenty //
////////////////////////////

b0d=b0/a0; 
b1d=b1/a0;
b2d=b2/a0;
a1d=a1/a0;
a2d=a2/a0;

S=min(max(0,slider2),1)/20;

@block
slider6=_global.hypersathd;

@sample
_global.hypersathd == 0 ? (

srate > 48000 ? (

in0=spl0; in1=spl1;


/////////////////
/// Saturator ///
/////////////////

outs0=in0+S;
outs1=in1+S;

e2f0=$e^(HS2*outs0);
e2f1=$e^(HS2*outs1);

hs0=(e2f0-1)/(e2f0+1)/HS;
hs1=(e2f1-1)/(e2f1+1)/HS;

/////////
// OUT //
/////////

spl0=hs0;
spl1=hs1;

///////////////
// DC Offset //
///////////////

S > 0 ? (
outd0 = b0d*spl0 + b1d*ind01 + b2d*ind02 - a1d*outd01 - a2d*outd02;
outd1 = b0d*spl1 + b1d*ind11 + b2d*ind12 - a1d*outd11 - a2d*outd12;

outd02=outd01 ; outd01=outd0;
outd12=outd11 ; outd11=outd1;

ind02=ind01 ; ind01=spl0 ;
ind12=ind11 ; ind11=spl1 ;

spl0=outd0;
spl1=outd1;
);

/////////
// Kni //
/////////

count > 0 ? (


kni0=1-(hs0+0.00000001)/(outs0+0.00000001);
kni1=1-(hs1+0.00000001)/(outs1+0.00000001);


kni0>knid0? knid0=knid0/aa: 
            knid0=knid0*ar;
            
kni1>knid1? knid1=knid1/aa: 
            knid1=knid1*ar;
count-=1;);

):(
      
      reverc[i]=spl0;
      reverc[i+2*srate]=spl1;
      spl0=reverc[2*srate-i];
      spl1=reverc[4*srate-i];
      i+=1);
i > 2*srate ? i=0;
);
@gfx
_global.hypersathd == 0 ? (
slider3=ceil(1000*knid0)/10;
slider4=ceil(1000*knid1)/10;
count=countmax;

Srate <= 48000 ? (
                  glare+=0.5;glare > 0 ? (gfx_r=gfx_a=1; gfx_g=gfx_b=slider3=0;slider4=17):
                                         (gfx_b=gfx_a=1; gfx_g=gfx_r=slider4=0;slider3=17);
                  glare >1 ? glare=-1;
                  gfx_rect(0,0,gfx_w,gfx_h);
                  
                  gfx_r=gfx_g=gfx_b=1;
                  gfx_x=gfx_y=0;
                  gfx_setfont(1,1,gfx_h,0);
                  gfx_measurestr("Low FS!!!",F_w,F_h);
                  F_w>gfx_w ? gfx_setfont(1,1,F_h*gfx_w/F_w,0);
                  gfx_drawstr("Low FS!!!");
                 ):
                 (
                  gfx_g=gfx_a=1; gfx_r=gfx_b=0;
                  gfx_rect(0,0,gfx_w,gfx_h);
                  gfx_r=gfx_g=gfx_b=1;
                  gfx_x=gfx_y=0;
                  gfx_setfont(1,1,gfx_h,0);
                  gfx_measurestr("FS 408.0k",aaa1,aaa2);
                  aaa1>gfx_w ? gfx_setfont(1,1,aaa2*gfx_w/aaa1,0);
                  gfx_drawstr("FS ");
                  gfx_drawnumber(srate/1000,1);
                  gfx_drawstr("k");
                  
                );
):
(
                  gfx_a=1; gfx_g=gfx_r=gfx_b=0.3;
                  gfx_rect(0,0,gfx_w,gfx_h);
                  gfx_r=gfx_g=gfx_b=1;
                  gfx_x=gfx_y=0;
                  gfx_setfont(1,1,gfx_h,0);
                  gfx_measurestr("Globall OFF",aaa1,aaa2);
                  aaa1>gfx_w ? gfx_setfont(1,1,aaa2*gfx_w/aaa1,0);
                  gfx_drawstr("Globall OFF");  
                  
);
                  
                  
