ft2-clone

Fasttracker 2 clone
Log | Files | Refs | README | LICENSE

commit 53456ab178ac8f0e9399af1cf87122a2fc479fe8
parent f8c9eaf54b72e77320cb3ad47bc2526a59e78cee
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Wed, 13 Jan 2021 21:23:31 +0100

Micro optimizations ;)

Diffstat:
Msrc/ft2_audio.c | 2+-
Msrc/ft2_header.h | 2+-
Msrc/ft2_replayer.h | 13+++++++++----
Msrc/ft2_scopes.c | 34+++++++++++++++++++++-------------
Msrc/ft2_scopes.h | 6+++---
5 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/src/ft2_audio.c b/src/ft2_audio.c @@ -198,7 +198,7 @@ void calcPanningTable(void) { // same formula as FT2's panning table (with 0.0f..1.0f range) for (int32_t i = 0; i <= 256; i++) - dPanningTab[i] = sqrt(i / 256.0); + dPanningTab[i] = sqrt(i * (1.0 / 256.0)); } static void voiceUpdateVolumes(int32_t i, uint8_t status) diff --git a/src/ft2_header.h b/src/ft2_header.h @@ -12,7 +12,7 @@ #endif #include "ft2_replayer.h" -#define PROG_VER_STR "1.42" +#define PROG_VER_STR "1.43" // do NOT change these! It will only mess things up... diff --git a/src/ft2_replayer.h b/src/ft2_replayer.h @@ -213,9 +213,12 @@ typedef struct stmTyp_t int16_t midiPitch; uint16_t outPeriod, realPeriod, finalPeriod, tonTyp, wantPeriod, portaSpeed; uint16_t envVCnt, envPCnt, eVibAmp, eVibSweep; - uint16_t fadeOutAmp, fadeOutSpeed, midiVibDepth; - double dEnvVIPValue, dEnvPIPValue, dEnvVAmp, dEnvPAmp, dFinalVol; + uint16_t fadeOutAmp, fadeOutSpeed, midiVibDepth; + int32_t envVIPValue, envPIPValue, envVAmp, envPAmp; int32_t oldFinalPeriod, smpStartPos; + + double dFinalVol; + sampleTyp *smpPtr; instrTyp *instrPtr; } stmTyp; @@ -247,13 +250,15 @@ typedef struct syncedChannel_t // used for audio/video sync queue double dFinalVol; } syncedChannel_t; +double getSampleC4Rate(sampleTyp *s); + void setNewSongPos(int32_t pos); void resetReplayerState(void); void fixSongName(void); // removes spaces from right side of song name void fixSampleName(int16_t nr); // removes spaces from right side of ins/smp names void calcReplayerVars(int32_t rate); -void tuneSample(sampleTyp *s, int32_t midCFreq); +void tuneSample(sampleTyp *s, const int32_t midCFreq); void calcRevMixDeltaTable(void); void calcReplayerLogTab(void); @@ -262,7 +267,7 @@ double dPeriod2Hz(uint16_t period); int64_t getMixerDelta(uint16_t period); uint32_t getRevMixerDelta(uint16_t period); -int32_t getPianoKey(uint16_t period, int32_t finetune, int32_t relativeNote); // for piano in Instr. Ed. +int32_t getPianoKey(uint16_t period, int8_t finetune, int8_t relativeNote); // for piano in Instr. Ed. bool allocateInstr(int16_t nr); void freeInstr(int32_t nr); diff --git a/src/ft2_scopes.c b/src/ft2_scopes.c @@ -26,9 +26,8 @@ #define SCOPE_HEIGHT 36 static volatile bool scopesUpdatingFlag, scopesDisplayingFlag; -static int32_t oldPeriod; -static uint32_t oldDrawDelta, scopeTimeLen, scopeTimeLenFrac; -static uint64_t oldDelta, timeNext64, timeNext64Frac; +static uint32_t scopeTimeLen, scopeTimeLenFrac; +static uint64_t timeNext64, timeNext64Frac; static volatile scope_t scope[MAX_VOICES]; static SDL_Thread *scopeThread; @@ -36,9 +35,13 @@ lastChInstr_t lastChInstr[MAX_VOICES]; // global void resetCachedScopeVars(void) { - oldPeriod = -1; - oldDelta = 0; - oldDrawDelta = 0; + volatile scope_t *sc = scope; + for (int32_t i = 0; i < MAX_VOICES; i++, sc++) + { + sc->oldPeriod = -1; + sc->oldDrawDelta = 0; + sc->oldDelta = 0; + } } int32_t getSamplePosition(uint8_t ch) @@ -383,9 +386,14 @@ static void updateScopes(void) // scope position update s.posFrac += s.delta; - s.pos += (int32_t)(s.posFrac >> SCOPE_FRAC_BITS) * s.direction; + const int32_t wholeSamples = (int32_t)(s.posFrac >> SCOPE_FRAC_BITS); s.posFrac &= SCOPE_FRAC_MASK; + if (s.direction == 1) + s.pos += wholeSamples; // forwards + else + s.pos -= wholeSamples; // backwards + // handle loop wrapping or sample end if (s.direction == -1 && s.pos < s.loopStart) // sampling backwards (definitely pingpong loop) { @@ -521,20 +529,20 @@ void handleScopesFromChQueue(chSyncData_t *chSyncData, uint8_t *scopeUpdateStatu // use cached values if possible const uint16_t period = ch->finalPeriod; - if (period != oldPeriod) + if (period != sc->oldPeriod) { - oldPeriod = period; + sc->oldPeriod = period; const double dHz = dPeriod2Hz(period); const double dScopeRateFactor = SCOPE_FRAC_SCALE / (double)SCOPE_HZ; - oldDelta = (int64_t)((dHz * dScopeRateFactor) + 0.5); // Hz -> rounded fixed-point delta + sc->oldDelta = (int64_t)((dHz * dScopeRateFactor) + 0.5); // Hz -> rounded fixed-point delta const double dRelativeHz = dHz * (1.0 / (8363.0 / 2.0)); - oldDrawDelta = (int32_t)((dRelativeHz * SCOPE_DRAW_FRAC_SCALE) + 0.5); // Hz -> rounded fixed-point draw delta + sc->oldDrawDelta = (int32_t)((dRelativeHz * SCOPE_DRAW_FRAC_SCALE) + 0.5); // Hz -> rounded fixed-point draw delta } - sc->delta = oldDelta; - sc->drawDelta = oldDrawDelta; + sc->delta = sc->oldDelta; + sc->drawDelta = sc->oldDrawDelta; } if (status & IS_NyTon) diff --git a/src/ft2_scopes.h b/src/ft2_scopes.h @@ -31,9 +31,9 @@ typedef struct scope_t const int16_t *base16; bool wasCleared, sampleIs16Bit; uint8_t loopType; - int32_t vol, loopStart, loopLength, end, pos, direction; - uint32_t drawDelta; - uint64_t delta, posFrac; + int32_t vol, loopStart, loopLength, end, pos, direction, oldPeriod; + uint32_t drawDelta, oldDrawDelta; + uint64_t delta, posFrac, oldDelta; } scope_t; typedef struct lastChInstr_t