esa es una version que testeamos junto a la gente de Sudala.cl (pablo y nolo)
muchas gracias a ellos por la onda para probarlo
aca va un pic del main patch de maxmsp

y aca va el source de processing del control de la bandeja
import oscP5.*;
import netP5.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
int ww=800;
int hh=600;
int discoX=400;
int discoY=400;
float rotaDisco=0;
float SDJlengthsample=0;
float SDJVUELTA=1818.18;
float SDJval=0;
float SDJval2 = 0;
float SDJval2rad=0;
float SDJval2radT=0;
float SDJlastval=0;
float SDJvalT=0;
float SDJvalFrame=0;
float SDJvalFrameT=0;
float SDJgradT=0;
float SDJrota=0;
float SDJrotaAnt=0;
int SDJmodostop=0;
float SDJinercia=0.0;
float SDJinercia2=0.0;
int SDJmouseDown=0;
void setup(){
size(ww,hh,P3D);
oscP5 = new OscP5(this,12000);
myRemoteLocation = new NetAddress("127.0.0.1",13000);
OscMessage myMessage = new OscMessage("/sDJ/requestData");
myMessage.add(1);
oscP5.send(myMessage, myRemoteLocation);
}
void draw(){
background(50);
if(mousePressed){
if(SDJmouseDown==0){
SDJval2radT = atan2(mouseX-discoX,mouseY-discoY);
SDJgradT=SDJval2radT;
SDJmouseDown=1;
if(SDJmodostop==0){
SDJrota=0;
SDJrotaAnt=0;
SDJinercia=0;
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(1);
oscP5.send(myMessage, myRemoteLocation);
}
}else{
float gg=atan2(mouseX-discoX,mouseY-discoY);
float grad1=(gg-SDJgradT)%(PI);
if(grad1>PI/2.0){
grad1-=PI;
}
if(grad1<-PI/2.0){
grad1+=PI;
}
SDJgradT=gg;
SDJrota+=grad1;
float vv=SDJrota;//(rota-val2radT);
SDJval2rad = SDJvalT-vv;
//if(grad1!=0){
SDJinercia=grad1;
//}
float ff=(((((-vv*180.0/PI)+180.0)/360.0)-0.5)*SDJVUELTA);
float SDJval2 = SDJvalFrameT+ff;
if(SDJval2<0){
SDJval2=SDJlengthsample-(abs(SDJval2)%SDJlengthsample);
}
//println(SDJlengthsample);
OscMessage myMessage = new OscMessage("/sDJ/newPos");
myMessage.add(SDJval2);
oscP5.send(myMessage, myRemoteLocation);
}
}else{
if(SDJmouseDown==1){
if(SDJmodostop==0){
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(0);
oscP5.send(myMessage, myRemoteLocation);
}
SDJmouseDown=0;
}
}
pushMatrix();
ellipseMode(CENTER);
translate(discoX,discoY,0);
if(SDJmouseDown==0 && SDJmodostop==0){
SDJval2=SDJvalFrame;
SDJvalFrameT=SDJvalFrame;
SDJval2rad=SDJval;
SDJvalT=SDJval;
SDJinercia*=0.9;
OscMessage myMessage = new OscMessage("/sDJ/inercia");
myMessage.add(SDJinercia);
oscP5.send(myMessage, myRemoteLocation);
rotateZ(SDJval);
}else{
if(SDJmouseDown==0){
makeInercia();
}
rotateZ(SDJval2rad);
}
fill(255);
ellipse(0,0,300,300);
translate(0,130,0);
fill(100);
ellipse(0,0,30,30);
popMatrix();
rotaDisco+=0.1;
}
void makeInercia(){
SDJrota+=SDJinercia;
float vv=SDJrota;
SDJval2rad = SDJvalT-vv;
float ff=(((((-vv*180.0/PI)+180.0)/360.0)-0.5)*SDJVUELTA);
SDJval2 = SDJvalFrameT+ff;
if(SDJval2<0){
SDJval2=SDJval2+SDJlengthsample;
}
SDJinercia*=0.95;
OscMessage myMessage = new OscMessage("/sDJ/newPos");
myMessage.add(SDJval2);
oscP5.send(myMessage, myRemoteLocation);
}
void oscEvent(OscMessage theOscMessage) {
/* print the address pattern and the typetag of the received OscMessage */
//print("### received an osc message.");
//print(" addrpattern: "+theOscMessage.addrPattern());
//println(" typetag: "+theOscMessage.typetag());
if(theOscMessage.checkAddrPattern("/sDJ/rotadisco")){
float v=theOscMessage.get(0).floatValue();
//println(v);
SDJval = (((v%SDJVUELTA)/SDJVUELTA)*360.0)*PI/180;
SDJvalFrame=v;
}
if(theOscMessage.checkAddrPattern("/sDJ/setlength")){
float v=theOscMessage.get(0).floatValue();
SDJlengthsample=v;
}
if(theOscMessage.checkAddrPattern("/sDJ/setstop")){
SDJmodostop=1;
SDJrota=0;
SDJrotaAnt=0;
SDJinercia=0;
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(1);
oscP5.send(myMessage, myRemoteLocation);
}
if(theOscMessage.checkAddrPattern("/sDJ/setplay")){
SDJmodostop=0;
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(0);
oscP5.send(myMessage, myRemoteLocation);
}
}