shithub: ft²

Download patch

ref: b48f9f24fa04cfbf4f97f199a0d4e6542bc6aabb
parent: 900219373bae44cbf473a35dd8f414ce67768d28
author: Olav Sørensen <olav.sorensen@live.no>
date: Wed Jan 13 16:23:21 EST 2021

New feature: Draw C-4 (mid-C) frequency in Inster. Ed.

--- a/src/ft2_inst_ed.c
+++ b/src/ft2_inst_ed.c
@@ -114,7 +114,6 @@
 	9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11
 };
 
-
 // thread data
 static uint16_t saveInstrNr;
 static SDL_Thread *thread;
@@ -438,6 +437,23 @@
 	hexOutBg(505, 191, PAL_FORGRND, PAL_DESKTOP, s->pan, 2);
 }
 
+void drawC4Rate(void)
+{
+	fillRect(465, 299, 71, 8, PAL_DESKTOP);
+
+	int32_t C4Hz = 0;
+	if (editor.curInstr != 0)
+	{
+		instrTyp *ins = instr[editor.curInstr];
+		if (ins != NULL)
+			C4Hz = (int32_t)(getSampleC4Rate(&ins->samp[editor.curSmp]) + 0.5); // rounded
+	}
+
+	char str[64];
+	sprintf(str, "%dHz", C4Hz);
+	textOut(465, 299, PAL_FORGRND, str);
+}
+
 static void drawFineTune(void)
 {
 	sampleTyp *s;
@@ -505,7 +521,7 @@
 
 	if (instr[editor.curInstr] == NULL)
 	{
-		fillRect(598, 299, 8*3, 8, PAL_BCKGRND);
+		fillRect(600, 299, 8*3, 8, PAL_BCKGRND);
 		return;
 	}
 
@@ -528,9 +544,9 @@
 
 	const char octaChar = '0' + (note2 / 12);
 
-	charOutBg(598, 299, PAL_FORGRND, PAL_BCKGRND, noteChar1);
-	charOutBg(606, 299, PAL_FORGRND, PAL_BCKGRND, noteChar2);
-	charOutBg(614, 299, PAL_FORGRND, PAL_BCKGRND, octaChar);
+	charOutBg(600, 299, PAL_FORGRND, PAL_BCKGRND, noteChar1);
+	charOutBg(608, 299, PAL_FORGRND, PAL_BCKGRND, noteChar2);
+	charOutBg(616, 299, PAL_FORGRND, PAL_BCKGRND, octaChar);
 }
 
 static void setStdVolEnvelope(instrTyp *ins, uint8_t num)
@@ -723,6 +739,7 @@
 		s->relTon = 71;
 
 	drawRelTone();
+	drawC4Rate();
 	setSongModifiedFlag();
 }
 
@@ -739,6 +756,7 @@
 		s->relTon = -48;
 
 	drawRelTone();
+	drawC4Rate();
 	setSongModifiedFlag();
 }
 
@@ -753,6 +771,7 @@
 	{
 		s->relTon++;
 		drawRelTone();
+		drawC4Rate();
 		setSongModifiedFlag();
 	}
 }
@@ -768,6 +787,7 @@
 	{
 		s->relTon--;
 		drawRelTone();
+		drawC4Rate();
 		setSongModifiedFlag();
 	}
 }
@@ -1283,6 +1303,7 @@
 	{
 		s->fine = (int8_t)(pos - 128);
 		drawFineTune();
+		drawC4Rate();
 		setSongModifiedFlag();
 	}
 }
@@ -1945,55 +1966,6 @@
 	}
 }
 
-static void textOutTiny(int32_t xPos, int32_t yPos, char *str, uint32_t color)
-{
-	uint32_t *dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos];
-	while (*str != '\0')
-	{
-		const char chr = *str++;
-		if (chr < '0' || chr > '9')
-		{
-			dstPtr += FONT3_CHAR_W;
-			continue;
-		}
-
-		const uint8_t *srcPtr = &bmp.font3[(chr - '0') * FONT3_CHAR_W];
-		for (int32_t y = 0; y < FONT3_CHAR_H; y++)
-		{
-			for (int32_t x = 0; x < FONT3_CHAR_W; x++)
-			{
-#ifdef __arm__
-				if (srcPtr[x] != 0)
-					dstPtr[x] = color;
-#else
-				// carefully written like this to generate conditional move instructions (font data is hard to predict)
-				uint32_t tmp = dstPtr[x];
-				if (srcPtr[x] != 0) tmp = color;
-				dstPtr[x] = tmp;
-#endif
-			}
-
-			srcPtr += FONT3_WIDTH;
-			dstPtr += SCREEN_W;
-		}
-
-		dstPtr -= (SCREEN_W * FONT3_CHAR_H) - FONT3_CHAR_W;
-	}
-}
-
-static void textOutTinyOutline(int32_t xPos, int32_t yPos, char *str)
-{
-	const uint32_t bgColor = video.palette[PAL_BCKGRND];
-	const uint32_t fgColor = video.palette[PAL_FORGRND];
-
-	textOutTiny(xPos-1, yPos,   str, bgColor);
-	textOutTiny(xPos,   yPos-1, str, bgColor);
-	textOutTiny(xPos+1, yPos,   str, bgColor);
-	textOutTiny(xPos,   yPos+1, str, bgColor);
-
-	textOutTiny(xPos, yPos, str, fgColor);
-}
-
 static void drawVolEnvCoords(int16_t tick, int16_t val)
 {
 	char str[4];
@@ -2053,7 +2025,7 @@
 		tick = 0;
 		val = 0;
 
-		if (ins != NULL)
+		if (ins != NULL && ins->envVPAnt > 0)
 		{
 			tick = ins->envVP[editor.currVolEnvPoint][0];
 			val = ins->envVP[editor.currVolEnvPoint][1];
@@ -2070,7 +2042,7 @@
 		tick = 0;
 		val = 32;
 
-		if (ins != NULL)
+		if (ins != NULL && ins->envPPAnt > 0)
 		{
 			tick = ins->envPP[editor.currPanEnvPoint][0];
 			val = ins->envPP[editor.currPanEnvPoint][1];
@@ -2201,6 +2173,7 @@
 	drawVibSpeed();
 	drawVibDepth();
 	drawVibSweep();
+	drawC4Rate();
 	drawRelTone();
 
 	// set scroll bars
@@ -2271,7 +2244,7 @@
 	drawFramework(2,   188, 337,  70, FRAMEWORK_TYPE2);
 	drawFramework(2,   275, 337,  70, FRAMEWORK_TYPE2);
 	drawFramework(2,   349, 628,  49, FRAMEWORK_TYPE2);
-	drawFramework(590, 296,  40,  15, FRAMEWORK_TYPE2);
+	drawFramework(593, 296,  36,  15, FRAMEWORK_TYPE2);
 
 	textOutShadow(20,  176, PAL_FORGRND, PAL_DSKTOP2, "Volume envelope:");
 	textOutShadow(153, 176, PAL_FORGRND, PAL_DSKTOP2, "Predef.");
@@ -2294,7 +2267,8 @@
 	textOutShadow(442, 236, PAL_FORGRND, PAL_DSKTOP2, "Vib.speed");
 	textOutShadow(442, 250, PAL_FORGRND, PAL_DSKTOP2, "Vib.depth");
 	textOutShadow(442, 264, PAL_FORGRND, PAL_DSKTOP2, "Vib.sweep");
-	textOutShadow(453, 299, PAL_FORGRND, PAL_DSKTOP2, "Tone relative to C-4:");
+	textOutShadow(442, 299, PAL_FORGRND, PAL_DSKTOP2, "C4=");
+	textOutShadow(537, 299, PAL_FORGRND, PAL_DSKTOP2, "Rel. note");
 
 	showScrollBar(SB_INST_VOL);
 	showScrollBar(SB_INST_PAN);
--- a/src/ft2_inst_ed.h
+++ b/src/ft2_inst_ed.h
@@ -6,6 +6,8 @@
 #include "ft2_audio.h"
 #include "ft2_unicode.h"
 
+void drawC4Rate(void);
+
 void saveInstr(UNICHAR *filenameU, int16_t nr);
 void loadInstr(UNICHAR *filenameU);
 void copyInstr(void); // dstInstr = srcInstr
--- a/src/ft2_sample_ed.c
+++ b/src/ft2_sample_ed.c
@@ -460,11 +460,7 @@
 
 int32_t getSampleMiddleCRate(sampleTyp *s)
 {
-	const int32_t realFineTune = (int32_t)s->fine >> 3; // the FT2 replayer is ASR'ing the finetune to the right by 3
-	const double dFTune = realFineTune / 16.0; // new range is -16..15
-
-	const double dFreq = 8363.0 * exp2((s->relTon + dFTune) / 12.0);
-	return (int32_t)(dFreq + 0.5); // rounded
+	return (int32_t)(getSampleC4Rate(s) + 0.5); // rounded
 }
 
 int32_t getSampleRangeStart(void)