annotate src/melodyTriangle.cpp @ 12:317637282293

Compressed keyboard handling code, added calibration key 'c'.
author samer
date Mon, 30 Jan 2012 00:00:15 +0000
parents 066104f9a2e2
children 9e31c0507e65
rev   line source
hekeus@6 1 #include "melodyTriangle.h"
hekeus@6 2 #include <GLUT/GLUT.h>
hekeus@6 3
samer@10 4 #define BUFFER_ZONE 50 // have to drag this far to snap out of triange.
hekeus@6 5 /*
hekeus@6 6 /birth id
hekeus@6 7 /death id
hekeus@6 8 /start id
hekeus@6 9 /stop id
hekeus@6 10 /track id x y left right top bottom area
hekeus@6 11 /tempo
hekeus@6 12
hekeus@6 13
hekeus@6 14 */
hekeus@8 15 melodyTriangle::melodyTriangle(const char *host, int port, int numVoices, bool enableKeys,int voiceIdOffset,int receivePort){
hekeus@8 16 printf("in constructor: %s %i %i %i %i %i\n",host,port,numVoices,enableKeys,voiceIdOffset,receivePort);
hekeus@6 17 this->numVoices=numVoices;
hekeus@6 18 this->enableKeys=enableKeys;
hekeus@6 19 this->voiceIdOffset=voiceIdOffset;
hekeus@6 20 //voices=*Voice[numVoices];
hekeus@6 21 sender.setup( host,port );
hekeus@8 22 receiver.setup( receivePort );
hekeus@8 23
hekeus@6 24 }
hekeus@6 25
hekeus@6 26 //--------------------------------------------------------------
hekeus@6 27 void melodyTriangle::setup(){
hekeus@6 28 //voices = new Voice[NUMVOICES];
hekeus@6 29
hekeus@6 30 ofSetCircleResolution(100);
hekeus@6 31 ofBackground(0,0,0);
hekeus@6 32 ofSetWindowTitle("Melody Triangle");
hekeus@6 33 triangleHeight=ofGetHeight()*0.75;
hekeus@6 34 ofSetFrameRate(40); // if vertical sync is off, we can go a bit fast... this caps the framerate at 60fps.
hekeus@6 35 ofEnableSmoothing();
hekeus@6 36 x1=ofGetWidth()/2;
hekeus@6 37 y1=(ofGetHeight()-triangleHeight)/2;
hekeus@6 38 x2=ofGetWidth()/2-triangleHeight/sqrt(3);
hekeus@6 39 y2=ofGetHeight()-(ofGetHeight()-triangleHeight)/2;
hekeus@6 40 x3=ofGetWidth()/2+triangleHeight/sqrt(3);
hekeus@6 41 y3=y2;
hekeus@6 42
samer@12 43 sendCalibrate();
samer@12 44 for (int i=0;i<numVoices;i++){
samer@12 45 voices[i]=new Voice(i+1+voiceIdOffset,x2+15,y1+20+i*30);
samer@12 46 }
samer@12 47 voiceGrabbed=-1;
samer@12 48 }
samer@12 49
samer@12 50 void melodyTriangle::sendCalibrate(){
hekeus@6 51 ofxOscMessage m;
hekeus@6 52 m.setAddress( "/calibrate" );
hekeus@6 53 m.addIntArg( x1 );
hekeus@6 54 m.addIntArg( y1 );
hekeus@6 55 m.addIntArg( x2 );
hekeus@6 56 m.addIntArg( y2 );
hekeus@6 57 m.addIntArg( x3 );
hekeus@6 58 m.addIntArg( y3 );
hekeus@6 59 sender.sendMessage( m );
hekeus@6 60 printf("sent /calibrate %i %i %i %i %i %i\n",x1,y1,x2,y2,x3,y3);
samer@12 61 }
samer@12 62
samer@12 63 void melodyTriangle::sendPeriod(int id, int num, int den){
samer@12 64 ofxOscMessage m;
samer@12 65 m.setAddress("/period");
samer@12 66 m.addIntArg(id);
samer@12 67 m.addIntArg(num);
samer@12 68 m.addIntArg(den);
samer@12 69 sender.sendMessage(m);
samer@12 70 printf("sent /period %i %i %i\n",id,num,den);
samer@12 71 }
samer@12 72
samer@12 73 void melodyTriangle::sendShift(int id, int num, int den){
samer@12 74 ofxOscMessage m;
samer@12 75 m.setAddress("/shift");
samer@12 76 m.addIntArg(id);
samer@12 77 m.addIntArg(num);
samer@12 78 m.addIntArg(den);
samer@12 79 sender.sendMessage(m);
samer@12 80 printf("sent /shift %i %i %i\n",id,num,den);
samer@12 81 }
samer@12 82
samer@12 83 void melodyTriangle::sendOctave(int id, int oct){
samer@12 84 ofxOscMessage m;
samer@12 85 m.setAddress("/octave");
samer@12 86 m.addIntArg(id);
samer@12 87 m.addIntArg(oct);
samer@12 88 sender.sendMessage(m);
samer@12 89 printf("sent /octave %i %i\n",id,oct);
hekeus@6 90 }
hekeus@6 91
hekeus@6 92 //--------------------------------------------------------------
hekeus@6 93 void melodyTriangle::update(){
hekeus@8 94 while( receiver.hasWaitingMessages() )
hekeus@8 95 {
hekeus@8 96 // get the next message
hekeus@8 97 ofxOscMessage m;
hekeus@8 98 receiver.getNextMessage( &m );
hekeus@8 99 string msg_string;
hekeus@8 100 msg_string = m.getAddress();
hekeus@8 101 msg_string += ": ";
hekeus@8 102 for ( int i=0; i<m.getNumArgs(); i++ )
hekeus@8 103 {
hekeus@8 104 // get the argument type
hekeus@8 105 msg_string += m.getArgTypeName( i );
hekeus@8 106 msg_string += ":";
hekeus@8 107 // display the argument - make sure we get the right type
hekeus@8 108 if( m.getArgType( i ) == OFXOSC_TYPE_INT32 )
hekeus@8 109 msg_string += ofToString( m.getArgAsInt32( i ) );
hekeus@8 110 else if( m.getArgType( i ) == OFXOSC_TYPE_FLOAT )
hekeus@8 111 msg_string += ofToString( m.getArgAsFloat( i ) );
hekeus@8 112 else if( m.getArgType( i ) == OFXOSC_TYPE_STRING )
hekeus@8 113 msg_string += m.getArgAsString( i );
hekeus@8 114 else
hekeus@8 115 msg_string += "unknown";
hekeus@8 116 }
hekeus@8 117 cout<< msg_string << "\n";
hekeus@8 118
hekeus@8 119 }
hekeus@6 120 }
hekeus@6 121
hekeus@6 122 bool melodyTriangle::isInTriangle(int x, int y){
hekeus@6 123 if (x>x2 && x<x3 && y>y1 && y<y2){
hekeus@6 124 //printf("in bounding box\n");
hekeus@6 125 float dx=abs(x-x1);
hekeus@6 126 float dy=abs(y-y1);
hekeus@6 127 //printf("tan(30)- dx/dy: %f\n",tan(30*PI/180)-dx/dy);
hekeus@6 128
hekeus@6 129 if (dx/dy < tan(30*PI/180)){
hekeus@6 130
hekeus@6 131 //printf("in triangle \n");
hekeus@6 132 return true;
hekeus@6 133 }else {
hekeus@6 134 //printf("not in triangle \n");
hekeus@6 135 return false;
hekeus@6 136 }
hekeus@6 137
hekeus@6 138 }else{
hekeus@6 139 //printf("not in bounding box \n");
hekeus@6 140 return false;
hekeus@6 141 }
hekeus@6 142 }
hekeus@6 143
hekeus@6 144 void melodyTriangle::sendStatus(Voice v){
hekeus@6 145
hekeus@6 146 ofxOscMessage m;
hekeus@6 147 ///track id x y left right top bottom area
hekeus@6 148 m.setAddress( "/track2d" );
hekeus@6 149 m.addIntArg( v.id );
hekeus@6 150 m.addIntArg( v.posx );
hekeus@6 151 m.addIntArg( v.posy );
hekeus@6 152 sender.sendMessage( m );
hekeus@6 153 printf("sent - /track2d %i %i %i\n",v.id,v.posx,v.posy);
hekeus@6 154
hekeus@6 155 }
hekeus@6 156
hekeus@6 157 //--------------------------------------------------------------
hekeus@6 158 void melodyTriangle::draw(){
samer@10 159 bool constrained=false;
hekeus@6 160
hekeus@6 161 bool sendStart=false;
hekeus@6 162 if (voiceGrabbed!=-1){
hekeus@6 163 if (mouseX!=(*voices[voiceGrabbed]).posx || mouseY!=(*voices[voiceGrabbed]).posy){
hekeus@6 164 //(*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 165 //(*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 166 if ((*voices[voiceGrabbed]).inTriangle && !isInTriangle(mouseX,mouseY)){
hekeus@6 167 ///death id
hekeus@6 168
samer@10 169 if (ofDist((*voices[voiceGrabbed]).posx, (*voices[voiceGrabbed]).posy, mouseX, mouseY)
samer@10 170 > BUFFER_ZONE) {
hekeus@6 171
hekeus@7 172
samer@10 173 ofxOscMessage m;
samer@10 174 ///track id x y left right top bottom area
samer@10 175 m.setAddress( "/death" );
samer@10 176 m.addIntArg( (*voices[voiceGrabbed]).id );
samer@10 177 sender.sendMessage( m );
hekeus@6 178
samer@10 179 printf("sent /death %i \n",(*voices[voiceGrabbed]).id);
samer@10 180 (*voices[voiceGrabbed]).posx=mouseX;
samer@10 181 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 182 } else {
hekeus@6 183 //printf("e");
hekeus@6 184 //On Edge
samer@10 185 constrained=true;
hekeus@6 186 }
hekeus@6 187
hekeus@6 188 }else{
hekeus@6 189 (*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 190 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 191 //(*voices[voiceGrabbed]).posx=(*voices[voiceGrabbed]).posx*0.9+mouseX*0.1;
hekeus@6 192 //(*voices[voiceGrabbed]).posy=(*voices[voiceGrabbed]).posy*0.9+mouseY*0.1;
hekeus@6 193
hekeus@6 194
hekeus@6 195 }
hekeus@6 196 if (!(*voices[voiceGrabbed]).inTriangle && isInTriangle(mouseX,mouseY)){
hekeus@6 197 //birth id
hekeus@6 198
hekeus@6 199 ofxOscMessage m;
hekeus@6 200 ///track id x y left right top bottom area
hekeus@6 201 m.setAddress( "/birth" );
hekeus@6 202 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 203 sender.sendMessage( m );
hekeus@6 204
hekeus@6 205 printf("sent /birth %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 206 sendStart=true;
hekeus@6 207 }
hekeus@6 208
hekeus@6 209
hekeus@6 210 //(*voices[voiceGrabbed]).inTriangle = isInTriangle(mouseX,mouseY);
hekeus@6 211
hekeus@6 212 (*voices[voiceGrabbed]).inTriangle = isInTriangle((*voices[voiceGrabbed]).posx,(*voices[voiceGrabbed]).posy);
hekeus@6 213
hekeus@6 214 if ((*voices[voiceGrabbed]).inTriangle){
hekeus@6 215 sendStatus(*voices[voiceGrabbed]);
hekeus@6 216 if (sendStart){
hekeus@6 217 if ((*voices[voiceGrabbed]).isActive){
hekeus@6 218 ofxOscMessage m;
hekeus@6 219 ///track id x y left right top bottom area
hekeus@6 220 m.setAddress( "/start" );
hekeus@6 221 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 222 sender.sendMessage( m );
hekeus@6 223 printf("sent /start %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 224 }
hekeus@6 225 }
hekeus@6 226 }
hekeus@6 227
hekeus@6 228 }
hekeus@6 229 };
samer@10 230
samer@10 231 //let's draw our triangle
samer@11 232 ofSetLineWidth(2);
samer@12 233 ofSetColor(96,96,96);
samer@10 234 ofFill();
samer@10 235 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@12 236 if (constrained) ofSetColor(255,96,96);
samer@10 237
samer@10 238 // draw smooth edge, brighter if a token is constrained
samer@10 239 ofNoFill();
samer@10 240 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 241
hekeus@6 242 for (int i=0; i<numVoices; i++){
hekeus@6 243 (*voices[i]).draw();
hekeus@6 244 }
hekeus@6 245
hekeus@6 246
hekeus@6 247 }
hekeus@6 248
hekeus@6 249
hekeus@6 250 //--------------------------------------------------------------
hekeus@6 251 void melodyTriangle::keyPressed (int key){
hekeus@6 252 //printf("key %i",key);
hekeus@6 253 if (enableKeys){
samer@12 254 switch (key) {
samer@12 255 case ' ': {
samer@12 256 ofxOscMessage m;
samer@12 257 m.setAddress( "/marker" );
samer@12 258 sender.sendMessage(m);
samer@12 259 printf("sent /marker\n");
samer@12 260 break;
samer@12 261 }
samer@12 262
samer@12 263 case '1':
samer@12 264 case '2':
samer@12 265 case '3':
samer@12 266 case '4': {
samer@12 267 int tempo=30 + 30*(key-'1');
samer@12 268 ofxOscMessage m;
samer@12 269 m.setAddress( "/tempo" );
samer@12 270 m.addIntArg(tempo);
samer@12 271 sender.sendMessage( m );
samer@12 272 printf("sent /tempo %d\n",tempo);
samer@12 273 }
samer@12 274 break;
samer@12 275
samer@12 276 case 'c': sendCalibrate(); break;
samer@12 277
samer@12 278 default: { // otherwise, send key to all active voices
samer@12 279 for (int i=0; i<numVoices; i++){
samer@12 280 if (voices[i]->isInVoice(mouseX,mouseY)){
samer@12 281 Voice *v=voices[i];
samer@12 282 switch (key) {
samer@12 283 case 'a': {
samer@12 284 ofxOscMessage m;
samer@12 285 const char *addr = v->isActive ? "/stop" : "/start";
samer@12 286 v->isActive=!v->isActive;
samer@12 287 m.setAddress(addr);
samer@12 288 m.addIntArg(v->id );
samer@12 289 sender.sendMessage( m );
samer@12 290 printf("sent %s %i \n",addr,v->id);
samer@12 291 break;
samer@12 292 }
samer@12 293 case OF_KEY_LEFT: sendShift(v->id,-1,2); break;
samer@12 294 case OF_KEY_RIGHT: sendShift(v->id,1,2); break;
samer@12 295 case OF_KEY_UP: sendPeriod(v->id,1,2); break;
samer@12 296 case OF_KEY_DOWN: sendPeriod(v->id,2,1); break;
samer@12 297 case '.': sendPeriod(v->id,1,3); break;
samer@12 298 case ',': sendPeriod(v->id,3,1); break;
samer@12 299 case '+': sendOctave(v->id, ++v->octave); break;
samer@12 300 case '-': sendOctave(v->id, --v->octave); break;
samer@12 301 }
hekeus@6 302 }
hekeus@6 303 }
hekeus@6 304 }
hekeus@6 305 }
hekeus@6 306 }
hekeus@6 307 }
hekeus@6 308
hekeus@6 309 //--------------------------------------------------------------
hekeus@6 310 void melodyTriangle::keyReleased (int key){
hekeus@6 311
hekeus@6 312 }
hekeus@6 313
hekeus@6 314 //--------------------------------------------------------------
hekeus@6 315 void melodyTriangle::mouseMoved(int x, int y ){
hekeus@6 316 for (int i=0; i<numVoices;i++){
hekeus@6 317 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 318 (*voices[i]).highlight=true;
hekeus@6 319 }else {
hekeus@6 320 (*voices[i]).highlight=false;
hekeus@6 321 }
hekeus@6 322
hekeus@6 323 }
hekeus@6 324
hekeus@6 325
hekeus@6 326 }
hekeus@6 327
hekeus@6 328 //--------------------------------------------------------------
hekeus@6 329 void melodyTriangle::mouseDragged(int x, int y, int button){
hekeus@6 330
hekeus@6 331 }
hekeus@6 332
hekeus@6 333 //--------------------------------------------------------------
hekeus@6 334 void melodyTriangle::mousePressed(int x, int y, int button){
hekeus@6 335
hekeus@6 336 for (int i=0; i<numVoices;i++){
hekeus@6 337 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 338 voiceGrabbed=i;
hekeus@6 339 //printf("grabbed %i",voiceGrabbed);
hekeus@6 340 }else{
hekeus@6 341 //printf("didnt grab %i",i);
hekeus@6 342 }
hekeus@6 343 }
hekeus@6 344 }
hekeus@6 345
hekeus@6 346
hekeus@6 347
hekeus@6 348 //--------------------------------------------------------------
hekeus@6 349 void melodyTriangle::mouseReleased(int x, int y, int button){
hekeus@6 350 //printf("released %i",voiceGrabbed);
hekeus@6 351 voiceGrabbed=-1;
hekeus@6 352 }
hekeus@6 353
hekeus@6 354 //--------------------------------------------------------------
hekeus@6 355 void melodyTriangle::windowResized(int w, int h){
hekeus@6 356
hekeus@6 357 }