annotate src/melodyTriangle.cpp @ 6:d879a30556f8

re-intital commit
author Henrik Ekeus <hekeus@eecs.qmul.ac.uk>
date Wed, 25 Jan 2012 16:30:07 +0000
parents
children 38f63c4300d7
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@6 116 ofxOscMessage m;
hekeus@6 117 ///track id x y left right top bottom area
hekeus@6 118 m.setAddress( "/death" );
hekeus@6 119 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 120 sender.sendMessage( m );
hekeus@6 121
hekeus@6 122 printf("sent /death %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 123 (*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 124 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 125
hekeus@6 126 } else {
hekeus@6 127 //printf("e");
hekeus@6 128 //On Edge
hekeus@6 129 }
hekeus@6 130
hekeus@6 131 }else{
hekeus@6 132 (*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 133 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 134 //(*voices[voiceGrabbed]).posx=(*voices[voiceGrabbed]).posx*0.9+mouseX*0.1;
hekeus@6 135 //(*voices[voiceGrabbed]).posy=(*voices[voiceGrabbed]).posy*0.9+mouseY*0.1;
hekeus@6 136
hekeus@6 137
hekeus@6 138 }
hekeus@6 139 if (!(*voices[voiceGrabbed]).inTriangle && isInTriangle(mouseX,mouseY)){
hekeus@6 140 //birth id
hekeus@6 141
hekeus@6 142 ofxOscMessage m;
hekeus@6 143 ///track id x y left right top bottom area
hekeus@6 144 m.setAddress( "/birth" );
hekeus@6 145 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 146 sender.sendMessage( m );
hekeus@6 147
hekeus@6 148 printf("sent /birth %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 149 sendStart=true;
hekeus@6 150 }
hekeus@6 151
hekeus@6 152
hekeus@6 153 //(*voices[voiceGrabbed]).inTriangle = isInTriangle(mouseX,mouseY);
hekeus@6 154
hekeus@6 155 (*voices[voiceGrabbed]).inTriangle = isInTriangle((*voices[voiceGrabbed]).posx,(*voices[voiceGrabbed]).posy);
hekeus@6 156
hekeus@6 157 if ((*voices[voiceGrabbed]).inTriangle){
hekeus@6 158 sendStatus(*voices[voiceGrabbed]);
hekeus@6 159 if (sendStart){
hekeus@6 160 if ((*voices[voiceGrabbed]).isActive){
hekeus@6 161 ofxOscMessage m;
hekeus@6 162 ///track id x y left right top bottom area
hekeus@6 163 m.setAddress( "/start" );
hekeus@6 164 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 165 sender.sendMessage( m );
hekeus@6 166 printf("sent /start %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 167 }
hekeus@6 168 }
hekeus@6 169 }
hekeus@6 170
hekeus@6 171 }
hekeus@6 172 };
hekeus@6 173 for (int i=0; i<numVoices; i++){
hekeus@6 174 (*voices[i]).draw();
hekeus@6 175 }
hekeus@6 176
hekeus@6 177
hekeus@6 178 }
hekeus@6 179
hekeus@6 180
hekeus@6 181 //--------------------------------------------------------------
hekeus@6 182 void melodyTriangle::keyPressed (int key){
hekeus@6 183 //printf("key %i",key);
hekeus@6 184 if (enableKeys){
hekeus@6 185 if (key == 'a'){
hekeus@6 186 for (int i=0; i<numVoices; i++){
hekeus@6 187 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 188
hekeus@6 189 (*voices[i]).isActive=!(*voices[i]).isActive;
hekeus@6 190 ///start id
hekeus@6 191 ///stop id
hekeus@6 192 if ((*voices[i]).isActive){
hekeus@6 193 ofxOscMessage m;
hekeus@6 194 ///track id x y left right top bottom area
hekeus@6 195 m.setAddress( "/start" );
hekeus@6 196 m.addIntArg( (*voices[i]).id );
hekeus@6 197 sender.sendMessage( m );
hekeus@6 198 printf("sent /start %i \n",(*voices[i]).id);
hekeus@6 199 }else {
hekeus@6 200 ofxOscMessage m;
hekeus@6 201 ///track id x y left right top bottom area
hekeus@6 202 m.setAddress( "/stop" );
hekeus@6 203 m.addIntArg( (*voices[i]).id );
hekeus@6 204 sender.sendMessage( m );
hekeus@6 205 printf("sent /stop %i \n",(*voices[i]).id);
hekeus@6 206
hekeus@6 207 }
hekeus@6 208
hekeus@6 209 }
hekeus@6 210 }
hekeus@6 211 }
hekeus@6 212 if (key == OF_KEY_UP){
hekeus@6 213 for (int i=0; i<numVoices; i++){
hekeus@6 214 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 215
hekeus@6 216 ofxOscMessage m;
hekeus@6 217 ///track id x y left right top bottom area
hekeus@6 218 m.setAddress( "/period" );
hekeus@6 219 m.addIntArg( (*voices[i]).id );
hekeus@6 220 m.addIntArg(1);
hekeus@6 221 m.addIntArg(2);
hekeus@6 222 sender.sendMessage( m );
hekeus@6 223 printf("sent /period %i %i %i\n",(*voices[i]).id,1,2);
hekeus@6 224
hekeus@6 225 }
hekeus@6 226 }
hekeus@6 227 }
hekeus@6 228 if (key == OF_KEY_DOWN){
hekeus@6 229 for (int i=0; i<numVoices; i++){
hekeus@6 230 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 231 ofxOscMessage m;
hekeus@6 232 ///track id x y left right top bottom area
hekeus@6 233 m.setAddress( "/period" );
hekeus@6 234 m.addIntArg( (*voices[i]).id );
hekeus@6 235 m.addIntArg(2);
hekeus@6 236 m.addIntArg(1);
hekeus@6 237 sender.sendMessage( m );
hekeus@6 238 printf("sent /period %i %i %i\n",(*voices[i]).id,2,1);
hekeus@6 239 }
hekeus@6 240 }
hekeus@6 241 }
hekeus@6 242
hekeus@6 243 if (key == '.'){
hekeus@6 244 for (int i=0; i<numVoices; i++){
hekeus@6 245 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 246 ofxOscMessage m;
hekeus@6 247 ///track id x y left right top bottom area
hekeus@6 248 m.setAddress( "/period" );
hekeus@6 249 m.addIntArg( (*voices[i]).id );
hekeus@6 250 m.addIntArg(1);
hekeus@6 251 m.addIntArg(3);
hekeus@6 252 sender.sendMessage( m );
hekeus@6 253 printf("sent /period %i %i %i\n",(*voices[i]).id,1,3);
hekeus@6 254 }
hekeus@6 255 }
hekeus@6 256
hekeus@6 257 }
hekeus@6 258 if (key == ','){
hekeus@6 259 for (int i=0; i<numVoices; i++){
hekeus@6 260 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 261 ofxOscMessage m;
hekeus@6 262 ///track id x y left right top bottom area
hekeus@6 263 m.setAddress( "/period" );
hekeus@6 264 m.addIntArg( (*voices[i]).id );
hekeus@6 265 m.addIntArg(3);
hekeus@6 266 m.addIntArg(1);
hekeus@6 267 sender.sendMessage( m );
hekeus@6 268 printf("sent /period %i %i %i\n",(*voices[i]).id,3,1);
hekeus@6 269 }
hekeus@6 270 }
hekeus@6 271
hekeus@6 272 }
hekeus@6 273 if (key == OF_KEY_LEFT){
hekeus@6 274 for (int i=0; i<numVoices; i++){
hekeus@6 275 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 276
hekeus@6 277 ofxOscMessage m;
hekeus@6 278 ///track id x y left right top bottom area
hekeus@6 279 m.setAddress( "/shift" );
hekeus@6 280 m.addIntArg( (*voices[i]).id );
hekeus@6 281 m.addIntArg(-1);
hekeus@6 282 m.addIntArg(2);
hekeus@6 283 sender.sendMessage( m );
hekeus@6 284 printf("sent /shift %i %i %i\n",(*voices[i]).id,-1,2);
hekeus@6 285
hekeus@6 286 }
hekeus@6 287 }
hekeus@6 288 }
hekeus@6 289 if (key == OF_KEY_RIGHT){
hekeus@6 290 for (int i=0; i<numVoices; i++){
hekeus@6 291 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 292
hekeus@6 293
hekeus@6 294 ofxOscMessage m;
hekeus@6 295 ///track id x y left right top bottom area
hekeus@6 296 m.setAddress( "/shift" );
hekeus@6 297 m.addIntArg( (*voices[i]).id );
hekeus@6 298 m.addIntArg(1);
hekeus@6 299 m.addIntArg(2);
hekeus@6 300 sender.sendMessage( m );
hekeus@6 301 printf("sent /shift %i %i %i\n",(*voices[i]).id,1,2);
hekeus@6 302
hekeus@6 303 }
hekeus@6 304 }
hekeus@6 305 }
hekeus@6 306 if (key == '1'){
hekeus@6 307
hekeus@6 308 ofxOscMessage m;
hekeus@6 309 ///track id x y left right top bottom area
hekeus@6 310 m.setAddress( "/tempo" );
hekeus@6 311 m.addIntArg(30);
hekeus@6 312 sender.sendMessage( m );
hekeus@6 313 printf("sent /tempo 30\n");
hekeus@6 314
hekeus@6 315 }
hekeus@6 316 if (key == '2'){
hekeus@6 317 ofxOscMessage m;
hekeus@6 318 ///track id x y left right top bottom area
hekeus@6 319 m.setAddress( "/tempo" );
hekeus@6 320 m.addIntArg(60);
hekeus@6 321 sender.sendMessage( m );
hekeus@6 322 printf("sent /tempo 60\n");
hekeus@6 323 }
hekeus@6 324 if (key == '3'){
hekeus@6 325 ofxOscMessage m;
hekeus@6 326 ///track id x y left right top bottom area
hekeus@6 327 m.setAddress( "/tempo" );
hekeus@6 328 m.addIntArg(90);
hekeus@6 329 sender.sendMessage( m );
hekeus@6 330 printf("sent /tempo 90\n");
hekeus@6 331 }
hekeus@6 332 if (key == '4'){
hekeus@6 333 ofxOscMessage m;
hekeus@6 334 ///track id x y left right top bottom area
hekeus@6 335 m.setAddress( "/tempo" );
hekeus@6 336 m.addIntArg(120);
hekeus@6 337 sender.sendMessage( m );
hekeus@6 338 printf("sent /tempo 120\n");
hekeus@6 339 }
hekeus@6 340 if (key == '+'){
hekeus@6 341 for (int i=0; i<numVoices; i++){
hekeus@6 342 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 343
hekeus@6 344 (*voices[i]).octave++;
hekeus@6 345 ofxOscMessage m;
hekeus@6 346 ///track id x y left right top bottom area
hekeus@6 347 m.setAddress( "/octave" );
hekeus@6 348 m.addIntArg( (*voices[i]).id );
hekeus@6 349 m.addIntArg((*voices[i]).octave);
hekeus@6 350
hekeus@6 351 sender.sendMessage( m );
hekeus@6 352 printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
hekeus@6 353
hekeus@6 354 }
hekeus@6 355 }
hekeus@6 356 }
hekeus@6 357
hekeus@6 358 if (key == '-'){
hekeus@6 359 for (int i=0; i<numVoices; i++){
hekeus@6 360 if ((*voices[i]).isInVoice(mouseX,mouseY)){
hekeus@6 361
hekeus@6 362 (*voices[i]).octave--;
hekeus@6 363 ofxOscMessage m;
hekeus@6 364 ///track id x y left right top bottom area
hekeus@6 365 m.setAddress( "/octave" );
hekeus@6 366 m.addIntArg( (*voices[i]).id );
hekeus@6 367 m.addIntArg((*voices[i]).octave);
hekeus@6 368
hekeus@6 369 sender.sendMessage( m );
hekeus@6 370 printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave);
hekeus@6 371
hekeus@6 372 }
hekeus@6 373 }
hekeus@6 374 }
hekeus@6 375 }
hekeus@6 376 if (key == ' '){
hekeus@6 377
hekeus@6 378 ofxOscMessage m;
hekeus@6 379 ///track id x y left right top bottom area
hekeus@6 380 m.setAddress( "/marker" );
hekeus@6 381 sender.sendMessage(m);
hekeus@6 382 printf("sent /marker\n");
hekeus@6 383 }
hekeus@6 384 }
hekeus@6 385
hekeus@6 386 //--------------------------------------------------------------
hekeus@6 387 void melodyTriangle::keyReleased (int key){
hekeus@6 388
hekeus@6 389 }
hekeus@6 390
hekeus@6 391 //--------------------------------------------------------------
hekeus@6 392 void melodyTriangle::mouseMoved(int x, int y ){
hekeus@6 393 for (int i=0; i<numVoices;i++){
hekeus@6 394 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 395 (*voices[i]).highlight=true;
hekeus@6 396 }else {
hekeus@6 397 (*voices[i]).highlight=false;
hekeus@6 398 }
hekeus@6 399
hekeus@6 400 }
hekeus@6 401
hekeus@6 402
hekeus@6 403 }
hekeus@6 404
hekeus@6 405 //--------------------------------------------------------------
hekeus@6 406 void melodyTriangle::mouseDragged(int x, int y, int button){
hekeus@6 407
hekeus@6 408 }
hekeus@6 409
hekeus@6 410 //--------------------------------------------------------------
hekeus@6 411 void melodyTriangle::mousePressed(int x, int y, int button){
hekeus@6 412
hekeus@6 413 for (int i=0; i<numVoices;i++){
hekeus@6 414 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 415 voiceGrabbed=i;
hekeus@6 416 //printf("grabbed %i",voiceGrabbed);
hekeus@6 417 }else{
hekeus@6 418 //printf("didnt grab %i",i);
hekeus@6 419 }
hekeus@6 420 }
hekeus@6 421 }
hekeus@6 422
hekeus@6 423
hekeus@6 424
hekeus@6 425 //--------------------------------------------------------------
hekeus@6 426 void melodyTriangle::mouseReleased(int x, int y, int button){
hekeus@6 427 //printf("released %i",voiceGrabbed);
hekeus@6 428 voiceGrabbed=-1;
hekeus@6 429 }
hekeus@6 430
hekeus@6 431 //--------------------------------------------------------------
hekeus@6 432 void melodyTriangle::windowResized(int w, int h){
hekeus@6 433
hekeus@6 434 }