Mercurial > hg > screen-ui
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 } |