/*
Ring Modulator

Simple ring modulator with sine-wave oscillator.

Frequency	Set oscillator frequency in 100Hz steps
Fine		Oscillator frequency fine tune
Feedback		Amount of feedback for "harsh" sound

Can be used as a high-frequency enhancer for drum sounds (when mixed with the original),
adding dissonance to pitched material, and severe tremolo (at low frequency settings). 
*/

slider1:0.0625<0,1,0.00390625>frequency
slider2:0<0,1,0.01>fine
slider3:0<0,1,0.01>feedback
slider4:0.33<0,1,0.01>wet mix
slider5:0.5<0,1,0.01>output

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

@init
fPhi = 0;
twoPi = 6.2831853;

ffb = 0;
fprev = 0;

@slider
fParam1 = slider1; //0.0625=1kHz
fParam2 = slider2; //fine
fParam3 = slider3; //feedback
fParam4 = slider4; //wet mix
fParam5 = slider5; //output

fdPhi = (twoPi * 100 * (fParam2 + (160 * fParam1))/ srate);
ffb = 0.95 * fParam3;

wet = 1 - fParam4;
wet = fParam5 * (1 - wet * wet); //-3dB at 50% mix
dry = fParam5 * 2 * (1 - fParam4 * fParam4);

@sample
tp = twoPi;

p = fPhi;
dp = fdPhi;
fb = ffb;
fp = fprev;

a = spl0;
b = spl1;

g = sin(p); //instantaneous gain

//p = mod(p+dp,tp); //oscillator phase
test0 = p+dp;
test1 = (test0 / tp) |0;
test2 = test1 * tp;
p = test0 - test2;

fp =  (fb * fp + a) * g;
fp2 = (fb * fp + b) * g;

c = fp;
d = fp2;

spl0 = dry*a + wet*c;
spl1 = dry*b + wet*d;

fPhi = p;
fprev = fp;

@gfx 0 120
gfx_r=0; gfx_g=0.9; gfx_b=0; gfx_a=1;
gfx_setfont(1,"Arial", 16);

gfx_x =20; gfx_y =10;  gfx_printf("%.0f",(100 * floor(160 * fParam1)));
gfx_x =70; gfx_y =10;  gfx_printf("Hz");
gfx_x =110; gfx_y =10;  gfx_printf("Frequency");

gfx_x =20; gfx_y =30;  gfx_printf("%.0f",(100 * fParam2));
gfx_x =70; gfx_y =30;  gfx_printf("Hz");
gfx_x =110; gfx_y =30;  gfx_printf("Fine");

gfx_x =20; gfx_y =50;  gfx_printf("%.0f",(100 * fParam3));
gfx_x =70; gfx_y =50;  gfx_drawchar($'%');
gfx_x =110; gfx_y =50;  gfx_printf("Feedback");

gfx_x =20; gfx_y =70;  gfx_printf("%.0f",(100 * fParam4));
gfx_x =70; gfx_y =70;  gfx_drawchar($'%');
gfx_x =110; gfx_y =70;  gfx_printf("Wet Mix");

gfx_x =20; gfx_y =90;  gfx_printf("%.1f",(20 * log10(2 * fParam5)));
gfx_x =70; gfx_y =90;  gfx_printf("dB");
gfx_x =110; gfx_y =90;  gfx_printf("Output");
