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);
--
⑨