annotate src/melodyTriangle.cpp @ 10:a8f71b5bdb0e

Toned down colours, increased buffer zone, added visual constraint feedback.
author samer
date Fri, 27 Jan 2012 09:23:43 +0000
parents 3d9e0db254dc
children 066104f9a2e2
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
hekeus@6 43 ofxOscMessage m;
hekeus@6 44 m.setAddress( "/calibrate" );
hekeus@6 45 m.addIntArg( x1 );
hekeus@6 46 m.addIntArg( y1 );
hekeus@6 47 m.addIntArg( x2 );
hekeus@6 48 m.addIntArg( y2 );
hekeus@6 49 m.addIntArg( x3 );
hekeus@6 50 m.addIntArg( y3 );
hekeus@6 51 sender.sendMessage( m );
hekeus@6 52 printf("sent /calibrate %i %i %i %i %i %i\n",x1,y1,x2,y2,x3,y3);
hekeus@6 53
hekeus@6 54 for (int i=0;i<numVoices;i++){
hekeus@6 55
hekeus@6 56 voices[i]=new Voice(i+1+voiceIdOffset,x2+15,y1+20+i*30);
hekeus@6 57 }
hekeus@6 58 voiceGrabbed=-1;
hekeus@6 59 }
hekeus@6 60
hekeus@6 61 //--------------------------------------------------------------
hekeus@6 62 void melodyTriangle::update(){
hekeus@8 63 while( receiver.hasWaitingMessages() )
hekeus@8 64 {
hekeus@8 65 // get the next message
hekeus@8 66 ofxOscMessage m;
hekeus@8 67 receiver.getNextMessage( &m );
hekeus@8 68 string msg_string;
hekeus@8 69 msg_string = m.getAddress();
hekeus@8 70 msg_string += ": ";
hekeus@8 71 for ( int i=0; i<m.getNumArgs(); i++ )
hekeus@8 72 {
hekeus@8 73 // get the argument type
hekeus@8 74 msg_string += m.getArgTypeName( i );
hekeus@8 75 msg_string += ":";
hekeus@8 76 // display the argument - make sure we get the right type
hekeus@8 77 if( m.getArgType( i ) == OFXOSC_TYPE_INT32 )
hekeus@8 78 msg_string += ofToString( m.getArgAsInt32( i ) );
hekeus@8 79 else if( m.getArgType( i ) == OFXOSC_TYPE_FLOAT )
hekeus@8 80 msg_string += ofToString( m.getArgAsFloat( i ) );
hekeus@8 81 else if( m.getArgType( i ) == OFXOSC_TYPE_STRING )
hekeus@8 82 msg_string += m.getArgAsString( i );
hekeus@8 83 else
hekeus@8 84 msg_string += "unknown";
hekeus@8 85 }
hekeus@8 86 cout<< msg_string << "\n";
hekeus@8 87
hekeus@8 88 }
hekeus@6 89 }
hekeus@6 90
hekeus@6 91 bool melodyTriangle::isInTriangle(int x, int y){
hekeus@6 92 if (x>x2 && x<x3 && y>y1 && y<y2){
hekeus@6 93 //printf("in bounding box\n");
hekeus@6 94 float dx=abs(x-x1);
hekeus@6 95 float dy=abs(y-y1);
hekeus@6 96 //printf("tan(30)- dx/dy: %f\n",tan(30*PI/180)-dx/dy);
hekeus@6 97
hekeus@6 98 if (dx/dy < tan(30*PI/180)){
hekeus@6 99
hekeus@6 100 //printf("in triangle \n");
hekeus@6 101 return true;
hekeus@6 102 }else {
hekeus@6 103 //printf("not in triangle \n");
hekeus@6 104 return false;
hekeus@6 105 }
hekeus@6 106
hekeus@6 107 }else{
hekeus@6 108 //printf("not in bounding box \n");
hekeus@6 109 return false;
hekeus@6 110 }
hekeus@6 111 }
hekeus@6 112
hekeus@6 113 void melodyTriangle::sendStatus(Voice v){
hekeus@6 114
hekeus@6 115 ofxOscMessage m;
hekeus@6 116 ///track id x y left right top bottom area
hekeus@6 117 m.setAddress( "/track2d" );
hekeus@6 118 m.addIntArg( v.id );
hekeus@6 119 m.addIntArg( v.posx );
hekeus@6 120 m.addIntArg( v.posy );
hekeus@6 121 sender.sendMessage( m );
hekeus@6 122 printf("sent - /track2d %i %i %i\n",v.id,v.posx,v.posy);
hekeus@6 123
hekeus@6 124 }
hekeus@6 125
hekeus@6 126 //--------------------------------------------------------------
hekeus@6 127 void melodyTriangle::draw(){
samer@10 128 bool constrained=false;
hekeus@6 129
hekeus@6 130 bool sendStart=false;
hekeus@6 131 if (voiceGrabbed!=-1){
hekeus@6 132 if (mouseX!=(*voices[voiceGrabbed]).posx || mouseY!=(*voices[voiceGrabbed]).posy){
hekeus@6 133 //(*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 134 //(*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 135 if ((*voices[voiceGrabbed]).inTriangle && !isInTriangle(mouseX,mouseY)){
hekeus@6 136 ///death id
hekeus@6 137
samer@10 138 if (ofDist((*voices[voiceGrabbed]).posx, (*voices[voiceGrabbed]).posy, mouseX, mouseY)
samer@10 139 > BUFFER_ZONE) {
hekeus@6 140
hekeus@7 141
samer@10 142 ofxOscMessage m;
samer@10 143 ///track id x y left right top bottom area
samer@10 144 m.setAddress( "/death" );
samer@10 145 m.addIntArg( (*voices[voiceGrabbed]).id );
samer@10 146 sender.sendMessage( m );
hekeus@6 147
samer@10 148 printf("sent /death %i \n",(*voices[voiceGrabbed]).id);
samer@10 149 (*voices[voiceGrabbed]).posx=mouseX;
samer@10 150 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 151 } else {
hekeus@6 152 //printf("e");
hekeus@6 153 //On Edge
samer@10 154 constrained=true;
hekeus@6 155 }
hekeus@6 156
hekeus@6 157 }else{
hekeus@6 158 (*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 159 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 160 //(*voices[voiceGrabbed]).posx=(*voices[voiceGrabbed]).posx*0.9+mouseX*0.1;
hekeus@6 161 //(*voices[voiceGrabbed]).posy=(*voices[voiceGrabbed]).posy*0.9+mouseY*0.1;
hekeus@6 162
hekeus@6 163
hekeus@6 164 }
hekeus@6 165 if (!(*voices[voiceGrabbed]).inTriangle && isInTriangle(mouseX,mouseY)){
hekeus@6 166 //birth id
hekeus@6 167
hekeus@6 168 ofxOscMessage m;
hekeus@6 169 ///track id x y left right top bottom area
hekeus@6 170 m.setAddress( "/birth" );
hekeus@6 171 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 172 sender.sendMessage( m );
hekeus@6 173
hekeus@6 174 printf("sent /birth %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 175 sendStart=true;
hekeus@6 176 }
hekeus@6 177
hekeus@6 178
hekeus@6 179 //(*voices[voiceGrabbed]).inTriangle = isInTriangle(mouseX,mouseY);
hekeus@6 180
hekeus@6 181 (*voices[voiceGrabbed]).inTriangle = isInTriangle((*voices[voiceGrabbed]).posx,(*voices[voiceGrabbed]).posy);
hekeus@6 182
hekeus@6 183 if ((*voices[voiceGrabbed]).inTriangle){
hekeus@6 184 sendStatus(*voices[voiceGrabbed]);
hekeus@6 185 if (sendStart){
hekeus@6 186 if ((*voices[voiceGrabbed]).isActive){
hekeus@6 187 ofxOscMessage m;
hekeus@6 188 ///track id x y left right top bottom area
hekeus@6 189 m.setAddress( "/start" );
hekeus@6 190 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 191 sender.sendMessage( m );
hekeus@6 192 printf("sent /start %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 193 }
hekeus@6 194 }
hekeus@6 195 }
hekeus@6 196
hekeus@6 197 }
hekeus@6 198 };
samer@10 199
samer@10 200 //let's draw our triangle
samer@10 201 ofSetColor(128,128,128);
samer@10 202 ofFill();
samer@10 203 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 204 if (constrained) ofSetColor(255,128,128);
samer@10 205
samer@10 206 // draw smooth edge, brighter if a token is constrained
samer@10 207 ofNoFill();
samer@10 208 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 209
hekeus@6 210 for (int i=0; i<numVoices; i++){
hekeus@6 211 (*voices[i]).draw();
hekeus@6 212 }
hekeus@6 213
hekeus@6 214
hekeus@6 215 }
hekeus@6 216
hekeus@6 217
hekeus@6 218 //--------------------------------------------------------------
hekeus@6 219 void melodyTriangle::keyPressed (int key){
hekeus@6 220 //printf("key %i",key);
hekeus@6 221 if (enableKeys){
hekeus@6 222 if (key == 'a'){
hekeus@6 223 for (int i=0; i<numVoices; i++){
hekeus@6 224 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 225
hekeus@6 226 (*voices[i]).isActive=!(*voices[i]).isActive;
hekeus@6 227 ///start id
hekeus@6 228 ///stop id
hekeus@6 229 if ((*voices[i]).isActive){
hekeus@6 230 ofxOscMessage m;
hekeus@6 231 ///track id x y left right top bottom area
hekeus@6 232 m.setAddress( "/start" );
hekeus@6 233 m.addIntArg( (*voices[i]).id );
hekeus@6 234 sender.sendMessage( m );
hekeus@6 235 printf("sent /start %i \n",(*voices[i]).id);
hekeus@6 236 }else {
hekeus@6 237 ofxOscMessage m;
hekeus@6 238 ///track id x y left right top bottom area
hekeus@6 239 m.setAddress( "/stop" );
hekeus@6 240 m.addIntArg( (*voices[i]).id );
hekeus@6 241 sender.sendMessage( m );
hekeus@6 242 printf("sent /stop %i \n",(*voices[i]).id);
hekeus@6 243
hekeus@6 244 }
hekeus@6 245
hekeus@6 246 }
hekeus@6 247 }
hekeus@6 248 }
hekeus@6 249 if (key == OF_KEY_UP){
hekeus@6 250 for (int i=0; i<numVoices; i++){
hekeus@6 251 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 252
hekeus@6 253 ofxOscMessage m;
hekeus@6 254 ///track id x y left right top bottom area
hekeus@6 255 m.setAddress( "/period" );
hekeus@6 256 m.addIntArg( (*voices[i]).id );
hekeus@6 257 m.addIntArg(1);
hekeus@6 258 m.addIntArg(2);
hekeus@6 259 sender.sendMessage( m );
hekeus@6 260 printf("sent /period %i %i %i\n",(*voices[i]).id,1,2);
hekeus@6 261
hekeus@6 262 }
hekeus@6 263 }
hekeus@6 264 }
hekeus@6 265 if (key == OF_KEY_DOWN){
hekeus@6 266 for (int i=0; i<numVoices; i++){
hekeus@6 267 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 268 ofxOscMessage m;
hekeus@6 269 ///track id x y left right top bottom area
hekeus@6 270 m.setAddress( "/period" );
hekeus@6 271 m.addIntArg( (*voices[i]).id );
hekeus@6 272 m.addIntArg(2);
hekeus@6 273 m.addIntArg(1);
hekeus@6 274 sender.sendMessage( m );
hekeus@6 275 printf("sent /period %i %i %i\n",(*voices[i]).id,2,1);
hekeus@6 276 }
hekeus@6 277 }
hekeus@6 278 }
hekeus@6 279
hekeus@6 280 if (key == '.'){
hekeus@6 281 for (int i=0; i<numVoices; i++){
hekeus@6 282 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 283 ofxOscMessage m;
hekeus@6 284 ///track id x y left right top bottom area
hekeus@6 285 m.setAddress( "/period" );
hekeus@6 286 m.addIntArg( (*voices[i]).id );
hekeus@6 287 m.addIntArg(1);
hekeus@6 288 m.addIntArg(3);
hekeus@6 289 sender.sendMessage( m );
hekeus@6 290 printf("sent /period %i %i %i\n",(*voices[i]).id,1,3);
hekeus@6 291 }
hekeus@6 292 }
hekeus@6 293
hekeus@6 294 }
hekeus@6 295 if (key == ','){
hekeus@6 296 for (int i=0; i<numVoices; i++){
hekeus@6 297 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 298 ofxOscMessage m;
hekeus@6 299 ///track id x y left right top bottom area
hekeus@6 300 m.setAddress( "/period" );
hekeus@6 301 m.addIntArg( (*voices[i]).id );
hekeus@6 302 m.addIntArg(3);
hekeus@6 303 m.addIntArg(1);
hekeus@6 304 sender.sendMessage( m );
hekeus@6 305 printf("sent /period %i %i %i\n",(*voices[i]).id,3,1);
hekeus@6 306 }
hekeus@6 307 }
hekeus@6 308
hekeus@6 309 }
hekeus@6 310 if (key == OF_KEY_LEFT){
hekeus@6 311 for (int i=0; i<numVoices; i++){
hekeus@6 312 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 313
hekeus@6 314 ofxOscMessage m;
hekeus@6 315 ///track id x y left right top bottom area
hekeus@6 316 m.setAddress( "/shift" );
hekeus@6 317 m.addIntArg( (*voices[i]).id );
hekeus@6 318 m.addIntArg(-1);
hekeus@6 319 m.addIntArg(2);
hekeus@6 320 sender.sendMessage( m );
hekeus@6 321 printf("sent /shift %i %i %i\n",(*voices[i]).id,-1,2);
hekeus@6 322
hekeus@6 323 }
hekeus@6 324 }
hekeus@6 325 }
hekeus@6 326 if (key == OF_KEY_RIGHT){
hekeus@6 327 for (int i=0; i<numVoices; i++){
hekeus@6 328 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 329
hekeus@6 330
hekeus@6 331 ofxOscMessage m;
hekeus@6 332 ///track id x y left right top bottom area
hekeus@6 333 m.setAddress( "/shift" );
hekeus@6 334 m.addIntArg( (*voices[i]).id );
hekeus@6 335 m.addIntArg(1);
hekeus@6 336 m.addIntArg(2);
hekeus@6 337 sender.sendMessage( m );
hekeus@6 338 printf("sent /shift %i %i %i\n",(*voices[i]).id,1,2);
hekeus@6 339
hekeus@6 340 }
hekeus@6 341 }
hekeus@6 342 }
hekeus@6 343 if (key == '1'){
hekeus@6 344
hekeus@6 345 ofxOscMessage m;
hekeus@6 346 ///track id x y left right top bottom area
hekeus@6 347 m.setAddress( "/tempo" );
hekeus@6 348 m.addIntArg(30);
hekeus@6 349 sender.sendMessage( m );
hekeus@6 350 printf("sent /tempo 30\n");
hekeus@6 351
hekeus@6 352 }
hekeus@6 353 if (key == '2'){
hekeus@6 354 ofxOscMessage m;
hekeus@6 355 ///track id x y left right top bottom area
hekeus@6 356 m.setAddress( "/tempo" );
hekeus@6 357 m.addIntArg(60);
hekeus@6 358 sender.sendMessage( m );
hekeus@6 359 printf("sent /tempo 60\n");
hekeus@6 360 }
hekeus@6 361 if (key == '3'){
hekeus@6 362 ofxOscMessage m;
hekeus@6 363 ///track id x y left right top bottom area
hekeus@6 364 m.setAddress( "/tempo" );
hekeus@6 365 m.addIntArg(90);
hekeus@6 366 sender.sendMessage( m );
hekeus@6 367 printf("sent /tempo 90\n");
hekeus@6 368 }
hekeus@6 369 if (key == '4'){
hekeus@6 370 ofxOscMessage m;
hekeus@6 371 ///track id x y left right top bottom area
hekeus@6 372 m.setAddress( "/tempo" );
hekeus@6 373 m.addIntArg(120);
hekeus@6 374 sender.sendMessage( m );
hekeus@6 375 printf("sent /tempo 120\n");
hekeus@6 376 }
hekeus@6 377 if (key == '+'){
hekeus@6 378 for (int i=0; i<numVoices; i++){
hekeus@6 379 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 380
hekeus@6 381 (*voices[i]).octave++;
hekeus@6 382 ofxOscMessage m;
hekeus@6 383 ///track id x y left right top bottom area
hekeus@6 384 m.setAddress( "/octave" );
hekeus@6 385 m.addIntArg( (*voices[i]).id );
hekeus@6 386 m.addIntArg((*voices[i]).octave);
hekeus@6 387
hekeus@6 388 sender.sendMessage( m );
hekeus@6 389 printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
hekeus@6 390
hekeus@6 391 }
hekeus@6 392 }
hekeus@6 393 }
hekeus@6 394
hekeus@6 395 if (key == '-'){
hekeus@6 396 for (int i=0; i<numVoices; i++){
hekeus@6 397 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 398
hekeus@6 399 (*voices[i]).octave--;
hekeus@6 400 ofxOscMessage m;
hekeus@6 401 ///track id x y left right top bottom area
hekeus@6 402 m.setAddress( "/octave" );
hekeus@6 403 m.addIntArg( (*voices[i]).id );
hekeus@6 404 m.addIntArg((*voices[i]).octave);
hekeus@6 405
hekeus@6 406 sender.sendMessage( m );
hekeus@6 407 printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
hekeus@6 408
hekeus@6 409 }
hekeus@6 410 }
hekeus@6 411 }
hekeus@6 412 }
hekeus@6 413 if (key == ' '){
hekeus@6 414
hekeus@6 415 ofxOscMessage m;
hekeus@6 416 ///track id x y left right top bottom area
hekeus@6 417 m.setAddress( "/marker" );
hekeus@6 418 sender.sendMessage(m);
hekeus@6 419 printf("sent /marker\n");
hekeus@6 420 }
hekeus@6 421 }
hekeus@6 422
hekeus@6 423 //--------------------------------------------------------------
hekeus@6 424 void melodyTriangle::keyReleased (int key){
hekeus@6 425
hekeus@6 426 }
hekeus@6 427
hekeus@6 428 //--------------------------------------------------------------
hekeus@6 429 void melodyTriangle::mouseMoved(int x, int y ){
hekeus@6 430 for (int i=0; i<numVoices;i++){
hekeus@6 431 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 432 (*voices[i]).highlight=true;
hekeus@6 433 }else {
hekeus@6 434 (*voices[i]).highlight=false;
hekeus@6 435 }
hekeus@6 436
hekeus@6 437 }
hekeus@6 438
hekeus@6 439
hekeus@6 440 }
hekeus@6 441
hekeus@6 442 //--------------------------------------------------------------
hekeus@6 443 void melodyTriangle::mouseDragged(int x, int y, int button){
hekeus@6 444
hekeus@6 445 }
hekeus@6 446
hekeus@6 447 //--------------------------------------------------------------
hekeus@6 448 void melodyTriangle::mousePressed(int x, int y, int button){
hekeus@6 449
hekeus@6 450 for (int i=0; i<numVoices;i++){
hekeus@6 451 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 452 voiceGrabbed=i;
hekeus@6 453 //printf("grabbed %i",voiceGrabbed);
hekeus@6 454 }else{
hekeus@6 455 //printf("didnt grab %i",i);
hekeus@6 456 }
hekeus@6 457 }
hekeus@6 458 }
hekeus@6 459
hekeus@6 460
hekeus@6 461
hekeus@6 462 //--------------------------------------------------------------
hekeus@6 463 void melodyTriangle::mouseReleased(int x, int y, int button){
hekeus@6 464 //printf("released %i",voiceGrabbed);
hekeus@6 465 voiceGrabbed=-1;
hekeus@6 466 }
hekeus@6 467
hekeus@6 468 //--------------------------------------------------------------
hekeus@6 469 void melodyTriangle::windowResized(int w, int h){
hekeus@6 470
hekeus@6 471 }