annotate src/melodyTriangle.cpp @ 7:38f63c4300d7

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