// left mouse = move ball
// right mouse = reset to center
// ctrl + left mouse = X-axis only
// alt + left mouse = Y-axis only

// use with MIDItoReaControlPath

slider1:0<-1,1,0.001>--X
slider2:0<-1,1,0.001>--Y
slider3:1<1,16,1>output Channel X
slider4:14<1,119,1>output CC X
slider5:1<1,16,1>output Channel Y
slider6:15<1,119,1>output CC Y
slider7:0<0,2,1{Off,Send X (Channel+CC),Send Y (Channel+CC)}>learn

in_pin:none
out_pin:none

@init
ext_noinit = 1;

xvalue = 63;
yvalue = 63;

CC_MESG_MIN = 176;
BYTE_SIZE = 256;
offset = 0;
click_onx = 0;
click_ony = 0;
last_xvalue = 0;
last_yvalue = 0;
OFF = 0;
CC = 11;

@slider
xchannel = slider3-1;
xCC = slider4;
(xvalue != last_xvalue) ? click_onx = 1;

ychannel = slider5-1;
yCC = slider6;
(yvalue != last_yvalue) ? click_ony = 1;

@block
click_onx ? (
// send the message
xvalue = tmpA;
msg1 = xchannel + CC_MESG_MIN;
msg23 = xCC + (xvalue * BYTE_SIZE );
midisend( offset, msg1, msg23 );

// clean up
click_onx = 0;
last_xvalue = xvalue;
);

click_ony ? (
// send the message
yvalue = tmpB;
msg1 = ychannel + CC_MESG_MIN;
msg23 = yCC + (yvalue * BYTE_SIZE );
midisend( offset, msg1, msg23 );

// clean up
click_ony = 0;
last_yvalue = yvalue;
);

slider7 == 1 ? (
msg1 = xchannel + (CC * 16);
CC_num = xCC;
CC_data = 64;
msg23 = CC_num | (CC_data*256);
midisend(mpos, msg1, msg23);
count +=1;
);
count >= 1 ? (
count = 0;
slider7 = OFF;
sliderchange(-1);
);

slider7 == 2 ? (
msg1 = ychannel + (CC * 16);
CC_num = yCC;
CC_data = 64;
msg23 = CC_num | (CC_data*256);
midisend(mpos, msg1, msg23);
count +=1;
);
count >= 1 ? (
count = 0;
slider7 = OFF;
sliderchange(-1);
);

@gfx 500 500
gfx_getchar();

gCenterX = gfx_w * 0.5;
gCenterY = gfx_h * 0.5;

(mouse_cap == 1) ? (
slider1 = (mouse_x - gCenterX) / gCenterX;
slider2 = -(mouse_y - gCenterY) / gCenterY;
click_onx = 1;
click_ony = 1;
);
(mouse_cap == 2) ? (
slider1 = 0;
slider2 = 0;
click_onx = 1;
click_ony = 1;
);
(mouse_cap == 5) ? (
slider1 = (mouse_x - gCenterX) / gCenterX;
click_onx = 1;
click_ony = 0;
);
(mouse_cap == 17) ? (
slider2 = -(mouse_y - gCenterY) / gCenterY;
click_onx = 0;
click_ony = 1;
);
(mouse_cap == 0) ? (
click_onx = 0;
click_ony = 0;
);

slider1 = min(max(slider1,-1),1);
slider2 = min(max(slider2,-1),1);
tmpA = floor((slider1+1)*63.5);
tmpB = floor((slider2+1)*63.5);
slider_automate(slider1);
slider_automate(slider2);

// Draw readout
font_size = 50;
gfx_setfont(1, "Lucida Sans Unicode", font_size);
gfx_r=1; gfx_g=0.8; gfx_b=0.2; gfx_a=0.5;
gfx_x = gCenterX-floor(font_size/2);
gfx_y = gCenterY-floor(font_size/2)+25;
gfx_drawnumber(tmpA,0);
gfx_x = gCenterX-floor(font_size/2);
gfx_y = gCenterY-floor(font_size/2)-25;
gfx_drawnumber(tmpB,0);

// Draw circle
gfx_r=0.8; gfx_g=0.2; gfx_b=0.2; gfx_a=1;
gfx_circle((slider1+1)*gCenterX,(-slider2+1)*gCenterY,20,1,1);
