comparison src/melodyTriangle.cpp @ 30:9e8c19c90986

Added visual confirmation on keyboard enable/disable.
author samer
date Mon, 06 Feb 2012 11:50:03 +0000
parents 10afc9afb79d
children 417deb31dd4e
comparison
equal deleted inserted replaced
29:10afc9afb79d 30:9e8c19c90986
5 5
6 static int tempi[]={20,30,45,60,90,120,150,180}; 6 static int tempi[]={20,30,45,60,90,120,150,180};
7 7
8 melodyTriangle::melodyTriangle(const char *host, int port, int numVoices, 8 melodyTriangle::melodyTriangle(const char *host, int port, int numVoices,
9 bool enableKeys,int voiceIdOffset,int receivePort): 9 bool enableKeys,int voiceIdOffset,int receivePort):
10 numVoices(numVoices), enableKeys(enableKeys), receivePort(receivePort), 10 numVoices(numVoices), receivePort(receivePort),
11 display_msg(""), display_frames(0), ratio(2), tempoIndex(4) 11 enableKeys(enableKeys), allowExit(true), ratio(2), tempoIndex(4),
12 display_msg(""), display_frames(0)
12 { 13 {
13 printf("in constructor: %s %i %i %i %i %i\n",
14 host,port,numVoices,enableKeys,voiceIdOffset,receivePort);
15 for (int i=0;i<numVoices;i++) voices[i]=new Voice(i+1+voiceIdOffset); 14 for (int i=0;i<numVoices;i++) voices[i]=new Voice(i+1+voiceIdOffset);
16 15
17 sender.setup( host,port ); 16 sender.setup( host,port );
18 receiver.setup( receivePort ); 17 receiver.setup( receivePort );
19 display_font.loadFont("/System/Library/Fonts/LucidaGrande.ttc",24); 18 display_font.loadFont("/System/Library/Fonts/LucidaGrande.ttc",24);
64 63
65 if (vg->inTriangle) { 64 if (vg->inTriangle) {
66 65
67 if (clipped) { 66 if (clipped) {
68 // check how far we clipped 67 // check how far we clipped
69 if (ofDist(clipx, clipy, mouseX, mouseY) > BUFFER_ZONE) { 68 if (ofDist(clipx, clipy, mouseX, mouseY)>BUFFER_ZONE && allowExit) {
70 // if far enough, we pop out of triangle and send 69 // if far enough, we pop out of triangle and send
71 send("/death",vg->id); 70 send("/death",vg->id);
72 vg->posx=mouseX; 71 vg->posx=mouseX;
73 vg->posy=mouseY; 72 vg->posy=mouseY;
74 vg->inTriangle=false; 73 vg->inTriangle=false;
204 case 'S': send("/save"); break; 203 case 'S': send("/save"); break;
205 case 'C': sendReplyTo(); sendCalibrate(); break; 204 case 'C': sendReplyTo(); sendCalibrate(); break;
206 case 'F': ofToggleFullscreen(); break; 205 case 'F': ofToggleFullscreen(); break;
207 case 'R': reset(); break; 206 case 'R': reset(); break;
208 case 'Q': ofAppGlutWindow::exitApp(); 207 case 'Q': ofAppGlutWindow::exitApp();
208 case OF_KEY_ESC: setKeyboardEnable(false); break;
209 209
210 default: // otherwise, send key to all voices under mouse 210 default: // otherwise, send key to all voices under mouse
211 for (int i=0; i<numVoices; i++) 211 for (int i=0; i<numVoices; i++)
212 if (voices[i]->isInVoice(mouseX,mouseY)) 212 if (voices[i]->isInVoice(mouseX,mouseY))
213 voiceKeypress(voices[i],key); 213 voiceKeypress(voices[i],key);
214 } 214 }
215 } 215 }
216 } else send("/key",key); 216 } else {
217 if (key==OF_KEY_ESC) setKeyboardEnable(true);
218 else send("/key",key);
219 }
217 } 220 }
218 221
219 void melodyTriangle::voiceKeypress(Voice *v, int key) { 222 void melodyTriangle::voiceKeypress(Voice *v, int key) {
220 switch (key) { 223 switch (key) {
221 case 'a': 224 case 'a':
276 v->posx=x2+RADIUS+(numVoices-1-i)*36; 279 v->posx=x2+RADIUS+(numVoices-1-i)*36;
277 v->posy=48; 280 v->posy=48;
278 v->status=Voice::pending; 281 v->status=Voice::pending;
279 v->isActive=true; 282 v->isActive=true;
280 if (v->inTriangle) { 283 if (v->inTriangle) {
281 send("/death",voices[i]->id); 284 send("/death",v->id);
282 v->inTriangle=false; 285 v->inTriangle=false;
283 } 286 }
284 } 287 }
285 } 288 }
286 289
287 // OSC Message handling ----------------------------------------- 290 // OSC Message handling -----------------------------------------
288 291
289 Voice *melodyTriangle::get_voice(int id) throw(bad_voice_id) { 292 Voice *melodyTriangle::get_voice(int id) throw(bad_voice_id) {
290 if (id<1 || id>numVoices) throw bad_voice_id(id); 293 for (int i=0; i<numVoices; i++) {
291 return voices[id-1]; 294 if (voices[i]->id==id) return voices[i];
295 }
296 throw bad_voice_id(id);
292 } 297 }
293 298
294 void melodyTriangle::handleMessage(ofxOscMessage &m) { 299 void melodyTriangle::handleMessage(ofxOscMessage &m) {
295 string msg_path=m.getAddress(); 300 string msg_path=m.getAddress();
296 301
330 } else if (msg_path=="/display") { 335 } else if (msg_path=="/display") {
331 display_msg=m.getArgAsString(0); 336 display_msg=m.getArgAsString(0);
332 display_frames=m.getArgAsInt32(1); 337 display_frames=m.getArgAsInt32(1);
333 } else if (msg_path=="/font") { 338 } else if (msg_path=="/font") {
334 display_font.loadFont(m.getArgAsString(0),m.getArgAsInt32(1)); 339 display_font.loadFont(m.getArgAsString(0),m.getArgAsInt32(1));
335 } else if (msg_path=="/keyboard") { enableKeys=m.getArgAsInt32(0); } 340 } else if (msg_path=="/keyboard") { setKeyboardEnable(m.getArgAsInt32(0)); }
336 else if (msg_path=="/reset") { reset(); } 341 else if (msg_path=="/reset") { reset(); }
337 else if (msg_path=="/fullscreen") { ofSetFullscreen(m.getArgAsInt32(0)); } 342 else if (msg_path=="/fullscreen") { ofSetFullscreen(m.getArgAsInt32(0)); }
338 else if (msg_path=="/quit") { ofAppGlutWindow::exitApp(); } 343 else if (msg_path=="/quit") { ofAppGlutWindow::exitApp(); }
344 else if (msg_path=="/allowExit") { allowExit=m.getArgAsInt32(0); }
339 else { 345 else {
340 cout << m.getAddress(); 346 cout << m.getAddress();
341 for (int i=0; i<m.getNumArgs(); i++) { 347 for (int i=0; i<m.getNumArgs(); i++) {
342 cout << " " << m.getArgTypeName(i) << ":"; 348 cout << " " << m.getArgTypeName(i) << ":";
343 switch (m.getArgType(i)) { 349 switch (m.getArgType(i)) {
352 } catch (std::exception &ex) { 358 } catch (std::exception &ex) {
353 cout << "** Error processing OSC message: " << ex.what() << "\n"; 359 cout << "** Error processing OSC message: " << ex.what() << "\n";
354 } 360 }
355 } 361 }
356 362
363 void melodyTriangle::setKeyboardEnable(bool en) {
364 enableKeys=en;
365 display_msg=en ? "Keyboard enabled" : "Keybard disabled";
366 display_frames=40;
367 }
368
357 // OSC Message sending ----------------------------------------- 369 // OSC Message sending -----------------------------------------
358 370
359 void melodyTriangle::sendPosition(Voice *v){ 371 void melodyTriangle::sendPosition(Voice *v){
360 372
361 ofxOscMessage m; 373 ofxOscMessage m;
457 } 469 }
458 470
459 const char *melodyTriangle::bad_voice_id::what() const throw() { 471 const char *melodyTriangle::bad_voice_id::what() const throw() {
460 std::stringstream out; 472 std::stringstream out;
461 printf("bad_voice_id(%d).\n",id); 473 printf("bad_voice_id(%d).\n",id);
462 out << "Voice id " << id <<" out of range."; 474 out << "Voice id " << id <<" not present.";
463 return out.str().c_str(); 475 return out.str().c_str();
464 } 476 }