diff src/melodyTriangle.cpp @ 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
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 -----------------------------------------