annotate src/melodyTriangle.cpp @ 8:3d9e0db254dc

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