// (C) 2006-2007, Michael Gruhn.

// NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
// WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
// ANY DIRECT OR INDIRECT,  SPECIAL,  INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
// OUT OF  THE  USE  OR INABILITY  TO  USE  THIS PLUG-IN,  COMPUTER FAILTURE  OF
// MALFUNCTION INCLUDED.  THE USE OF THE SOURCE CODE,  EITHER  PARTIALLY  OR  IN
// TOTAL, IS ONLY GRANTED,  IF USED IN THE SENSE OF THE AUTHOR'S INTENTION,  AND
// USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A  THIRD
// PARTY CONTRIBUTION,  EVEN IF INCLUDED IN REAPER(TM),  COCKOS INCORPORATED  OR
// ITS AFFILIATES HAVE NOTHING TO DO WITH IT.  LAST BUT NOT LEAST, BY USING THIS
// PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
// ENTRUST SOMEBODY ELSE WITH DOING SO.

desc:SaturatMod
desc:SaturatMod [Gazzz]
//tags: processing amplitude gain saturation + stereodistortion
//author: LOSER + Gazzz mod


// v0.2 
// added PostAmp
slider1:1 <0,4,0.1>PreAmp x (x1 = clear)
slider2:100 <1,500,1>Amount (%, 100% = clear)
slider3:1 <0,2,0.1>Assymetry (x1, 1 = clear)
slider4:0 <-1,1,0.1>PanPos (0 = center)
slider5:1 <0,4,0.1>PostAmp x (x1 = clear)

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

@init
gfx_clear = 0;
@slider
trsh = slider2/100;

@sample
slider1 ? (
L = slider1 * spl0;
R = slider1 * spl1;

spl0 = L > 0 
  ? min(slider5,sign(L) * (1 - min(2,pow(abs(1-L*sign(L)),trsh*slider3*(1-slider4))) ) * slider5)
  : max(-slider5,sign(L) * (1 - min(2,pow(abs(1-L*sign(L)),trsh*(1-slider4))) )* slider5);
spl1 = R > 0 
  ? min(slider5,sign(R) * (1 - min(2,pow(abs(1-R*sign(R)),trsh*(1+slider4))) )* slider5)
  : max(-slider5,sign(R) * (1 - min(2,pow(abs(1-R*sign(R)),trsh*slider3*(1+slider4))) )* slider5);
    
);

@gfx 256 192

gfxSize = min(gfx_w,gfx_h);


gfx_r=gfx_g=gfx_b=0; gfx_a=1;
gfx_x=gfx_y=0;
gfx_rectto(gfx_w,gfx_h);

gfx_r=gfx_g=gfx_b=0.8; gfx_a=1;
gfx_x=gfxSize/2; gfx_y=0;
gfx_lineto(gfxSize/2,gfxSize,0);
gfx_x=0; gfx_y=gfxSize/2;
gfx_lineto(gfxSize,gfxSize/2,0);

gfx_x = gfxSize-20; gfx_y = gfxSize/2;
gfx_drawchar($'I');
gfx_drawchar($'N');

gfx_x = gfxSize/2+2; gfx_y = 0;
gfx_drawchar($'O');
gfx_drawchar($'U');
gfx_drawchar($'T');

slider1 ? (
  gfx_r=0.5; gfx_g=1; gfx_b=0; gfx_a=1;
  gfx_x=0; gfx_y=gfxSize;
  x = -1;
  while(
    //y = -sign(x)*pow(abs(x),2); // pow(abs(x-1),1.5)-1; //-sign(x)*pow(abs(x),trsh)*slider;
    y = y < 0 
      ? -sign(x) * (1 - pow(abs(1-x*sign(x)),trsh*slider3*(1-slider4))) 
      : -sign(x) * (1 - pow(abs(1-x*sign(x)),trsh*(1-slider4))) ;
//      : -sign(x) * pow(abs(x),trsh) ;
    gfx_lineto(x*gfxSize/2+gfxSize/2,y*gfxSize/2+gfxSize/2,1);
    (x+=0.01) <= 1;
  );
//  gfx_lineto(gfxSize,0,1);
):(
  gfx_r=0.5; gfx_g=1; gfx_b=0; gfx_a=1;
  gfx_x=0; gfx_y=gfxSize;
  gfx_lineto(gfxSize,0,1);
);
