// (C) 2023, Helmut Keller

// 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. 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:Vol-Wah
tags: Volume Wah-Wah
author: Helumut Keller

slider1:position= 	0.5 <0, 1, 0.001> 			Position 
slider2:mode= 		0 <0, 1, 1 {Volume, Wah-Wah}> 	Mode

slider5:eV= 		2.0 <1.0, 4.00, 0.1> 			Volume Exponent

slider7:fmin= 		400 <200, 800, 5>  			Min.Frequency [Hz]
slider8:fmax= 		2500 <1250, 5000, 50>  			Max.Frequency [Hz]

slider10:Q_1k=		4 <0.5, 20, 0.1>  			Q 
slider11:LB= 		-60 <-60, 30, 0.5> 			Bass [dB]
slider12:LM= 		20 <-60, 30, 0.5> 			Mid [dB]
slider13:LT=	 	-60 <-60, 30,0.5> 			Treble [dB]

slider15:eQ= 		-1.1 <-2, 2, 0.05> 			Q Exponent
slider16:eB= 		0 <-2, 2, 0.05> 				Bass Exponent
slider17:eM= 		-0.1 <-2, 2, 0.05> 			Mid Exponent
slider18:eT= 		0 <-2, 2, 0.05> 				Treble Exponent


@init

// Time constant of the  parameter smoothing:
tau = 0.010;      

// Coeficient of the parameter smoothing fiters
ksmooth = 1 / (tau*srate);

// Frequency scaling factor:

pit = 4*atan(1) / srate;


// All smoothed  coefficients, their updates  and their states:


volume = 1.0;
volume_u = 1.0;
volume_s = 1.0;

k = 0.1;
k_u = 0.1;
k_s = 0.1;

kdiv = 1/ 1.11;
kdiv_u = 1 / 1.11;
kdiv_s = 1 / 1.11;

kf = 1.1;
kf_u = 1.1;
kf_s = 1.1;

b0 = 0.0;
b0_u = 0.00;
b0_s = 0.0;

kb1 = 10.0;
kb1_u = 10.0;
kb1_s = 10.0;

b2 = 0.0;
b2_u = 0.00;
b2_s = 0.0;

// Filter states of the state-variable filters (left and right channel)

s1l = 0.0;
s2l = 0.0;

s1r = 0.0;
s2r = 0.0;


@slider

mode == 0 ?
(
	volume_u =  position^eV;
):
(    
	// Parameters of the analog prototype filter:

	f = fmin * exp(position*log(fmax/fmin));

	f_kHz = f /1000;
	
	Q = Q_1k * f_khz ^ eQ;	
	LT == -60 ? b0_1k = 0 : b0_1k = 10^(LT*0.05);
	LM == -60 ? b1_1k = 0 : b1_1k = 10^(LM*0.05);
	LB == -60 ? b2_1k = 0 : b2_1k = 10^(LB*0.05);
	
	b0_u = b0_1k * f_kHz ^ eT;
	b1 = b1_1k * f_kHz ^ eM;
	b2_u = b2_1k * f_kHz ^ eB;
	
	// Prewarping of f and Q

	fw = f*tan(pit*f)/(pit*f);
	aux= pit *f /sin(2*pit*f) * log( (sqrt(1+4*Q*Q)+1) / (sqrt(1+4*Q*Q)-1) );
	kqw = exp(aux)-exp(-aux);	
	
	// Parameters of the digital state-variable filter:

	k_u = pit * fw;
	kdiv_u =  1 / ( 1 + k_u * ( k_u + kqw));
	kf_u  = kqw + k_u;
	kb1_u = b1 * kqw;	
)


@sample

mode == 0 ? 
(
	// The parameter smoothing filter:
	
	volume = ksmooth * (volume_u - volume_s) + volume_s;
     	volume_s = volume;
	
	// The volume control:

     	spl0 = volume * spl0;
	
     	spl1 = volume * spl1;
	
): 
(
	// The parameter smoothing filters:
	
	k = ksmooth * (k_u - k_s) + k_s;
	k_s = k;

	kdiv = ksmooth * (kdiv_u - kdiv_s) + kdiv_s;
	kdiv_s = kdiv;

	kf = ksmooth * (kf_u - kf_s) + kf_s;
	kf_s = kf;

	b0 = ksmooth * (b0_u - b0_s) + b0_s;
	b0_s = b0;

	kb1 = ksmooth * (kb1_u - kb1_s) + kb1_s;
	kb1_s = kb1;

	b2 = ksmooth * (b2_u - b2_s) + b2_s;
	b2_s = b2;
 
	// The state-variable filters:	
	  
	hpl = kdiv * (spl0 - kf * s1l - s2l);
	aux = k * hpl;
	bpl = aux + s1l;
	s1l = aux + bpl;
	aux = k * bpl;
	lpl = aux + s2l;
	s2l = aux + lpl;
	spl0 = b0 * hpl + kb1 * bpl + b2 * lpl;
	
	hpr = kdiv * (spl1 - kf * s1r - s2r);
	aux = k * hpr;
	bpr = aux + s1r;
	s1r = aux + bpr;
	aux = k * bpr;
	lpr = aux + s2r;
	s2r = aux + lpr;
	spl1 = b0 * hpr +  kb1 * bpr + b2 * lpr;	
);

