ft2-clone

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

commit fbb9816f4f3ae74ef5db5f11127123f7efbecbd0
parent 23923f12dcb6b945dc9f54f5556bd4d7278181cd
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Sun, 16 Aug 2020 16:03:15 +0200

Pushed v1.28 code

- Bugfix: Don't redraw the instrument switcher when pressing numpad keys while certain screens (about/config/help/nibbles) are open.
- Slightly increased the volume precision in the audio channel mixer. This is most likely not measurable.
- Fixed some errors in the help text
- Small code cleanup

Diffstat:
M.gitignore | 1+
Msrc/ft2_audio.c | 116++++++++++++++++++++++++++++++++++++++-----------------------------------------
Msrc/ft2_audio.h | 5+++--
Msrc/ft2_header.h | 2+-
Msrc/ft2_main.c | 34++++++++++++++++------------------
Msrc/ft2_pattern_ed.c | 3+++
Msrc/ft2_replayer.c | 62++++++++++++++++++++++++++++++++++++--------------------------
Msrc/ft2_replayer.h | 8+++++---
Msrc/ft2_scopes.c | 16++++++++--------
Msrc/ft2_scopes.h | 2+-
Msrc/ft2_tables.c | 25-------------------------
Msrc/ft2_tables.h | 2--
Msrc/helpdata/FT2.HLP | 7++-----
Msrc/helpdata/ft2_help_data.h | 183+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/mixer/ft2_mix_macros.h | 4++--
15 files changed, 220 insertions(+), 250 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -20,3 +20,4 @@ vs2019_project/ft2-clone/Debug/ft2-clone.vcxproj.FileListAbsolute.txt *.opendb *.db-shm *.db-wal +*.recipe diff --git a/src/ft2_audio.c b/src/ft2_audio.c @@ -27,7 +27,7 @@ static uint16_t smpBuffSize; static int32_t masterVol, oldAudioFreq, randSeed = INITIAL_DITHER_SEED; static int32_t prngStateL, prngStateR; static uint32_t tickTimeLen, tickTimeLenFrac; -static float fAudioAmpMul; +static double dAudioAmpMul, dPanningTab[256+1]; static voice_t voice[MAX_VOICES * 2]; static void (*sendAudSamplesFunc)(uint8_t *, uint32_t, uint8_t); // "send mixed samples" routines @@ -123,18 +123,17 @@ void setAudioAmp(int16_t ampFactor, int16_t master, bool bitDepth32Flag) ampFactor = CLAMP(ampFactor, 1, 32); master = CLAMP(master, 0, 256); - // voiceVolume = (vol(0..65535) * pan(0..65536)) >> 4 - const float fAudioNorm = 1.0f / (((65535UL * 65536) / 16) / MAX_VOICES); + const double dAudioNorm = 1.0 / (1UL << 25); // 2^25 = internal voice mixing range (per voice) if (bitDepth32Flag) { - // 32-bit floating point - fAudioAmpMul = fAudioNorm * (master / 256.0f) * (ampFactor / 32.0f); + // 32-bit floating point mixing mode + dAudioAmpMul = dAudioNorm * (master / 256.0) * (ampFactor / 32.0); } else { - // 16-bit integer - masterVol = master * ampFactor * 2048; + // 16-bit integer mixing mode + masterVol = (master * ampFactor) * 512; } } @@ -190,21 +189,23 @@ void audioSetInterpolation(bool interpolation) unlockMixerCallback(); } -static void voiceUpdateVolumes(int32_t i, uint8_t status) +void calcPanningTable(void) { - int32_t volL, volR, destVolL, destVolR; - uint32_t vol; - voice_t *v, *f; + // same formula as FT2's panning table (with 0.0..1.0 range) + for (int32_t i = 0; i <= 256; i++) + dPanningTab[i] = sqrt(i * (1.0 / 256.0)); +} - v = &voice[i]; +static void voiceUpdateVolumes(int32_t i, uint8_t status) +{ + int32_t destVolL, destVolR; - vol = v->SVol; // 0..4096 + voice_t *v = &voice[i]; - // 0..4096 * 0..65535 = 0..268431360 (about max safe volume range) - volR = vol * panningTab[ v->SPan]; - volL = vol * panningTab[256-v->SPan]; + const int32_t volR = (int32_t)((v->SVol * dPanningTab[ v->SPan]) + 0.5); + const int32_t volL = (int32_t)((v->SVol * dPanningTab[256-v->SPan]) + 0.5); - if (!audio.volumeRampingFlag) + if (!audio.volumeRampingFlag) // is volume ramping disabled? { v->SVolIPLen = 0; // reset volume ramp length v->SLVol2 = volL; @@ -222,7 +223,7 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) // setup "fade out" voice (only if current voice volume>0) if (v->SLVol2 > 0 || v->SRVol2 > 0) { - f = &voice[MAX_VOICES + i]; + voice_t *f = &voice[MAX_VOICES + i]; *f = *v; // copy voice @@ -231,7 +232,7 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) destVolL = -f->SLVol2; destVolR = -f->SRVol2; - f->SLVolIP = ((int64_t)destVolL * audio.rampQuickVolMul) >> 32; + f->SLVolIP = ((int64_t)destVolL * audio.rampQuickVolMul) >> 32; // x = a / b f->SRVolIP = ((int64_t)destVolR * audio.rampQuickVolMul) >> 32; f->isFadeOutVoice = true; @@ -262,13 +263,13 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) if (status & IS_QuickVol) { v->SVolIPLen = audio.quickVolSizeVal; - v->SLVolIP = ((int64_t)destVolL * audio.rampQuickVolMul) >> 32; + v->SLVolIP = ((int64_t)destVolL * audio.rampQuickVolMul) >> 32; // x = a / b v->SRVolIP = ((int64_t)destVolR * audio.rampQuickVolMul) >> 32; } else { v->SVolIPLen = audio.samplesPerTick; - v->SLVolIP = ((int64_t)destVolL * audio.rampSpeedValMul) >> 32; + v->SLVolIP = ((int64_t)destVolL * audio.rampSpeedValMul) >> 32; // x = a / b v->SRVolIP = ((int64_t)destVolR * audio.rampSpeedValMul) >> 32; } } @@ -424,12 +425,9 @@ static inline uint32_t random32(void) static void sendSamples16BitStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - int16_t *streamPointer16; int32_t out32; - (void)numAudioChannels; - - streamPointer16 = (int16_t *)stream; + int16_t *streamPointer16 = (int16_t *)stream; for (uint32_t i = 0; i < sampleBlockLength; i++) { // left channel @@ -442,16 +440,16 @@ static void sendSamples16BitStereo(uint8_t *stream, uint32_t sampleBlockLength, CLAMP16(out32); *streamPointer16++ = (int16_t)out32; } + + (void)numAudioChannels; } static void sendSamples16BitMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - int16_t *streamPointer16; int32_t out32; - uint32_t i, j; - streamPointer16 = (int16_t *)stream; - for (i = 0; i < sampleBlockLength; i++) + int16_t *streamPointer16 = (int16_t *)stream; + for (uint32_t i = 0; i < sampleBlockLength; i++) { // left channel out32 = ((int64_t)audio.mixBufferL[i] * masterVol) >> 32; @@ -464,19 +462,16 @@ static void sendSamples16BitMultiChan(uint8_t *stream, uint32_t sampleBlockLengt *streamPointer16++ = (int16_t)out32; // send zeroes to the rest of the channels - for (j = 2; j < numAudioChannels; j++) + for (uint32_t j = 2; j < numAudioChannels; j++) *streamPointer16++ = 0; } } static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - int16_t *streamPointer16; int32_t prng, out32; - (void)numAudioChannels; - - streamPointer16 = (int16_t *)stream; + int16_t *streamPointer16 = (int16_t *)stream; for (uint32_t i = 0; i < sampleBlockLength; i++) { // left channel - 1-bit triangular dithering @@ -493,14 +488,15 @@ static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLe CLAMP16(out32); *streamPointer16++ = (int16_t)out32; } + + (void)numAudioChannels; } static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - int16_t *streamPointer16; int32_t prng, out32; - streamPointer16 = (int16_t *)stream; + int16_t *streamPointer16 = (int16_t *)stream; for (uint32_t i = 0; i < sampleBlockLength; i++) { // left channel - 1-bit triangular dithering @@ -523,47 +519,47 @@ static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBloc } } -static void sendSamples24BitStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) +static void sendSamples32BitStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - float fOut, *fStreamPointer24; + double dOut; - (void)numAudioChannels; - - fStreamPointer24 = (float *)stream; + float *fStreamPointer32 = (float *)stream; for (uint32_t i = 0; i < sampleBlockLength; i++) { // left channel - fOut = audio.mixBufferL[i] * fAudioAmpMul; - fOut = CLAMP(fOut, -1.0f, 1.0f); - *fStreamPointer24++ = fOut; + dOut = audio.mixBufferL[i] * dAudioAmpMul; + dOut = CLAMP(dOut, -1.0, 1.0); + *fStreamPointer32++ = (float)dOut; // right channel - fOut = audio.mixBufferR[i] * fAudioAmpMul; - fOut = CLAMP(fOut, -1.0f, 1.0f); - *fStreamPointer24++ = fOut; + dOut = audio.mixBufferR[i] * dAudioAmpMul; + dOut = CLAMP(dOut, -1.0, 1.0); + *fStreamPointer32++ = (float)dOut; } + + (void)numAudioChannels; } -static void sendSamples24BitMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) +static void sendSamples32BitMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - float fOut, *fStreamPointer24; + double dOut; - fStreamPointer24 = (float *)stream; + float *fStreamPointer32 = (float *)stream; for (uint32_t i = 0; i < sampleBlockLength; i++) { // left channel - fOut = audio.mixBufferL[i] * fAudioAmpMul; - fOut = CLAMP(fOut, -1.0f, 1.0f); - *fStreamPointer24++ = fOut; + dOut = audio.mixBufferL[i] * dAudioAmpMul; + dOut = CLAMP(dOut, -1.0, 1.0); + *fStreamPointer32++ = (float)dOut; // right channel - fOut = audio.mixBufferR[i] * fAudioAmpMul; - fOut = CLAMP(fOut, -1.0f, 1.0f); - *fStreamPointer24++ = fOut; + dOut = audio.mixBufferR[i] * dAudioAmpMul; + dOut = CLAMP(dOut, -1.0, 1.0); + *fStreamPointer32++ = (float)dOut; // send zeroes to the rest of the channels for (uint32_t j = 2; j < numAudioChannels; j++) - *fStreamPointer24++ = 0.0f; + *fStreamPointer32++ = 0.0f; } } @@ -636,7 +632,7 @@ void mixReplayerTickToBuffer(uint32_t samplesToMix, uint8_t *stream, uint8_t bit } else { - sendSamples24BitStereo(stream, samplesToMix, 2); + sendSamples32BitStereo(stream, samplesToMix, 2); } } @@ -1061,9 +1057,9 @@ void updateSendAudSamplesRoutine(bool lockMixer) else { if (pmpChannels > 2) - sendAudSamplesFunc = sendSamples24BitMultiChan; + sendAudSamplesFunc = sendSamples32BitMultiChan; else - sendAudSamplesFunc = sendSamples24BitStereo; + sendAudSamplesFunc = sendSamples32BitStereo; } if (lockMixer) diff --git a/src/ft2_audio.h b/src/ft2_audio.h @@ -65,9 +65,8 @@ typedef struct const int16_t *SBase16, *SRevBase16; bool active, backwards, isFadeOutVoice; uint8_t mixFuncOffset, SPan, SLoopType; - uint16_t SVol; int32_t SLVol1, SRVol1, SLVol2, SRVol2, SLVolIP, SRVolIP; - int32_t SPos, SLen, SRepS, SRepL; + int32_t SVol, SPos, SLen, SRepS, SRepL; uint32_t SVolIPLen, SFrqRev; #if defined _WIN64 || defined __amd64__ @@ -116,6 +115,8 @@ bool chQueuePush(chSyncData_t t); bool chQueuePop(void); chSyncData_t *chQueuePeek(void); uint64_t getChQueueTimestamp(void); + +void calcPanningTable(void); void setAudioAmp(int16_t ampFactor, int16_t master, bool bitDepth32Flag); void setNewAudioFreq(uint32_t freq); void setBackOldAudioFreq(void); 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.27" +#define PROG_VER_STR "1.28" // do NOT change these! It will only mess things up... diff --git a/src/ft2_main.c b/src/ft2_main.c @@ -440,38 +440,36 @@ static void setupPerfFreq(void) #ifdef _WIN32 static void disableWasapi(void) { - const char *audioDriver; - int32_t i, numAudioDrivers; - // disable problematic WASAPI SDL2 audio driver on Windows (causes clicks/pops sometimes...) - numAudioDrivers = SDL_GetNumAudioDrivers(); - for (i = 0; i < numAudioDrivers; i++) + const int32_t numAudioDrivers = SDL_GetNumAudioDrivers(); + if (numAudioDrivers <= 1) + return; + + // look for directsound and enable it if found + for (int32_t i = 0; i < numAudioDrivers; i++) { - audioDriver = SDL_GetAudioDriver(i); + const char *audioDriver = SDL_GetAudioDriver(i); if (audioDriver != NULL && strcmp("directsound", audioDriver) == 0) { SDL_setenv("SDL_AUDIODRIVER", "directsound", true); audio.rescanAudioDevicesSupported = false; - break; + return; } } - if (i == numAudioDrivers) + // directsound is not available, try winmm + for (int32_t i = 0; i < numAudioDrivers; i++) { - // directsound is not available, try winmm - for (i = 0; i < numAudioDrivers; i++) + const char *audioDriver = SDL_GetAudioDriver(i); + if (audioDriver != NULL && strcmp("winmm", audioDriver) == 0) { - audioDriver = SDL_GetAudioDriver(i); - if (audioDriver != NULL && strcmp("winmm", audioDriver) == 0) - { - SDL_setenv("SDL_AUDIODRIVER", "winmm", true); - audio.rescanAudioDevicesSupported = false; - break; - } + SDL_setenv("SDL_AUDIODRIVER", "winmm", true); + audio.rescanAudioDevicesSupported = false; + return; } } - // maybe we didn't find directsound or winmm, let's use wasapi after all then... + // we didn't find directsound or winmm, let's use wasapi after all... } #endif diff --git a/src/ft2_pattern_ed.c b/src/ft2_pattern_ed.c @@ -2305,6 +2305,9 @@ void updateInstrumentSwitcher(void) int8_t i; int16_t y; + if (ui.aboutScreenShown || ui.configScreenShown || ui.helpScreenShown || ui.nibblesShown) + return; // don't redraw instrument switcher when it's not shown! + if (ui.extended) // extended pattern editor { //INSTRUMENTS diff --git a/src/ft2_replayer.c b/src/ft2_replayer.c @@ -21,13 +21,13 @@ #include "ft2_tables.h" #include "ft2_structs.h" -/* This is a *huge* mess, directly ported from the original FT2 code (and modified). +/* This is a mess, directly ported from the original FT2 code (with some modifications). ** You will experience a lot of headaches if you dig into it... ** If something looks to be off, it probably isn't! */ // non-FT2 precalced stuff -static double dPeriod2HzTab[65536], dLogTab[768], dAudioRateFactor; +static double dPeriod2HzTab[65536], dLogTab[768], d2nRevTab[32], dHz2MixDeltaMul; static bool bxxOverflow; static tonTyp nilPatternLine; @@ -209,21 +209,28 @@ int16_t getRealUsedSamples(int16_t nr) return i+1; } -static void calcPeriod2HzTab(void) // called every time you change linear/amiga period mode +static void calc2nRevTable(void) // for calcPeriod2HzTable() { - dPeriod2HzTab[0] = 0.0; // in FT2, a period of 0 yields 0Hz + d2nRevTab[0] = 1.0; + for (int32_t i = 0; i < 32; i++) + d2nRevTab[i] = 1.0 / (1UL << i); +} + +static void calcPeriod2HzTable(void) // called every time "linear/amiga frequency" mode is changed +{ + dPeriod2HzTab[0] = 0.0; // in FT2, a period of 0 converts to 0Hz if (audio.linearFreqTable) { // linear periods for (int32_t i = 1; i < 65536; i++) { - const uint16_t invPeriod = (12 * 192 * 4) - (uint16_t)i; // this intentionally overflows uint16_t to be accurate to FT2 + const uint16_t invPeriod = (12 * 192 * 4) - (uint16_t)i; // this intentionally 16-bit-underflows to be accurate to FT2 const int32_t octave = invPeriod / 768; const int32_t period = invPeriod % 768; - const int32_t bitshift = (14 - octave) & 0x1F; // 100% accurate to FT2 + const int32_t invOct = (14 - octave) & 0x1F; // accurate to FT2 - dPeriod2HzTab[i] = dLogTab[period] / (1UL << bitshift); + dPeriod2HzTab[i] = dLogTab[period] * d2nRevTab[invOct]; // x = y / 2^invOct } } else @@ -245,7 +252,7 @@ void setFrqTab(bool linear) else note2Period = amigaPeriods; - calcPeriod2HzTab(); + calcPeriod2HzTable(); resumeAudio(); @@ -348,9 +355,9 @@ void calcReplayRate(int32_t audioFreq) if (audioFreq == 0) return; - dAudioRateFactor = (double)MIXER_FRAC_SCALE / audioFreq; + dHz2MixDeltaMul = (double)MIXER_FRAC_SCALE / audioFreq; - audio.quickVolSizeVal = audioFreq / 200; // FT2 truncates here + audio.quickVolSizeVal = (int32_t)((audioFreq / 200.0) + 0.5); audio.rampQuickVolMul = (int32_t)(((UINT32_MAX + 1.0) / audio.quickVolSizeVal) + 0.5); /* Calculate tables to prevent floating point operations on systems that @@ -384,7 +391,7 @@ void calcReplayRate(int32_t audioFreq) } } -double period2Hz(uint16_t period) +double dPeriod2Hz(uint16_t period) { return dPeriod2HzTab[period]; } @@ -392,12 +399,12 @@ double period2Hz(uint16_t period) #if defined _WIN64 || defined __amd64__ int64_t getMixerDelta(uint16_t period) { - return (int64_t)((dPeriod2HzTab[period] * dAudioRateFactor) + 0.5); // Hz -> rounded fixed-point mixer delta + return (int64_t)((dPeriod2Hz(period) * dHz2MixDeltaMul) + 0.5); // Hz -> rounded fixed-point mixer delta } #else int32_t getMixerDelta(uint16_t period) { - return (int32_t)((dPeriod2HzTab[period] * dAudioRateFactor) + 0.5); // Hz -> rounded fixed-point mixer delta + return (int32_t)((dPeriod2Hz(period) * dHz2MixDeltaMul) + 0.5); // Hz -> rounded fixed-point mixer delta } #endif @@ -405,7 +412,7 @@ int32_t getPianoKey(uint16_t period, int32_t finetune, int32_t relativeNote) // { finetune >>= 3; // FT2 does this in the replayer internally, so the actual range is -16..15 - const double dRelativeHz = dPeriod2HzTab[period] * (1.0 / (8363.0 / 16.0)); + const double dRelativeHz = dPeriod2Hz(period) * (1.0 / (8363.0 / 16.0)); const double dNote = (log2(dRelativeHz) * 12.0) - (finetune * (1.0 / 16.0)); const int32_t note = (int32_t)(dNote + 0.5) - relativeNote; // rounded @@ -1317,27 +1324,28 @@ static void fixaEnvelopeVibrato(stmTyp *ch) } } - /* calculate with 16 times more precision than FT2 (vol = 0..4096) - ** Also, vol envelope range is now 0..16384 instead of being shifted to 0..64 - */ + // original FT2 shifts the vol env. range to 0..64, but we keep its full resolution (0..16384) - int32_t vol1 = song.globVol * ch->outVol * ch->fadeOutAmp; // 0..64 * 0..64 * 0..32768 = 0..134217728 - int32_t vol2 = envVal << 3; // 0..16384 * 2^3 = 0..131072 + // 0..64 * 0..64 * 0..32768 = 0..134217728 + vol = song.globVol * ch->outVol * ch->fadeOutAmp; - vol = ((int64_t)vol1 * vol2) >> 32; // 0..4096 + // ((0..134217728 * 0..16384) + 2^10) / 2^11 = 0..1073741824 (rounded) + vol = (uint32_t)((((int64_t)vol * envVal) + (1UL << 10)) >> 11); ch->status |= IS_Vol; } else { - // calculate with 16 times more precision than FT2 (vol = 0..4096) - vol = ((song.globVol * ch->outVol * ch->fadeOutAmp) + (1 << 14)) >> 15; // 0..64 * 0..64 * 0..32768 -> 0..4096 (rounded) + // (0..64 * 0..64 * 0..32768) * 2^3 = 0..1073741824 + vol = (uint32_t)(song.globVol * ch->outVol * ch->fadeOutAmp) << 3; } - if (vol > 4096) - vol = 4096; + // original FT2 calculates final volume with a range of 0..256. We do it with a range of 0..1073741824 (why not) + + if (vol > (1UL<<30)) // shouldn't happen, but just in case... + vol = (1UL<<30); - ch->finalVol = (uint16_t)vol; + ch->finalVol = vol; } else { @@ -2727,7 +2735,9 @@ bool setupReplayer(void) audio.linearFreqTable = true; note2Period = linearPeriods; - calcPeriod2HzTab(); + calc2nRevTable(); + calcPeriod2HzTable(); + calcPanningTable(); setPos(0, 0, true); diff --git a/src/ft2_replayer.h b/src/ft2_replayer.h @@ -201,9 +201,10 @@ typedef struct stmTyp_t uint8_t volKolVol, tonNr, envPPos, eVibPos, envVPos, realVol, oldVol, outVol; uint8_t oldPan, outPan, finalPan; int16_t midiPitch, envVIPValue, envPIPValue; - uint16_t finalVol, outPeriod, realPeriod, finalPeriod, tonTyp, wantPeriod, portaSpeed; + uint16_t outPeriod, realPeriod, finalPeriod, tonTyp, wantPeriod, portaSpeed; uint16_t envVCnt, envVAmp, envPCnt, envPAmp, eVibAmp, eVibSweep; uint16_t fadeOutAmp, fadeOutSpeed, midiVibDepth; + uint32_t finalVol; int32_t smpStartPos; sampleTyp *smpPtr; instrTyp *instrSeg; @@ -231,8 +232,9 @@ typedef struct syncedChannel_t // used for audio/video sync queue bool envSustainActive; int8_t fineTune, relTonNr; uint8_t status, sampleNr, instrNr; - uint16_t finalPeriod, finalVol; + uint16_t finalPeriod; int32_t smpStartPos; + uint32_t finalVol; } syncedChannel_t; void fixSongName(void); // removes spaces from right side of song name @@ -241,7 +243,7 @@ void calcReplayRate(int32_t rate); void tuneSample(sampleTyp *s, int32_t midCFreq); void calcReplayerLogTab(void); -double period2Hz(uint16_t period); +double dPeriod2Hz(uint16_t period); #if defined _WIN64 || defined __amd64__ int64_t getMixerDelta(uint16_t period); diff --git a/src/ft2_scopes.c b/src/ft2_scopes.c @@ -58,7 +58,7 @@ void resetCachedScopeVars(void) int32_t getSamplePosition(uint8_t ch) { - volatile bool active, sample16Bit; + volatile bool active, sampleIs16Bit; volatile int32_t pos, len; volatile scope_t *sc; @@ -71,14 +71,14 @@ int32_t getSamplePosition(uint8_t ch) active = sc->active; pos = sc->SPos; len = sc->SLen; - sample16Bit = sc->sample16Bit; + sampleIs16Bit = sc->sampleIs16Bit; if (!active || len == 0) return -1; if (pos >= 0 && pos < len) { - if (sample16Bit) + if (sampleIs16Bit) pos <<= 1; return pos; @@ -357,7 +357,7 @@ static void scopeTrigger(int32_t ch, const sampleTyp *s, int32_t playOffset) else tempState.sampleData8 = (const int8_t *)s->pek; - tempState.sample16Bit = sampleIs16Bit; + tempState.sampleIs16Bit = sampleIs16Bit; tempState.loopType = loopType; tempState.backwards = false; @@ -499,8 +499,8 @@ void drawScopes(void) clearRect(scopeXOffs, scopeYOffs, scopeDrawLen, SCOPE_HEIGHT); // draw scope - bool linedScopes = !!(config.specialFlags & LINED_SCOPES); - scopeDrawRoutineTable[(linedScopes * 6) + (s.sample16Bit * 3) + s.loopType](&s, scopeXOffs, scopeLineY, scopeDrawLen); + bool linedScopesFlag = !!(config.specialFlags & LINED_SCOPES); + scopeDrawRoutineTable[(linedScopesFlag * 6) + (s.sampleIs16Bit * 3) + s.loopType](&s, scopeXOffs, scopeLineY, scopeDrawLen); } else { @@ -550,7 +550,7 @@ void handleScopesFromChQueue(chSyncData_t *chSyncData, uint8_t *scopeUpdateStatu status = scopeUpdateStatus[i]; if (status & IS_Vol) - sc->SVol = (int8_t)(((ch->finalVol * SCOPE_HEIGHT) + (1 << 11)) >> 12); // rounded + sc->SVol = (int8_t)((((ch->finalVol >> 6) * SCOPE_HEIGHT)) >> 24); // rounded if (status & IS_Period) { @@ -560,7 +560,7 @@ void handleScopesFromChQueue(chSyncData_t *chSyncData, uint8_t *scopeUpdateStatu if (period != oldPeriod) { oldPeriod = period; - const double dHz = period2Hz(period); + const double dHz = dPeriod2Hz(period); const double dScopeRateFactor = SCOPE_FRAC_SCALE / (double)SCOPE_HZ; oldSFrq = (int64_t)((dHz * dScopeRateFactor) + 0.5); // Hz -> rounded fixed-point delta diff --git a/src/ft2_scopes.h b/src/ft2_scopes.h @@ -30,7 +30,7 @@ typedef struct scope_t const int8_t *sampleData8; const int16_t *sampleData16; int8_t SVol; - bool wasCleared, sample16Bit, backwards; + bool wasCleared, sampleIs16Bit, backwards; uint8_t loopType; int32_t SRepS, SRepL, SLen, SPos; uint32_t DFrq; diff --git a/src/ft2_tables.c b/src/ft2_tables.c @@ -317,31 +317,6 @@ const uint16_t amigaPeriods[1936] = // bit-exact to FT2 table }; /* ----------------------------------------------------------------------- */ -/* AUDIO MIXER TABLES */ -/* ----------------------------------------------------------------------- */ - -const uint16_t panningTab[257] = // bit-exact to FT2 table (except last value 65536 -> 65535) -{ - 0, 4096, 5793, 7094, 8192, 9159,10033,10837,11585,12288,12953,13585,14189,14768,15326,15864, - 16384,16888,17378,17854,18318,18770,19212,19644,20066,20480,20886,21283,21674,22058,22435,22806, - 23170,23530,23884,24232,24576,24915,25249,25580,25905,26227,26545,26859,27170,27477,27780,28081, - 28378,28672,28963,29251,29537,29819,30099,30377,30652,30924,31194,31462,31727,31991,32252,32511, - 32768,33023,33276,33527,33776,34024,34270,34514,34756,34996,35235,35472,35708,35942,36175,36406, - 36636,36864,37091,37316,37540,37763,37985,38205,38424,38642,38858,39073,39287,39500,39712,39923, - 40132,40341,40548,40755,40960,41164,41368,41570,41771,41972,42171,42369,42567,42763,42959,43154, - 43348,43541,43733,43925,44115,44305,44494,44682,44869,45056,45242,45427,45611,45795,45977,46160, - 46341,46522,46702,46881,47059,47237,47415,47591,47767,47942,48117,48291,48465,48637,48809,48981, - 49152,49322,49492,49661,49830,49998,50166,50332,50499,50665,50830,50995,51159,51323,51486,51649, - 51811,51972,52134,52294,52454,52614,52773,52932,53090,53248,53405,53562,53719,53874,54030,54185, - 54340,54494,54647,54801,54954,55106,55258,55410,55561,55712,55862,56012,56162,56311,56459,56608, - 56756,56903,57051,57198,57344,57490,57636,57781,57926,58071,58215,58359,58503,58646,58789,58931, - 59073,59215,59357,59498,59639,59779,59919,60059,60199,60338,60477,60615,60753,60891,61029,61166, - 61303,61440,61576,61712,61848,61984,62119,62254,62388,62523,62657,62790,62924,63057,63190,63323, - 63455,63587,63719,63850,63982,64113,64243,64374,64504,64634,64763,64893,65022,65151,65279,65408, - 65535 -}; - -/* ----------------------------------------------------------------------- */ /* GUI TABLES */ /* ----------------------------------------------------------------------- */ diff --git a/src/ft2_tables.h b/src/ft2_tables.h @@ -17,8 +17,6 @@ extern const uint16_t amigaPeriod[12 * 8]; extern const uint16_t linearPeriods[1936]; extern const uint16_t amigaPeriods[1936]; -extern const uint16_t panningTab[257]; - extern const char *dec2StrTab[100]; extern const char *dec3StrTab[256]; diff --git a/src/helpdata/FT2.HLP b/src/helpdata/FT2.HLP @@ -898,7 +898,7 @@ END >@C001Sample editor: >@C002 >@X010- When a looped sample is zoomed out in the sample editor, you could see ->@X021unwanted sample data at the loop-end point. This is because of a kludge +>@X021unexpected sample data at the loop-end point. This is because of a kludge for the resampling interpolation to work faster in the audio mixer, and the original FT2 has the same problem. I have made it so that if you zoom in to see the individual sample points, it will look like normal. @@ -907,12 +907,9 @@ see the individual sample points, it will look like normal. > >@C002- Linux: The mouse cursor graphics can be glitchy at times... >@X010 ->@C002- The "clear sample" shortcut (shift + num-pad Del/',') only works if ->@X021num lock is off. There's no way I can fix this... ->@X010 >@C001Video: >@C002 ->@X010- Fullscreen mode can be unbearably slow on a Raspberry Pi (even an RPi 4) +>@X010- Fullscreen mode can be unbearably slow on a Raspberry Pi (even on RPi 4) > >@X010- The scopes can mildly flicker depending on the waveform and pitch. >@X021This is because their frequency is not clocked to exactly the same rate diff --git a/src/helpdata/ft2_help_data.h b/src/helpdata/ft2_help_data.h @@ -3,9 +3,9 @@ #include <stdint.h> -#define HELP_DATA_LEN 27295 +#define HELP_DATA_LEN 27158 -const uint8_t helpData[27295] = +const uint8_t helpData[27158] = { 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, @@ -2187,101 +2187,90 @@ const uint8_t helpData[27295] = 0x6F,0x75,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x73, 0x61,0x6D,0x70,0x6C,0x65,0x20,0x65,0x64,0x69,0x74,0x6F,0x72, 0x2C,0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x75,0x6C,0x64,0x20, - 0x73,0x65,0x65,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31,0x75,0x6E, - 0x77,0x61,0x6E,0x74,0x65,0x64,0x20,0x73,0x61,0x6D,0x70,0x6C, - 0x65,0x20,0x64,0x61,0x74,0x61,0x20,0x61,0x74,0x20,0x74,0x68, - 0x65,0x20,0x6C,0x6F,0x6F,0x70,0x2D,0x65,0x6E,0x64,0x20,0x70, - 0x6F,0x69,0x6E,0x74,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x69, - 0x73,0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x6F,0x66, - 0x20,0x61,0x20,0x6B,0x6C,0x75,0x64,0x67,0x65,0x4B,0x66,0x6F, - 0x72,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x73,0x61,0x6D,0x70, - 0x6C,0x69,0x6E,0x67,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F, - 0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20,0x77,0x6F, - 0x72,0x6B,0x20,0x66,0x61,0x73,0x74,0x65,0x72,0x20,0x69,0x6E, - 0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x6D, - 0x69,0x78,0x65,0x72,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74,0x68, - 0x65,0x4B,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46, - 0x54,0x32,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x73, - 0x61,0x6D,0x65,0x20,0x70,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x2E, - 0x20,0x49,0x20,0x68,0x61,0x76,0x65,0x20,0x6D,0x61,0x64,0x65, - 0x20,0x69,0x74,0x20,0x73,0x6F,0x20,0x74,0x68,0x61,0x74,0x20, - 0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x7A,0x6F,0x6F,0x6D,0x20, - 0x69,0x6E,0x20,0x74,0x6F,0x3B,0x73,0x65,0x65,0x20,0x74,0x68, - 0x65,0x20,0x69,0x6E,0x64,0x69,0x76,0x69,0x64,0x75,0x61,0x6C, - 0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E, - 0x74,0x73,0x2C,0x20,0x69,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20, - 0x6C,0x6F,0x6F,0x6B,0x20,0x6C,0x69,0x6B,0x65,0x20,0x6E,0x6F, - 0x72,0x6D,0x61,0x6C,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30, - 0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73,0x65, - 0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x3A, - 0x01,0x3E,0x43,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x4C, - 0x69,0x6E,0x75,0x78,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F, - 0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x67, - 0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x63,0x61,0x6E,0x20, - 0x62,0x65,0x20,0x67,0x6C,0x69,0x74,0x63,0x68,0x79,0x20,0x61, - 0x74,0x20,0x74,0x69,0x6D,0x65,0x73,0x2E,0x2E,0x2E,0x06,0x3E, - 0x40,0x58,0x30,0x31,0x30,0x4B,0x3E,0x40,0x43,0x30,0x30,0x32, - 0x2D,0x20,0x54,0x68,0x65,0x20,0x22,0x63,0x6C,0x65,0x61,0x72, - 0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x22,0x20,0x73,0x68,0x6F, - 0x72,0x74,0x63,0x75,0x74,0x20,0x28,0x73,0x68,0x69,0x66,0x74, - 0x20,0x2B,0x20,0x6E,0x75,0x6D,0x2D,0x70,0x61,0x64,0x20,0x44, - 0x65,0x6C,0x2F,0x27,0x2C,0x27,0x29,0x20,0x6F,0x6E,0x6C,0x79, - 0x20,0x77,0x6F,0x72,0x6B,0x73,0x20,0x69,0x66,0x37,0x3E,0x40, - 0x58,0x30,0x32,0x31,0x6E,0x75,0x6D,0x20,0x6C,0x6F,0x63,0x6B, - 0x20,0x69,0x73,0x20,0x6F,0x66,0x66,0x2E,0x20,0x54,0x68,0x65, - 0x72,0x65,0x27,0x73,0x20,0x6E,0x6F,0x20,0x77,0x61,0x79,0x20, - 0x49,0x20,0x63,0x61,0x6E,0x20,0x66,0x69,0x78,0x20,0x74,0x68, - 0x69,0x73,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30, - 0x0C,0x3E,0x40,0x43,0x30,0x30,0x31,0x56,0x69,0x64,0x65,0x6F, - 0x3A,0x06,0x3E,0x40,0x43,0x30,0x30,0x32,0x50,0x3E,0x40,0x58, - 0x30,0x31,0x30,0x2D,0x20,0x46,0x75,0x6C,0x6C,0x73,0x63,0x72, - 0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x63,0x61,0x6E, - 0x20,0x62,0x65,0x20,0x75,0x6E,0x62,0x65,0x61,0x72,0x61,0x62, - 0x6C,0x79,0x20,0x73,0x6C,0x6F,0x77,0x20,0x6F,0x6E,0x20,0x61, - 0x20,0x52,0x61,0x73,0x70,0x62,0x65,0x72,0x72,0x79,0x20,0x50, - 0x69,0x20,0x28,0x65,0x76,0x65,0x6E,0x20,0x61,0x6E,0x20,0x52, - 0x50,0x69,0x20,0x34,0x29,0x01,0x3E,0x4A,0x3E,0x40,0x58,0x30, - 0x31,0x30,0x2D,0x20,0x54,0x68,0x65,0x20,0x73,0x63,0x6F,0x70, - 0x65,0x73,0x20,0x63,0x61,0x6E,0x20,0x6D,0x69,0x6C,0x64,0x6C, - 0x79,0x20,0x66,0x6C,0x69,0x63,0x6B,0x65,0x72,0x20,0x64,0x65, - 0x70,0x65,0x6E,0x64,0x69,0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x77,0x61,0x76,0x65,0x66,0x6F,0x72,0x6D,0x20, - 0x61,0x6E,0x64,0x20,0x70,0x69,0x74,0x63,0x68,0x2E,0x4D,0x3E, - 0x40,0x58,0x30,0x32,0x31,0x54,0x68,0x69,0x73,0x20,0x69,0x73, - 0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65, - 0x69,0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79, - 0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x63,0x6C,0x6F,0x63, - 0x6B,0x65,0x64,0x20,0x74,0x6F,0x20,0x65,0x78,0x61,0x63,0x74, - 0x6C,0x79,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20, - 0x72,0x61,0x74,0x65,0x4D,0x3E,0x61,0x74,0x20,0x77,0x68,0x69, - 0x63,0x68,0x20,0x74,0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65, - 0x73,0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72, - 0x65,0x64,0x2E,0x20,0x49,0x74,0x27,0x73,0x20,0x63,0x6C,0x6F, - 0x73,0x65,0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x63,0x61, - 0x75,0x73,0x65,0x73,0x20,0x61,0x20,0x66,0x6C,0x69,0x63,0x6B, - 0x65,0x72,0x20,0x65,0x66,0x66,0x65,0x63,0x74,0x2E,0x01,0x3E, - 0x52,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74, - 0x20,0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,0x20, - 0x69,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69, - 0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,0x73, - 0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F, - 0x74,0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,0x48, - 0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x4F, - 0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,0x61, - 0x79,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65, - 0x20,0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,0x74, - 0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,0x75, - 0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,0x6C, - 0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65, - 0x64,0x20,0x74,0x68,0x65,0x6E,0x2E,0x49,0x49,0x20,0x68,0x69, - 0x67,0x68,0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65, - 0x6E,0x64,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79, - 0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20, - 0x61,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,0x79, - 0x6F,0x75,0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,0x64, - 0x63,0x6F,0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x10,0x6F,0x66, - 0x20,0x74,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61, - 0x6D,0x2E,0x00,0x03,0x45,0x4E,0x44 + 0x73,0x65,0x65,0x4F,0x3E,0x40,0x58,0x30,0x32,0x31,0x75,0x6E, + 0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,0x73,0x61,0x6D, + 0x70,0x6C,0x65,0x20,0x64,0x61,0x74,0x61,0x20,0x61,0x74,0x20, + 0x74,0x68,0x65,0x20,0x6C,0x6F,0x6F,0x70,0x2D,0x65,0x6E,0x64, + 0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E,0x20,0x54,0x68,0x69,0x73, + 0x20,0x69,0x73,0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20, + 0x6F,0x66,0x20,0x61,0x20,0x6B,0x6C,0x75,0x64,0x67,0x65,0x4B, + 0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x73,0x61, + 0x6D,0x70,0x6C,0x69,0x6E,0x67,0x20,0x69,0x6E,0x74,0x65,0x72, + 0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20, + 0x77,0x6F,0x72,0x6B,0x20,0x66,0x61,0x73,0x74,0x65,0x72,0x20, + 0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,0x6F, + 0x20,0x6D,0x69,0x78,0x65,0x72,0x2C,0x20,0x61,0x6E,0x64,0x20, + 0x74,0x68,0x65,0x4B,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C, + 0x20,0x46,0x54,0x32,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65, + 0x20,0x73,0x61,0x6D,0x65,0x20,0x70,0x72,0x6F,0x62,0x6C,0x65, + 0x6D,0x2E,0x20,0x49,0x20,0x68,0x61,0x76,0x65,0x20,0x6D,0x61, + 0x64,0x65,0x20,0x69,0x74,0x20,0x73,0x6F,0x20,0x74,0x68,0x61, + 0x74,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x7A,0x6F,0x6F, + 0x6D,0x20,0x69,0x6E,0x20,0x74,0x6F,0x3B,0x73,0x65,0x65,0x20, + 0x74,0x68,0x65,0x20,0x69,0x6E,0x64,0x69,0x76,0x69,0x64,0x75, + 0x61,0x6C,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F, + 0x69,0x6E,0x74,0x73,0x2C,0x20,0x69,0x74,0x20,0x77,0x69,0x6C, + 0x6C,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x6C,0x69,0x6B,0x65,0x20, + 0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x06,0x3E,0x40,0x58,0x30, + 0x31,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75, + 0x73,0x65,0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72, + 0x64,0x3A,0x01,0x3E,0x43,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D, + 0x20,0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20,0x54,0x68,0x65,0x20, + 0x6D,0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72, + 0x20,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x20,0x63,0x61, + 0x6E,0x20,0x62,0x65,0x20,0x67,0x6C,0x69,0x74,0x63,0x68,0x79, + 0x20,0x61,0x74,0x20,0x74,0x69,0x6D,0x65,0x73,0x2E,0x2E,0x2E, + 0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30, + 0x30,0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43, + 0x30,0x30,0x32,0x50,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20, + 0x46,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D, + 0x6F,0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x75, + 0x6E,0x62,0x65,0x61,0x72,0x61,0x62,0x6C,0x79,0x20,0x73,0x6C, + 0x6F,0x77,0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,0x61,0x73,0x70, + 0x62,0x65,0x72,0x72,0x79,0x20,0x50,0x69,0x20,0x28,0x65,0x76, + 0x65,0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,0x20,0x34,0x29, + 0x01,0x3E,0x4A,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x54, + 0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x63,0x61, + 0x6E,0x20,0x6D,0x69,0x6C,0x64,0x6C,0x79,0x20,0x66,0x6C,0x69, + 0x63,0x6B,0x65,0x72,0x20,0x64,0x65,0x70,0x65,0x6E,0x64,0x69, + 0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x77,0x61, + 0x76,0x65,0x66,0x6F,0x72,0x6D,0x20,0x61,0x6E,0x64,0x20,0x70, + 0x69,0x74,0x63,0x68,0x2E,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31, + 0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x62,0x65,0x63,0x61, + 0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x69,0x72,0x20,0x66,0x72, + 0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x69,0x73,0x20,0x6E, + 0x6F,0x74,0x20,0x63,0x6C,0x6F,0x63,0x6B,0x65,0x64,0x20,0x74, + 0x6F,0x20,0x65,0x78,0x61,0x63,0x74,0x6C,0x79,0x20,0x74,0x68, + 0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x72,0x61,0x74,0x65,0x4D, + 0x3E,0x61,0x74,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x74,0x68, + 0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x61,0x72,0x65, + 0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x65,0x64,0x2E,0x20,0x49, + 0x74,0x27,0x73,0x20,0x63,0x6C,0x6F,0x73,0x65,0x2C,0x20,0x77, + 0x68,0x69,0x63,0x68,0x20,0x63,0x61,0x75,0x73,0x65,0x73,0x20, + 0x61,0x20,0x66,0x6C,0x69,0x63,0x6B,0x65,0x72,0x20,0x65,0x66, + 0x66,0x65,0x63,0x74,0x2E,0x01,0x3E,0x52,0x3E,0x40,0x58,0x30, + 0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74,0x20,0x61,0x20,0x62,0x75, + 0x67,0x2C,0x20,0x62,0x75,0x74,0x20,0x69,0x66,0x20,0x79,0x6F, + 0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73, + 0x20,0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74, + 0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74, + 0x20,0x74,0x6F,0x20,0x36,0x30,0x48,0x7A,0x20,0x28,0x6F,0x72, + 0x20,0x35,0x39,0x48,0x7A,0x29,0x4F,0x3E,0x40,0x58,0x30,0x32, + 0x31,0x79,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x65,0x78,0x70, + 0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x76,0x69,0x73,0x75, + 0x61,0x6C,0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E, + 0x67,0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x56,0x53, + 0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,0x6C,0x20,0x6E,0x6F,0x74, + 0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x74,0x68,0x65, + 0x6E,0x2E,0x49,0x49,0x20,0x68,0x69,0x67,0x68,0x6C,0x79,0x20, + 0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x20,0x72,0x75, + 0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D, + 0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x61,0x74,0x20,0x36,0x30, + 0x48,0x7A,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x27,0x72,0x65, + 0x20,0x61,0x20,0x68,0x61,0x72,0x64,0x63,0x6F,0x72,0x65,0x20, + 0x75,0x73,0x65,0x72,0x10,0x6F,0x66,0x20,0x74,0x68,0x69,0x73, + 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x00,0x03,0x45, + 0x4E,0x44 }; #endif diff --git a/src/mixer/ft2_mix_macros.h b/src/mixer/ft2_mix_macros.h @@ -128,13 +128,13 @@ #define RENDER_8BIT_SMP \ assert(smpPtr >= CDA_LinearAdr && smpPtr < CDA_LinearAdr+v->SLen); \ - sample = *smpPtr << 20; \ + sample = *smpPtr << (12+8); \ *audioMixL++ += ((int64_t)sample * CDA_LVol) >> 32; \ *audioMixR++ += ((int64_t)sample * CDA_RVol) >> 32; \ #define RENDER_8BIT_SMP_MONO \ assert(smpPtr >= CDA_LinearAdr && smpPtr < CDA_LinearAdr+v->SLen); \ - sample = *smpPtr << 20; \ + sample = *smpPtr << (12+8); \ sample = ((int64_t)sample * CDA_LVol) >> 32; \ *audioMixL++ += sample; \ *audioMixR++ += sample; \