slider1:0.4<0,8,0.1>Rate (Hz)
slider2:30<0,100,1>Width (%)
slider3:70<0,100,1>Feedback (%)
slider4:2<0,4,1{2,4,6,8,10}>Stages
slider5:0<0,7,1{Mono,Mono Minus,Mono Wet Only,Mono Wet Only Minus,Stereo,Stereo Minus,Stereo Wet Only,Stereo Wet Only Minus}>Mix Mode
slider6:240<120,600,30>Bottom Freq (Hz)
slider7:-3<-30,12,0.1>Wet (dB)
slider8:-30<-30,12,0.1>Dry (dB)
slider9:0<0,1,1{tanh,hard}>--Limit

in_pin:L in
in_pin:R in
out_pin:L out
out_pin:R out

@init
_feedbackPhase = 1;

// init the all pass line
_lx1 = _ly1 =
_lx2 = _ly2 =
_lx3 = _ly3 =
_lx4 = _ly4 = 
_lx5 = _ly5 = 
_lx6 = _ly6 =
_lx7 = _ly7 =
_lx8 = _ly8 =
_lx9 = _ly9 = 
_lx10 = _ly10 = 0;

_mixLeftWet =
_mixLeftDry =
_mixRightWet =
_mixRightDry = 0.5;

function tanh(x) 
( 
x = exp(2*x);
(x - 1) / (x + 1);
);

@slider
_paramSweepRate=slider1/10;
_paramWidth=max(min((slider2+10)/100,1.1),0.1);
_paramFeedback=max(min(slider3/100,1),0.01);
BOTTOM_FREQ=slider6;

rate = pow(10,_paramSweepRate);
rate -= 1;
rate *= 1.1;
rate += 0.1;
_sweepRate = rate;
range = _paramWidth * 10;

// freq param for equation
_wp = _minwp = ($pi * BOTTOM_FREQ) / srate;
_maxwp = ($pi * BOTTOM_FREQ * range) / srate;

// amount to multiply the freq by with each sample
_sweepFactor = pow( range, (_sweepRate / (srate / 2)) );

wet = slider7 <= -30 ? 0 : 10^(slider7/20);
dry = slider8 <= -30 ? 0 : 10^(slider8/20);

@sample
slider5 == 0 ? (
_mixLeftWet = _mixRightWet = 1;
_mixLeftDry = _mixRightDry = 1;
_feedbackPhase = 1;
);

slider5 == 1 ? (
_mixLeftWet = _mixRightWet = -1;
_mixLeftDry = _mixRightDry = 1;
_feedbackPhase = -1;
);

slider5 == 2 ? (
_mixLeftWet = _mixRightWet = 1;
_mixLeftDry = _mixRightDry = 0;
_feedbackPhase = 1;
);

slider5 == 3 ? (
_mixLeftWet = _mixRightWet = 1;
_mixLeftDry = _mixRightDry = 0;
_feedbackPhase = -1;
);

slider5 == 4 ? (
_mixLeftWet = 1;
_mixRightWet = -1;
_mixLeftDry = _mixRightDry = 1;
_feedbackPhase = 1;
);

slider5 == 5 ? (
_mixLeftWet = 1;
_mixRightWet = -1;
_mixLeftDry = _mixRightDry = 1;
_feedbackPhase = -1;
);

slider5 == 6 ? (
_mixLeftWet = 1;
_mixRightWet = -1;
_mixLeftDry = _mixRightDry = 0;
_feedbackPhase = 1;
);

slider5 == 7 ? (
_mixLeftWet = 1;
_mixRightWet = -1;
_mixLeftDry = _mixRightDry = 0;
_feedbackPhase = -1;
);

in0 = spl0;
in1 = spl1;

coef = (1 - _wp) / (1 + _wp);     		// calc coef for current freq

inval = (in0 + in1)*0.5;

slider4 == 0 ? (
inmix = inval  + tanh( _paramFeedback * _feedbackPhase * _ly2);

// run thru the all pass filters
_ly1 = coef * (_ly1 + inmix) - _lx1;		// do 1st filter
_lx1 = inmix;
_ly2 = coef * (_ly2 + _ly1) - _lx2;		// do 2nd filter
_lx2 = _ly1;
);

slider4 == 1 ? (
inmix = inval + tanh(_paramFeedback * _feedbackPhase * _ly4);

// run thru the all pass filters
_ly1 = coef * (_ly1 + inmix) - _lx1;		// do 1st filter
_lx1 = inmix;
_ly2 = coef * (_ly2 + _ly1) - _lx2;		// do 2nd filter
_lx2 = _ly1;
_ly3 = coef * (_ly3 + _ly2) - _lx3;		// do 3rd filter
_lx3 = _ly2;
_ly4 = coef * (_ly4 + _ly3) - _lx4;		// do 4th filter
_lx4 = _ly3;
);

slider4 == 2 ? (
inmix = inval + tanh(_paramFeedback * _feedbackPhase * _ly6);

// run thru the all pass filters
_ly1 = coef * (_ly1 + inmix) - _lx1;		// do 1st filter
_lx1 = inmix;
_ly2 = coef * (_ly2 + _ly1) - _lx2;		// do 2nd filter
_lx2 = _ly1;
_ly3 = coef * (_ly3 + _ly2) - _lx3;		// do 3rd filter
_lx3 = _ly2;
_ly4 = coef * (_ly4 + _ly3) - _lx4;		// do 4th filter
_lx4 = _ly3;
_ly5 = coef * (_ly5 + _ly4) - _lx5;		// do 5th filter
_lx5 = _ly4;
_ly6 = coef * (_ly6 + _ly5) - _lx6;		// do 6th filter
_lx6 = _ly5;
);

slider4 == 3 ? (
inmix = inval + tanh(_paramFeedback * _feedbackPhase * _ly8);

// run thru the all pass filters
_ly1 = coef * (_ly1 + inmix) - _lx1;		// do 1st filter
_lx1 = inmix;
_ly2 = coef * (_ly2 + _ly1) - _lx2;		// do 2nd filter
_lx2 = _ly1;
_ly3 = coef * (_ly3 + _ly2) - _lx3;		// do 3rd filter
_lx3 = _ly2;
_ly4 = coef * (_ly4 + _ly3) - _lx4;		// do 4th filter
_lx4 = _ly3;
_ly5 = coef * (_ly5 + _ly4) - _lx5;		// do 5th filter
_lx5 = _ly4;
_ly6 = coef * (_ly6 + _ly5) - _lx6;		// do 6th filter
_lx6 = _ly5;
_ly7 = coef * (_ly7 + _ly6) - _lx7;		// do 7th filter
_lx7 = _ly6;
_ly8 = coef * (_ly8 + _ly7) - _lx8;		// do 8th filter
_lx8 = _ly7;
);

slider4 == 4 ? (
inmix = inval + tanh(_paramFeedback * _feedbackPhase * _ly10);

// run thru the all pass filters
_ly1 = coef * (_ly1 + inmix) - _lx1;		// do 1st filter
_lx1 = inmix;
_ly2 = coef * (_ly2 + _ly1) - _lx2;		// do 2nd filter
_lx2 = _ly1;
_ly3 = coef * (_ly3 + _ly2) - _lx3;		// do 3rd filter
_lx3 = _ly2;
_ly4 = coef * (_ly4 + _ly3) - _lx4;		// do 4th filter
_lx4 = _ly3;
_ly5 = coef * (_ly5 + _ly4) - _lx5;		// do 5th filter
_lx5 = _ly4;
_ly6 = coef * (_ly6 + _ly5) - _lx6;		// do 6th filter
_lx6 = _ly5;
_ly7 = coef * (_ly7 + _ly6) - _lx7;		// do 7th filter
_lx7 = _ly6;
_ly8 = coef * (_ly8 + _ly7) - _lx8;		// do 8th filter
_lx8 = _ly7;
_ly9 = coef * (_ly9 + _ly8) - _lx9;		// do 9th filter
_lx9 = _ly8;
_ly10 = coef * (_ly10 + _ly9) - _lx10;		// do 10th filter
_lx10 = _ly9;
);

// develop output mix
slider9 ? (
out0 = min(max(_mixLeftDry * inval + _mixLeftWet * _ly2,-0.99), 0.99);
out1 = min(max(_mixRightDry * inval + _mixRightWet * _ly2,-0.99), 0.99);
):(
out0 = tanh(_mixLeftDry * inval + _mixLeftWet * _ly2);
out1 = tanh(_mixRightDry * inval + _mixRightWet * _ly2);
);

// step the sweep
_wp *= _sweepFactor;                       	// adjust freq of filters
(_wp > _maxwp || _wp < _minwp) ? (	// max or min ?
_sweepFactor = 1 / _sweepFactor;		// reverse
);

spl0 = in0*dry + out0*wet;
spl1 = in1*dry + out1*wet;
