shithub: ft²

Download patch

ref: 6bf57d122d29d81afb4f9bbc5d689091b8d24049
parent: 7631018400739f8f20f36d8f038d93ef028fae0a
author: Olav Sørensen <olav.sorensen@live.no>
date: Wed Apr 2 16:30:27 EDT 2025

getPianoKey() speed-up for linear periods

--- a/src/ft2_replayer.c
+++ b/src/ft2_replayer.c
@@ -427,33 +427,42 @@
 	}
 }
 
-// for piano in Instr. Ed. (values outside 0..95 can happen)
-int32_t getPianoKey(uint16_t period, int8_t finetune, int8_t relativeNote)
+// for piano in Instr. Ed. (values outside 0..95 can and will happen)
+int32_t getPianoKey(int32_t period, int8_t finetune, int8_t relativeNote)
 {
-	assert(note2PeriodLUT != NULL);
-	if (period > note2PeriodLUT[0])
-		return -1; // outside left piano edge
+	if (audio.linearPeriodsFlag)
+	{
+		period >>= 2;
+		period += (int8_t)finetune >> 3;
 
-	finetune = ((int8_t)finetune >> 3) + 16; // -128..127 -> 0..31
+		return (((10*12*16) - period) >> 4) - relativeNote;
+	}
+	else
+	{
+		// amiga periods, requires slower method (binary search in amiga period LUT)
 
-	int32_t hiPeriod = 10*12*16;
-	int32_t loPeriod = 0;
+		if (period > amigaPeriodLUT[0])
+			return -1; // outside left piano edge
 
-	for (int32_t i = 0; i < 7; i++)
-	{
-		const int32_t tmpPeriod = (((loPeriod + hiPeriod) >> 1) & ~15) + finetune;
+		int32_t hiPeriod = 10*12*16;
+		int32_t loPeriod = 0;
 
-		int32_t lookUp = tmpPeriod - 16;
-		if (lookUp < 0)
-			lookUp = 0;
+		for (int32_t i = 0; i < 7; i++)
+		{
+			const int32_t tmpPeriod = (((loPeriod + hiPeriod) >> 1) & ~15) + finetune;
 
-		if (period >= note2PeriodLUT[lookUp])
-			hiPeriod = (tmpPeriod - finetune) & ~15;
-		else
-			loPeriod = (tmpPeriod - finetune) & ~15;
-	}
+			int32_t lookUp = tmpPeriod - 16;
+			if (lookUp < 0)
+				lookUp = 0;
 
-	return (loPeriod >> 4) - relativeNote;
+			if (period >= amigaPeriodLUT[lookUp])
+				hiPeriod = (tmpPeriod - finetune) & ~15;
+			else
+				loPeriod = (tmpPeriod - finetune) & ~15;
+		}
+
+		return (loPeriod >> 4) - relativeNote;
+	}
 }
 
 void triggerNote(uint8_t note, uint8_t efx, uint8_t efxData, channel_t *ch)
--- a/src/ft2_replayer.h
+++ b/src/ft2_replayer.h
@@ -294,7 +294,7 @@
 double dAmigaPeriod2Hz(int32_t period);
 double dPeriod2Hz(int32_t period);
 
-int32_t getPianoKey(uint16_t period, int8_t finetune, int8_t relativeNote); // for piano in Instr. Ed.
+int32_t getPianoKey(int32_t period, int8_t finetune, int8_t relativeNote); // for piano in Instr. Ed.
 void triggerNote(uint8_t note, uint8_t efx, uint8_t efxData, channel_t *ch);
 void updateVolPanAutoVib(channel_t *ch);
 
--