slider1:1<0,8,0.1>Rate (Hz)
slider2:15<0,100,1>Width (%)
slider3:75<0,100,1>Delay (ms)
slider4:0<0,3,1{Mono,Mono Wet Only,Stereo,Stereo Wet Only}>Mix Mode
slider5:-3<-30,12,0.1>Wet (dB)
slider6:-30<-30,12,0.1>Dry (dB)
slider7:0<0,1,1{tanh,hard}>--Limit

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

@init
_sweepSamples = 0; // sweep width in # of samples
_fp = 0; // fill/write pointer
_sweep = 0;

outval = 0; // most recent output value (for feedback)

_mixLeftWet =
_mixLeftDry =
_mixRightWet =
_mixRightDry = 0.5;

BSZ = 8192; // ~0.2*srate
//buffer = 128;
//memset(buffer, 0, BSZ);

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

@slider
_paramSweepRate=slider1/10;
_paramWidth=slider2/100;
_paramDelay=slider3/100;

// rate , map into param onto desired sweep range with log curve
_sweepRate = pow(10,_paramSweepRate);
_sweepRate -= 1;
_sweepRate *= 1.1;
_sweepRate += 0.1;

// width , map so that we can spec between 0ms and 50ms
_sweepSamples = ceil(_paramWidth * 0.05 * srate);

// delay
delay = pow(10, _paramDelay * 2)/1000; // map logarithmically and convert to seconds
_delaySamples = ceil(delay * srate);

// sweep
_step = (_sweepSamples * 2 * _sweepRate) / srate;

// calc min and max sweep now
_minSweepSamples = _delaySamples;
_maxSweepSamples = _delaySamples + _sweepSamples;

// set intial sweep pointer to midrange
_sweep = (_minSweepSamples + _maxSweepSamples) / 2;

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

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

slider4 == 1 ? (
_mixLeftWet = _mixRightWet = 1;
_mixLeftDry = _mixRightDry = 0;
);

slider4 == 2 ? (
_mixLeftWet = 1;
_mixRightWet = -1;
_mixLeftDry = _mixRightDry = 1;
);

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

in0 = spl0;
in1 = spl1;

inval = (in0 + in1)*0.5;

inmix = inval;

buf[buffer+_fp] = inmix;
_fp = (_fp + 1) & (BSZ-1);

outval = 0;

// build the two emptying pointers and do linear interpolation
ep = _fp - _sweep;

ep1 = ep|0;
w2 = ep-ep1;

ep1 &= (BSZ-1);
ep2 = ep1 + 1;
ep2 &= (BSZ-1);
w1 = 1 - w2;
outval = buf[buffer+ep1] * w1 + buf[buffer+ep2] * w2;

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

// increment the sweep
_sweep += _step;
( _sweep >= _maxSweepSamples || _sweep <= _minSweepSamples ) ? (
_step = -_step;
);

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