annotate src/melodyTriangle.cpp @ 11:066104f9a2e2

Increased line widths.
author samer
date Fri, 27 Jan 2012 12:06:34 +0000
parents a8f71b5bdb0e
children 317637282293
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@11 201 ofSetLineWidth(2);
samer@10 202 ofSetColor(128,128,128);
samer@10 203 ofFill();
samer@10 204 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 205 if (constrained) ofSetColor(255,128,128);
samer@10 206
samer@10 207 // draw smooth edge, brighter if a token is constrained
samer@10 208 ofNoFill();
samer@10 209 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 210
hekeus@6 211 for (int i=0; i<numVoices; i++){
hekeus@6 212 (*voices[i]).draw();
hekeus@6 213 }
hekeus@6 214
hekeus@6 215
hekeus@6 216 }
hekeus@6 217
hekeus@6 218
hekeus@6 219 //--------------------------------------------------------------
hekeus@6 220 void melodyTriangle::keyPressed (int key){
hekeus@6 221 //printf("key %i",key);
hekeus@6 222 if (enableKeys){
hekeus@6 223 if (key == 'a'){
hekeus@6 224 for (int i=0; i<numVoices; i++){
hekeus@6 225 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 226
hekeus@6 227 (*voices[i]).isActive=!(*voices[i]).isActive;
hekeus@6 228 ///start id
hekeus@6 229 ///stop id
hekeus@6 230 if ((*voices[i]).isActive){
hekeus@6 231 ofxOscMessage m;
hekeus@6 232 ///track id x y left right top bottom area
hekeus@6 233 m.setAddress( "/start" );
hekeus@6 234 m.addIntArg( (*voices[i]).id );
hekeus@6 235 sender.sendMessage( m );
hekeus@6 236 printf("sent /start %i \n",(*voices[i]).id);
hekeus@6 237 }else {
hekeus@6 238 ofxOscMessage m;
hekeus@6 239 ///track id x y left right top bottom area
hekeus@6 240 m.setAddress( "/stop" );
hekeus@6 241 m.addIntArg( (*voices[i]).id );
hekeus@6 242 sender.sendMessage( m );
hekeus@6 243 printf("sent /stop %i \n",(*voices[i]).id);
hekeus@6 244
hekeus@6 245 }
hekeus@6 246
hekeus@6 247 }
hekeus@6 248 }
hekeus@6 249 }
hekeus@6 250 if (key == OF_KEY_UP){
hekeus@6 251 for (int i=0; i<numVoices; i++){
hekeus@6 252 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 253
hekeus@6 254 ofxOscMessage m;
hekeus@6 255 ///track id x y left right top bottom area
hekeus@6 256 m.setAddress( "/period" );
hekeus@6 257 m.addIntArg( (*voices[i]).id );
hekeus@6 258 m.addIntArg(1);
hekeus@6 259 m.addIntArg(2);
hekeus@6 260 sender.sendMessage( m );
hekeus@6 261 printf("sent /period %i %i %i\n",(*voices[i]).id,1,2);
hekeus@6 262
hekeus@6 263 }
hekeus@6 264 }
hekeus@6 265 }
hekeus@6 266 if (key == OF_KEY_DOWN){
hekeus@6 267 for (int i=0; i<numVoices; i++){
hekeus@6 268 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 269 ofxOscMessage m;
hekeus@6 270 ///track id x y left right top bottom area
hekeus@6 271 m.setAddress( "/period" );
hekeus@6 272 m.addIntArg( (*voices[i]).id );
hekeus@6 273 m.addIntArg(2);
hekeus@6 274 m.addIntArg(1);
hekeus@6 275 sender.sendMessage( m );
hekeus@6 276 printf("sent /period %i %i %i\n",(*voices[i]).id,2,1);
hekeus@6 277 }
hekeus@6 278 }
hekeus@6 279 }
hekeus@6 280
hekeus@6 281 if (key == '.'){
hekeus@6 282 for (int i=0; i<numVoices; i++){
hekeus@6 283 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 284 ofxOscMessage m;
hekeus@6 285 ///track id x y left right top bottom area
hekeus@6 286 m.setAddress( "/period" );
hekeus@6 287 m.addIntArg( (*voices[i]).id );
hekeus@6 288 m.addIntArg(1);
hekeus@6 289 m.addIntArg(3);
hekeus@6 290 sender.sendMessage( m );
hekeus@6 291 printf("sent /period %i %i %i\n",(*voices[i]).id,1,3);
hekeus@6 292 }
hekeus@6 293 }
hekeus@6 294
hekeus@6 295 }
hekeus@6 296 if (key == ','){
hekeus@6 297 for (int i=0; i<numVoices; i++){
hekeus@6 298 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 299 ofxOscMessage m;
hekeus@6 300 ///track id x y left right top bottom area
hekeus@6 301 m.setAddress( "/period" );
hekeus@6 302 m.addIntArg( (*voices[i]).id );
hekeus@6 303 m.addIntArg(3);
hekeus@6 304 m.addIntArg(1);
hekeus@6 305 sender.sendMessage( m );
hekeus@6 306 printf("sent /period %i %i %i\n",(*voices[i]).id,3,1);
hekeus@6 307 }
hekeus@6 308 }
hekeus@6 309
hekeus@6 310 }
hekeus@6 311 if (key == OF_KEY_LEFT){
hekeus@6 312 for (int i=0; i<numVoices; i++){
hekeus@6 313 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 314
hekeus@6 315 ofxOscMessage m;
hekeus@6 316 ///track id x y left right top bottom area
hekeus@6 317 m.setAddress( "/shift" );
hekeus@6 318 m.addIntArg( (*voices[i]).id );
hekeus@6 319 m.addIntArg(-1);
hekeus@6 320 m.addIntArg(2);
hekeus@6 321 sender.sendMessage( m );
hekeus@6 322 printf("sent /shift %i %i %i\n",(*voices[i]).id,-1,2);
hekeus@6 323
hekeus@6 324 }
hekeus@6 325 }
hekeus@6 326 }
hekeus@6 327 if (key == OF_KEY_RIGHT){
hekeus@6 328 for (int i=0; i<numVoices; i++){
hekeus@6 329 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 330
hekeus@6 331
hekeus@6 332 ofxOscMessage m;
hekeus@6 333 ///track id x y left right top bottom area
hekeus@6 334 m.setAddress( "/shift" );
hekeus@6 335 m.addIntArg( (*voices[i]).id );
hekeus@6 336 m.addIntArg(1);
hekeus@6 337 m.addIntArg(2);
hekeus@6 338 sender.sendMessage( m );
hekeus@6 339 printf("sent /shift %i %i %i\n",(*voices[i]).id,1,2);
hekeus@6 340
hekeus@6 341 }
hekeus@6 342 }
hekeus@6 343 }
hekeus@6 344 if (key == '1'){
hekeus@6 345
hekeus@6 346 ofxOscMessage m;
hekeus@6 347 ///track id x y left right top bottom area
hekeus@6 348 m.setAddress( "/tempo" );
hekeus@6 349 m.addIntArg(30);
hekeus@6 350 sender.sendMessage( m );
hekeus@6 351 printf("sent /tempo 30\n");
hekeus@6 352
hekeus@6 353 }
hekeus@6 354 if (key == '2'){
hekeus@6 355 ofxOscMessage m;
hekeus@6 356 ///track id x y left right top bottom area
hekeus@6 357 m.setAddress( "/tempo" );
hekeus@6 358 m.addIntArg(60);
hekeus@6 359 sender.sendMessage( m );
hekeus@6 360 printf("sent /tempo 60\n");
hekeus@6 361 }
hekeus@6 362 if (key == '3'){
hekeus@6 363 ofxOscMessage m;
hekeus@6 364 ///track id x y left right top bottom area
hekeus@6 365 m.setAddress( "/tempo" );
hekeus@6 366 m.addIntArg(90);
hekeus@6 367 sender.sendMessage( m );
hekeus@6 368 printf("sent /tempo 90\n");
hekeus@6 369 }
hekeus@6 370 if (key == '4'){
hekeus@6 371 ofxOscMessage m;
hekeus@6 372 ///track id x y left right top bottom area
hekeus@6 373 m.setAddress( "/tempo" );
hekeus@6 374 m.addIntArg(120);
hekeus@6 375 sender.sendMessage( m );
hekeus@6 376 printf("sent /tempo 120\n");
hekeus@6 377 }
hekeus@6 378 if (key == '+'){
hekeus@6 379 for (int i=0; i<numVoices; i++){
hekeus@6 380 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 381
hekeus@6 382 (*voices[i]).octave++;
hekeus@6 383 ofxOscMessage m;
hekeus@6 384 ///track id x y left right top bottom area
hekeus@6 385 m.setAddress( "/octave" );
hekeus@6 386 m.addIntArg( (*voices[i]).id );
hekeus@6 387 m.addIntArg((*voices[i]).octave);
hekeus@6 388
hekeus@6 389 sender.sendMessage( m );
hekeus@6 390 printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
hekeus@6 391
hekeus@6 392 }
hekeus@6 393 }
hekeus@6 394 }
hekeus@6 395
hekeus@6 396 if (key == '-'){
hekeus@6 397 for (int i=0; i<numVoices; i++){
hekeus@6 398 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 399
hekeus@6 400 (*voices[i]).octave--;
hekeus@6 401 ofxOscMessage m;
hekeus@6 402 ///track id x y left right top bottom area
hekeus@6 403 m.setAddress( "/octave" );
hekeus@6 404 m.addIntArg( (*voices[i]).id );
hekeus@6 405 m.addIntArg((*voices[i]).octave);
hekeus@6 406
hekeus@6 407 sender.sendMessage( m );
hekeus@6 408 printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
hekeus@6 409
hekeus@6 410 }
hekeus@6 411 }
hekeus@6 412 }
hekeus@6 413 }
hekeus@6 414 if (key == ' '){
hekeus@6 415
hekeus@6 416 ofxOscMessage m;
hekeus@6 417 ///track id x y left right top bottom area
hekeus@6 418 m.setAddress( "/marker" );
hekeus@6 419 sender.sendMessage(m);
hekeus@6 420 printf("sent /marker\n");
hekeus@6 421 }
hekeus@6 422 }
hekeus@6 423
hekeus@6 424 //--------------------------------------------------------------
hekeus@6 425 void melodyTriangle::keyReleased (int key){
hekeus@6 426
hekeus@6 427 }
hekeus@6 428
hekeus@6 429 //--------------------------------------------------------------
hekeus@6 430 void melodyTriangle::mouseMoved(int x, int y ){
hekeus@6 431 for (int i=0; i<numVoices;i++){
hekeus@6 432 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 433 (*voices[i]).highlight=true;
hekeus@6 434 }else {
hekeus@6 435 (*voices[i]).highlight=false;
hekeus@6 436 }
hekeus@6 437
hekeus@6 438 }
hekeus@6 439
hekeus@6 440
hekeus@6 441 }
hekeus@6 442
hekeus@6 443 //--------------------------------------------------------------
hekeus@6 444 void melodyTriangle::mouseDragged(int x, int y, int button){
hekeus@6 445
hekeus@6 446 }
hekeus@6 447
hekeus@6 448 //--------------------------------------------------------------
hekeus@6 449 void melodyTriangle::mousePressed(int x, int y, int button){
hekeus@6 450
hekeus@6 451 for (int i=0; i<numVoices;i++){
hekeus@6 452 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 453 voiceGrabbed=i;
hekeus@6 454 //printf("grabbed %i",voiceGrabbed);
hekeus@6 455 }else{
hekeus@6 456 //printf("didnt grab %i",i);
hekeus@6 457 }
hekeus@6 458 }
hekeus@6 459 }
hekeus@6 460
hekeus@6 461
hekeus@6 462
hekeus@6 463 //--------------------------------------------------------------
hekeus@6 464 void melodyTriangle::mouseReleased(int x, int y, int button){
hekeus@6 465 //printf("released %i",voiceGrabbed);
hekeus@6 466 voiceGrabbed=-1;
hekeus@6 467 }
hekeus@6 468
hekeus@6 469 //--------------------------------------------------------------
hekeus@6 470 void melodyTriangle::windowResized(int w, int h){
hekeus@6 471
hekeus@6 472 }