Mercurial > hg > screen-ui
changeset 38:330f2746fedd tip
Added keys help in a smaller font; changed loadness keyboard controls.
author | samer |
---|---|
date | Mon, 27 Feb 2012 20:09:10 +0000 |
parents | 260cc4f4d70a |
children | |
files | src/melodyTriangle.cpp src/melodyTriangle.h |
diffstat | 2 files changed, 89 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/melodyTriangle.cpp Wed Feb 22 00:30:20 2012 +0000 +++ b/src/melodyTriangle.cpp Mon Feb 27 20:09:10 2012 +0000 @@ -3,6 +3,7 @@ #define BUFFER_ZONE 64 // have to drag this far to snap out of triange. #define NUM_TEMPI 9 +#define NUMEL(a) sizeof(a)/sizeof(a[0]) static int tempi[]={20,30,45,60,90,120,150,180,240}; @@ -25,13 +26,15 @@ bool enableKeys,int voiceIdOffset,int receivePort): numVoices(numVoices), receivePort(receivePort), snapTruePos(enableKeys), enableKeys(enableKeys), randInit(false),allowExit(true), ratio(2), tempoIndex(4), - display_msg(""), display_frames(0) + display_msg(""), display_frames(0), display_font(NULL) { for (int i=0;i<numVoices;i++) voices[i]=new Voice(i+1+voiceIdOffset); sender.setup( host,port ); receiver.setup( receivePort ); - display_font.loadFont("/System/Library/Fonts/LucidaGrande.ttc",24); + main_font.loadFont("/System/Library/Fonts/LucidaGrande.ttc",24); + help_font.loadFont("/System/Library/Fonts/Menlo.ttc",16); + //help_font.loadFont("/System/Library/Fonts/Courier.dfont",16); } melodyTriangle::~melodyTriangle() { @@ -149,15 +152,15 @@ // display message if any if (display_frames!=0) { - ofRectangle bbox=display_font.getStringBoundingBox(display_msg,0,0); + ofRectangle bbox=display_font->getStringBoundingBox(display_msg,0,0); ofSetColor(220,220,220); - display_font.drawString(display_msg, + display_font->drawString(display_msg, (ofGetWidth()-bbox.width)/2, (ofGetHeight()-bbox.height)/2); if (display_frames>0) display_frames--; } if (ratio!=2) { ofSetColor(160,160,160); - display_font.drawString(ofToString(ratio),16,ofGetHeight()-16); + display_font->drawString(ofToString(ratio),16,ofGetHeight()-16); } } @@ -205,6 +208,44 @@ ratio=2; } } + +struct command { + const char *key; + const char *desc; +}; + +struct command voice_commands[] = { +// { "←", "fractional delay" }, +// { "→", "fractional advance" }, +// { "↑", "multiply note rate" }, +// { "↓", "divide note rate" }, + { "[right]", "fractional delay" }, + { "[left]", "fractional advance" }, + { "[up]", "multiply note rate" }, + { "[down]", "divide note rate" }, + { "[", "transpose octave down" }, + { "]", "transpose octave up" }, + { "{", "quieter" }, + { "}", "louder" }, + { "c", "change to nearby pattern" }, + { "s", "shuffle notes" }, + { "h", "this help screen" }, + { "H", "global keys help screen" }, +}; + +struct command global_commands[] = { + { "<", "reduce tempo" }, + { ">", "increase tempo" }, + { "I", "toggle randomise on birth" }, + { "S", "save current pattern" }, + { "C", "calibrate triangle" }, + { "F", "toggle full screen" }, + { "R", "reset token positions" }, + { "Q", "quit" }, + { "H", "this help screen" }, + { "h", "token keys help screen" } +}; + void melodyTriangle::keyPressed(int key){ if (enableKeys){ if (key>='2' && key<='9') { @@ -213,11 +254,11 @@ printf("got key: %d.\n",key); switch (key) { - case '{': + case '<': if (tempoIndex>0) tempoIndex--; sender << msg("/tempo",tempi[tempoIndex]); break; - case '}': + case '>': if (tempoIndex<NUM_TEMPI-1) tempoIndex++; sender << msg("/tempo",tempi[tempoIndex]); break; @@ -225,9 +266,10 @@ case ' ': sender << msg("/marker"); break; case 'S': sender << msg("/save"); break; case 'r': sender << msg("/report"); break; - case 'i': + case 'I': randInit ^= true; display_msg = (randInit?"randomise on birth":"no randomise on birth"); + display_font = &main_font; display_frames = 40; break; case 'C': { @@ -238,6 +280,15 @@ case 'F': ofToggleFullscreen(); break; case 'R': reset(); break; case 'Q': ofAppGlutWindow::exitApp(); + case '/': display_frames=0; break; + case 'h': + case 'H': + case '?': + display_frames = -1; + display_msg = help_string(key!='h'); + display_font = &help_font; + break; + case OF_KEY_ESC: setKeyboardEnable(false); break; default: // otherwise, send key to all voices under mouse @@ -266,13 +317,33 @@ case OF_KEY_DOWN: sender << msgPeriod(v->id,ratio,1); break; case ']': sender << msgOctave(v->id, ++v->octave); break; case '[': sender << msgOctave(v->id, --v->octave); break; - case '*': sender << msgAmplitude(v->id, v->louder()); break; - case '/': sender << msgAmplitude(v->id, v->quieter()); break; + case '}': sender << msgAmplitude(v->id, v->louder()); break; + case '{': sender << msgAmplitude(v->id, v->quieter()); break; case 'c': sender << msg("/change",v->id); v->status=Voice::pending; break; + case 's': sender << msg("/shuffle",v->id); break; default: printf("unrecognised key: %d.\n",key); } } +inline int max(int x, int y) { return y>x ? y : x; } + +string melodyTriangle::help_string(bool global) { + stringstream buf; + struct command *cmds; + int n, maxw=0; + + buf << " ( " << (global ? "GLOBAL" : "TOKEN") << " KEYBOARD CONTROLS ) \n\n"; + if (global) { cmds=global_commands; n=NUMEL(global_commands); } + else { cmds=voice_commands; n=NUMEL(voice_commands); } + + for (int i=0; i<n; i++) maxw=max(maxw,strlen(cmds[i].key)); + for (int i=0; i<n; i++) buf << setw(maxw) << cmds[i].key << " - " << cmds[i].desc << "\n"; + + buf << "\nPress '/' to dismiss."; + return buf.str(); +} + + //- Mouse ------------------------------------------------------ void melodyTriangle::mouseDragged(int x, int y, int button){} @@ -378,8 +449,9 @@ } else if (msg_path=="/display") { display_msg=m.getArgAsString(0); display_frames=m.getArgAsInt32(1); + display_font=&main_font; } else if (msg_path=="/font") { - display_font.loadFont(m.getArgAsString(0),m.getArgAsInt32(1)); + main_font.loadFont(m.getArgAsString(0),m.getArgAsInt32(1)); } else if (msg_path=="/keyboard") { setKeyboardEnable(m.getArgAsInt32(0)); } else if (msg_path=="/reset") { reset(); } else if (msg_path=="/fullscreen") { ofSetFullscreen(m.getArgAsInt32(0)); } @@ -408,6 +480,7 @@ snapTruePos=en; display_msg=en ? "Keyboard enabled" : "Keybard disabled"; display_frames=40; + display_font=&main_font; } // OSC Message sending -----------------------------------------
--- a/src/melodyTriangle.h Wed Feb 22 00:30:20 2012 +0000 +++ b/src/melodyTriangle.h Mon Feb 27 20:09:10 2012 +0000 @@ -53,6 +53,7 @@ bool clipToTriangle(int *cx, int *cy); void fitTriangleIn(int w, int h); void reset(); + string help_string(bool global); // Immutable after construction and setup ofxOscSender sender; @@ -72,9 +73,11 @@ bool allowExit; bool snapTruePos; bool randInit; - int display_frames; int ratio; int tempoIndex; + int display_frames; string display_msg; - ofTrueTypeFont display_font; + ofTrueTypeFont *display_font; + ofTrueTypeFont help_font; + ofTrueTypeFont main_font; };