annotate src/melodyTriangle.cpp @ 13:9e31c0507e65

Added amplitude control (keys '*' and '/').
author samer
date Mon, 30 Jan 2012 13:29:53 +0000
parents 317637282293
children 578c1acf1cc4
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
hekeus@6 153 void melodyTriangle::sendStatus(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){
hekeus@6 172 if (mouseX!=(*voices[voiceGrabbed]).posx || mouseY!=(*voices[voiceGrabbed]).posy){
hekeus@6 173 //(*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 174 //(*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 175 if ((*voices[voiceGrabbed]).inTriangle && !isInTriangle(mouseX,mouseY)){
hekeus@6 176 ///death id
hekeus@6 177
samer@10 178 if (ofDist((*voices[voiceGrabbed]).posx, (*voices[voiceGrabbed]).posy, mouseX, mouseY)
samer@10 179 > BUFFER_ZONE) {
hekeus@6 180
hekeus@7 181
samer@10 182 ofxOscMessage m;
samer@10 183 ///track id x y left right top bottom area
samer@10 184 m.setAddress( "/death" );
samer@10 185 m.addIntArg( (*voices[voiceGrabbed]).id );
samer@10 186 sender.sendMessage( m );
hekeus@6 187
samer@10 188 printf("sent /death %i \n",(*voices[voiceGrabbed]).id);
samer@10 189 (*voices[voiceGrabbed]).posx=mouseX;
samer@10 190 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 191 } else {
hekeus@6 192 //printf("e");
hekeus@6 193 //On Edge
samer@10 194 constrained=true;
hekeus@6 195 }
hekeus@6 196
hekeus@6 197 }else{
hekeus@6 198 (*voices[voiceGrabbed]).posx=mouseX;
hekeus@6 199 (*voices[voiceGrabbed]).posy=mouseY;
hekeus@6 200 //(*voices[voiceGrabbed]).posx=(*voices[voiceGrabbed]).posx*0.9+mouseX*0.1;
hekeus@6 201 //(*voices[voiceGrabbed]).posy=(*voices[voiceGrabbed]).posy*0.9+mouseY*0.1;
hekeus@6 202
hekeus@6 203
hekeus@6 204 }
hekeus@6 205 if (!(*voices[voiceGrabbed]).inTriangle && isInTriangle(mouseX,mouseY)){
hekeus@6 206 //birth id
hekeus@6 207
hekeus@6 208 ofxOscMessage m;
hekeus@6 209 ///track id x y left right top bottom area
hekeus@6 210 m.setAddress( "/birth" );
hekeus@6 211 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 212 sender.sendMessage( m );
hekeus@6 213
hekeus@6 214 printf("sent /birth %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 215 sendStart=true;
hekeus@6 216 }
hekeus@6 217
hekeus@6 218
hekeus@6 219 //(*voices[voiceGrabbed]).inTriangle = isInTriangle(mouseX,mouseY);
hekeus@6 220
hekeus@6 221 (*voices[voiceGrabbed]).inTriangle = isInTriangle((*voices[voiceGrabbed]).posx,(*voices[voiceGrabbed]).posy);
hekeus@6 222
hekeus@6 223 if ((*voices[voiceGrabbed]).inTriangle){
hekeus@6 224 sendStatus(*voices[voiceGrabbed]);
hekeus@6 225 if (sendStart){
hekeus@6 226 if ((*voices[voiceGrabbed]).isActive){
hekeus@6 227 ofxOscMessage m;
hekeus@6 228 ///track id x y left right top bottom area
hekeus@6 229 m.setAddress( "/start" );
hekeus@6 230 m.addIntArg( (*voices[voiceGrabbed]).id );
hekeus@6 231 sender.sendMessage( m );
hekeus@6 232 printf("sent /start %i \n",(*voices[voiceGrabbed]).id);
hekeus@6 233 }
hekeus@6 234 }
hekeus@6 235 }
hekeus@6 236
hekeus@6 237 }
hekeus@6 238 };
samer@10 239
samer@10 240 //let's draw our triangle
samer@11 241 ofSetLineWidth(2);
samer@12 242 ofSetColor(96,96,96);
samer@10 243 ofFill();
samer@10 244 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@12 245 if (constrained) ofSetColor(255,96,96);
samer@10 246
samer@10 247 // draw smooth edge, brighter if a token is constrained
samer@10 248 ofNoFill();
samer@10 249 ofTriangle(x1, y1, x2, y2, x3, y3);
samer@10 250
hekeus@6 251 for (int i=0; i<numVoices; i++){
hekeus@6 252 (*voices[i]).draw();
hekeus@6 253 }
hekeus@6 254
hekeus@6 255
hekeus@6 256 }
hekeus@6 257
hekeus@6 258
hekeus@6 259 //--------------------------------------------------------------
hekeus@6 260 void melodyTriangle::keyPressed (int key){
hekeus@6 261 //printf("key %i",key);
hekeus@6 262 if (enableKeys){
samer@12 263 switch (key) {
samer@12 264 case ' ': {
samer@12 265 ofxOscMessage m;
samer@12 266 m.setAddress( "/marker" );
samer@12 267 sender.sendMessage(m);
samer@12 268 printf("sent /marker\n");
samer@12 269 break;
samer@12 270 }
samer@12 271
samer@12 272 case '1':
samer@12 273 case '2':
samer@12 274 case '3':
samer@12 275 case '4': {
samer@12 276 int tempo=30 + 30*(key-'1');
samer@12 277 ofxOscMessage m;
samer@12 278 m.setAddress( "/tempo" );
samer@12 279 m.addIntArg(tempo);
samer@12 280 sender.sendMessage( m );
samer@12 281 printf("sent /tempo %d\n",tempo);
samer@12 282 }
samer@12 283 break;
samer@12 284
samer@12 285 case 'c': sendCalibrate(); break;
samer@12 286
samer@12 287 default: { // otherwise, send key to all active voices
samer@12 288 for (int i=0; i<numVoices; i++){
samer@12 289 if (voices[i]->isInVoice(mouseX,mouseY)){
samer@12 290 Voice *v=voices[i];
samer@12 291 switch (key) {
samer@12 292 case 'a': {
samer@12 293 ofxOscMessage m;
samer@12 294 const char *addr = v->isActive ? "/stop" : "/start";
samer@12 295 v->isActive=!v->isActive;
samer@12 296 m.setAddress(addr);
samer@12 297 m.addIntArg(v->id );
samer@12 298 sender.sendMessage( m );
samer@12 299 printf("sent %s %i \n",addr,v->id);
samer@12 300 break;
samer@12 301 }
samer@12 302 case OF_KEY_LEFT: sendShift(v->id,-1,2); break;
samer@12 303 case OF_KEY_RIGHT: sendShift(v->id,1,2); break;
samer@12 304 case OF_KEY_UP: sendPeriod(v->id,1,2); break;
samer@12 305 case OF_KEY_DOWN: sendPeriod(v->id,2,1); break;
samer@12 306 case '.': sendPeriod(v->id,1,3); break;
samer@12 307 case ',': sendPeriod(v->id,3,1); break;
samer@12 308 case '+': sendOctave(v->id, ++v->octave); break;
samer@12 309 case '-': sendOctave(v->id, --v->octave); break;
samer@13 310 case '*': sendAmplitude(v->id, v->louder()); break;
samer@13 311 case '/': sendAmplitude(v->id, v->quieter()); break;
samer@13 312 default: printf("unrecognised key: %d.\n",key);
samer@12 313 }
hekeus@6 314 }
hekeus@6 315 }
hekeus@6 316 }
hekeus@6 317 }
hekeus@6 318 }
hekeus@6 319 }
hekeus@6 320
hekeus@6 321 //--------------------------------------------------------------
hekeus@6 322 void melodyTriangle::keyReleased (int key){
hekeus@6 323
hekeus@6 324 }
hekeus@6 325
hekeus@6 326 //--------------------------------------------------------------
hekeus@6 327 void melodyTriangle::mouseMoved(int x, int y ){
hekeus@6 328 for (int i=0; i<numVoices;i++){
hekeus@6 329 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 330 (*voices[i]).highlight=true;
hekeus@6 331 }else {
hekeus@6 332 (*voices[i]).highlight=false;
hekeus@6 333 }
hekeus@6 334
hekeus@6 335 }
hekeus@6 336
hekeus@6 337
hekeus@6 338 }
hekeus@6 339
hekeus@6 340 //--------------------------------------------------------------
hekeus@6 341 void melodyTriangle::mouseDragged(int x, int y, int button){
hekeus@6 342
hekeus@6 343 }
hekeus@6 344
hekeus@6 345 //--------------------------------------------------------------
hekeus@6 346 void melodyTriangle::mousePressed(int x, int y, int button){
hekeus@6 347
hekeus@6 348 for (int i=0; i<numVoices;i++){
hekeus@6 349 if ((*voices[i]).isInVoice(x,y)){
hekeus@6 350 voiceGrabbed=i;
hekeus@6 351 //printf("grabbed %i",voiceGrabbed);
hekeus@6 352 }else{
hekeus@6 353 //printf("didnt grab %i",i);
hekeus@6 354 }
hekeus@6 355 }
hekeus@6 356 }
hekeus@6 357
hekeus@6 358
hekeus@6 359
hekeus@6 360 //--------------------------------------------------------------
hekeus@6 361 void melodyTriangle::mouseReleased(int x, int y, int button){
hekeus@6 362 //printf("released %i",voiceGrabbed);
hekeus@6 363 voiceGrabbed=-1;
hekeus@6 364 }
hekeus@6 365
hekeus@6 366 //--------------------------------------------------------------
hekeus@6 367 void melodyTriangle::windowResized(int w, int h){
hekeus@6 368
hekeus@6 369 }