slider1:0.5<0,1,0.01>size
slider2:0.5<0,1,0.01>feedback
slider3:0.5<0,1,0.01>hf damp
slider4:0.5<0,1,0.01>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
buf1 = 1024*1;
buf2 = 1024*2;
buf3 = 1024*3;
buf4 = 1024*4;

memset(buf1, 0, 1024*1);
memset(buf2, 0, 1024*2);
memset(buf3, 0, 1024*3);
memset(buf4, 0, 1024*4);

fil = 0;
pos = 0;

@slider
fParam0 = slider1; //size
fParam1 = slider2; //feedback
fParam2 = slider3; //hf
fParam3 = slider4; //mix
fParam4 = slider5; //output

size = 1 + 1.6 * fParam0;
fbak = 0.5 + fParam1 * 0.2;

damp = 1 - (0.05 + 0.9 * fParam2);
mix = pow(10, 2 * fParam4 - 1);
dry = mix - fParam3 * fParam3 * mix;
wet = (0.4 + 0.4) * fParam3 * mix;

@sample
f=fil;

d1 = (pos + (107 * size)) & 1023; //107
d2 = (pos + (139 * size)) & 1023; //142
d3 = (pos + (277 * size)) & 1023; //277
d4 = (pos + (379 * size)) & 1023; //379

a = spl0;
b = spl1;

f += damp * (wet * (a + b) - f); //hf damping
r = f;

t = buffer[buf1 + pos];
r -= fbak * t;
buffer[buf1 + d1] = r; //allpass
r += t;

t = buffer[buf2 + pos];
r -= fbak * t;
buffer[buf2 + d2] = r; //allpass
r += t;

t = buffer[buf3 + pos];
r -= fbak * t;
buffer[buf3 + d3] = r; //allpass
r += t;
c = dry * a + r - f; //left output

t = buffer[buf4 + pos];
r -= fbak * t;
buffer[buf4 + d4] = r; //allpass
r += t;
d = dry * b + r - f; //right output

pos+=1; pos&=1023;
d1+=1; d1&=1023;
d2+=1; d2&=1023;
d3+=1; d3&=1023;
d4+=1; d4&=1023;

spl0 = c;
spl1 = d;

(abs(f)>0.0000000001) ? ( fil=f; ):( fil=0; ); //catch denormals

@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 * fParam0 );
gfx_x =70; gfx_y =10;  gfx_drawchar($'%');
gfx_x =110; gfx_y =10;  gfx_printf("Size");

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

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

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

gfx_x =20; gfx_y =90;  gfx_printf("%.1f",40 * fParam4 - 20 );
gfx_x =70; gfx_y =90;  gfx_printf("dB");
gfx_x =110; gfx_y =90;  gfx_printf("Output");
