annotate src/melodyTriangle.cpp @ 14:578c1acf1cc4

Octave and amplitude now initialised correctly on birth; added binary app.
author samer
date Mon, 30 Jan 2012 23:31:39 +0000
parents 9e31c0507e65
children 9d7e139cd0a3
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
samer@12 43 sendCalibrate();
samer@12 44 for (int i=0;i<numVoices;i++){
samer@12 45 voices[i]=new Voice(i+1+voiceIdOffset,x2+15,y1+20+i*30);
samer@12 46 }
samer@12 47 voiceGrabbed=-1;
samer@12 48 }
samer@12 49
samer@12 50 void melodyTriangle::sendCalibrate(){
hekeus@6 51 ofxOscMessage m;
hekeus@6 52 m.setAddress( "/calibrate" );
hekeus@6 53 m.addIntArg( x1 );
hekeus@6 54 m.addIntArg( y1 );
hekeus@6 55 m.addIntArg( x2 );
hekeus@6 56 m.addIntArg( y2 );
hekeus@6 57 m.addIntArg( x3 );
hekeus@6 58 m.addIntArg( y3 );
hekeus@6 59 sender.sendMessage( m );
hekeus@6 60 printf("sent /calibrate %i %i %i %i %i %i\n",x1,y1,x2,y2,x3,y3);
samer@12 61 }
samer@12 62
samer@12 63 void melodyTriangle::sendPeriod(int id, int num, int den){
samer@12 64 ofxOscMessage m;
samer@12 65 m.setAddress("/period");
samer@12 66 m.addIntArg(id);
samer@12 67 m.addIntArg(num);
samer@12 68 m.addIntArg(den);
samer@12 69 sender.sendMessage(m);
samer@12 70 printf("sent /period %i %i %i\n",id,num,den);
samer@12 71 }
samer@12 72
samer@12 73 void melodyTriangle::sendShift(int id, int num, int den){
samer@12 74 ofxOscMessage m;
samer@12 75 m.setAddress("/shift");
samer@12 76 m.addIntArg(id);
samer@12 77 m.addIntArg(num);
samer@12 78 m.addIntArg(den);
samer@12 79 sender.sendMessage(m);
samer@12 80 printf("sent /shift %i %i %i\n",id,num,den);
samer@12 81 }
samer@12 82
samer@12 83 void melodyTriangle::sendOctave(int id, int oct){
samer@12 84 ofxOscMessage m;
samer@12 85 m.setAddress("/octave");
samer@12 86 m.addIntArg(id);
samer@12 87 m.addIntArg(oct);
samer@12 88 sender.sendMessage(m);
samer@12 89 printf("sent /octave %i %i\n",id,oct);
hekeus@6 90 }
hekeus@6 91
samer@13 92 void melodyTriangle::sendAmplitude(int id, float amp){
samer@13 93 ofxOscMessage m;
samer@13 94 m.setAddress("/amplitude");
samer@13 95 m.addIntArg(id);
samer@13 96 m.addFloatArg(amp);
samer@13 97 sender.sendMessage(m);
samer@13 98 printf("sent /amplitude %i %1.3f\n",id,amp);
samer@13 99 }
samer@13 100
hekeus@6 101 //--------------------------------------------------------------
hekeus@6 102 void melodyTriangle::update(){
hekeus@8 103 while( receiver.hasWaitingMessages() )
hekeus@8 104 {
hekeus@8 105 // get the next message
hekeus@8 106 ofxOscMessage m;
hekeus@8 107 receiver.getNextMessage( &m );
hekeus@8 108 string msg_string;
hekeus@8 109 msg_string = m.getAddress();
hekeus@8 110 msg_string += ": ";
hekeus@8 111 for ( int i=0; i<m.getNumArgs(); i++ )
hekeus@8 112 {
hekeus@8 113 // get the argument type
hekeus@8 114 msg_string += m.getArgTypeName( i );
hekeus@8 115 msg_string += ":";
hekeus@8 116 // display the argument - make sure we get the right type
hekeus@8 117 if( m.getArgType( i ) == OFXOSC_TYPE_INT32 )
hekeus@8 118 msg_string += ofToString( m.getArgAsInt32( i ) );
hekeus@8 119 else if( m.getArgType( i ) == OFXOSC_TYPE_FLOAT )
hekeus@8 120 msg_string += ofToString( m.getArgAsFloat( i ) );
hekeus@8 121 else if( m.getArgType( i ) == OFXOSC_TYPE_STRING )
hekeus@8 122 msg_string += m.getArgAsString( i );
hekeus@8 123 else
hekeus@8 124 msg_string += "unknown";
hekeus@8 125 }
hekeus@8 126 cout<< msg_string << "\n";
hekeus@8 127
hekeus@8 128 }
hekeus@6 129 }
hekeus@6 130
hekeus@6 131 bool melodyTriangle::isInTriangle(int x, int y){
hekeus@6 132 if (x>x2 && x<x3 && y>y1 && y<y2){
hekeus@6 133 //printf("in bounding box\n");
hekeus@6 134 float dx=abs(x-x1);
hekeus@6 135 float dy=abs(y-y1);
hekeus@6 136 //printf("tan(30)- dx/dy: %f\n",tan(30*PI/180)-dx/dy);
hekeus@6 137
hekeus@6 138 if (dx/dy < tan(30*PI/180)){
hekeus@6 139
hekeus@6 140 //printf("in triangle \n");
hekeus@6 141 return true;
hekeus@6 142 }else {
hekeus@6 143 //printf("not in triangle \n");
hekeus@6 144 return false;
hekeus@6 145 }
hekeus@6 146
hekeus@6 147 }else{
hekeus@6 148 //printf("not in bounding box \n");
hekeus@6 149 return false;
hekeus@6 150 }
hekeus@6 151 }
hekeus@6 152
samer@14 153 void melodyTriangle::sendPosition(Voice v){
hekeus@6 154
hekeus@6 155 ofxOscMessage m;
hekeus@6 156 ///track id x y left right top bottom area
hekeus@6 157 m.setAddress( "/track2d" );
hekeus@6 158 m.addIntArg( v.id );
hekeus@6 159 m.addIntArg( v.posx );
hekeus@6 160 m.addIntArg( v.posy );
hekeus@6 161 sender.sendMessage( m );
hekeus@6 162 printf("sent - /track2d %i %i %i\n",v.id,v.posx,v.posy);
hekeus@6 163
hekeus@6 164 }
hekeus@6 165
hekeus@6 166 //--------------------------------------------------------------
hekeus@6 167 void melodyTriangle::draw(){
samer@10 168 bool constrained=false;
hekeus@6 169
hekeus@6 170 bool sendStart=false;
hekeus@6 171 if (voiceGrabbed!=-1){
samer@14 172 Voice *vg=voices[voiceGrabbed];
samer@14 173 if (mouseX!=vg->posx || mouseY!=vg->posy){
samer@14 174 //vg->posx=mouseX;
samer@14 175 //vg->posy=mouseY;
samer@14 176 if (vg->inTriangle && !isInTriangle(mouseX,mouseY)){
hekeus@6 177 ///death id
hekeus@6 178
samer@14 179 if (ofDist(vg->posx, vg->posy, mouseX, mouseY)
samer@10 180 > BUFFER_ZONE) {
hekeus@6 181
hekeus@7 182
samer@10 183 ofxOscMessage m;
samer@10 184 ///track id x y left right top bottom area
samer@10 185 m.setAddress( "/death" );
samer@14 186 m.addIntArg( vg->id );
samer@10 187 sender.sendMessage( m );
hekeus@6 188
samer@14 189 printf("sent /death %i \n",vg->id);
samer@14 190 vg->posx=mouseX;
samer@14 191 vg->posy=mouseY;
hekeus@6 192 } else {
hekeus@6 193 //printf("e");
hekeus@6 194 //On Edge
samer@10 195 constrained=true;
hekeus@6 196 }
hekeus@6 197
hekeus@6 198 }else{
samer@14 199 vg->posx=mouseX;
samer@14 200 vg->posy=mouseY;
samer@14 201 //vg->posx=vg->posx*0.9+mouseX*0.1;
samer@14 202 //vg->posy=vg->posy*0.9+mouseY*0.1;
hekeus@6 203
hekeus@6 204
hekeus@6 205 }
samer@14 206 if (!vg->inTriangle && isInTriangle(mouseX,mouseY)){
hekeus@6 207 //birth id
hekeus@6 208
hekeus@6 209 ofxOscMessage m;
hekeus@6 210 ///track id x y left right top bottom area
hekeus@6 211 m.setAddress( "/birth" );
samer@14 212 m.addIntArg( vg->id );
hekeus@6 213 sender.sendMessage( m );
hekeus@6 214
samer@14 215 printf("sent /birth %i \n",vg->id);
samer@14 216 sendOctave(vg->id,vg->octave);
samer@14 217 sendAmplitude(vg->id,vg->amplitude);
hekeus@6 218 sendStart=true;
hekeus@6 219 }
hekeus@6 220
hekeus@6 221
samer@14 222 //vg->inTriangle = isInTriangle(mouseX,mouseY);
hekeus@6 223
samer@14 224 vg->inTriangle = isInTriangle(vg->posx,vg->posy);
hekeus@6 225
samer@14 226 if (vg->inTriangle){
samer@14 227 sendPosition(*vg);
hekeus@6 228 if (sendStart){
samer@14 229 if (vg->isActive){
hekeus@6 230 ofxOscMessage m;
hekeus@6 231 ///track id x y left right top bottom area
hekeus@6 232 m.setAddress( "/start" );
samer@14 233 m.addIntArg( vg->id );
hekeus@6 234 sender.sendMessage( m );
samer@14 235 printf("sent /start %i \n",vg->id);
hekeus@6 236 }
hekeus@6 237 }
hekeus@6 238 }
hekeus@6 239
hekeus@6 240 }
hekeus@6 241 };
samer@10 242
samer@10 243 //let's draw our triangle
samer@11 244 ofSetLineWidth(2);
samer@12 245 ofSetColor(96,96,96);
samer@10 246 ofFill();
samer@10 247 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@12 248 if (constrained) ofSetColor(255,96,96);
samer@10 249
samer@10 250 // draw smooth edge, brighter if a token is constrained
samer@10 251 ofNoFill();
samer@10 252 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 253
hekeus@6 254 for (int i=0; i<numVoices; i++){
hekeus@6 255 (*voices[i]).draw();
hekeus@6 256 }
hekeus@6 257
hekeus@6 258
hekeus@6 259 }
hekeus@6 260
hekeus@6 261
hekeus@6 262 //--------------------------------------------------------------
hekeus@6 263 void melodyTriangle::keyPressed (int key){
hekeus@6 264 //printf("key %i",key);
hekeus@6 265 if (enableKeys){
samer@12 266 switch (key) {
samer@12 267 case ' ': {
samer@12 268 ofxOscMessage m;
samer@12 269 m.setAddress( "/marker" );
samer@12 270 sender.sendMessage(m);
samer@12 271 printf("sent /marker\n");
samer@12 272 break;
samer@12 273 }
samer@12 274
samer@12 275 case '1':
samer@12 276 case '2':
samer@12 277 case '3':
samer@12 278 case '4': {
samer@12 279 int tempo=30 + 30*(key-'1');
samer@12 280 ofxOscMessage m;
samer@12 281 m.setAddress( "/tempo" );
samer@12 282 m.addIntArg(tempo);
samer@12 283 sender.sendMessage( m );
samer@12 284 printf("sent /tempo %d\n",tempo);
samer@12 285 }
samer@12 286 break;
samer@12 287
samer@12 288 case 'c': sendCalibrate(); break;
samer@12 289
samer@12 290 default: { // otherwise, send key to all active voices
samer@12 291 for (int i=0; i<numVoices; i++){
samer@12 292 if (voices[i]->isInVoice(mouseX,mouseY)){
samer@12 293 Voice *v=voices[i];
samer@12 294 switch (key) {
samer@12 295 case 'a': {
samer@12 296 ofxOscMessage m;
samer@12 297 const char *addr = v->isActive ? "/stop" : "/start";
samer@12 298 v->isActive=!v->isActive;
samer@12 299 m.setAddress(addr);
samer@12 300 m.addIntArg(v->id );
samer@12 301 sender.sendMessage( m );
samer@12 302 printf("sent %s %i \n",addr,v->id);
samer@12 303 break;
samer@12 304 }
samer@12 305 case OF_KEY_LEFT: sendShift(v->id,-1,2); break;
samer@12 306 case OF_KEY_RIGHT: sendShift(v->id,1,2); break;
samer@12 307 case OF_KEY_UP: sendPeriod(v->id,1,2); break;
samer@12 308 case OF_KEY_DOWN: sendPeriod(v->id,2,1); break;
samer@12 309 case '.': sendPeriod(v->id,1,3); break;
samer@12 310 case ',': sendPeriod(v->id,3,1); break;
samer@12 311 case '+': sendOctave(v->id, ++v->octave); break;
samer@12 312 case '-': sendOctave(v->id, --v->octave); break;
samer@13 313 case '*': sendAmplitude(v->id, v->louder()); break;
samer@13 314 case '/': sendAmplitude(v->id, v->quieter()); break;
samer@13 315 default: printf("unrecognised key: %d.\n",key);
samer@12 316 }
hekeus@6 317 }
hekeus@6 318 }
hekeus@6 319 }
hekeus@6 320 }
hekeus@6 321 }
hekeus@6 322 }
hekeus@6 323
hekeus@6 324 //--------------------------------------------------------------
hekeus@6 325 void melodyTriangle::keyReleased (int key){
hekeus@6 326
hekeus@6 327 }
hekeus@6 328
hekeus@6 329 //--------------------------------------------------------------
hekeus@6 330 void melodyTriangle::mouseMoved(int x, int y ){
hekeus@6 331 for (int i=0; i<numVoices;i++){
hekeus@6 332 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 333 (*voices[i]).highlight=true;
hekeus@6 334 }else {
hekeus@6 335 (*voices[i]).highlight=false;
hekeus@6 336 }
hekeus@6 337
hekeus@6 338 }
hekeus@6 339
hekeus@6 340
hekeus@6 341 }
hekeus@6 342
hekeus@6 343 //--------------------------------------------------------------
hekeus@6 344 void melodyTriangle::mouseDragged(int x, int y, int button){
hekeus@6 345
hekeus@6 346 }
hekeus@6 347
hekeus@6 348 //--------------------------------------------------------------
hekeus@6 349 void melodyTriangle::mousePressed(int x, int y, int button){
hekeus@6 350
hekeus@6 351 for (int i=0; i<numVoices;i++){
hekeus@6 352 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 353 voiceGrabbed=i;
hekeus@6 354 //printf("grabbed %i",voiceGrabbed);
hekeus@6 355 }else{
hekeus@6 356 //printf("didnt grab %i",i);
hekeus@6 357 }
hekeus@6 358 }
hekeus@6 359 }
hekeus@6 360
hekeus@6 361
hekeus@6 362
hekeus@6 363 //--------------------------------------------------------------
hekeus@6 364 void melodyTriangle::mouseReleased(int x, int y, int button){
hekeus@6 365 //printf("released %i",voiceGrabbed);
hekeus@6 366 voiceGrabbed=-1;
hekeus@6 367 }
hekeus@6 368
hekeus@6 369 //--------------------------------------------------------------
hekeus@6 370 void melodyTriangle::windowResized(int w, int h){
hekeus@6 371
hekeus@6 372 }