/*
Image

Stereo image adjuster and MS matrix.
Allows the level and pan of mono and stereo components to be adjusted separately,
or components to be separated for individual processing before recombining with a second Image plug-in.

Mode	SM->LR   -   decode from MS (input channels reversed)
	MS->LR   -   decode from MS
	LR->LR    -   stereo image adjustment
	LR->MS   -   encode to MS

S Width	Stereo width (level of stereo component)
S Pan	Stereo image "skew"
M Level	Center "depth"
M Pan	Center pan
Output	Level trim (a 6dB correction may be required for some MS encoded material)
*/

slider1:2<0,3,1{SM to LR,MS to LR,LR to LR,LR to MS}>mode
slider2:0.75<0,1,0.01>s width
slider3:0.5<0,1,0.01>s pan
slider4:0.75<0,1,0.01>m level
slider5:0.5<0,1,0.01>m pan
slider6:0.5<0,1,0.01>output

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

@slider
fParam2 = slider2; // width
fParam3 = slider3; // skew
fParam4 = slider4; // centre
fParam5 = slider5; // balance
fParam6 = slider6; // output

w = 4 * fParam2 - 2;	// width
k = 2 * fParam3;		// balance
c = 4 * fParam4 - 2;	// depth
b = 2 * fParam5;		// pan
g = pow(10, 2 * fParam6 - 1);

slider1 == 0 ? ( // SM->LR
r2l =  g * c * (2 - b);
l2l =  g * w * (2 - k);
r2r =  g * c * b;
l2r = -g * w * k;
);

slider1 == 1 ? ( // MS->LR
l2l =  g * c * (2 - b);
r2l =  g * w * (2 - k);
l2r =  g * c * b;
r2r = -g * w * k;
);

slider1 == 2 ? ( // LR->LR
g *= 0.5;
l2l = g * (c * (2 - b) + w * (2 - k));
r2l = g * (c * (2 - b) - w * (2 - k));
l2r = g * (c * b - w * k);
r2r = g * (c * b + w * k);
);

slider1 == 3 ? ( // LR->MS
g *= 0.5;
l2l =  g * (2 - b) * (2 - k);
r2l =  g * (2 - b) * k;
l2r = -g * b * (2 - k);
r2r =  g * b * k;
);

@sample
a = spl0;
b = spl1;

d = r2r*b + l2r*a;
c = l2l*a + r2l*b;

spl0 = c;
spl1 = d;

@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",(400 * fParam2 - 200) );
gfx_x =70; gfx_y =10;  gfx_drawchar($'%');
gfx_x =140; gfx_y =10;  gfx_printf("S Width");

gfx_x =20; gfx_y =30;  gfx_printf("%.0f",(200 * fParam3 - 100) );
gfx_x =70; gfx_y =30;  gfx_printf("L <> R");
gfx_x =140; gfx_y =30;  gfx_printf("S Pan");

gfx_x =20; gfx_y =50;  gfx_printf("%.0f",(400 * fParam4 - 200) );
gfx_x =70; gfx_y =50;  gfx_drawchar($'%');
gfx_x =140; gfx_y =50;  gfx_printf("M Level");

gfx_x =20; gfx_y =70;  gfx_printf("%.0f",(200 * fParam5 - 100) );
gfx_x =70; gfx_y =70;  gfx_printf("L <> R");
gfx_x =140; gfx_y =70;  gfx_printf("M Pan");

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