Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ft2-clone for openSUSE:Factory 
checked in at 2026-10-31 23:07:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ft2-clone (Old)
 and      /work/SRC/openSUSE:Factory/.ft2-clone.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ft2-clone"

Sat Oct 31 23:07:22 2026 rev:51 rq:1393947 version:2.28

Changes:
--------
--- /work/SRC/openSUSE:Factory/ft2-clone/ft2-clone.changes      2026-10-26 
10:03:42.629044634 +0100
+++ /work/SRC/openSUSE:Factory/.ft2-clone.new.1255/ft2-clone.changes    
2026-10-31 23:09:34.076895465 +0100
@@ -1,0 +2,8 @@
+Fri Oct 30 18:42:19 UTC 2026 - Martin Hauke <[email protected]>
+
+- Update to version 2.28
+  * Fixed crash when using the "Fix DC" button (S.E.Ext) on a marked
+    selection.
+  * Did some tweaks to the routines in Smp. Ed. -> Effects.
+
+-------------------------------------------------------------------

Old:
----
  ft2-clone-2.27.tar.gz

New:
----
  ft2-clone-2.28.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ft2-clone.spec ++++++
--- /var/tmp/diff_new_pack.9dCx2j/_old  2026-10-31 23:09:34.977932771 +0100
+++ /var/tmp/diff_new_pack.9dCx2j/_new  2026-10-31 23:09:34.978932812 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           ft2-clone
-Version:        2.27
+Version:        2.28
 Release:        0
 Summary:        Fasttracker II clone
 License:        BSD-3-Clause AND CC-BY-NC-SA-4.0

++++++ ft2-clone-2.27.tar.gz -> ft2-clone-2.28.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_about.c 
new/ft2-clone-2.28/src/ft2_about.c
--- old/ft2-clone-2.27/src/ft2_about.c  2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_about.c  2026-10-29 18:44:55.000000000 +0100
@@ -10,7 +10,7 @@
 #include "ft2_config.h"
 #include "ft2_random.h"
 
-#define NUM_STARS 1500
+#define NUM_STARS 2048
 #define STARSHINE_ALPHA_PERCENTAGE 33
 #define ABOUT_SCREEN_X 3
 #define ABOUT_SCREEN_Y 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_audio.c 
new/ft2-clone-2.28/src/ft2_audio.c
--- old/ft2-clone-2.27/src/ft2_audio.c  2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_audio.c  2026-10-29 18:44:55.000000000 +0100
@@ -351,7 +351,7 @@
                if (status & CS_UPDATE_VOL)
                {
                        v->fVolume = ch->fFinalVol; // 0.0f .. 1.0f
-                       v->scopeVolume = (int16_t)(int32_t)((ch->fFinalVol * 
(SCOPE_HEIGHT*512)) + 0.5f);
+                       v->scopeVolume = (uint16_t)(int32_t)((ch->fFinalVol * 
32768.0f) + 0.5f);
                }
 
                if (status & CS_UPDATE_PAN)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_audio.h 
new/ft2-clone-2.28/src/ft2_audio.h
--- old/ft2-clone-2.27/src/ft2_audio.h  2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_audio.h  2026-10-29 18:44:55.000000000 +0100
@@ -62,7 +62,7 @@
        const int16_t *base16, *revBase16;
        bool active, samplingBackwards, isFadeOutVoice, hasLooped;
        uint8_t mixFuncOffset, panning, loopType;
-       int16_t scopeVolume;
+       uint16_t scopeVolume;
        int32_t position, sampleEnd, loopStart, loopLength;
        uint32_t volumeRampLength;
        uint64_t positionFrac, delta, scopeDelta;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_config.c 
new/ft2-clone-2.28/src/ft2_config.c
--- old/ft2-clone-2.27/src/ft2_config.c 2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_config.c 2026-10-29 18:44:55.000000000 +0100
@@ -259,7 +259,7 @@
        showTopScreen(DONT_RESTORE_SCREENS);
        showBottomScreen();
 
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        updateImageStretchAndPixelFilter(oldWindowFlags, oldSpecialFlags2);
 
        if (config.specialFlags2 & HARDWARE_MOUSE)
@@ -369,7 +369,7 @@
        showTopScreen(DONT_RESTORE_SCREENS);
        showBottomScreen();
 
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        updateImageStretchAndPixelFilter(oldWindowFlags, oldSpecialFlags2);
 
        if (config.specialFlags2 & HARDWARE_MOUSE)
@@ -1988,7 +1988,7 @@
 
        config.windowFlags &= ~(WINSIZE_1X + WINSIZE_2X + WINSIZE_3X + 
WINSIZE_4X);
        config.windowFlags |= WINSIZE_AUTO;
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        checkRadioButton(RB_CONFIG_WIN_SIZE_AUTO);
 }
 
@@ -2002,7 +2002,7 @@
 
        config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_2X + WINSIZE_3X + 
WINSIZE_4X);
        config.windowFlags |= WINSIZE_1X;
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        checkRadioButton(RB_CONFIG_WIN_SIZE_1X);
 }
 
@@ -2016,7 +2016,7 @@
 
        config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_3X + 
WINSIZE_4X);
        config.windowFlags |= WINSIZE_2X;
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        checkRadioButton(RB_CONFIG_WIN_SIZE_2X);
 }
 
@@ -2030,7 +2030,7 @@
 
        config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_2X + 
WINSIZE_4X);
        config.windowFlags |= WINSIZE_3X;
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        checkRadioButton(RB_CONFIG_WIN_SIZE_3X);
 }
 
@@ -2044,7 +2044,7 @@
 
        config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_2X + 
WINSIZE_3X);
        config.windowFlags |= WINSIZE_4X;
-       setWindowSizeFromConfig(true);
+       setWindowSizeFromConfig(UPDATE_RENDERER);
        checkRadioButton(RB_CONFIG_WIN_SIZE_4X);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_gui.c 
new/ft2-clone-2.28/src/ft2_gui.c
--- old/ft2-clone-2.27/src/ft2_gui.c    2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_gui.c    2026-10-29 18:44:55.000000000 +0100
@@ -556,16 +556,6 @@
        }
 }
 
-void textOutBorder(uint16_t x, uint16_t y, uint8_t paletteIndex, uint8_t 
borderPaletteIndex, const char *textPtr)
-{
-       textOut(x,   y-1, borderPaletteIndex, textPtr); // top
-       textOut(x+1, y,   borderPaletteIndex, textPtr); // right
-       textOut(x,   y+1, borderPaletteIndex, textPtr); // bottom
-       textOut(x-1, y,   borderPaletteIndex, textPtr); // left
-
-       textOut(x, y, paletteIndex, textPtr);
-}
-
 // fixed width
 void textOutFixed(uint16_t x, uint16_t y, uint8_t fgPaltete, uint8_t 
bgPalette, const char *textPtr)
 {
@@ -855,7 +845,7 @@
        for (int32_t i = 0; i < h; i++)
        {
                *dstPtr = pixVal;
-                dstPtr += SCREEN_W;
+               dstPtr += SCREEN_W;
        }
 }
 
@@ -879,8 +869,8 @@
        const int16_t dy = y2 - y1;
        const uint16_t ay = ABS(dy) * 2;
        const int16_t sy = SGN(dy);
-       int16_t x = x1;
-       int16_t y  = y1;
+
+       int16_t x = x1, y = y1;
 
        uint32_t pixVal = video.palette[paletteIndex];
        const int32_t pitch  = sy * SCREEN_W;
@@ -1257,7 +1247,7 @@
        }
        else
        {
-               showTopLeftMainScreen(restoreScreens); // updates ui.scopesShown
+               showTopLeftMainScreen(restoreScreens); // also sets 
ui.scopesShown
                showTopRightMainScreen();
        }
 }
@@ -1276,7 +1266,7 @@
 {
        setScrollBarPos(SB_POS_ED, 0, DONT_TRIGGER_CALLBACK);
 
-       showTopScreen(DONT_RESTORE_SCREENS); // false = don't restore screens
+       showTopScreen(DONT_RESTORE_SCREENS);
        showPatternEditor();
 
        ui.updatePosSections = true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_gui.h 
new/ft2-clone-2.28/src/ft2_gui.h
--- old/ft2-clone-2.27/src/ft2_gui.h    2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_gui.h    2026-10-29 18:44:55.000000000 +0100
@@ -37,6 +37,9 @@
 
 enum
 {
+       DONT_UPDATE_RENDERER = false,
+       UPDATE_RENDERER = true,
+
        DONT_RESTORE_SCREENS = false,
        RESTORE_SCREENS = true,
 
@@ -106,7 +109,6 @@
 void bigCharOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr);
 void charOutOutlined(uint16_t x, uint16_t y, uint8_t paletteIndex, char chr);
 void textOut(uint16_t x, uint16_t y, uint8_t paletteIndex, const char 
*textPtr);
-void textOutBorder(uint16_t x, uint16_t y, uint8_t paletteIndex, uint8_t 
borderPaletteIndex, const char *textPtr);
 void textOutFixed(uint16_t x, uint16_t y, uint8_t fgPaltete, uint8_t 
bgPalette, const char *textPtr);
 void bigTextOut(uint16_t x, uint16_t y, uint8_t paletteIndex, const char 
*textPtr);
 void bigTextOutShadow(uint16_t x, uint16_t y, uint8_t paletteIndex, uint8_t 
shadowPaletteIndex, const char *textPtr);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_header.h 
new/ft2-clone-2.28/src/ft2_header.h
--- old/ft2-clone-2.27/src/ft2_header.h 2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_header.h 2026-10-29 18:44:55.000000000 +0100
@@ -14,7 +14,7 @@
 #endif
 #include "ft2_replayer.h"
 
-#define PROG_VER_STR "2.27"
+#define PROG_VER_STR "2.28"
 
 // do NOT change these! It will only mess things up...
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_pattern_ed.c 
new/ft2-clone-2.28/src/ft2_pattern_ed.c
--- old/ft2-clone-2.27/src/ft2_pattern_ed.c     2026-10-25 15:23:06.000000000 
+0100
+++ new/ft2-clone-2.28/src/ft2_pattern_ed.c     2026-10-29 18:44:55.000000000 
+0100
@@ -2167,19 +2167,15 @@
 
 void resetPlaybackTime(void)
 {
-       song.playbackSeconds = 0;
-       song.playbackSecondsFrac = 0;
-
-       last_TimeH = 0;
-       last_TimeM = 0;
-       last_TimeS = 0;
+       song.dPlaybackSeconds = 0.0;
+       last_TimeH = last_TimeM = last_TimeS = 0;
 }
 
 void drawPlaybackTime(void)
 {
        if (songPlaying)
        {
-               uint32_t seconds = song.playbackSeconds;
+               uint32_t seconds = (int32_t)song.dPlaybackSeconds;
 
                last_TimeH = seconds / 3600;
                seconds -= last_TimeH * 3600;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_replayer.c 
new/ft2-clone-2.28/src/ft2_replayer.c
--- old/ft2-clone-2.27/src/ft2_replayer.c       2026-10-25 15:23:06.000000000 
+0100
+++ new/ft2-clone-2.28/src/ft2_replayer.c       2026-10-29 18:44:55.000000000 
+0100
@@ -30,8 +30,7 @@
 #include "mixer/ft2_windowed_sinc.h"
 
 static uint32_t logTab[4*12*16], frequencyMulFactor, frequencyDivFactor;
-static uint64_t songTickDuration52fp[(MAX_BPM-MIN_BPM)+1];
-static double dDeltaMul, dScopeDeltaMul, dScopeDrawDeltaMul;
+static double dSongTickDuration[(MAX_BPM-MIN_BPM)+1], dDeltaMul, 
dScopeDeltaMul, dScopeDrawDeltaMul;
 static bool bxxOverflow;
 static note_t nilPatternLine[MAX_CHANNELS];
 
@@ -490,7 +489,9 @@
                const int32_t i = bpm - MIN_BPM;
                audio.samplesPerTickIntTab[i] = (uint32_t)dSamplesPerTickInt;
                audio.samplesPerTickFracTab[i] = (uint64_t)(dSamplesPerTickFrac 
* BPM_FRAC_SCALE);
-               songTickDuration52fp[i] = (uint64_t)round((1ULL << 52ULL) / 
dFt2BPMHz);
+
+               dSongTickDuration[i] = 1.0 / dFt2BPMHz;
+
                audio.tickTimeIntTab[i] = (uint32_t)dTickTimeInt;
                audio.tickTimeFracTab[i] = (uint64_t)(dTickTimeFrac * 
TICK_TIME_FRAC_SCALE);
        }
@@ -2374,12 +2375,10 @@
        // for song playback counter (hh:mm:ss)
        if (song.BPM >= MIN_BPM && song.BPM <= MAX_BPM) // just in case
        {
-               song.playbackSecondsFrac += 
songTickDuration52fp[song.BPM-MIN_BPM];
-               if (song.playbackSecondsFrac >= 1ULL << 52)
-               {
-                       song.playbackSecondsFrac &= (1ULL << 52)-1;
-                       song.playbackSeconds++;
-               }
+               song.dPlaybackSeconds += dSongTickDuration[song.BPM-MIN_BPM];
+
+               if (song.dPlaybackSeconds >= (99.0*60.0*60.0)+60.0) // wrap 
around 99:59:59 -> 00:00:00
+                       song.dPlaybackSeconds = 0.0;
        }
 
        bool tickZero = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_replayer.h 
new/ft2-clone-2.28/src/ft2_replayer.h
--- old/ft2-clone-2.27/src/ft2_replayer.h       2026-10-25 15:23:06.000000000 
+0100
+++ new/ft2-clone-2.28/src/ft2_replayer.h       2026-10-29 18:44:55.000000000 
+0100
@@ -198,8 +198,7 @@
 typedef struct syncedChannel_t // used for audio/video sync queue (pack to 
save RAM)
 {
        uint8_t status, pianoNoteNum, smpNum, instrNum;
-       int16_t scopeVolume;
-       uint16_t period;
+       uint16_t scopeVolume, period;
        int32_t smpStartPos;
 }
 #ifdef __GNUC__
@@ -274,9 +273,7 @@
        int16_t songPos, pattNum, row, currNumRows;
        uint16_t songLength, songLoopStart, BPM, speed, initialSpeed, 
globalVolume, tick;
        int32_t numChannels;
-
-       uint32_t playbackSeconds;
-       uint64_t playbackSecondsFrac;
+       double dPlaybackSeconds;
 } song_t;
 
 int32_t getSampleC4Hz(sample_t *s);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_sample_ed.c 
new/ft2-clone-2.28/src/ft2_sample_ed.c
--- old/ft2-clone-2.27/src/ft2_sample_ed.c      2026-10-25 15:23:06.000000000 
+0100
+++ new/ft2-clone-2.28/src/ft2_sample_ed.c      2026-10-29 18:44:55.000000000 
+0100
@@ -3587,14 +3587,14 @@
 
        if (s->flags & SAMPLE_16BIT)
        {
+               ptr16 = (int16_t *)s->dataPtr;
                if (!sampleDataMarked)
                {
-                       ptr16 = (int16_t *)s->dataPtr;
                        length = s->length;
                }
                else
                {
-                       ptr16 = (int16_t *)&s->dataPtr + smpEd_Rx1;
+                       ptr16 += smpEd_Rx1;
                        length = smpEd_Rx2 - smpEd_Rx1;
                }
 
@@ -3610,6 +3610,7 @@
                int64_t averageDC = 0;
                for (int32_t i = 0; i < length; i++)
                        averageDC += ptr16[i];
+
                averageDC = (averageDC + (length>>1)) / length; // rounded
 
                const int32_t smpSub = (int32_t)averageDC;
@@ -3624,14 +3625,14 @@
        }
        else // 8-bit
        {
+               ptr8 = s->dataPtr;
                if (!sampleDataMarked)
                {
-                       ptr8 = s->dataPtr;
                        length = s->length;
                }
                else
                {
-                       ptr8 = &s->dataPtr[smpEd_Rx1];
+                       ptr8 += smpEd_Rx1;
                        length = smpEd_Rx2 - smpEd_Rx1;
                }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_smpfx.c 
new/ft2-clone-2.28/src/ft2_smpfx.c
--- old/ft2-clone-2.27/src/ft2_smpfx.c  2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_smpfx.c  2026-10-29 18:44:55.000000000 +0100
@@ -180,16 +180,16 @@
        memset(lengthStr, '\0', sizeof (lengthStr));
        snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength);
 
-       if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof 
(lengthStr)-1) != 1)
+       if (inputBox(1, "Enter new waveform length (3..9999):", lengthStr, 
sizeof (lengthStr)-1) != 1)
                return;
 
        if (lengthStr[0] == '\0')
                return;
 
        lastWaveLength = (int32_t)atoi(lengthStr);
-       if (lastWaveLength <= 1 || lastWaveLength > 65536)
+       if (lastWaveLength < 3 || lastWaveLength > 9999)
        {
-               okBox(0, "System message", "Illegal range! Allowed range is 
2..65535", NULL);
+               okBox(0, "System message", "Illegal length! Allowed range is 
3..9999", NULL);
                return;
        }
 
@@ -207,20 +207,23 @@
                return;
        }
 
-       const double delta = 4.0 / lastWaveLength;
-       double phase = 0.0;
-
        int16_t *ptr16 = (int16_t *)s->dataPtr;
+
+       const double dDelta = 4.0 / (double)lastWaveLength;
+       double dPhase = 0.0;
+
        for (int32_t i = 0; i < newLength; i++)
        {
-               double t = phase;
-               if (t > 3.0)
-                       t -= 4.0;
-               else if (t >= 1.0)
-                       t = 2.0 - t;
+               double dT = dPhase;
+               if (dT > 3.0)
+                       dT -= 4.0;
+               else if (dT >= 1.0)
+                       dT = 2.0 - dT;
 
-               *ptr16++ = (int16_t)(t * INT16_MAX);
-               phase = fmod(phase + delta, 4.0);
+               dPhase = fmod(dPhase + dDelta, 4.0);
+
+               int32_t smp = (int32_t)round(INT16_MAX * dT);
+               *ptr16++ = (int16_t)smp;
        }
 
        s->loopLength = newLength;
@@ -238,16 +241,16 @@
        memset(lengthStr, '\0', sizeof (lengthStr));
        snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength);
 
-       if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof 
(lengthStr)-1) != 1)
+       if (inputBox(1, "Enter new waveform length (3..9999):", lengthStr, 
sizeof (lengthStr)-1) != 1)
                return;
 
        if (lengthStr[0] == '\0')
                return;
 
        lastWaveLength = (int32_t)atoi(lengthStr);
-       if (lastWaveLength <= 1 || lastWaveLength > 65536)
+       if (lastWaveLength < 3 || lastWaveLength > 9999)
        {
-               okBox(0, "System message", "Illegal range! Allowed range is 
2..65535", NULL);
+               okBox(0, "System message", "Illegal length! Allowed range is 
3..9999", NULL);
                return;
        }
 
@@ -264,15 +267,17 @@
                okBox(0, "System message", "Not enough memory!", NULL);
                return;
        }
+       
+       int16_t *ptr16 = (int16_t *)s->dataPtr;
 
-       uint64_t point64 = 0;
-       uint64_t delta64 = ((uint64_t)(INT16_MAX*2) << 32ULL) / lastWaveLength;
+       const double dDelta = (INT16_MAX * 2.0) / (double)lastWaveLength;
+       double dPoint = 0.0;
 
-       int16_t *ptr16 = (int16_t *)s->dataPtr;
        for (int32_t i = 0; i < newLength; i++)
        {
-               *ptr16++ = (int16_t)(point64 >> 32);
-               point64 += delta64;
+               int32_t smp = (int32_t)round(dPoint);
+               *ptr16++ = (int16_t)smp;
+               dPoint += dDelta;
        }
 
        s->loopLength = newLength;
@@ -290,16 +295,16 @@
        memset(lengthStr, '\0', sizeof (lengthStr));
        snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength);
 
-       if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof 
(lengthStr)-1) != 1)
+       if (inputBox(1, "Enter new waveform length (6..9999):", lengthStr, 
sizeof (lengthStr)-1) != 1)
                return;
 
        if (lengthStr[0] == '\0')
                return;
 
        lastWaveLength = (int32_t)atoi(lengthStr);
-       if (lastWaveLength <= 1 || lastWaveLength > 65536)
+       if (lastWaveLength < 6 || lastWaveLength > 9999)
        {
-               okBox(0, "System message", "Illegal range! Allowed range is 
2..65535", NULL);
+               okBox(0, "System message", "Illegal length! Allowed range is 
6..9999", NULL);
                return;
        }
 
@@ -317,11 +322,14 @@
                return;
        }
 
-       const double dMul = (2.0 * M_PI) / lastWaveLength;
-
        int16_t *ptr16 = (int16_t *)s->dataPtr;
+
+       const double dMul = (2.0 * M_PI) / (double)lastWaveLength;
        for (int32_t i = 0; i < newLength; i++)
-               *ptr16++ = (int16_t)(INT16_MAX * sin(i * dMul));
+       {
+               int32_t smp = (int32_t)round(INT16_MAX * sin(i * dMul));
+               *ptr16++ = (int16_t)smp;
+       }
 
        s->loopLength = newLength;
        s->flags |= LOOP_FORWARD;
@@ -338,16 +346,22 @@
        memset(lengthStr, '\0', sizeof (lengthStr));
        snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength);
 
-       if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof 
(lengthStr)-1) != 1)
+       if (inputBox(1, "Enter new waveform length (2..9999, even):", 
lengthStr, sizeof (lengthStr)-1) != 1)
                return;
 
        if (lengthStr[0] == '\0')
                return;
 
        lastWaveLength = (int32_t)atoi(lengthStr);
-       if (lastWaveLength <= 1 || lastWaveLength > 65536)
+       if (lastWaveLength < 2 || lastWaveLength > 9999)
+       {
+               okBox(0, "System message", "Illegal length! Allowed range is 
2..9999", NULL);
+               return;
+       }
+
+       if (lastWaveLength & 1)
        {
-               okBox(0, "System message", "Illegal range! Allowed range is 
2..65535", NULL);
+               okBox(0, "System message", "Illegal length! Length must be an 
even number (2, 4, 6, 8, ...)", NULL);
                return;
        }
 
@@ -528,15 +542,16 @@
                        int16_t *ptr16 = (int16_t *)s->dataPtr + x1;
                        for (int32_t i = 0; i < len; i++)
                        {
-                               double out = (f->a1*ptr16[i]) + 
(f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - 
(f->b2*f->outTmp[1]);
+                               double dOut = (f->a1*ptr16[i]) + 
(f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - 
(f->b2*f->outTmp[1]);
 
                                f->inTmp[1] = f->inTmp[0];
                                f->inTmp[0] = ptr16[i];
 
                                f->outTmp[1] = f->outTmp[0];
-                               f->outTmp[0] = out;
+                               f->outTmp[0] = dOut;
 
-                               ptr16[i] = (int16_t)CLAMP(out, INT16_MIN, 
INT16_MAX);
+                               int32_t sample = (int32_t)CLAMP(dOut, 
INT16_MIN, INT16_MAX);
+                               ptr16[i] = (int16_t)sample;
                        }
                }
                else
@@ -544,15 +559,16 @@
                        int8_t *ptr8 = (int8_t *)s->dataPtr + x1;
                        for (int32_t i = 0; i < len; i++)
                        {
-                               double out = (f->a1*ptr8[i]) + 
(f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - 
(f->b2*f->outTmp[1]);
+                               double dOut = (f->a1*ptr8[i]) + 
(f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - 
(f->b2*f->outTmp[1]);
 
                                f->inTmp[1] = f->inTmp[0];
                                f->inTmp[0] = ptr8[i];
 
                                f->outTmp[1] = f->outTmp[0];
-                               f->outTmp[0] = out;
+                               f->outTmp[0] = dOut;
 
-                               ptr8[i] = (int8_t)CLAMP(out, INT8_MIN, 
INT8_MAX);
+                               int32_t sample = (int32_t)CLAMP(dOut, INT8_MIN, 
INT8_MAX);
+                               ptr8[i] = (int8_t)sample;
                        }
                }
 
@@ -587,36 +603,42 @@
                double peak = 0.0;
                for (int32_t i = 0; i < len; i++)
                {
-                       const double out = (f->a1*dSmp[i]) + 
(f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - 
(f->b2*f->outTmp[1]);
+                       const double dOut = (f->a1*dSmp[i]) + 
(f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - 
(f->b2*f->outTmp[1]);
 
                        f->inTmp[1] = f->inTmp[0];
                        f->inTmp[0] = dSmp[i];
 
                        f->outTmp[1] = f->outTmp[0];
-                       f->outTmp[0] = out;
+                       f->outTmp[0] = dOut;
 
-                       dSmp[i] = out;
+                       dSmp[i] = dOut;
 
-                       const double outAbs = fabs(out);
+                       const double outAbs = fabs(dOut);
                        if (outAbs > peak)
                                peak = outAbs;
                }
 
                if (s->flags & SAMPLE_16BIT)
                {
-                       const double scale = INT16_MAX / peak;
+                       const double dScale = INT16_MAX / peak;
 
                        int16_t *ptr16 = (int16_t *)s->dataPtr + x1;
                        for (int32_t i = 0; i < len; i++)
-                               ptr16[i] = (int16_t)(dSmp[i] * scale);
+                       {
+                               int32_t sample = (int32_t)(dSmp[i] * dScale);
+                               ptr16[i] = (int16_t)sample;
+                       }
                }
                else
                {
-                       const double scale = INT8_MAX / peak;
+                       const double dScale = INT8_MAX / peak;
 
                        int8_t *ptr8 = (int8_t *)s->dataPtr + x1;
                        for (int32_t i = 0; i < len; i++)
-                               ptr8[i] = (int8_t)(dSmp[i] * scale);
+                       {
+                               int32_t sample = (int32_t)(dSmp[i] * dScale);
+                               ptr8[i] = (int8_t)sample;
+                       }
                }
 
                free(dSmp);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_sysreqs.c 
new/ft2-clone-2.28/src/ft2_sysreqs.c
--- old/ft2-clone-2.27/src/ft2_sysreqs.c        2026-10-25 15:23:06.000000000 
+0100
+++ new/ft2-clone-2.28/src/ft2_sysreqs.c        2026-10-29 18:44:55.000000000 
+0100
@@ -196,6 +196,8 @@
        pushButton_t *p;
        SDL_Event inputEvent;
 
+       volatile bool wasBusy = editor.busy;
+
        if (editor.editTextFlag)
        {
                exitTextEditing();
@@ -402,6 +404,10 @@
        showBottomScreen();
 
        SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
+
+       if (wasBusy)
+               mouseAnimOn();
+
        return returnVal;
 }
 
@@ -416,6 +422,8 @@
 
        SDL_Event inputEvent;
 
+       volatile bool wasBusy = editor.busy;
+
        if (editor.editTextFlag)
        {
                exitTextEditing();
@@ -673,6 +681,10 @@
        showBottomScreen();
 
        SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
+
+       if (wasBusy)
+               mouseAnimOn();
+
        return returnVal;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_video.c 
new/ft2-clone-2.28/src/ft2_video.c
--- old/ft2-clone-2.27/src/ft2_video.c  2026-10-25 15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/ft2_video.c  2026-10-29 18:44:55.000000000 +0100
@@ -353,7 +353,7 @@
        SDL_SetWindowFullscreen(video.window, 0);
        SDL_Delay(15); // fixes possible issues
 
-       setWindowSizeFromConfig(false); // false = do not change actual window 
size, only update variables
+       setWindowSizeFromConfig(DONT_UPDATE_RENDERER);
        SDL_SetWindowSize(video.window, SCREEN_W * 
video.windowModeUpscaleFactor, SCREEN_H * video.windowModeUpscaleFactor);
 
        updateRenderSizeVars();
@@ -911,7 +911,7 @@
        windowFlags |= SDL_WINDOW_HIDDEN;
 #endif
 
-       setWindowSizeFromConfig(false);
+       setWindowSizeFromConfig(DONT_UPDATE_RENDERER);
 
        int32_t di = SDL_GetWindowDisplayIndex(video.window);
        if (di < 0)
@@ -1007,7 +1007,9 @@
 
        SDL_SetRenderDrawColor(video.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
 
+       // for CTRL+SHIFT+F info screen
        dFrameDurationDiv = (1000.0 * FPS_SCAN_FRAMES) / hpcFreq.dFreqMulMs;
+
        return true;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/mixer/ft2_mix_macros.h 
new/ft2-clone-2.28/src/mixer/ft2_mix_macros.h
--- old/ft2-clone-2.27/src/mixer/ft2_mix_macros.h       2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/mixer/ft2_mix_macros.h       2026-10-29 
18:44:55.000000000 +0100
@@ -78,246 +78,199 @@
        fVolumeL += fVolumeLDelta; \
        fVolumeR += fVolumeRDelta;
 
-/* It may look like we are potentially going out of bounds while looking up 
the sample points,
-** but the sample data is actually padded on both the left (negative) and 
right side, where correct tap
-** samples are stored according to loop mode (or no loop).
+#define MIX_SAMPLE \
+       *fMixBufferL++ += fSample * fVolumeL; \
+       *fMixBufferR++ += fSample * fVolumeR;
+
+
+/* ----------------------------------------------------------------------- */
+/*                       SAMPLE INTERPOLATION MACROS                       */
+/* ----------------------------------------------------------------------- */
+/* Notes:
+**  It may look like we are potentially going out of bounds while looking
+**  up the sample points and interpolation LUT data, but we have the
+**  correct data stored at the correct places for this.
 **
-** There is also a second special case for the left edge (negative taps) after 
the sample has looped once.
+**  The _TAP_FIX macros are for special left-edge cases to get proper tap
+**  data after one loop cycle. These are only used on looped samples.
 */
 
+
 /* ----------------------------------------------------------------------- */
 /*                            NO INTERPOLATION                             */
 /* ----------------------------------------------------------------------- */
 
 #define RENDER_8BIT_SMP \
        fSample = *smpPtr * (1.0f / 128.0f); \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP \
        fSample = *smpPtr * (1.0f / 32768.0f); \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       MIX_SAMPLE
 
 
 /* ----------------------------------------------------------------------- */
 /*                      2-POINT LINEAR INTERPOLATION                       */
 /* ----------------------------------------------------------------------- */
 
-#define LINEAR_INTERPOLATION(s, f, scale) \
+#define LINEAR_INTERPOLATION(s, f, smpBits) \
 { \
        const int32_t frac31 = (uint32_t)f >> (MIXER_FRAC_BITS-31); \
-       const float t = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
-       \
-       const float s1 = s[0]; \
-       const float s2 = s[1]; \
+       const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
+       const float p1 = s[0], p2 = s[1]; \
        \
-       fSample = (s1 + ((s2 - s1) * t)) * (1.0f / scale); \
+       fSample = (p1 + ((p2 - p1) * x)) * (1.0f / (1 << (smpBits-1))); \
 }
 
 #define RENDER_8BIT_SMP_LINTRP \
-       LINEAR_INTERPOLATION(smpPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       LINEAR_INTERPOLATION(smpPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_LINTRP \
-       LINEAR_INTERPOLATION(smpPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       LINEAR_INTERPOLATION(smpPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 
 /* ----------------------------------------------------------------------- */
 /*                 3-POINT QUADRATIC SPLINE INTERPOLATION                  */
 /* ----------------------------------------------------------------------- */
 
-#define QUADRATIC_SPLINE_INTERPOLATION(s, f, scale) \
+#define QUADRATIC_SPLINE_INTERPOLATION(s, f, smpBits) \
 { \
        const int32_t frac31 = (uint32_t)f >> (MIXER_FRAC_BITS-31); \
-       const float t = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
-       \
-       const float s1 = s[-1]; \
-       const float s2 =  s[0]; \
-       const float s3 =  s[1]; \
+       const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
+       const float p1 = s[-1], p2 = s[0], p3 = s[1]; \
        \
-       const float a = ((s1 + s3) * 0.5f) - s2; \
-       const float b =  (s3 - s1) * 0.5f; \
+       const float a = ((p1 + p3) * 0.5f) - p2; \
+       const float b = (p3 - p1) * 0.5f; \
+       const float c = p2; \
        \
-       fSample = ((a * t + b) * t + s2) * (1.0f / scale); \
+       fSample = ((a * x + b) * x + c) * (float)(1.0 / (1 << (smpBits-1))); \
 }
 
 #define RENDER_8BIT_SMP_QINTRP \
-       QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_QINTRP \
-       QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
-
-/* The TAP_FIX macros are for special left-edge cases get proper tap data 
after one loop cycle.
-** These are only used on looped samples.
-*/
+       QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 #define RENDER_8BIT_SMP_QINTRP_TAP_FIX  \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t 
*)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \
-       QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_QINTRP_TAP_FIX \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t 
*)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \
-       QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 
 /* ----------------------------------------------------------------------- */
-/*                   4-POINT CUBIC SPLINE INTERPOLATION                    */
+/*            4-POINT CUBIC SPLINE ("Catmull-Rom") INTERPOLATION           */
 /* ----------------------------------------------------------------------- */
 
-// Catmull-Rom algorithm
-#define CUBIC_SPLINE_INTERPOLATION(s, f, scale) \
+#define CUBIC_SPLINE_INTERPOLATION(s, f, smpBits) \
 { \
        const int32_t frac31 = (uint32_t)f >> (MIXER_FRAC_BITS-31); \
-       const float t = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
+       const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
+       const float p1 = s[-1], p2 = s[0], p3 = s[1], p4 = s[2]; \
        \
-       const float s1 = s[-1]; \
-       const float s2 =  s[0]; \
-       const float s3 =  s[1]; \
-       const float s4 =  s[2]; \
-       \
-       const float a = ((s4 - s1) * 0.5f) + ((s2 - s3) * 1.5f); \
-       const float b = ((s1 - (s2 * 2.5f)) + (s3 * 2.0f)) - (s4 * 0.5f); \
-       const float c = (s3 - s1) * 0.5f; \
+       const float a = ((p4 - p1) * 0.5f) + ((p2 - p3) * 1.5f); \
+       const float b = ((p1 - (p2 * 2.5f)) + (p3 * 2.0f)) - (p4 * 0.5f); \
+       const float c = (p3 - p1) * 0.5f; \
+       const float d = p2; \
        \
-       fSample = (((a * t + b) * t + c) * t + s2) * (1.0f / scale); \
+       fSample = (((a * x + b) * x + c) * x + d) * (float)(1.0 / (1 << 
(smpBits-1))); \
 }
 
 #define RENDER_8BIT_SMP_CINTRP \
-       CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_CINTRP \
-       CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 #define RENDER_8BIT_SMP_CINTRP_TAP_FIX  \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t 
*)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \
-       CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_CINTRP_TAP_FIX \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t 
*)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \
-       CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 
 /* ----------------------------------------------------------------------- */
-/*                   8-POINT WINDOWED-SINC INTERPOLATION                   */
+/*                       WINDOWED-SINC INTERPOLATION                       */
 /* ----------------------------------------------------------------------- */
-
-/* Uses linear interpolation between the phases in the kernels to achieve
-** very good precision at a low pre-computed phase count.
-**
-** It may look like we go out of bounds for fSinc[] and s[], but we have
-** extra data at the correct places to account for this.
+/* Note:
+**  Uses linear interpolation between the phases in the kernels to achieve
+**  very good precision at a low pre-computed phase count (256).
 */
 
-#define WINDOWED_SINC8_INTERPOLATION(s, f, scale) \
+#define WSINC_INTRP(NUM_TAPS, NUM_TAPS_BITS, s, f, smpBits) \
 { \
        const uint32_t frac32 = (uint32_t)f; \
        const uint32_t phaseInt = frac32 >> SINC_PHASE_SHIFT; \
        const float fPhaseFrac = (int32_t)(frac32 & SINC_PHASE_MASK) * (1.0f / 
SINC_PHASE_SCALE); \
        \
-       const float *fSinc = v->fSincLUT + (phaseInt << SINC8_TAPS_BITS); \
+       const float *fSinc = v->fSincLUT + (phaseInt << NUM_TAPS_BITS); \
        \
        float fSum = 0.0f; \
-       for (int32_t tap = 0; tap < SINC8_TAPS; tap++) \
+       for (int32_t tap = 0; tap < NUM_TAPS; tap++) \
        { \
                const float fY1 = fSinc[tap]; \
-               const float fY2 = fSinc[SINC8_TAPS+tap]; /* next phase */ \
+               const float fY2 = fSinc[NUM_TAPS+tap]; /* next phase */ \
                \
                /* do linear interpolation between phases */ \
-               fSum += s[tap-SINC8_CENTER_TAP] * (fY1 + ((fY2 - fY1) * 
fPhaseFrac)); \
+               fSum += s[tap-((NUM_TAPS/2)-1)] * (fY1 + ((fY2 - fY1) * 
fPhaseFrac)); \
        } \
        \
-       fSample = fSum * (1.0f / scale); \
+       fSample = fSum * (float)(1.0 / (1 << (smpBits-1))); \
 }
 
+#define WSINC8_INTERPOLATION(s, f, smpBits) WSINC_INTRP(SINC8_TAPS, 
SINC8_TAPS_BITS, s, f, smpBits)
+#define WSINC16_INTERPOLATION(s, f, smpBits) WSINC_INTRP(SINC16_TAPS, 
SINC16_TAPS_BITS, s, f, smpBits)
+
 #define RENDER_8BIT_SMP_S8INTRP \
-       WINDOWED_SINC8_INTERPOLATION(smpPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC8_INTERPOLATION(smpPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_S8INTRP \
-       WINDOWED_SINC8_INTERPOLATION(smpPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC8_INTERPOLATION(smpPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 #define RENDER_8BIT_SMP_S8INTRP_TAP_FIX  \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t 
*)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \
-       WINDOWED_SINC8_INTERPOLATION(smpTapPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC8_INTERPOLATION(smpTapPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_S8INTRP_TAP_FIX \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t 
*)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \
-       WINDOWED_SINC8_INTERPOLATION(smpTapPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
-
-
-/* ----------------------------------------------------------------------- */
-/*                  16-POINT WINDOWED-SINC INTERPOLATION                   */
-/* ----------------------------------------------------------------------- */
-
-#define WINDOWED_SINC16_INTERPOLATION(s, f, scale) \
-{ \
-       const uint32_t frac32 = (uint32_t)f; \
-       const uint32_t phaseInt = frac32 >> SINC_PHASE_SHIFT; \
-       const float fPhaseFrac = (int32_t)(frac32 & SINC_PHASE_MASK) * (1.0f / 
SINC_PHASE_SCALE); \
-       \
-       const float *fSinc = v->fSincLUT + (phaseInt << SINC16_TAPS_BITS); \
-       \
-       float fSum = 0.0f; \
-       for (int32_t tap = 0; tap < SINC16_TAPS; tap++) \
-       { \
-               const float fY1 = fSinc[tap]; \
-               const float fY2 = fSinc[SINC16_TAPS+tap]; /* next phase */ \
-               \
-               /* do linear interpolation between phases */ \
-               fSum += s[tap-SINC16_CENTER_TAP] * (fY1 + ((fY2 - fY1) * 
fPhaseFrac)); \
-       } \
-       \
-       fSample = fSum * (1.0f / scale); \
-}
+       WSINC8_INTERPOLATION(smpTapPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 #define RENDER_8BIT_SMP_S16INTRP \
-       WINDOWED_SINC16_INTERPOLATION(smpPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC16_INTERPOLATION(smpPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_S16INTRP \
-       WINDOWED_SINC16_INTERPOLATION(smpPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC16_INTERPOLATION(smpPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 #define RENDER_8BIT_SMP_S16INTRP_TAP_FIX  \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t 
*)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \
-       WINDOWED_SINC16_INTERPOLATION(smpTapPtr, positionFrac, 128) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC16_INTERPOLATION(smpTapPtr, positionFrac, 8) \
+       MIX_SAMPLE
 
 #define RENDER_16BIT_SMP_S16INTRP_TAP_FIX \
        smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t 
*)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \
-       WINDOWED_SINC16_INTERPOLATION(smpTapPtr, positionFrac, 32768) \
-       *fMixBufferL++ += fSample * fVolumeL; \
-       *fMixBufferR++ += fSample * fVolumeR;
+       WSINC16_INTERPOLATION(smpTapPtr, positionFrac, 16) \
+       MIX_SAMPLE
 
 
 /* ----------------------------------------------------------------------- */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/scopes/ft2_scope_macros.h 
new/ft2-clone-2.28/src/scopes/ft2_scope_macros.h
--- old/ft2-clone-2.27/src/scopes/ft2_scope_macros.h    2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/scopes/ft2_scope_macros.h    2026-10-29 
18:44:55.000000000 +0100
@@ -6,18 +6,20 @@
 
 #define SCOPE_INIT \
        const uint32_t color = video.palette[PAL_PATTEXT]; \
-       uint32_t width = x + w; \
-       int32_t sample; \
-       int32_t position = s->position; \
-       uint64_t positionFrac = s->positionFrac;
+       uint32_t width = sx + w; \
+       int32_t sample, position = s->position; \
+       uint64_t positionFrac = s->positionFrac; \
+       float fSample; \
+       const float fVolume = (float)s->volume * (float)((SCOPE_HEIGHT / 2.0) / 
32768.0);
 
 #define SCOPE_INIT_PINGPONG \
        const uint32_t color = video.palette[PAL_PATTEXT]; \
-       uint32_t width = x + w; \
-       int32_t sample; \
-       int32_t actualPos, position = s->position; \
+       uint32_t width = sx + w; \
+       int32_t sample, actualPos, position = s->position; \
        uint64_t positionFrac = s->positionFrac; \
-       bool samplingBackwards = s->samplingBackwards;
+       bool samplingBackwards = s->samplingBackwards; \
+       float fSample; \
+       const float fVolume = (float)s->volume * (float)((SCOPE_HEIGHT / 2.0) / 
32768.0);
 
 #define LINED_SCOPE_INIT \
        SCOPE_INIT \
@@ -33,129 +35,127 @@
 ** so that out-of-bounds reads get the correct interpolation tap data.
 */
 
-#define NO_INTERPOLATION8 \
-{ \
-       sample = s8[0] << 8; \
-}
-
-#define NO_INTERPOLATION16 \
-{ \
-       sample = s16[0]; \
-}
+#define NO_INTERPOLATION8 fSample = s8[0] * (1.0f / 128.0f);
+#define NO_INTERPOLATION16 fSample = s16[0] * (1.0f / 32768.0f);
 
-// linear interpolation
+// 2-point linear interpolation
 
-#define LINEAR_INTERPOLATION(smp1, smp2, frac) \
+#define LINEAR_INTERPOLATION(s, f, smpBits) \
 { \
-       const int32_t frac15 = (uint32_t)(frac) >> (SCOPE_FRAC_BITS-15); \
-       const int32_t s1 = smp1, s2 = smp2; \
+       const int32_t frac31 = (uint32_t)(f) >> (SCOPE_FRAC_BITS-31); \
+       const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
+       const float p1 = s[0], p2 = s[1]; \
        \
-       sample = s1 + (((s2 - s1) * frac15) >> 15); \
+       fSample = (p1 + ((p2 - p1) * x)) * (float)(1.0 / (1 << (smpBits-1))); \
 }
 
-#define LINEAR_INTERPOLATION8(frac) LINEAR_INTERPOLATION(s8[0] << 8, s8[1] << 
8, frac)
-#define LINEAR_INTERPOLATION16(frac) LINEAR_INTERPOLATION(s16[0], s16[1], frac)
+#define LINEAR_INTERPOLATION8(f) LINEAR_INTERPOLATION(s8, f, 8)
+#define LINEAR_INTERPOLATION16(f) LINEAR_INTERPOLATION(s16, f, 16)
 
-/* 4-point cubic B-spline interpolation (32 phases with interpolation between 
them).
-** The LUT has an extra inverted phase at the end for interpolation 
wrap-around.
-*/
+// 4-point cubic B-spline interpolation
 
-#define CUBIC_BSPLINE_INTERPOLATION(data, shift, frac) \
+#define CUBIC_BSPLINE_INTERPOLATION(s, f, smpBits) \
 { \
-       const uint32_t fracReduced = (uint32_t)(frac) >> 
(SCOPE_FRAC_BITS-INTRP_BITS); \
-       const uint32_t phaseInt5 = fracReduced >> INTRP_PHASE_SHIFT; \
-       const int32_t phaseFrac15 = fracReduced & INTRP_PHASE_MASK; \
-       const int16_t *t = scopeIntrpLUT + (phaseInt5 << 
SCOPE_INTRP_WIDTH_BITS); \
-       \
-       const int32_t s1 = ((data[-1] * t[0]) + \
-                           ( data[0] * t[1]) + \
-                           ( data[1] * t[2]) + \
-                           ( data[2] * t[3])) >> (shift); \
+       const int32_t frac31 = (uint32_t)(f) >> (SCOPE_FRAC_BITS-31); \
+       const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \
+       const float p1 = s[-1], p2 = s[0], p3 = s[1], p4 = s[2]; \
        \
-       const int32_t s2 = ((data[-1] * t[SCOPE_INTRP_WIDTH+0]) + \
-                           ( data[0] * t[SCOPE_INTRP_WIDTH+1]) + \
-                           ( data[1] * t[SCOPE_INTRP_WIDTH+2]) + \
-                           ( data[2] * t[SCOPE_INTRP_WIDTH+3])) >> (shift); \
+       const float a = ((p4 - p1) * (1.0f / 6.0f)) + ((p2 - p3) * (3.0f / 
6.0f)); \
+       const float b = ((p1 + p3) * (3.0f / 6.0f)) - p2; \
+       const float c =  (p3 - p1) * (3.0f / 6.0f); \
+       const float d = ((p1 + p3) * (1.0f / 6.0f)) + (p2 * (4.0f / 6.0f)); \
        \
-       sample = s1 + (((s2 - s1) * phaseFrac15) >> INTRP_PHASE_SHIFT); \
+       fSample = (((a * x + b) * x + c) * x + d) * (float)(1.0 / (1 << 
(smpBits-1))); \
 }
 
-#define CUBIC_BSPLINE_INTERPOLATION8(frac) CUBIC_BSPLINE_INTERPOLATION(s8, 
SCOPE_INTRP_SCALE_BITS-8, frac)
-#define CUBIC_BSPLINE_INTERPOLATION16(frac) CUBIC_BSPLINE_INTERPOLATION(s16, 
SCOPE_INTRP_SCALE_BITS, frac)
+#define CUBIC_BSPLINE_INTERPOLATION8(f) CUBIC_BSPLINE_INTERPOLATION(s8, f, 8)
+#define CUBIC_BSPLINE_INTERPOLATION16(f) CUBIC_BSPLINE_INTERPOLATION(s16, f, 
16)
 
-#define CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, frac) \
-{ \
+#define CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, f) \
        if (s->hasLooped && pos <= s->loopStart+MAX_LEFT_TAPS) \
                s8 = s->leftEdgeTaps8 + (pos - s->loopStart); \
        \
-       CUBIC_BSPLINE_INTERPOLATION(s8, SCOPE_INTRP_SCALE_BITS-8, frac) \
-} \
+       CUBIC_BSPLINE_INTERPOLATION(s8, f, 8) \
 
-#define CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, frac) \
-{ \
+#define CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, f) \
        if (s->hasLooped && pos <= s->loopStart+MAX_LEFT_TAPS) \
                s16 = s->leftEdgeTaps16 + (pos - s->loopStart); \
        \
-       CUBIC_BSPLINE_INTERPOLATION(s16, SCOPE_INTRP_SCALE_BITS, frac) \
-} \
+       CUBIC_BSPLINE_INTERPOLATION(s16, f, 16) \
+
+/* Note:
+** floorf() is needed for proper negative rounding, or else
+** the scopes will not look correct.
+*/
 
-#define INTERPOLATE_SMP8(pos, frac) \
+#define INTERPOLATE_SMP8(pos, f) \
        const int8_t *s8 = s->base8 + pos; \
        if (config.interpolation == INTERPOLATION_DISABLED) \
                NO_INTERPOLATION8 \
        else if (config.interpolation == INTERPOLATION_LINEAR) \
-               LINEAR_INTERPOLATION8(frac) \
+               LINEAR_INTERPOLATION8(f) \
        else \
-               CUBIC_BSPLINE_INTERPOLATION8(frac) \
-       sample = (sample * s->volume) >> (16+9);
+               CUBIC_BSPLINE_INTERPOLATION8(f) \
+       sample = (int32_t)floorf(fSample * fVolume);
 
-#define INTERPOLATE_SMP16(pos, frac) \
+#define INTERPOLATE_SMP16(pos, f) \
        const int16_t *s16 = s->base16 + pos; \
        if (config.interpolation == INTERPOLATION_DISABLED) \
                NO_INTERPOLATION16 \
        else if (config.interpolation == INTERPOLATION_LINEAR) \
-               LINEAR_INTERPOLATION16(frac) \
+               LINEAR_INTERPOLATION16(f) \
        else \
-               CUBIC_BSPLINE_INTERPOLATION16(frac) \
-       sample = (sample * s->volume) >> (16+9);
+               CUBIC_BSPLINE_INTERPOLATION16(f) \
+       sample = (int32_t)floorf(fSample * fVolume);
 
-#define INTERPOLATE_SMP8_LOOP(pos, frac) \
+#define INTERPOLATE_SMP8_LOOP(pos, f) \
        const int8_t *s8 = s->base8 + pos; \
        if (config.interpolation == INTERPOLATION_DISABLED) \
                NO_INTERPOLATION8 \
        else if (config.interpolation == INTERPOLATION_LINEAR) \
-               LINEAR_INTERPOLATION8(frac) \
+               LINEAR_INTERPOLATION8(f) \
        else \
-               CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, frac) \
-       sample = (sample * s->volume) >> (16+9);
+               CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, f) \
+       sample = (int32_t)floorf(fSample * fVolume);
 
-#define INTERPOLATE_SMP16_LOOP(pos, frac) \
+#define INTERPOLATE_SMP16_LOOP(pos, f) \
        const int16_t *s16 = s->base16 + pos; \
        if (config.interpolation == INTERPOLATION_DISABLED) \
                NO_INTERPOLATION16 \
        else if (config.interpolation == INTERPOLATION_LINEAR) \
-               LINEAR_INTERPOLATION16(frac) \
+               LINEAR_INTERPOLATION16(f) \
        else \
-               CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, frac) \
-       sample = (sample * s->volume) >> (16+9);
+               CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, f) \
+       sample = (int32_t)floorf(fSample * fVolume);
 
 #define SCOPE_GET_SMP8 \
        if (s->active) \
-               sample = (s->base8[position] * s->volume) >> (8+9); \
+       { \
+               fSample = s->base8[position] * (1.0f / 128.0f); \
+               sample = (int32_t)floorf(fSample * fVolume); \
+       } \
        else \
-               sample = 0;
+       { \
+               sample = 0; \
+       }
 
 #define SCOPE_GET_SMP16 \
        if (s->active) \
-               sample = (s->base16[position] * s->volume) >> (16+9); \
+       { \
+               fSample = s->base16[position] * (1.0f / 32768.0f); \
+               sample = (int32_t)floorf(fSample * fVolume); \
+       } \
        else \
-               sample = 0;
+       { \
+               sample = 0; \
+       }
 
 #define SCOPE_GET_SMP8_PINGPONG \
        if (s->active) \
        { \
                GET_PINGPONG_POSITION \
-               sample = (s->base8[actualPos] * s->volume) >> (8+9); \
+               fSample = s->base8[actualPos] * (1.0f / 128.0f); \
+               sample = (int32_t)floorf(fSample * fVolume); \
        } \
        else \
        { \
@@ -166,7 +166,8 @@
        if (s->active) \
        { \
                GET_PINGPONG_POSITION \
-               sample = (s->base16[actualPos] * s->volume) >> (16+9); \
+               fSample = s->base16[actualPos] * (1.0f / 32768.0f); \
+               sample = (int32_t)floorf(fSample * fVolume); \
        } \
        else \
        { \
@@ -247,7 +248,7 @@
        positionFrac &= SCOPE_FRAC_MASK;
 
 #define SCOPE_DRAW_SMP \
-       video.frameBuffer[((lineY - sample) * SCREEN_W) + x] = color;
+       video.frameBuffer[((lineY - sample) * SCREEN_W) + sx] = color;
 
 #define LINED_SCOPE_PREPARE_SMP8 \
        SCOPE_GET_INTERPOLATED_SMP8 \
@@ -281,7 +282,7 @@
 
 #define LINED_SCOPE_DRAW_SMP \
        smpY2 = lineY - sample; \
-       scopeLine(x, smpY1, smpY2, color); \
+       scopeLine(sx, smpY1, smpY2, color); \
        smpY1 = smpY2;
 
 #define SCOPE_HANDLE_POS_NO_LOOP \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/scopes/ft2_scopedraw.c 
new/ft2-clone-2.28/src/scopes/ft2_scopedraw.c
--- old/ft2-clone-2.27/src/scopes/ft2_scopedraw.c       2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/scopes/ft2_scopedraw.c       2026-10-29 
18:44:55.000000000 +0100
@@ -8,74 +8,17 @@
 #include "ft2_scopedraw.h"
 #include "ft2_scope_macros.h"
 
-/* 4-point cubic B-spline (no overshoot) interpolation LUT (32 phases).
-** Used on the scopes when using quadratic/cubic/sinc mixing interpolation,
-** together with linear interpolation between the phases in the LUT.
-**
-** ----------------- C code for making LUT (has unity gain) ----------------
-** #define SCALE 32768
-** #define PHASES 32
-** for (int32_t i = 0; i < PHASES; i++)
-** {
-**             double t1 = i / (double)PHASES, t2 = t1 * t1, t3 = t2 * t1;
-**             double a = SCALE * ((1.0 - 3.0*t1 + 3.0*t2 - t3) / 6.0);
-**             double b = SCALE * ((4.0 - 6.0*t2 + 3.0*t3) / 6.0);
-**             double c = SCALE * ((1.0 + 3.0*t1 + 3.0*t2 - 3.0*t3) / 6.0);
-**             double d = SCALE * (t3 / 6.0);
-**             printf("%d, %d, %d, %d,\n", (int32_t)a, (int32_t)b, (int32_t)c, 
(int32_t)d);
-**     }
-**     printf("%d, %d, %d, %d // inverted copy of first phase (for 
interpolation)\n",
-**             0, (int32_t)(SCALE * (1.0 / 6.0)), (int32_t)(SCALE * (4.0 / 
6.0)),
-**             (int32_t)(SCALE * (1.0 / 6.0)));
-** ------------------------------------------------------------------------- */
-static const int16_t scopeIntrpLUT[SCOPE_INTRP_WIDTH * (SCOPE_INTRP_PHASES+1)] 
=
-{
-       5461, 21845,  5461,    0,
-       4965, 21813,  5988,    0,
-       4500, 21721,  6545,    1,
-       4064, 21570,  7127,    4,
-       3658, 21365,  7733,   10,
-       3280, 21107,  8358,   20,
-       2929, 20801,  9001,   36,
-       2604, 20448,  9657,   57,
-       2304, 20053, 10325,   85,
-       2027, 19617, 11000,  121,
-       1774, 19145, 11681,  166,
-       1543, 18638, 12363,  221,
-       1333, 18101, 13045,  288,
-       1143, 17535, 13722,  366,
-        972, 16945, 14393,  457,
-        818, 16332, 15053,  562,
-        682, 15701, 15701,  682,
-        562, 15053, 16332,  818,
-        457, 14393, 16945,  972,
-        366, 13722, 17535, 1143,
-        288, 13045, 18101, 1333,
-        221, 12363, 18638, 1543,
-        166, 11681, 19145, 1774,
-        121, 11000, 19617, 2027,
-         85, 10325, 20053, 2304,
-         57,  9657, 20448, 2604,
-         36,  9001, 20801, 2929,
-         20,  8358, 21107, 3280,
-         10,  7733, 21365, 3658,
-          4,  7127, 21570, 4064,
-          1,  6545, 21721, 4500,
-          0,  5988, 21813, 4965,
-          0,  5461, 21845, 5461 // inverted copy of first phase (for 
interpolation)
-};
-
 static void scopeLine(int32_t x1, int32_t y1, int32_t y2, const uint32_t 
color);
 
 /* ----------------------------------------------------------------------- */
 /*                    NON-LINED SCOPE DRAWING ROUTINES                     */
 /* ----------------------------------------------------------------------- */
 
-static void scopeDrawNoLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void scopeDrawNoLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        SCOPE_INIT
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_SMP8
                SCOPE_DRAW_SMP
@@ -84,11 +27,11 @@
        }
 }
 
-static void scopeDrawLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void scopeDrawLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        SCOPE_INIT
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_SMP8
                SCOPE_DRAW_SMP
@@ -97,11 +40,11 @@
        }
 }
 
-static void scopeDrawPingpongLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void scopeDrawPingpongLoop_8bit(scope_t *s, uint32_t sx, uint32_t 
lineY, uint32_t w)
 {
        SCOPE_INIT_PINGPONG
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_SMP8_PINGPONG
                SCOPE_DRAW_SMP
@@ -110,11 +53,11 @@
        }
 }
 
-static void scopeDrawNoLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void scopeDrawNoLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        SCOPE_INIT
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_SMP16
                SCOPE_DRAW_SMP
@@ -123,11 +66,11 @@
        }
 }
 
-static void scopeDrawLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void scopeDrawLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        SCOPE_INIT
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_SMP16
                SCOPE_DRAW_SMP
@@ -136,11 +79,11 @@
        }
 }
 
-static void scopeDrawPingpongLoop_16bit(scope_t *s, uint32_t x, uint32_t 
lineY, uint32_t w)
+static void scopeDrawPingpongLoop_16bit(scope_t *s, uint32_t sx, uint32_t 
lineY, uint32_t w)
 {
        SCOPE_INIT_PINGPONG
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_SMP16_PINGPONG
                SCOPE_DRAW_SMP
@@ -153,13 +96,13 @@
 /*                       LINED SCOPE DRAWING ROUTINES                      */
 /* ----------------------------------------------------------------------- */
 
-static void linedScopeDrawNoLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void linedScopeDrawNoLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        LINED_SCOPE_INIT
        LINED_SCOPE_PREPARE_SMP8
        SCOPE_HANDLE_POS_NO_LOOP
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_INTERPOLATED_SMP8
                LINED_SCOPE_DRAW_SMP
@@ -168,13 +111,13 @@
        }
 }
 
-static void linedScopeDrawLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void linedScopeDrawLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        LINED_SCOPE_INIT
        LINED_SCOPE_PREPARE_SMP8_LOOP
        SCOPE_HANDLE_POS_LOOP
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_INTERPOLATED_SMP8_LOOP
                LINED_SCOPE_DRAW_SMP
@@ -183,13 +126,13 @@
        }
 }
 
-static void linedScopeDrawPingpongLoop_8bit(scope_t *s, uint32_t x, uint32_t 
lineY, uint32_t w)
+static void linedScopeDrawPingpongLoop_8bit(scope_t *s, uint32_t sx, uint32_t 
lineY, uint32_t w)
 {
        LINED_SCOPE_INIT_PINGPONG
        LINED_SCOPE_PREPARE_SMP8_PINGPONG
        SCOPE_HANDLE_POS_PINGPONG
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_INTERPOLATED_SMP8_PINGPONG
                LINED_SCOPE_DRAW_SMP
@@ -198,13 +141,13 @@
        }
 }
 
-static void linedScopeDrawNoLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void linedScopeDrawNoLoop_16bit(scope_t *s, uint32_t sx, uint32_t 
lineY, uint32_t w)
 {
        LINED_SCOPE_INIT
        LINED_SCOPE_PREPARE_SMP16
        SCOPE_HANDLE_POS_NO_LOOP
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_INTERPOLATED_SMP16
                LINED_SCOPE_DRAW_SMP
@@ -213,13 +156,13 @@
        }
 }
 
-static void linedScopeDrawLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, 
uint32_t w)
+static void linedScopeDrawLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, 
uint32_t w)
 {
        LINED_SCOPE_INIT
        LINED_SCOPE_PREPARE_SMP16_LOOP
        SCOPE_HANDLE_POS_LOOP
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_INTERPOLATED_SMP16_LOOP
                LINED_SCOPE_DRAW_SMP
@@ -228,13 +171,13 @@
        }
 }
 
-static void linedScopeDrawPingpongLoop_16bit(scope_t *s, uint32_t x, uint32_t 
lineY, uint32_t w)
+static void linedScopeDrawPingpongLoop_16bit(scope_t *s, uint32_t sx, uint32_t 
lineY, uint32_t w)
 {
        LINED_SCOPE_INIT_PINGPONG
        LINED_SCOPE_PREPARE_SMP16_PINGPONG
        SCOPE_HANDLE_POS_PINGPONG
 
-       for (; x < width; x++)
+       for (; sx < width; sx++)
        {
                SCOPE_GET_INTERPOLATED_SMP16_PINGPONG
                LINED_SCOPE_DRAW_SMP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/scopes/ft2_scopes.h 
new/ft2-clone-2.28/src/scopes/ft2_scopes.h
--- old/ft2-clone-2.27/src/scopes/ft2_scopes.h  2026-10-25 15:23:06.000000000 
+0100
+++ new/ft2-clone-2.28/src/scopes/ft2_scopes.h  2026-10-29 18:44:55.000000000 
+0100
@@ -17,16 +17,6 @@
 #define SCOPE_FRAC_SCALE ((int64_t)1 << SCOPE_FRAC_BITS)
 #define SCOPE_FRAC_MASK (SCOPE_FRAC_SCALE-1)
 
-#define SCOPE_INTRP_WIDTH 4
-#define SCOPE_INTRP_WIDTH_BITS 2 /* log2(SCOPE_INTRP_WIDTH) */
-#define SCOPE_INTRP_SCALE_BITS 15
-#define SCOPE_INTRP_PHASES 32 /* good enough */
-#define SCOPE_INTRP_PHASES_BITS 5 /* log2(SCOPE_INTRP_PHASES) */
-
-#define INTRP_BITS (15+SCOPE_INTRP_PHASES_BITS)
-#define INTRP_PHASE_SHIFT (INTRP_BITS-SCOPE_INTRP_PHASES_BITS)
-#define INTRP_PHASE_MASK ((1 << INTRP_PHASE_SHIFT)-1)
-
 int32_t getSamplePositionFromScopes(uint8_t ch);
 void stopAllScopes(void);
 void refreshScopes(void);
@@ -43,8 +33,7 @@
        const int16_t *base16;
        bool wasCleared, sample16Bit, samplingBackwards, hasLooped;
        uint8_t loopType;
-       int16_t volume;
-       int32_t loopStart, loopLength, loopEnd, sampleEnd, position;
+       int32_t volume, loopStart, loopLength, loopEnd, sampleEnd, position;
        uint64_t drawDelta;
        uint64_t delta, positionFrac;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_aiff.c 
new/ft2-clone-2.28/src/smploaders/ft2_load_aiff.c
--- old/ft2-clone-2.27/src/smploaders/ft2_load_aiff.c   2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/smploaders/ft2_load_aiff.c   2026-10-29 
18:44:55.000000000 +0100
@@ -155,10 +155,7 @@
 
        int16_t stereoAction = -1;
        if (aiffIsStereo(f))
-       {
                stereoAction = loaderSysReq(4, "System request", "This is a 
stereo sample. Which channel do you want to read?", NULL);
-               setMouseBusy(true); // kludge
-       }
 
        // read sample data
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_flac.c 
new/ft2-clone-2.28/src/smploaders/ft2_load_flac.c
--- old/ft2-clone-2.27/src/smploaders/ft2_load_flac.c   2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/smploaders/ft2_load_flac.c   2026-10-29 
18:44:55.000000000 +0100
@@ -191,10 +191,7 @@
 
        stereoAction = -1;
        if (numChannels == 2)
-       {
                stereoAction = loaderSysReq(4, "System request", "This is a 
stereo sample. Which channel do you want to read?", NULL);
-               setMouseBusy(true); // kludge
-       }
 
        bool sample16Bit = (bitDepth >= 16);
        if (sample16Bit)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_mp3.c 
new/ft2-clone-2.28/src/smploaders/ft2_load_mp3.c
--- old/ft2-clone-2.27/src/smploaders/ft2_load_mp3.c    2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/smploaders/ft2_load_mp3.c    2026-10-29 
18:44:55.000000000 +0100
@@ -103,10 +103,7 @@
 
        int16_t stereoAction = -1;
        if (mp3IsStereo)
-       {
                stereoAction = loaderSysReq(4, "System request", "This is a 
stereo sample. Which channel do you want to read?", NULL);
-               setMouseBusy(true); // kludge
-       }
 
        if (fread(buf, 1, filesize, f) != filesize)
        {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_ogg.c 
new/ft2-clone-2.28/src/smploaders/ft2_load_ogg.c
--- old/ft2-clone-2.27/src/smploaders/ft2_load_ogg.c    2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/smploaders/ft2_load_ogg.c    2026-10-29 
18:44:55.000000000 +0100
@@ -106,10 +106,7 @@
 
        int16_t stereoAction = -1;
        if (numChannels == 2)
-       {
                stereoAction = loaderSysReq(4, "System request", "This is a 
stereo sample. Which channel do you want to read?", NULL);
-               setMouseBusy(true); // kludge
-       }
 
        const int32_t shift = (numChannels == 2) ? 2 : 1;
        const int32_t bufferSamples = SAMPLE_BUFFER_SIZE >> shift;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_wav.c 
new/ft2-clone-2.28/src/smploaders/ft2_load_wav.c
--- old/ft2-clone-2.27/src/smploaders/ft2_load_wav.c    2026-10-25 
15:23:06.000000000 +0100
+++ new/ft2-clone-2.28/src/smploaders/ft2_load_wav.c    2026-10-29 
18:44:55.000000000 +0100
@@ -193,10 +193,7 @@
 
        int16_t stereoAction = -1;
        if (wavIsStereo(f))
-       {
                stereoAction = loaderSysReq(4, "System request", "This is a 
stereo sample. Which channel do you want to read?", NULL);
-               setMouseBusy(true); // kludge
-       }
 
        if (bitsPerSample == 8) // 8-BIT INTEGER SAMPLE
        {

Reply via email to