commit 64789ba9ad662eab1a1c7a4def30a618d8f9417d
parent f5334d8324dae71325c59b559ab8fcceb8695fd8
Author: Olav Sørensen <olav.sorensen@live.no>
Date: Fri, 26 Feb 2021 13:52:13 +0100
tuneSample() didn't use the correct period table under all circumstances
This was not a huge problem, as the tuning would only be very slightly off.
Diffstat:
11 files changed, 31 insertions(+), 27 deletions(-)
diff --git a/src/ft2_audio.h b/src/ft2_audio.h
@@ -28,7 +28,7 @@ typedef struct audio_t
char *currInputDevice, *currOutputDevice, *lastWorkingAudioDeviceName;
char *inputDeviceNames[MAX_AUDIO_DEVICES], *outputDeviceNames[MAX_AUDIO_DEVICES];
volatile bool locked, resetSyncTickTimeFlag, volumeRampingFlag;
- bool linearFreqTable, rescanAudioDevicesSupported;
+ bool linearPeriodsFlag, rescanAudioDevicesSupported;
volatile uint8_t interpolationType;
int32_t quickVolRampSamples, inputDeviceNum, outputDeviceNum, lastWorkingAudioFreq, lastWorkingAudioBits;
uint32_t freq, audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, musicTimeSpeedVal;
diff --git a/src/ft2_config.c b/src/ft2_config.c
@@ -844,7 +844,7 @@ void setConfigIORadioButtonStates(void) // accessed by other .c files
// FREQUENCY TABLE
uncheckRadioButtonGroup(RB_GROUP_CONFIG_FREQ_TABLE);
- tmpID = audio.linearFreqTable ? RB_CONFIG_FREQ_LINEAR : RB_CONFIG_FREQ_AMIGA;
+ tmpID = audio.linearPeriodsFlag ? RB_CONFIG_FREQ_LINEAR : RB_CONFIG_FREQ_AMIGA;
radioButtons[tmpID].state = RADIOBUTTON_CHECKED;
// show result
diff --git a/src/ft2_inst_ed.c b/src/ft2_inst_ed.c
@@ -3372,7 +3372,7 @@ static int32_t SDLCALL loadInstrThread(void *ptr)
const double dFreq = (1.0 + (ih_PATWave.fineTune / 512.0)) * ih_PATWave.sampleRate;
int32_t freq = (const int32_t)(dFreq + 0.5);
- tuneSample(s, freq);
+ tuneSample(s, freq, audio.linearPeriodsFlag);
a = s->relTon - (getPATNote(ih_PATWave.rootFrq) - (12 * 3));
s->relTon = (uint8_t)CLAMP(a, -48, 71);
diff --git a/src/ft2_main.c b/src/ft2_main.c
@@ -312,7 +312,7 @@ static void initializeVars(void)
editor.diskOpReadOnOpen = true;
editor.programRunning = true;
- audio.linearFreqTable = true;
+ audio.linearPeriodsFlag = true;
calcReplayerLogTab();
}
diff --git a/src/ft2_module_loader.c b/src/ft2_module_loader.c
@@ -929,7 +929,7 @@ static bool loadMusicSTM(FILE *f, uint32_t fileLength, bool externalThreadFlag)
s->pek = s->origPek + SMP_DAT_OFFSET;
s->len = h_STM.instr[i].len;
- tuneSample(s, h_STM.instr[i].rate);
+ tuneSample(s, h_STM.instr[i].rate, false);
s->vol = h_STM.instr[i].vol;
s->repS = h_STM.instr[i].repS;
s->repL = h_STM.instr[i].repE - h_STM.instr[i].repS;
@@ -1541,7 +1541,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool externalThreadFlag)
if (h_S3MInstr.c2Spd > 65535) // ST3 (and OpenMPT) does this
h_S3MInstr.c2Spd = 65535;
- tuneSample(s, h_S3MInstr.c2Spd);
+ tuneSample(s, h_S3MInstr.c2Spd, false);
s->len = h_S3MInstr.len;
s->vol = h_S3MInstr.vol;
diff --git a/src/ft2_module_saver.c b/src/ft2_module_saver.c
@@ -80,7 +80,7 @@ bool saveXM(UNICHAR *filenameU)
ai--;
h.antInstrs = ai;
- h.flags = audio.linearFreqTable;
+ h.flags = audio.linearPeriodsFlag;
memcpy(h.songTab, song.songTab, sizeof (song.songTab));
if (fwrite(&h, sizeof (h), 1, f) != 1)
@@ -266,7 +266,7 @@ static bool saveMOD(UNICHAR *filenameU)
incompatEfx = false;
noteUnderflow = false;
- if (audio.linearFreqTable)
+ if (audio.linearPeriodsFlag)
okBoxThreadSafe(0, "System message", "Linear frequency table used!");
// sanity checking
diff --git a/src/ft2_pattern_ed.c b/src/ft2_pattern_ed.c
@@ -2613,7 +2613,7 @@ static void zapSong(void)
resetPlaybackTime();
- if (!audio.linearFreqTable)
+ if (!audio.linearPeriodsFlag)
setFrqTab(true);
clearPattMark();
diff --git a/src/ft2_replayer.c b/src/ft2_replayer.c
@@ -123,13 +123,15 @@ void removeSongModifiedFlag(void)
editor.updateWindowTitle = true;
}
-void tuneSample(sampleTyp *s, const int32_t midCFreq) // used on external sample load (not when loading module)
+// used on external sample load and during sample loading in some module formats
+void tuneSample(sampleTyp *s, const int32_t midCFreq, bool linearPeriodsFlag)
{
#define NOTE_C4 (4*12)
#define MIN_PERIOD (0)
#define MAX_PERIOD (((10*12*16)-1)-1) /* -1 (because of bugged amigaPeriods table values) */
- if (midCFreq <= 0 || note2Period == NULL)
+ const uint16_t *periodTab = linearPeriodsFlag ? linearPeriods : amigaPeriods;
+ if (midCFreq <= 0 || periodTab == NULL)
{
s->fine = s->relTon = 0;
return;
@@ -137,14 +139,14 @@ void tuneSample(sampleTyp *s, const int32_t midCFreq) // used on external sample
// handle frequency boundaries first...
- if (midCFreq <= (int32_t)dPeriod2HzTab[note2Period[MIN_PERIOD]])
+ if (midCFreq <= (int32_t)dPeriod2HzTab[periodTab[MIN_PERIOD]])
{
s->fine = -128;
s->relTon = -48;
return;
}
- if (midCFreq >= (int32_t)dPeriod2HzTab[note2Period[MAX_PERIOD]])
+ if (midCFreq >= (int32_t)dPeriod2HzTab[periodTab[MAX_PERIOD]])
{
s->fine = 127;
s->relTon = 71;
@@ -154,7 +156,7 @@ void tuneSample(sampleTyp *s, const int32_t midCFreq) // used on external sample
// check if midCFreq is matching any of the non-finetuned note frequencies (C-0..B-9)
for (int8_t i = 0; i < 10*12; i++)
{
- if (midCFreq == (int32_t)dPeriod2HzTab[note2Period[16 + (i<<4)]])
+ if (midCFreq == (int32_t)dPeriod2HzTab[periodTab[16 + (i<<4)]])
{
s->fine = 0;
s->relTon = i - NOTE_C4;
@@ -167,13 +169,13 @@ void tuneSample(sampleTyp *s, const int32_t midCFreq) // used on external sample
int32_t period = MAX_PERIOD;
for (; period >= MIN_PERIOD; period--)
{
- const int32_t curr = (int32_t)dPeriod2HzTab[note2Period[period]];
+ const int32_t curr = (int32_t)dPeriod2HzTab[periodTab[period]];
if (midCFreq == curr)
break;
if (midCFreq > curr)
{
- const int32_t next = (int32_t)dPeriod2HzTab[note2Period[period+1]];
+ const int32_t next = (int32_t)dPeriod2HzTab[periodTab[period+1]];
const int32_t errorCurr = ABS(curr-midCFreq);
const int32_t errorNext = ABS(next-midCFreq);
@@ -259,7 +261,7 @@ static void calcPeriod2HzTable(void) // called every time "linear/amiga frequenc
{
dPeriod2HzTab[0] = 0.0; // in FT2, a period of 0 converts to 0Hz
- if (audio.linearFreqTable)
+ if (audio.linearPeriodsFlag)
{
// linear periods
for (int32_t i = 1; i < 65536; i++)
@@ -311,7 +313,7 @@ double getSampleC4Rate(sampleTyp *s)
const int32_t C4Period = (note << 4) + (((int8_t)s->fine >> 3) + 16);
- const uint16_t period = audio.linearFreqTable ? linearPeriods[C4Period] : amigaPeriods[C4Period];
+ const uint16_t period = audio.linearPeriodsFlag ? linearPeriods[C4Period] : amigaPeriods[C4Period];
return dPeriod2Hz(period);
}
@@ -319,9 +321,9 @@ void setFrqTab(bool linear)
{
pauseAudio();
- audio.linearFreqTable = linear;
+ audio.linearPeriodsFlag = linear;
- if (audio.linearFreqTable)
+ if (audio.linearPeriodsFlag)
note2Period = linearPeriods;
else
note2Period = amigaPeriods;
@@ -2839,7 +2841,7 @@ bool setupReplayer(void)
editor.tempo = song.tempo = 6;
editor.globalVol = song.globVol = 64;
song.initialTempo = song.tempo;
- audio.linearFreqTable = true;
+ audio.linearPeriodsFlag = true;
note2Period = linearPeriods;
if (!calcWindowedSincTables())
diff --git a/src/ft2_replayer.h b/src/ft2_replayer.h
@@ -259,7 +259,9 @@ 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, const int32_t midCFreq);
+
+// used on external sample load and during sample loading in some module formats
+void tuneSample(sampleTyp *s, const int32_t midCFreq, bool linearPeriodsFlag);
void calcRevMixDeltaTable(void);
void calcReplayerLogTab(void);
diff --git a/src/ft2_sample_loader.c b/src/ft2_sample_loader.c
@@ -650,7 +650,7 @@ static int32_t SDLCALL loadAIFFSample(void *ptr)
tmpSmp.vol = 64;
tmpSmp.pan = 128;
- tuneSample(&tmpSmp, sampleRate);
+ tuneSample(&tmpSmp, sampleRate, audio.linearPeriodsFlag);
// set sample name
char *tmpFilename = unicharToCp437(filename, true);
@@ -916,7 +916,7 @@ static int32_t SDLCALL loadIFFSample(void *ptr)
tmpSmp.vol = (uint8_t)sampleVol;
tmpSmp.pan = 128;
- tuneSample(&tmpSmp, sampleRate);
+ tuneSample(&tmpSmp, sampleRate, audio.linearPeriodsFlag);
// set name
if (namePtr != 0 && nameLen > 0)
@@ -1788,7 +1788,7 @@ static int32_t SDLCALL loadWAVSample(void *ptr)
tmpSmp.pek = tmpSmp.origPek + SMP_DAT_OFFSET;
}
- tuneSample(&tmpSmp, sampleRate);
+ tuneSample(&tmpSmp, sampleRate, audio.linearPeriodsFlag);
tmpSmp.vol = 64;
tmpSmp.pan = 128;
diff --git a/src/ft2_sampling.c b/src/ft2_sampling.c
@@ -387,7 +387,7 @@ void startSampling(void)
freeSample(editor.curInstr, editor.curSmp);
s->typ |= 16; // we always sample in 16-bit
- tuneSample(s, samplingRate); // tune sample (relTone/finetune) to the sampling frequency we obtained
+ tuneSample(s, samplingRate, audio.linearPeriodsFlag); // tune sample (relTone/finetune) to the sampling frequency we obtained
if (sampleInStereo)
{
@@ -409,7 +409,7 @@ void startSampling(void)
nextSmp->typ |= 16; // we always sample in 16-bit
nextSmp->pan = 255;
- tuneSample(nextSmp, samplingRate); // tune sample (relTone/finetune) to the sampling frequency we obtained
+ tuneSample(nextSmp, samplingRate, audio.linearPeriodsFlag); // tune sample (relTone/finetune) to the sampling frequency we obtained
}
}
else