Mercurial > hg > screen-ui
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/melodyTriangle.cpp Wed Jan 25 16:30:07 2012 +0000 @@ -0,0 +1,434 @@ +#include "melodyTriangle.h" +#include <GLUT/GLUT.h> + +/* + /birth id + /death id + /start id + /stop id + /track id x y left right top bottom area + /tempo + + + */ +melodyTriangle::melodyTriangle(const char *host, int port, int numVoices, bool enableKeys,int voiceIdOffset){ + printf("in constructor: %s %i %i %i\n",host,port,numVoices,enableKeys); + this->numVoices=numVoices; + this->enableKeys=enableKeys; + this->voiceIdOffset=voiceIdOffset; + //voices=*Voice[numVoices]; + sender.setup( host,port ); +} + +//-------------------------------------------------------------- +void melodyTriangle::setup(){ + //voices = new Voice[NUMVOICES]; + + ofSetCircleResolution(100); + ofBackground(0,0,0); + ofSetWindowTitle("Melody Triangle"); + triangleHeight=ofGetHeight()*0.75; + ofSetFrameRate(40); // if vertical sync is off, we can go a bit fast... this caps the framerate at 60fps. + ofEnableSmoothing(); + x1=ofGetWidth()/2; + y1=(ofGetHeight()-triangleHeight)/2; + x2=ofGetWidth()/2-triangleHeight/sqrt(3); + y2=ofGetHeight()-(ofGetHeight()-triangleHeight)/2; + x3=ofGetWidth()/2+triangleHeight/sqrt(3); + y3=y2; + + ofxOscMessage m; + m.setAddress( "/calibrate" ); + m.addIntArg( x1 ); + m.addIntArg( y1 ); + m.addIntArg( x2 ); + m.addIntArg( y2 ); + m.addIntArg( x3 ); + m.addIntArg( y3 ); + sender.sendMessage( m ); + printf("sent /calibrate %i %i %i %i %i %i\n",x1,y1,x2,y2,x3,y3); + + for (int i=0;i<numVoices;i++){ + + voices[i]=new Voice(i+1+voiceIdOffset,x2+15,y1+20+i*30); + } + voiceGrabbed=-1; +} + +//-------------------------------------------------------------- +void melodyTriangle::update(){ +} + +bool melodyTriangle::isInTriangle(int x, int y){ + if (x>x2 && x<x3 && y>y1 && y<y2){ + //printf("in bounding box\n"); + float dx=abs(x-x1); + float dy=abs(y-y1); + //printf("tan(30)- dx/dy: %f\n",tan(30*PI/180)-dx/dy); + + if (dx/dy < tan(30*PI/180)){ + + //printf("in triangle \n"); + return true; + }else { + //printf("not in triangle \n"); + return false; + } + + }else{ + //printf("not in bounding box \n"); + return false; + } +} + +void melodyTriangle::sendStatus(Voice v){ + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/track2d" ); + m.addIntArg( v.id ); + m.addIntArg( v.posx ); + m.addIntArg( v.posy ); + sender.sendMessage( m ); + printf("sent - /track2d %i %i %i\n",v.id,v.posx,v.posy); + +} + +//-------------------------------------------------------------- +void melodyTriangle::draw(){ + + + //let's draw our triangle + ofSetColor(0,0,255); + + ofFill(); + ofTriangle(x1, y1, x2, y2, x3, y3); + bool sendStart=false; + if (voiceGrabbed!=-1){ + if (mouseX!=(*voices[voiceGrabbed]).posx || mouseY!=(*voices[voiceGrabbed]).posy){ + //(*voices[voiceGrabbed]).posx=mouseX; + //(*voices[voiceGrabbed]).posy=mouseY; + if ((*voices[voiceGrabbed]).inTriangle && !isInTriangle(mouseX,mouseY)){ + ///death id + + if (ofDist((*voices[voiceGrabbed]).posx, (*voices[voiceGrabbed]).posy, mouseX, mouseY) > (*voices[voiceGrabbed]).radius*2){ + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/death" ); + m.addIntArg( (*voices[voiceGrabbed]).id ); + sender.sendMessage( m ); + + printf("sent /death %i \n",(*voices[voiceGrabbed]).id); + (*voices[voiceGrabbed]).posx=mouseX; + (*voices[voiceGrabbed]).posy=mouseY; + + } else { + //printf("e"); + //On Edge + } + + }else{ + (*voices[voiceGrabbed]).posx=mouseX; + (*voices[voiceGrabbed]).posy=mouseY; + //(*voices[voiceGrabbed]).posx=(*voices[voiceGrabbed]).posx*0.9+mouseX*0.1; + //(*voices[voiceGrabbed]).posy=(*voices[voiceGrabbed]).posy*0.9+mouseY*0.1; + + + } + if (!(*voices[voiceGrabbed]).inTriangle && isInTriangle(mouseX,mouseY)){ + //birth id + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/birth" ); + m.addIntArg( (*voices[voiceGrabbed]).id ); + sender.sendMessage( m ); + + printf("sent /birth %i \n",(*voices[voiceGrabbed]).id); + sendStart=true; + } + + + //(*voices[voiceGrabbed]).inTriangle = isInTriangle(mouseX,mouseY); + + (*voices[voiceGrabbed]).inTriangle = isInTriangle((*voices[voiceGrabbed]).posx,(*voices[voiceGrabbed]).posy); + + if ((*voices[voiceGrabbed]).inTriangle){ + sendStatus(*voices[voiceGrabbed]); + if (sendStart){ + if ((*voices[voiceGrabbed]).isActive){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/start" ); + m.addIntArg( (*voices[voiceGrabbed]).id ); + sender.sendMessage( m ); + printf("sent /start %i \n",(*voices[voiceGrabbed]).id); + } + } + } + + } + }; + for (int i=0; i<numVoices; i++){ + (*voices[i]).draw(); + } + + +} + + +//-------------------------------------------------------------- +void melodyTriangle::keyPressed (int key){ + //printf("key %i",key); + if (enableKeys){ + if (key == 'a'){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + + (*voices[i]).isActive=!(*voices[i]).isActive; + ///start id + ///stop id + if ((*voices[i]).isActive){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/start" ); + m.addIntArg( (*voices[i]).id ); + sender.sendMessage( m ); + printf("sent /start %i \n",(*voices[i]).id); + }else { + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/stop" ); + m.addIntArg( (*voices[i]).id ); + sender.sendMessage( m ); + printf("sent /stop %i \n",(*voices[i]).id); + + } + + } + } + } + if (key == OF_KEY_UP){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/period" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg(1); + m.addIntArg(2); + sender.sendMessage( m ); + printf("sent /period %i %i %i\n",(*voices[i]).id,1,2); + + } + } + } + if (key == OF_KEY_DOWN){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/period" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg(2); + m.addIntArg(1); + sender.sendMessage( m ); + printf("sent /period %i %i %i\n",(*voices[i]).id,2,1); + } + } + } + + if (key == '.'){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/period" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg(1); + m.addIntArg(3); + sender.sendMessage( m ); + printf("sent /period %i %i %i\n",(*voices[i]).id,1,3); + } + } + + } + if (key == ','){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/period" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg(3); + m.addIntArg(1); + sender.sendMessage( m ); + printf("sent /period %i %i %i\n",(*voices[i]).id,3,1); + } + } + + } + if (key == OF_KEY_LEFT){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/shift" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg(-1); + m.addIntArg(2); + sender.sendMessage( m ); + printf("sent /shift %i %i %i\n",(*voices[i]).id,-1,2); + + } + } + } + if (key == OF_KEY_RIGHT){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/shift" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg(1); + m.addIntArg(2); + sender.sendMessage( m ); + printf("sent /shift %i %i %i\n",(*voices[i]).id,1,2); + + } + } + } + if (key == '1'){ + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/tempo" ); + m.addIntArg(30); + sender.sendMessage( m ); + printf("sent /tempo 30\n"); + + } + if (key == '2'){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/tempo" ); + m.addIntArg(60); + sender.sendMessage( m ); + printf("sent /tempo 60\n"); + } + if (key == '3'){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/tempo" ); + m.addIntArg(90); + sender.sendMessage( m ); + printf("sent /tempo 90\n"); + } + if (key == '4'){ + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/tempo" ); + m.addIntArg(120); + sender.sendMessage( m ); + printf("sent /tempo 120\n"); + } + if (key == '+'){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + + (*voices[i]).octave++; + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/octave" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg((*voices[i]).octave); + + sender.sendMessage( m ); + printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave); + + } + } + } + + if (key == '-'){ + for (int i=0; i<numVoices; i++){ + if ((*voices[i]).isInVoice(mouseX,mouseY)){ + + (*voices[i]).octave--; + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/octave" ); + m.addIntArg( (*voices[i]).id ); + m.addIntArg((*voices[i]).octave); + + sender.sendMessage( m ); + printf("sent /octave %i %i \n",(*voices[i]).id,(*voices[i]).octave); + + } + } + } + } + if (key == ' '){ + + ofxOscMessage m; + ///track id x y left right top bottom area + m.setAddress( "/marker" ); + sender.sendMessage(m); + printf("sent /marker\n"); + } +} + +//-------------------------------------------------------------- +void melodyTriangle::keyReleased (int key){ + +} + +//-------------------------------------------------------------- +void melodyTriangle::mouseMoved(int x, int y ){ + for (int i=0; i<numVoices;i++){ + if ((*voices[i]).isInVoice(x,y)){ + (*voices[i]).highlight=true; + }else { + (*voices[i]).highlight=false; + } + + } + + +} + +//-------------------------------------------------------------- +void melodyTriangle::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void melodyTriangle::mousePressed(int x, int y, int button){ + + for (int i=0; i<numVoices;i++){ + if ((*voices[i]).isInVoice(x,y)){ + voiceGrabbed=i; + //printf("grabbed %i",voiceGrabbed); + }else{ + //printf("didnt grab %i",i); + } + } +} + + + +//-------------------------------------------------------------- +void melodyTriangle::mouseReleased(int x, int y, int button){ + //printf("released %i",voiceGrabbed); + voiceGrabbed=-1; +} + +//-------------------------------------------------------------- +void melodyTriangle::windowResized(int w, int h){ + +}