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