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 2025-05-22 16:56:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ft2-clone (Old)
 and      /work/SRC/openSUSE:Factory/.ft2-clone.new.2732 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ft2-clone"

Thu May 22 16:56:43 2025 rev:24 rq:1279114 version:1.96

Changes:
--------
--- /work/SRC/openSUSE:Factory/ft2-clone/ft2-clone.changes      2025-03-05 
13:42:40.473964831 +0100
+++ /work/SRC/openSUSE:Factory/.ft2-clone.new.2732/ft2-clone.changes    
2025-05-22 16:57:14.486867417 +0200
@@ -1,0 +2,12 @@
+Wed May 21 19:00:40 UTC 2025 - Martin Hauke <mar...@gmx.de>
+
+- Update to version 1.96
+  * Fixed: When deleting a song position entry, the currently
+    viewed pattern would sometimes not be the correct one.
+  * Reverted tracker scope scaling behavior to that of v1.93 and
+    earlier. This is a minor change. Sample waveform will not
+    have an upper clip now.
+  * Don't bypass window compositor in Linux (fixes broken window
+    manager visuals).
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ ft2-clone.spec ++++++
--- /var/tmp/diff_new_pack.WIIQD7/_old  2025-05-22 16:57:15.126894890 +0200
+++ /var/tmp/diff_new_pack.WIIQD7/_new  2025-05-22 16:57:15.126894890 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           ft2-clone
-Version:        1.95
+Version:        1.96
 Release:        0
 Summary:        Fasttracker II clone
 License:        BSD-3-Clause AND CC-BY-NC-SA-4.0

++++++ ft2-clone-1.95.tar.gz -> ft2-clone-1.96.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/make-macos.sh 
new/ft2-clone-1.96/make-macos.sh
--- old/ft2-clone-1.95/make-macos.sh    2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/make-macos.sh    2025-05-21 13:51:07.000000000 +0200
@@ -36,7 +36,7 @@
 #
 function compile() {
     rm $1 &> /dev/null
-    clang $VERBOSE $CFLAGS -F /Library/Frameworks -g0 -DNDEBUG -DHAS_MIDI 
-D__MACOSX_CORE__ -DHAS_LIBFLAC -stdlib=libc++ src/rtmidi/*.cpp src/gfxdata/*.c 
src/mixer/*.c src/scopes/*.c src/modloaders/*.c src/smploaders/*.c 
src/libflac/*.c src/*.c -Winit-self -Wno-deprecated -Wextra -Wunused 
-mno-ms-bitfields -Wno-missing-field-initializers -Wswitch-default $LDFLAGS -L 
/Library/Frameworks -framework SDL2 -framework CoreMidi -framework CoreAudio 
-framework Cocoa -liconv -lpthread -lm -lstdc++ -o $1
+    clang $VERBOSE $CFLAGS -F /Library/Frameworks -g0 -DNDEBUG -DHAS_MIDI 
-D__MACOSX_CORE__ -DHAS_LIBFLAC -stdlib=libc++ src/rtmidi/*.cpp src/gfxdata/*.c 
src/mixer/*.c src/scopes/*.c src/modloaders/*.c src/smploaders/*.c 
src/libflac/*.c src/*.c -Winit-self -Wno-deprecated -Wextra -Wunused 
-mno-ms-bitfields -Wno-missing-field-initializers $LDFLAGS -L 
/Library/Frameworks -framework SDL2 -framework CoreMidi -framework CoreAudio 
-framework Cocoa -liconv -lpthread -lm -lstdc++ -o $1
     return $?
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_cpuinfo.h
 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_cpuinfo.h
--- 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_cpuinfo.h
    2025-03-04 18:35:22.000000000 +0100
+++ 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_cpuinfo.h
    2025-05-21 13:51:07.000000000 +0200
@@ -115,7 +115,8 @@
 #include <lasxintrin.h>
 #define __LASX__
 #endif
-#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H)
+#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H) && \
+   (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || 
defined(_M_IX86))
 #include <immintrin.h>
 #else
 #if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_render.h
 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_render.h
--- 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_render.h
     2025-03-04 18:35:22.000000000 +0100
+++ 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_render.h
     2025-05-21 13:51:07.000000000 +0200
@@ -244,7 +244,7 @@
  * \since This function is available since SDL 2.0.0.
  *
  * \sa SDL_CreateRenderer
- * \sa SDL_CreateWindowRenderer
+ * \sa SDL_CreateWindowAndRenderer
  * \sa SDL_DestroyRenderer
  */
 extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface 
* surface);
@@ -787,7 +787,7 @@
  * Get the current render target.
  *
  * The default render target is the window for which the renderer was created,
- * and is reported a NULL here.
+ * and is reported as NULL here.
  *
  * \param renderer the rendering context.
  * \returns the current render target or NULL for the default render target.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_surface.h
 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_surface.h
--- 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_surface.h
    2025-03-04 18:35:22.000000000 +0100
+++ 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_surface.h
    2025-05-21 13:51:07.000000000 +0200
@@ -808,8 +808,8 @@
  *
  * This assumes that the source and destination rectangles are the same size.
  * If either `srcrect` or `dstrect` are NULL, the entire surface (`src` or
- * `dst`) is copied. The final blit rectangles are saved in `srcrect` and
- * `dstrect` after all clipping is performed.
+ * `dst`) is copied. The final blit rectangle is saved in `dstrect` after
+ * all clipping is performed.
  *
  * The blit function should not be called on a locked surface.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
--- 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
    2025-03-04 18:35:22.000000000 +0100
+++ 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
    2025-05-21 13:51:07.000000000 +0200
@@ -58,7 +58,7 @@
 */
 #define SDL_MAJOR_VERSION   2
 #define SDL_MINOR_VERSION   32
-#define SDL_PATCHLEVEL      2
+#define SDL_PATCHLEVEL      6
 
 /**
  * Macro to determine SDL version program was compiled against.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
--- 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
     2025-03-04 18:35:22.000000000 +0100
+++ 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
     2025-05-21 13:51:07.000000000 +0200
@@ -3,7 +3,7 @@
 <plist version="1.0">
 <dict>
        <key>BuildMachineOSBuild</key>
-       <string>23H311</string>
+       <string>23H527</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleExecutable</key>
@@ -19,7 +19,7 @@
        <key>CFBundlePackageType</key>
        <string>FMWK</string>
        <key>CFBundleShortVersionString</key>
-       <string>2.32.2</string>
+       <string>2.32.6</string>
        <key>CFBundleSignature</key>
        <string>SDLX</string>
        <key>CFBundleSupportedPlatforms</key>
@@ -27,7 +27,7 @@
                <string>MacOSX</string>
        </array>
        <key>CFBundleVersion</key>
-       <string>2.32.2</string>
+       <string>2.32.6</string>
        <key>DTCompiler</key>
        <string>com.apple.compilers.llvm.clang.1_0</string>
        <key>DTPlatformBuild</key>
Binary files 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/SDL2
 and 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/SDL2
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
--- 
old/ft2-clone-1.95/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
     2025-03-04 18:35:22.000000000 +0100
+++ 
new/ft2-clone-1.96/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
     2025-05-21 13:51:07.000000000 +0200
@@ -14,7 +14,7 @@
                </data>
                <key>Resources/Info.plist</key>
                <data>
-               Dy9w1XfagXeZ0e81ZSWsFJg+azY=
+               Zda7B5zOlgXIAj0SZw10DI8J4zY=
                </data>
                <key>Resources/License.txt</key>
                <data>
@@ -145,11 +145,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       C0H58cl/xghA4cpTvltFa5zADSc=
+                       CeTntJ1/RigZITBOca8u0bHomBU=
                        </data>
                        <key>hash2</key>
                        <data>
-                       JpncPWHkqqQ39WvjWBFvdMLGOAhlGvwtEdtEflUSwwQ=
+                       cf1WEDXGbROkg2mF2Ud2LBT6uDs538geSmtZNk/UbFM=
                        </data>
                </dict>
                <key>Headers/SDL_endian.h</key>
@@ -552,11 +552,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       ixhZ1LVMllogghoxkbkrnjkmfm0=
+                       O06ha5CcqgUpx/DNe21x0YQxIkM=
                        </data>
                        <key>hash2</key>
                        <data>
-                       YKCPJJ9GkJ8hiZ95O876mXtZ5SvBv5ViiUsgYkuykPs=
+                       lhJ8iMN5E5pflshoCY39V3/f9CI7ix5+NrtiMwoOUGc=
                        </data>
                </dict>
                <key>Headers/SDL_revision.h</key>
@@ -629,11 +629,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       4Ep9Q21aB+MvJ4ohfIaIobCiERU=
+                       tAHaYERzc7BuDPbTMZ9V0iiH9ZU=
                        </data>
                        <key>hash2</key>
                        <data>
-                       HBm9M4a5z2TAO7jYrEREEBPmFIZ10He+SyiAhJ90C6M=
+                       9PEjHfv4FZvsaPshfa6RkEur0QmJ1J96vlutaGTdeSA=
                        </data>
                </dict>
                <key>Headers/SDL_system.h</key>
@@ -706,11 +706,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       0p5YxpDU0ZKVW3O7oaiUEbQvQgM=
+                       gPL2qjhQt9pswRR/UrpHYP61KNo=
                        </data>
                        <key>hash2</key>
                        <data>
-                       EtiQXi0LseubTFgUWQb2VmPg9hMBLtbyUYL/q744sqo=
+                       5wMLgwuCEV//z0Hwsvs0UIsP9NcnMIH4jtOo6pMgtLE=
                        </data>
                </dict>
                <key>Headers/SDL_video.h</key>
@@ -783,11 +783,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       Dy9w1XfagXeZ0e81ZSWsFJg+azY=
+                       Zda7B5zOlgXIAj0SZw10DI8J4zY=
                        </data>
                        <key>hash2</key>
                        <data>
-                       BAddkaN2r4dEHPxmdAwZ33wKCEuHqn1y3xUe9sQ/wtY=
+                       tmWhV3TAUQkq3CfjDOIa/2S0mjQq6mtKeD/TSdsmAwo=
                        </data>
                </dict>
                <key>Resources/License.txt</key>
Binary files old/ft2-clone-1.95/release/win32/SDL2.dll and 
new/ft2-clone-1.96/release/win32/SDL2.dll differ
Binary files old/ft2-clone-1.95/release/win64/SDL2.dll and 
new/ft2-clone-1.96/release/win64/SDL2.dll differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_audio.c 
new/ft2-clone-1.96/src/ft2_audio.c
--- old/ft2-clone-1.95/src/ft2_audio.c  2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/ft2_audio.c  2025-05-21 13:51:07.000000000 +0200
@@ -368,7 +368,7 @@
                if (status & IS_Vol)
                {
                        v->fVolume = ch->fFinalVol; // 0.0f .. 1.0f
-                       v->scopeVolume = (uint8_t)((ch->fFinalVol * 255.0f) + 
0.5f); // 0..255, rounded
+                       v->scopeVolume = (uint8_t)((ch->fFinalVol * 
(SCOPE_HEIGHT*4.0f)) + 0.5f);
                }
 
                if (status & IS_Pan)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_header.h 
new/ft2-clone-1.96/src/ft2_header.h
--- old/ft2-clone-1.95/src/ft2_header.h 2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/ft2_header.h 2025-05-21 13:51:07.000000000 +0200
@@ -12,7 +12,7 @@
 #endif
 #include "ft2_replayer.h"
 
-#define PROG_VER_STR "1.95"
+#define PROG_VER_STR "1.96"
 
 // do NOT change these! It will only mess things up...
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_module_saver.c 
new/ft2-clone-1.96/src/ft2_module_saver.c
--- old/ft2-clone-1.95/src/ft2_module_saver.c   2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/ft2_module_saver.c   2025-05-21 13:51:07.000000000 
+0200
@@ -293,7 +293,7 @@
        // Commented out. This one was probably confusing to many people...
        /*
        if (audio.linearPeriodsFlag)
-               okBoxThreadSafe(0, "System message", "Warning: \"Frequency 
slides\" is not set to Amiga!");
+               okBoxThreadSafe(0, "System message", "Warning: \"Frequency 
slides\" is not set to Amiga!", NULL);
        */
 
        int32_t songLength = song.songLength;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_pattern_ed.c 
new/ft2-clone-1.96/src/ft2_pattern_ed.c
--- old/ft2-clone-1.95/src/ft2_pattern_ed.c     2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/ft2_pattern_ed.c     2025-05-21 13:51:07.000000000 
+0200
@@ -53,7 +53,7 @@
        if (pattern[pattNum] == NULL)
        {
                /* Original FT2 allocates only the amount of rows needed, but 
we don't
-               ** do that to avoid out of bondary row look-up between 
out-of-sync replayer
+               ** do that to avoid out of boundary row look-up between 
out-of-sync replayer
                ** state and tracker state (yes it used to happen, rarely). 
We're not wasting
                ** too much RAM for a modern computer anyway. Worst case: 256 
allocated
                ** patterns would be ~10MB.
@@ -1542,6 +1542,8 @@
 
        lockMixerCallback();
 
+       const uint8_t oldPattern = song.orders[song.songPos];
+
        if (song.songPos < 254)
        {
                for (uint16_t i = 0; i < 254-song.songPos; i++)
@@ -1553,16 +1555,19 @@
                song.songLoopStart = song.songLength - 1;
 
        if (song.songPos > song.songLength-1)
-       {
                editor.songPos = song.songPos = song.songLength-1;
+
+       if (song.orders[song.songPos] != oldPattern)
+       {
                setPos(song.songPos, -1, false);
+               ui.updatePatternEditor = true;
        }
 
+       unlockMixerCallback();
+
        ui.updatePosSections = true;
        ui.updatePosEdScrollBar = true;
        setSongModifiedFlag();
-
-       unlockMixerCallback();
 }
 
 void pbPosEdPattUp(void)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_replayer.c 
new/ft2-clone-1.96/src/ft2_replayer.c
--- old/ft2-clone-1.95/src/ft2_replayer.c       2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/ft2_replayer.c       2025-05-21 13:51:07.000000000 
+0200
@@ -427,33 +427,44 @@
        }
 }
 
-// for piano in Instr. Ed. (values outside 0..95 can happen)
-int32_t getPianoKey(uint16_t period, int8_t finetune, int8_t relativeNote)
+// for piano in Instr. Ed. (values outside 0..95 can and will happen)
+int32_t getPianoKey(int32_t period, int8_t finetune, int8_t relativeNote)
 {
-       assert(note2PeriodLUT != NULL);
-       if (period > note2PeriodLUT[0])
-               return -1; // outside left piano edge
+       if (audio.linearPeriodsFlag)
+       {
+               period >>= 2;
+               period += (int8_t)finetune >> 3;
 
-       finetune = ((int8_t)finetune >> 3) + 16; // -128..127 -> 0..31
+               return (((10*12*16) - period) >> 4) - relativeNote;
+       }
+       else
+       {
+               // amiga periods, requires slower method (binary search in 
amiga period LUT)
 
-       int32_t hiPeriod = 10*12*16;
-       int32_t loPeriod = 0;
+               if (period > amigaPeriodLUT[0])
+                       return -1; // outside left piano edge
 
-       for (int32_t i = 0; i < 7; i++)
-       {
-               const int32_t tmpPeriod = (((loPeriod + hiPeriod) >> 1) & ~15) 
+ finetune;
+               finetune = ((int8_t)finetune >> 3) + 16; // -128..127 -> 0..31
 
-               int32_t lookUp = tmpPeriod - 16;
-               if (lookUp < 0)
-                       lookUp = 0;
+               int32_t hiPeriod = 10*12*16;
+               int32_t loPeriod = 0;
 
-               if (period >= note2PeriodLUT[lookUp])
-                       hiPeriod = (tmpPeriod - finetune) & ~15;
-               else
-                       loPeriod = (tmpPeriod - finetune) & ~15;
-       }
+               for (int32_t i = 0; i < 7; i++)
+               {
+                       const int32_t tmpPeriod = (((loPeriod + hiPeriod) >> 1) 
& ~15) + finetune;
+
+                       int32_t lookUp = tmpPeriod - 16;
+                       if (lookUp < 0)
+                               lookUp = 0;
 
-       return (loPeriod >> 4) - relativeNote;
+                       if (period >= amigaPeriodLUT[lookUp])
+                               hiPeriod = (tmpPeriod - finetune) & ~15;
+                       else
+                               loPeriod = (tmpPeriod - finetune) & ~15;
+               }
+
+               return (loPeriod >> 4) - relativeNote;
+       }
 }
 
 void triggerNote(uint8_t note, uint8_t efx, uint8_t efxData, channel_t *ch)
@@ -1758,7 +1769,7 @@
 {
        uint8_t note;
 
-       const uint8_t tick = arpeggioTab[song.tick & 255];
+       const uint8_t tick = arpeggioTab[song.tick & 31];
        if (tick == 0)
        {
                ch->outPeriod = ch->realPeriod;
@@ -2261,12 +2272,12 @@
        }
 
        // for song playback counter (hh:mm:ss)
-       if (song.BPM >= MIN_BPM && song.BPM <= MAX_BPM)
+       if (song.BPM >= MIN_BPM && song.BPM <= MAX_BPM) // just in case
        {
-               song.playbackSecondsFrac += musicTimeTab52[song.BPM-MIN_BPM];
-               if (song.playbackSecondsFrac >= 1ULL << 52)
+               song.playbackSecondsFrac += 
songTickDuration35fp[song.BPM-MIN_BPM];
+               if (song.playbackSecondsFrac >= 1ULL << 35)
                {
-                       song.playbackSecondsFrac &= (1ULL << 52)-1;
+                       song.playbackSecondsFrac &= (1ULL << 35)-1;
                        song.playbackSeconds++;
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_replayer.h 
new/ft2-clone-1.96/src/ft2_replayer.h
--- old/ft2-clone-1.95/src/ft2_replayer.h       2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/ft2_replayer.h       2025-05-21 13:51:07.000000000 
+0200
@@ -294,7 +294,7 @@
 double dAmigaPeriod2Hz(int32_t period);
 double dPeriod2Hz(int32_t period);
 
-int32_t getPianoKey(uint16_t period, int8_t finetune, int8_t relativeNote); // 
for piano in Instr. Ed.
+int32_t getPianoKey(int32_t period, int8_t finetune, int8_t relativeNote); // 
for piano in Instr. Ed.
 void triggerNote(uint8_t note, uint8_t efx, uint8_t efxData, channel_t *ch);
 void updateVolPanAutoVib(channel_t *ch);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_smpfx.c 
new/ft2-clone-1.96/src/ft2_smpfx.c
--- old/ft2-clone-1.95/src/ft2_smpfx.c  2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/ft2_smpfx.c  2025-05-21 13:51:07.000000000 +0200
@@ -315,15 +315,11 @@
                return;
        }
 
-       const double delta = 2.0 * M_PI / lastWaveLength;
-       double phase = 0.0;
+       const double dMul = (2.0 * M_PI) / lastWaveLength;
 
        int16_t *ptr16 = (int16_t *)s->dataPtr;
        for (int32_t i = 0; i < newLength; i++)
-       {
-               *ptr16++ = (int16_t)(INT16_MAX * sin(phase));
-               phase += delta;
-       }
+               *ptr16++ = (int16_t)(INT16_MAX * sin(i * dMul));
 
        s->loopLength = newLength;
        s->flags |= LOOP_FORWARD;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_tables.c 
new/ft2-clone-1.96/src/ft2_tables.c
--- old/ft2-clone-1.95/src/ft2_tables.c 2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/ft2_tables.c 2025-05-21 13:51:07.000000000 +0200
@@ -10,38 +10,23 @@
 /*                             REPLAYER TABLES                             */
 /* ----------------------------------------------------------------------- */
 
-const uint16_t ptPeriods[3 * 12] =
-{
-       856,808,762,720,678,640,604,570,538,508,480,453,
-       428,404,381,360,339,320,302,285,269,254,240,226,
-       214,202,190,180,170,160,151,143,135,127,120,113
-};
-
-const uint8_t arpeggioTab[256] =
+// Formula (supposed to be):
+//  for (i = 0 to 31) x = i % 3
+//
+const uint8_t arpeggioTab[32] =
 {
        0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,
        
-       /* The following are overflown bytes from FT2's binary.
-       ** (confirmed to be the same on FT2.08 and FT2.09)
+       /* This table is too short in FT2. The following are overflown bytes 
from
+       ** FT2's binary (confirmed to be the same on FT2.08 and FT2.09).
        */
-       
0x00,0x18,0x31,0x4A,0x61,0x78,0x8D,0xA1,0xB4,0xC5,0xD4,0xE0,0xEB,0xF4,0xFA,0xFD,
-       
0xFF,0xFD,0xFA,0xF4,0xEB,0xE0,0xD4,0xC5,0xB4,0xA1,0x8D,0x78,0x61,0x4A,0x31,0x18,
-       
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x02,0x00,0x04,0x00,0x00,
-       
0x00,0x05,0x06,0x00,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x03,0x04,0x05,0x00,0x00,
-       
0x0B,0x00,0x0A,0x02,0x01,0x03,0x04,0x07,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,
-       
0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x79,0x02,0x00,0x00,0x8F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       
0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x4F,0x52,0x4D,0x49,0x4C,0x42,0x4D,0x42,0x4D
+       
0x00,0x18,0x31,0x4A,0x61,0x78,0x8D,0xA1,0xB4,0xC5,0xD4,0xE0,0xEB,0xF4,0xFA,0xFD
 };
 
-const int8_t autoVibSineTab[256] = 
+// Formula:
+//  for (i = 0 to 255) x = round[64 * sin(-i * 2 * PI / 256)]
+//
+const int8_t autoVibSineTab[256] =
 {
          0,  -2,  -3,  -5,  -6,  -8,  -9, -11, -12, -14, -16, -17, -19, -20, 
-22, -23,
        -24, -26, -27, -29, -30, -32, -33, -34, -36, -37, -38, -39, -41, -42, 
-43, -44,
@@ -61,24 +46,18 @@
         24,  23,  22,  20,  19,  17,  16,  14,  12,  11,   9,   8,   6,   5,   
3,   2
 };
 
+// Formula:
+//  for (i = 0 to 31) x = floor[255 * sin(i * PI / 32)]
+//
 const uint8_t vibratoTab[32] = // for normal vibrato/tremolo
 {
          0, 24, 49, 74, 97,120,141,161,180,197,212,224,235,244,250,253,
        255,253,250,244,235,224,212,197,180,161,141,120, 97, 74, 49, 24
 };
 
-const uint16_t modPeriods[8 * 12] = // used for .MOD loading/saving
-{
-       6848, 6464, 6096, 5760, 5424, 5120, 4832, 4560, 4304, 4064, 3840, 3624,
-       3424, 3232, 3048, 2880, 2712, 2560, 2416, 2280, 2152, 2032, 1920, 1812,
-       1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016,  960,  906,
-        856,  808,  762,  720,  678,  640,  604,  570,  538,  508,  480,  453,
-        428,  404,  381,  360,  339,  320,  302,  285,  269,  254,  240,  226,
-        214,  202,  190,  180,  170,  160,  151,  143,  135,  127,  120,  113,
-        107,  101,   95,   90,   85,   80,   75,   71,   67,   63,   60,   56,
-         53,   50,   47,   45,   42,   40,   37,   35,   33,   31,   30,   28
-};
-
+// Formula:
+//  for (i = 0 to 1935) x = (1936 - i) * 4
+//
 const uint16_t linearPeriodLUT[1936] = // bit-exact to FT2 table
 {
        7744, 7740, 7736, 7732, 7728, 7724, 7720, 7716, 7712, 7708, 7704, 7700, 
7696, 7692, 7688, 7684,
@@ -204,6 +183,9 @@
          64,   60,   56,   52,   48,   44,   40,   36,   32,   28,   24,   20, 
  16,   12,    8,    4
 };
 
+// The original formula is over-engineered and buggy. A simpler (and more 
accurate) formula would be:
+//  for (i = 0 to 1935) x = round[(1712*4*16) / 2^((368+i) / (12*16))]
+//
 const uint16_t amigaPeriodLUT[1936] = // bit-exact to FT2 table
 {
        29024, 28912, 28800, 28704, 28608, 28496, 28384, 28288, 28192, 28096, 
28000, 27888, 27776, 27680, 27584, 27488,
@@ -331,6 +313,74 @@
           22, 16, 8, 0, 16, 32, 24, 16, 8, 0, 16, 32, 24, 16, 8, 0, 0
 };
 
+const uint16_t ptPeriods[3 * 12] =
+{
+       856,808,762,720,678,640,604,570,538,508,480,453,
+       428,404,381,360,339,320,302,285,269,254,240,226,
+       214,202,190,180,170,160,151,143,135,127,120,113
+};
+
+const uint16_t modPeriods[8 * 12] = // used for .MOD loading/saving
+{
+       6848, 6464, 6096, 5760, 5424, 5120, 4832, 4560, 4304, 4064, 3840, 3624,
+       3424, 3232, 3048, 2880, 2712, 2560, 2416, 2280, 2152, 2032, 1920, 1812,
+       1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016,  960,  906,
+        856,  808,  762,  720,  678,  640,  604,  570,  538,  508,  480,  453,
+        428,  404,  381,  360,  339,  320,  302,  285,  269,  254,  240,  226,
+        214,  202,  190,  180,  170,  160,  151,  143,  135,  127,  120,  113,
+        107,  101,   95,   90,   85,   80,   75,   71,   67,   63,   60,   56,
+         53,   50,   47,   45,   42,   40,   37,   35,   33,   31,   30,   28
+};
+
+/*
+** For song playback time counter.
+** Precision is 35 bits (highest possible when output is uint32_t).
+**
+** Formula:
+** for (bpm = 32 to 255) x = round[2^35 / (bpm / 2.5)]
+*/
+const uint32_t songTickDuration35fp[(MAX_BPM-MIN_BPM)+1] =
+{
+       0xA0000000, 0x9B26C9B2, 0x96969697, 0x92492492, 0x8E38E38E, 0x8A60DD68,
+       0x86BCA1AF, 0x83483483, 0x80000000, 0x7CE0C7CE, 0x79E79E7A, 0x7711DC47,
+       0x745D1746, 0x71C71C72, 0x6F4DE9BD, 0x6CEFA8DA, 0x6AAAAAAB, 0x687D6344,
+       0x66666666, 0x64646464, 0x62762762, 0x609A90E8, 0x5ED097B4, 0x5D1745D1,
+       0x5B6DB6DB, 0x59D31675, 0x58469EE6, 0x56C797DD, 0x55555555, 0x53EF368F,
+       0x5294A529, 0x51451451, 0x50000000, 0x4EC4EC4F, 0x4D9364D9, 0x4C6AFC2E,
+       0x4B4B4B4B, 0x4A33F129, 0x49249249, 0x481CD857, 0x471C71C7, 0x46231189,
+       0x45306EB4, 0x44444444, 0x435E50D8, 0x427E5671, 0x41A41A42, 0x40CF6475,
+       0x40000000, 0x3F35BA78, 0x3E7063E7, 0x3DAFCEA7, 0x3CF3CF3D, 0x3C3C3C3C,
+       0x3B88EE24, 0x3AD9BF44, 0x3A2E8BA3, 0x398730E6, 0x38E38E39, 0x38438438,
+       0x37A6F4DF, 0x370DC371, 0x3677D46D, 0x35E50D79, 0x35555555, 0x34C893CB,
+       0x343EB1A2, 0x33B79891, 0x33333333, 0x32B16CFD, 0x32323232, 0x31B56FD8,
+       0x313B13B1, 0x30C30C31, 0x304D4874, 0x2FD9B839, 0x2F684BDA, 0x2EF8F442,
+       0x2E8BA2E9, 0x2E2049CD, 0x2DB6DB6E, 0x2D4F4AC3, 0x2CE98B3A, 0x2C8590B2,
+       0x2C234F73, 0x2BC2BC2C, 0x2B63CBEF, 0x2B06742B, 0x2AAAAAAB, 0x2A50658E,
+       0x29F79B47, 0x29A0429A, 0x294A5295, 0x28F5C28F, 0x28A28A29, 0x2850A143,
+       0x28000000, 0x27B09EC2, 0x27627627, 0x27157F06, 0x26C9B26D, 0x267F09A0,
+       0x26357E17, 0x25ED097B, 0x25A5A5A6, 0x255F4C9D, 0x2519F894, 0x24D5A3EA,
+       0x24924925, 0x244FE2F3, 0x240E6C2B, 0x23CDDFC7, 0x238E38E4, 0x234F72C2,
+       0x231188C4, 0x22D4766C, 0x2298375A, 0x225CC74D, 0x22222222, 0x21E843D1,
+       0x21AF286C, 0x2176CC21, 0x213F2B39, 0x21084211, 0x20D20D21, 0x209C88F8,
+       0x2067B23A, 0x203385A3, 0x20000000, 0x1FCD1E36, 0x1F9ADD3C, 0x1F693A1C,
+       0x1F3831F4, 0x1F07C1F0, 0x1ED7E753, 0x1EA89F6D, 0x1E79E79E, 0x1E4BBD59,
+       0x1E1E1E1E, 0x1DF1077C, 0x1DC47712, 0x1D986A8B, 0x1D6CDFA2, 0x1D41D41D,
+       0x1D1745D1, 0x1CED329F, 0x1CC39873, 0x1C9A7546, 0x1C71C71C, 0x1C498C06,
+       0x1C21C21C, 0x1BFA6785, 0x1BD37A6F, 0x1BACF915, 0x1B86E1B8, 0x1B6132A7,
+       0x1B3BEA36, 0x1B1706C6, 0x1AF286BD, 0x1ACE688B, 0x1AAAAAAB, 0x1A874B9B,
+       0x1A6449E6, 0x1A41A41A, 0x1A1F58D1, 0x19FD66A9, 0x19DBCC48, 0x19BA885D,
+       0x1999999A, 0x1978FEBA, 0x1958B67F, 0x1938BFAF, 0x19191919, 0x18F9C190,
+       0x18DAB7EC, 0x18BBFB0E, 0x189D89D9, 0x187F6337, 0x18618618, 0x1843F171,
+       0x1826A43A, 0x18099D72, 0x17ECDC1D, 0x17D05F41, 0x17B425ED, 0x17982F30,
+       0x177C7A21, 0x176105D8, 0x1745D174, 0x172ADC17, 0x171024E7, 0x16F5AB0D,
+       0x16DB6DB7, 0x16C16C17, 0x16A7A561, 0x168E18D0, 0x1674C59D, 0x165BAB0A,
+       0x1642C859, 0x162A1CD0, 0x1611A7B9, 0x15F96861, 0x15E15E16, 0x15C9882C,
+       0x15B1E5F7, 0x159A76D2, 0x15833A16, 0x156C2F21, 0x15555555, 0x153EAC15,
+       0x152832C7, 0x1511E8D3, 0x14FBCDA4, 0x14E5E0A7, 0x14D0214D, 0x14BA8F07,
+       0x14A5294A, 0x148FEF8D, 0x147AE148, 0x1465FDF6, 0x14514514, 0x143CB622,
+       0x142850A1, 0x14141414
+};
+
 /* ----------------------------------------------------------------------- */
 /*                               GUI TABLES                                */
 /* ----------------------------------------------------------------------- */
@@ -868,76 +918,3 @@
        
0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,
        
0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x40,0x1F,0x01,0x00,0x00,0x08,0x00,0x00,0x00
 };
-
-/* ----------------------------------------------------------------------- */
-/*                          MISCELLANEOUS TABLES                           */
-/* ----------------------------------------------------------------------- */
-
-/*
-** For playback time counter.
-**
-** for (int32_t bpm = 32; bpm <= 255; bpm++)
-** {
-**     const double dBpmHz = bpm / 2.5;
-**     uint64_t musicTimeTab48[i] = (uint64_t)round((1ULL << 52) / dBpmHz);
-** }
-*/
-const uint64_t musicTimeTab52[(MAX_BPM-MIN_BPM)+1] =
-{
-       0x1400000000000,0x1364D9364D936,0x12D2D2D2D2D2D,0x1249249249249,
-       0x11C71C71C71C7,0x114C1BACF914C,0x10D79435E50D8,0x1069069069069,
-       0x1000000000000,0x0F9C18F9C18FA,0x0F3CF3CF3CF3D,0x0EE23B88EE23C,
-       0x0E8BA2E8BA2E9,0x0E38E38E38E39,0x0DE9BD37A6F4E,0x0D9DF51B3BEA3,
-       0x0D55555555555,0x0D0FAC687D634,0x0CCCCCCCCCCCD,0x0C8C8C8C8C8C9,
-       0x0C4EC4EC4EC4F,0x0C13521CFB2B8,0x0BDA12F684BDA,0x0BA2E8BA2E8BA,
-       0x0B6DB6DB6DB6E,0x0B3A62CE98B3A,0x0B08D3DCB08D4,0x0AD8F2FBA9387,
-       0x0AAAAAAAAAAAB,0x0A7DE6D1D6086,0x0A5294A5294A5,0x0A28A28A28A29,
-       0x0A00000000000,0x09D89D89D89D9,0x09B26C9B26C9B,0x098D5F85BB395,
-       0x0969696969697,0x09467E2519F89,0x0924924924925,0x09039B0AD1207,
-       0x08E38E38E38E4,0x08C46231188C4,0x08A60DD67C8A6,0x0888888888889,
-       0x086BCA1AF286C,0x084FCACE213F3,0x0834834834835,0x0819EC8E95103,
-       0x0800000000000,0x07E6B74F03291,0x07CE0C7CE0C7D,0x07B5F9D4D1BC2,
-       0x079E79E79E79E,0x0787878787878,0x07711DC47711E,0x075B37E875B38,
-       0x0745D1745D174,0x0730E61CC3987,0x071C71C71C71C,0x0708708708708,
-       0x06F4DE9BD37A7,0x06E1B86E1B86E,0x06CEFA8D9DF52,0x06BCA1AF286BD,
-       0x06AAAAAAAAAAB,0x0699127966ED8,0x0687D6343EB1A,0x0676F31219DBD,
-       0x0666666666666,0x06562D9FAEE42,0x0646464646464,0x0636ADFB0774D,
-       0x0627627627627,0x0618618618618,0x0609A90E7D95C,0x05FB37072D754,
-       0x05ED097B425ED,0x05DF1E88385DF,0x05D1745D1745D,0x05C40939A85C4,
-       0x05B6DB6DB6DB7,0x05A9E9585A9E9,0x059D31674C59D,0x0590B21642C86,
-       0x058469EE5846A,0x0578578578578,0x056C797DD49C3,0x0560CE8560CE8,
-       0x0555555555555,0x054A0CB1B810F,0x053EF368EB043,0x0534085340853,
-       0x05294A5294A53,0x051EB851EB852,0x0514514514514,0x050A142850A14,
-       0x0500000000000,0x04F613D84F614,0x04EC4EC4EC4EC,0x04E2AFE0BB9A6,
-       0x04D9364D9364E,0x04CFE133F84D0,0x04C6AFC2DD9CB,0x04BDA12F684BE,
-       0x04B4B4B4B4B4B,0x04ABE9939ED50,0x04A33F128CFC5,0x049AB47D3CC6F,
-       0x0492492492492,0x0489FC5E694E1,0x0481CD8568904,0x0479BBF8D6D34,
-       0x0471C71C71C72,0x0469EE58469EE,0x046231188C462,0x045A8ECD7F211,
-       0x045306EB3E453,0x044B98E9AA181,0x0444444444444,0x043D087A10F42,
-       0x0435E50D79436,0x042ED9842ED98,0x0427E567109F9,0x0421084210842,
-       0x041A41A41A41A,0x0413911EFB1BC,0x040CF6474A882,0x040670B453B93,
-       0x0400000000000,0x03F9A3C6C1FCD,0x03F35BA781949,0x03ED274388A35,
-       0x03E7063E7063E,0x03E0F83E0F83E,0x03DAFCEA68DE1,0x03D513ED9AD39,
-       0x03CF3CF3CF3CF,0x03C977AB2BEDD,0x03C3C3C3C3C3C,0x03BE20EF883BE,
-       0x03B88EE23B88F,0x03B30D5163250,0x03AD9BF43AD9C,0x03A83A83A83A8,
-       0x03A2E8BA2E8BA,0x039DA653E312D,0x0398730E61CC4,0x03934EA8C280B,
-       0x038E38E38E38E,0x03893180B509E,0x0384384384384,0x037F4CF09CAD7,
-       0x037A6F4DE9BD3,0x03759F2298376,0x0370DC370DC37,0x036C2654E0837,
-       0x03677D46CEFA9,0x0362E0D8B8363,0x035E50D79435E,0x0359CD116C90C,
-       0x0355555555555,0x0350E97366228,0x034C893CB376C,0x0348348348348,
-       0x0343EB1A1F58D,0x033FACD51DE37,0x033B79890CEDE,0x0337510B93F09,
-       0x0333333333333,0x032F1FD73E687,0x032B16CFD7721,0x032717F5E94CF,
-       0x0323232323232,0x031F3831F3832,0x031B56FD83BA7,0x03177F61B352E,
-       0x0313B13B13B14,0x030FEC66E3D3E,0x030C30C30C30C,0x03087E2E1AB12,
-       0x0304D4873ECAE,0x030133AE45B58,0x02FD9B8396BAA,0x02FA0BE82FA0C,
-       0x02F684BDA12F7,0x02F305E60BCC1,0x02EF8F441C2F0,0x02EC20BB082EC,
-       0x02E8BA2E8BA2F,0x02E55B82E55B8,0x02E2049CD42E2,0x02DEB5619416F,
-       0x02DB6DB6DB6DB,0x02D82D82D82D8,0x02D4F4AC2D4F5,0x02D1C319F0362,
-       0x02CE98B3A62CF,0x02CB756141F4D,0x02C8590B21643,0x02C5439A0B151,
-       0x02C234F72C235,0x02BF2D0C15F97,0x02BC2BC2BC2BC,0x02B9310572621,
-       0x02B63CBEEA4E2,0x02B34EDA31B01,0x02B06742B0674,0x02AD85E4268F9,
-       0x02AAAAAAAAAAB,0x02A7D582A7D58,0x02A50658DC087,0x02A23D1A56630,
-       0x029F79B475822,0x029CBC14E5E0A,0x029A0429A042A,0x029751E0E8297,
-       0x0294A5294A529,0x0291FDF19B3EB,0x028F5C28F5C29,0x028CBFBEB9A02,
-       0x028A28A28A28A,0x028796C44CE6B,0x02850A142850A,0x0282828282828
-};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_tables.h 
new/ft2-clone-1.96/src/ft2_tables.h
--- old/ft2-clone-1.95/src/ft2_tables.h 2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/ft2_tables.h 2025-05-21 13:51:07.000000000 +0200
@@ -10,14 +10,14 @@
 #define KEY2EFX_ENTRIES (signed)(sizeof (key2EfxTab) / sizeof (SDL_Keycode))
 #define KEY2HEX_ENTRIES (signed)(sizeof (key2HexTab) / sizeof (SDL_Keycode))
 
-extern const uint16_t ptPeriods[3 * 12];
-
-extern const uint8_t arpeggioTab[256];
+extern const uint8_t arpeggioTab[32];
 extern const int8_t autoVibSineTab[256];
 extern const uint8_t vibratoTab[32];
-extern const uint16_t modPeriods[8 * 12];
 extern const uint16_t linearPeriodLUT[1936];
 extern const uint16_t amigaPeriodLUT[1936];
+extern const uint16_t ptPeriods[3 * 12];
+extern const uint16_t modPeriods[8 * 12];
+extern const uint32_t songTickDuration35fp[(MAX_BPM-MIN_BPM)+1];
 
 extern const char *dec2StrTab[100];
 extern const char *dec3StrTab[256];
@@ -46,5 +46,3 @@
 extern const uint16_t scopeLenTab[16][32];
 
 extern const uint8_t defConfigData[CONFIG_FILE_SIZE];
-
-extern const uint64_t musicTimeTab52[(MAX_BPM-MIN_BPM)+1];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/ft2_video.c 
new/ft2-clone-1.96/src/ft2_video.c
--- old/ft2-clone-1.95/src/ft2_video.c  2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/ft2_video.c  2025-05-21 13:51:07.000000000 +0200
@@ -919,6 +919,13 @@
        SDL_GetDesktopDisplayMode(di, &dm);
        video.dMonitorRefreshRate = (double)dm.refresh_rate;
 
+#ifndef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR
+/* older SDL2 versions don't define this, don't fail the build for it */
+#define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR 
"SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR"
+#endif
+       SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
+
+
        if (dm.refresh_rate >= 59 && dm.refresh_rate <= 61)
                video.vsync60HzPresent = true;
 
@@ -1140,7 +1147,7 @@
                                ui.drawBPMFlag = false;
                                drawSongBPM(editor.BPM);
                        }
-                       
+
                        if (ui.drawSpeedFlag)
                        {
                                ui.drawSpeedFlag = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/rtmidi/RtMidi.cpp 
new/ft2-clone-1.96/src/rtmidi/RtMidi.cpp
--- old/ft2-clone-1.95/src/rtmidi/RtMidi.cpp    2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/rtmidi/RtMidi.cpp    2025-05-21 13:51:07.000000000 
+0200
@@ -40,12 +40,15 @@
 #include "RtMidi.h"
 #include <sstream>
 
+// 8bb: removed as it bugs out compilation on macOS Sequoia 15.5
+/*
 #if defined(__MACOSX_CORE__)
   #if defined(TARGET_OS_IPHONE)
     #define AudioGetCurrentHostTime CAHostTimeBase::GetCurrentTime
     #define AudioConvertHostTimeToNanos CAHostTimeBase::ConvertToNanos
   #endif
 #endif
+*/
 
 // Default for Windows is to add an identifier to the port names; this
 // flag can be defined (e.g. in your project file) to disable this behaviour.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/scopes/ft2_scope_macros.h 
new/ft2-clone-1.96/src/scopes/ft2_scope_macros.h
--- old/ft2-clone-1.95/src/scopes/ft2_scope_macros.h    2025-03-04 
18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/scopes/ft2_scope_macros.h    2025-05-21 
13:51:07.000000000 +0200
@@ -109,8 +109,7 @@
                LINEAR_INTERPOLATION8(frac) \
        else \
                CUBIC_INTERPOLATION8(frac) \
-       sample = (int32_t)roundf((float)sample * s->fVolume); \
-       if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; /* 
upper-clamp needed */
+       sample = (sample * s->volume) >> (16+2);
 
 #define INTERPOLATE_SMP16(pos, frac) \
        const int16_t *s16 = s->base16 + pos; \
@@ -120,8 +119,7 @@
                LINEAR_INTERPOLATION16(frac) \
        else \
                CUBIC_INTERPOLATION16(frac) \
-       sample = (int32_t)roundf((float)sample * s->fVolume); \
-       if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; /* 
upper-clamp needed */
+       sample = (sample * s->volume) >> (16+2);
 
 #define INTERPOLATE_SMP8_LOOP(pos, frac) \
        const int8_t *s8 = s->base8 + pos; \
@@ -131,8 +129,7 @@
                LINEAR_INTERPOLATION8(frac) \
        else \
                CUBIC_INTERPOLATION8_LOOP(pos, frac) \
-       sample = (int32_t)roundf((float)sample * s->fVolume); \
-       if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; /* 
upper-clamp needed */
+       sample = (sample * s->volume) >> (16+2);
 
 #define INTERPOLATE_SMP16_LOOP(pos, frac) \
        const int16_t *s16 = s->base16 + pos; \
@@ -142,37 +139,25 @@
                LINEAR_INTERPOLATION16(frac) \
        else \
                CUBIC_INTERPOLATION16_LOOP(pos, frac) \
-       sample = (int32_t)roundf((float)sample * s->fVolume); \
-       if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; /* 
upper-clamp needed */
+       sample = (sample * s->volume) >> (16+2);
 
 #define SCOPE_GET_SMP8 \
        if (s->active) \
-       { \
-               sample = (int32_t)roundf((float)(s->base8[position] << 8) * 
s->fVolume); \
-               if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; 
/* upper-clamp needed */ \
-       } \
+               sample = (s->base8[position] * s->volume) >> (8+2); \
        else \
-       { \
-               sample = 0; \
-       }
+               sample = 0;
 
 #define SCOPE_GET_SMP16 \
        if (s->active) \
-       { \
-               sample = (int32_t)roundf((float)s->base16[position] * 
s->fVolume); \
-               if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; 
/* upper-clamp needed */ \
-       } \
+               sample = (s->base16[position] * s->volume) >> (16+2); \
        else \
-       { \
-               sample = 0; \
-       }
+               sample = 0;
 
 #define SCOPE_GET_SMP8_BIDI \
        if (s->active) \
        { \
                GET_BIDI_POSITION \
-               sample = (int32_t)roundf((float)(s->base8[actualPos] << 8) * 
s->fVolume); \
-               if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; 
/* upper-clamp needed */ \
+               sample = (s->base8[actualPos] * s->volume) >> (8+2); \
        } \
        else \
        { \
@@ -183,8 +168,7 @@
        if (s->active) \
        { \
                GET_BIDI_POSITION \
-               sample = (int32_t)roundf((float)s->base16[actualPos] * 
s->fVolume); \
-               if (sample > (SCOPE_HEIGHT/2)-1) sample = (SCOPE_HEIGHT/2)-1; 
/* upper-clamp needed */ \
+               sample = (s->base16[actualPos] * s->volume) >> (16+2); \
        } \
        else \
        { \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/scopes/ft2_scopedraw.c 
new/ft2-clone-1.96/src/scopes/ft2_scopedraw.c
--- old/ft2-clone-1.95/src/scopes/ft2_scopedraw.c       2025-03-04 
18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/src/scopes/ft2_scopedraw.c       2025-05-21 
13:51:07.000000000 +0200
@@ -40,11 +40,11 @@
                double t3 = (-(1.0/2.0) * x3) + ( (1.0/2.0) * x2) + ( (1.0/2.0) 
* x1) + (1.0/6.0);
                double t4 =   (1.0/6.0) * x3;
 
-               // rounding here would make the scopes clip, but we clamp the 
scopes for another reason anyway
-               *ptr16++ = (int16_t)round(t1 * SCOPE_INTRP_SCALE);
-               *ptr16++ = (int16_t)round(t2 * SCOPE_INTRP_SCALE);
-               *ptr16++ = (int16_t)round(t3 * SCOPE_INTRP_SCALE);
-               *ptr16++ = (int16_t)round(t4 * SCOPE_INTRP_SCALE);
+               // truncate, do not round!
+               *ptr16++ = (int16_t)(t1 * SCOPE_INTRP_SCALE);
+               *ptr16++ = (int16_t)(t2 * SCOPE_INTRP_SCALE);
+               *ptr16++ = (int16_t)(t3 * SCOPE_INTRP_SCALE);
+               *ptr16++ = (int16_t)(t4 * SCOPE_INTRP_SCALE);
        }
 
        return true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/scopes/ft2_scopes.c 
new/ft2-clone-1.96/src/scopes/ft2_scopes.c
--- old/ft2-clone-1.95/src/scopes/ft2_scopes.c  2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/scopes/ft2_scopes.c  2025-05-21 13:51:07.000000000 
+0200
@@ -428,7 +428,7 @@
                }
 
                volatile scope_t s = scope[i]; // cache scope to lower thread 
race condition issues
-               if (s.active && s.fVolume > 0.0f && !audio.locked)
+               if (s.active && s.volume > 0 && !audio.locked)
                {
                        // scope is active
                        scope[i].wasCleared = false;
@@ -489,7 +489,7 @@
                const uint8_t status = scopeUpdateStatus[i];
 
                if (status & IS_Vol)
-                       sc->fVolume = ch->scopeVolume * (1.0f / (255.0f / 
(SCOPE_HEIGHT/2) * 32768.0f));
+                       sc->volume = ch->scopeVolume;
 
                if (status & IS_Period)
                        sc->delta = (uint64_t)(dPeriod2Hz(ch->period) * 
(SCOPE_FRAC_SCALE / (double)SCOPE_HZ));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.95/src/scopes/ft2_scopes.h 
new/ft2-clone-1.96/src/scopes/ft2_scopes.h
--- old/ft2-clone-1.95/src/scopes/ft2_scopes.h  2025-03-04 18:35:22.000000000 
+0100
+++ new/ft2-clone-1.96/src/scopes/ft2_scopes.h  2025-05-21 13:51:07.000000000 
+0200
@@ -21,8 +21,8 @@
 #define SCOPE_INTRP_WIDTH_BITS 2 /* log2(SCOPE_INTRP_WIDTH) */
 #define SCOPE_INTRP_SCALE 32768
 #define SCOPE_INTRP_SCALE_BITS 15 /* log2(SCOPE_INTRP_SCALE) */
-#define SCOPE_INTRP_PHASES 512 /* plentiful for FT2-styled scopes */
-#define SCOPE_INTRP_PHASES_BITS 9 /* log2(SCOPE_INTRP_PHASES) */
+#define SCOPE_INTRP_PHASES 256 /* enough for the scopes */
+#define SCOPE_INTRP_PHASES_BITS 8 /* log2(SCOPE_INTRP_PHASES) */
 
 int32_t getSamplePositionFromScopes(uint8_t ch);
 void stopAllScopes(void);
@@ -40,9 +40,9 @@
        const int16_t *base16;
        bool wasCleared, sample16Bit, samplingBackwards, hasLooped;
        uint8_t loopType;
+       int16_t volume;
        int32_t loopStart, loopLength, loopEnd, sampleEnd, position;
        uint64_t delta, drawDelta, positionFrac;
-       float fVolume;
 
        // if (loopEnabled && hasLooped && samplingPos <= 
loopStart+MAX_LEFT_TAPS) readFixedTapsFromThisPointer();
        const int8_t *leftEdgeTaps8;
Binary files old/ft2-clone-1.95/vs2019_project/ft2-clone/SDL2.dll and 
new/ft2-clone-1.96/vs2019_project/ft2-clone/SDL2.dll differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/vs2019_project/ft2-clone/ft2-clone.vcxproj 
new/ft2-clone-1.96/vs2019_project/ft2-clone/ft2-clone.vcxproj
--- old/ft2-clone-1.95/vs2019_project/ft2-clone/ft2-clone.vcxproj       
2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/vs2019_project/ft2-clone/ft2-clone.vcxproj       
2025-05-21 13:51:07.000000000 +0200
@@ -426,7 +426,6 @@
     <ClInclude Include="..\..\src\ft2_sample_ed.h" />
     <ClInclude Include="..\..\src\ft2_sample_loader.h" />
     <ClInclude Include="..\..\src\ft2_sample_saver.h" />
-    <ClInclude Include="..\..\src\ft2_scopedraw.h" />
     <ClInclude Include="..\..\src\ft2_scrollbars.h" />
     <ClInclude Include="..\..\src\ft2_smpfx.h" />
     <ClInclude Include="..\..\src\ft2_structs.h" />
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters 
new/ft2-clone-1.96/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters
--- old/ft2-clone-1.95/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters       
2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters       
2025-05-21 13:51:07.000000000 +0200
@@ -279,9 +279,6 @@
     <ClInclude Include="..\..\src\ft2_sampling.h">
       <Filter>headers</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\src\ft2_scopedraw.h">
-      <Filter>headers</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\ft2_scrollbars.h">
       <Filter>headers</Filter>
     </ClInclude>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_cpuinfo.h 
new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_cpuinfo.h
--- old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_cpuinfo.h  
2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_cpuinfo.h  
2025-05-21 13:51:07.000000000 +0200
@@ -115,7 +115,8 @@
 #include <lasxintrin.h>
 #define __LASX__
 #endif
-#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H)
+#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H) && \
+   (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || 
defined(_M_IX86))
 #include <immintrin.h>
 #else
 #if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_render.h 
new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_render.h
--- old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_render.h   
2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_render.h   
2025-05-21 13:51:07.000000000 +0200
@@ -244,7 +244,7 @@
  * \since This function is available since SDL 2.0.0.
  *
  * \sa SDL_CreateRenderer
- * \sa SDL_CreateWindowRenderer
+ * \sa SDL_CreateWindowAndRenderer
  * \sa SDL_DestroyRenderer
  */
 extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface 
* surface);
@@ -787,7 +787,7 @@
  * Get the current render target.
  *
  * The default render target is the window for which the renderer was created,
- * and is reported a NULL here.
+ * and is reported as NULL here.
  *
  * \param renderer the rendering context.
  * \returns the current render target or NULL for the default render target.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_surface.h 
new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_surface.h
--- old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_surface.h  
2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_surface.h  
2025-05-21 13:51:07.000000000 +0200
@@ -808,8 +808,8 @@
  *
  * This assumes that the source and destination rectangles are the same size.
  * If either `srcrect` or `dstrect` are NULL, the entire surface (`src` or
- * `dst`) is copied. The final blit rectangles are saved in `srcrect` and
- * `dstrect` after all clipping is performed.
+ * `dst`) is copied. The final blit rectangle is saved in `dstrect` after
+ * all clipping is performed.
  *
  * The blit function should not be called on a locked surface.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h 
new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h
--- old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h  
2025-03-04 18:35:22.000000000 +0100
+++ new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h  
2025-05-21 13:51:07.000000000 +0200
@@ -58,7 +58,7 @@
 */
 #define SDL_MAJOR_VERSION   2
 #define SDL_MINOR_VERSION   32
-#define SDL_PATCHLEVEL      2
+#define SDL_PATCHLEVEL      6
 
 /**
  * Macro to determine SDL version program was compiled against.
Binary files old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/lib/SDL2.lib and 
new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/lib/SDL2.lib differ
Binary files old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/lib/SDL2main.lib 
and new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/lib/SDL2main.lib differ
Binary files old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/lib64/SDL2.lib and 
new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/lib64/SDL2.lib differ
Binary files old/ft2-clone-1.95/vs2019_project/ft2-clone/sdl/lib64/SDL2main.lib 
and new/ft2-clone-1.96/vs2019_project/ft2-clone/sdl/lib64/SDL2main.lib differ
Binary files old/ft2-clone-1.95/vs2019_project/x64/Debug/SDL2.dll and 
new/ft2-clone-1.96/vs2019_project/x64/Debug/SDL2.dll differ

Reply via email to