ft2-clone

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

commit 0c1f9008cbcd43eaae3f396c6d0a4d1b035586fd
parent 976b6bb80a6b04f209d13f670a941645fe0a89c7
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Sun,  6 Sep 2020 00:03:55 +0200

Cleanup and bugfixes!

- Fixed a small initial resampling interpolation error on looping samples
  whose loop start (Repeat) is above 0.
- Fixed a CUBIC_PHASES off-by-one typo, which could probably mess up the
  resampling interpolation in very rare cases.
- Cleaned up some messy logic in tickReplayer() (behavior is the same)

Diffstat:
Msrc/ft2_replayer.c | 61+++++++++++++++++++++++++++++--------------------------------
Msrc/ft2_sample_ed.c | 8++++++++
Msrc/mixer/ft2_cubic.h | 2+-
3 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/src/ft2_replayer.c b/src/ft2_replayer.c @@ -1072,7 +1072,7 @@ static void checkEffects(stmTyp *ch) checkMoreEffects(ch); } -static void fixTonePorta(stmTyp *ch, tonTyp *p, uint8_t inst) +static void fixTonePorta(stmTyp *ch, const tonTyp *p, uint8_t inst) { uint16_t portaTmp; @@ -1105,7 +1105,7 @@ static void fixTonePorta(stmTyp *ch, tonTyp *p, uint8_t inst) } } -static void getNewNote(stmTyp *ch, tonTyp *p) +static void getNewNote(stmTyp *ch, const tonTyp *p) { uint8_t inst; bool checkEfx; @@ -2094,68 +2094,65 @@ void resumeMusic(void) // starts reading pattern data musicPaused = false; } -static void noNewAllChannels(void) -{ - for (int32_t i = 0; i < song.antChn; i++) - { - doEffects(&stm[i]); - fixaEnvelopeVibrato(&stm[i]); - } -} void tickReplayer(void) // periodically called from audio callback { - bool readNewNote; int32_t i; + stmTyp *c; if (musicPaused || !songPlaying) { - for (i = 0; i < song.antChn; i++) - fixaEnvelopeVibrato(&stm[i]); + c = stm; + for (i = 0; i < song.antChn; i++, c++) + fixaEnvelopeVibrato(c); return; } + // for song playback counter (hh:mm:ss) if (song.speed >= MIN_BPM && song.speed <= MAX_BPM) - song.musicTime64 += musicTimeTab64[song.speed]; // for song playback counter (hh:mm:ss) + song.musicTime64 += musicTimeTab64[song.speed]; - readNewNote = false; - - song.timer--; - if (song.timer == 0) + bool tickZero = false; + if (--song.timer == 0) { song.timer = song.tempo; - readNewNote = true; + tickZero = true; } - + // for visuals song.curReplayerTimer = (uint8_t)song.timer; song.curReplayerPattPos = (uint8_t)song.pattPos; song.curReplayerPattNr = (uint8_t)song.pattNr; song.curReplayerSongPos = (uint8_t)song.songPos; + const bool readNewNote = tickZero && song.pattDelTime2 == 0; if (readNewNote) { - if (song.pattDelTime2 == 0) + const tonTyp *pattPtr = &nilPatternLine; + if (patt[song.pattNr] != NULL) { - for (i = 0; i < song.antChn; i++) - { - if (patt[song.pattNr] == NULL) - getNewNote(&stm[i], &nilPatternLine); - else - getNewNote(&stm[i], &patt[song.pattNr][(song.pattPos * MAX_VOICES) + i]); + assert(song.pattNr >= 0 && song.pattNr < MAX_PATTERNS && + song.pattPos >= 0 && song.pattPos < MAX_PATT_LEN); - fixaEnvelopeVibrato(&stm[i]); - } + pattPtr = &patt[song.pattNr][song.pattPos * MAX_VOICES]; } - else + + c = stm; + for (i = 0; i < song.antChn; i++, c++, pattPtr++) { - noNewAllChannels(); + getNewNote(c, pattPtr); + fixaEnvelopeVibrato(c); } } else { - noNewAllChannels(); + c = stm; + for (i = 0; i < song.antChn; i++, c++) + { + doEffects(c); + fixaEnvelopeVibrato(c); + } } getNextPos(); diff --git a/src/ft2_sample_ed.c b/src/ft2_sample_ed.c @@ -129,6 +129,8 @@ void fixSample(sampleTyp *s) ptr16[loopEnd+0] = ptr16[loopStart+0]; if (loopStart == 0 && loopEnd > 0) ptr16[-1] = ptr16[loopEnd-1]; + else + ptr16[-1] = 0; ptr16[loopEnd+1] = ptr16[loopStart+1]; } @@ -151,6 +153,8 @@ void fixSample(sampleTyp *s) s->pek[loopEnd+0] = s->pek[loopStart+0]; if (loopStart == 0 && loopEnd > 0) s->pek[-1] = s->pek[loopEnd-1]; + else + s->pek[-1] = 0; s->pek[loopEnd+1] = s->pek[loopStart+1]; } @@ -181,6 +185,8 @@ void fixSample(sampleTyp *s) ptr16[loopEnd+0] = ptr16[loopEnd-1]; if (loopStart == 0) ptr16[-1] = ptr16[0]; + else + ptr16[-1] = 0; if (loopLen >= 2) ptr16[loopEnd+1] = ptr16[loopEnd-2]; @@ -208,6 +214,8 @@ void fixSample(sampleTyp *s) s->pek[loopEnd+0] = s->pek[loopEnd-1]; if (loopStart == 0) s->pek[-1] = s->pek[0]; + else + s->pek[-1] = 0; if (loopLen >= 2) s->pek[loopEnd+1] = s->pek[loopEnd-2]; diff --git a/src/mixer/ft2_cubic.h b/src/mixer/ft2_cubic.h @@ -4,7 +4,7 @@ #include "../ft2_audio.h" // MIXER_FRAC_BITS definition // if you change this, also change CUBIC_PHASES_BITS -#define CUBIC_PHASES 4095 +#define CUBIC_PHASES 4096 #define CUBIC_PHASES_BITS 12 /* log2(CUBIC_PHASES) */ // don't change these!