shithub: ft²

Download patch

ref: 040c7f468a1c82dc14e3e6ebb466cfc98b0b74eb
parent: 2e7bfbda73d923e35b533193c0b3fee8c90bd5e0
author: Olav Sørensen <[email protected]>
date: Mon Dec 21 11:01:31 EST 2020

Simplified relocateTon() (still accurate)

--- a/src/ft2_replayer.c
+++ b/src/ft2_replayer.c
@@ -1628,32 +1628,29 @@
 {
 	int32_t tmpPeriod;
 
-	const int32_t fineTune = ((ch->fineTune >> 3) + 16) << 1;
-	int32_t hiPeriod = (8 * 12 * 16) * 2;
+	const int32_t fineTune = ((int8_t)ch->fineTune >> 3) + 16;
+	int32_t hiPeriod = 1536; // FT2 bug: should've been 1935
 	int32_t loPeriod = 0;
 
 	for (int32_t i = 0; i < 8; i++)
 	{
-		tmpPeriod = (((loPeriod + hiPeriod) >> 1) & 0xFFFFFFE0) + fineTune;
+		tmpPeriod = (((loPeriod + hiPeriod) >> 1) & ~15) + fineTune;
 
-		int32_t tableIndex = (uint32_t)(tmpPeriod - 16) >> 1;
-		tableIndex = CLAMP(tableIndex, 0, 1935); // 8bitbubsy: added security check
+		int32_t lookUp = tmpPeriod - 8;
+		if (lookUp < 0)
+			lookUp = 0; // 8bitbubsy: safety fix (C-0 w/ finetune <= -65)
 
-		if (period >= note2Period[tableIndex])
-			hiPeriod = (tmpPeriod - fineTune) & 0xFFFFFFE0;
+		if (period >= note2Period[lookUp])
+			hiPeriod = (tmpPeriod - fineTune) & ~15;
 		else
-			loPeriod = (tmpPeriod - fineTune) & 0xFFFFFFE0;
+			loPeriod = (tmpPeriod - fineTune) & ~15;
 	}
 
-	tmpPeriod = loPeriod + fineTune + (arpNote << 5);
+	tmpPeriod = loPeriod + fineTune + (arpNote << 4);
+	if (tmpPeriod >= 1550) // FT2 bugs: off-by-one edge case, and should've been 1935 (1936)
+		tmpPeriod = 1551;
 
-	if (tmpPeriod < 0) // 8bitbubsy: added security check
-		tmpPeriod = 0;
-
-	if (tmpPeriod >= (8*12*16+15)*2-1) // FT2 bug: off-by-one edge case
-		tmpPeriod = (8*12*16+15)*2;
-
-	return note2Period[(uint32_t)tmpPeriod>>1];
+	return note2Period[tmpPeriod];
 }
 
 static void vibrato2(stmTyp *ch)