Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libopenmpt for openSUSE:Factory checked in at 2021-12-24 20:22:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libopenmpt (Old) and /work/SRC/openSUSE:Factory/.libopenmpt.new.2520 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libopenmpt" Fri Dec 24 20:22:55 2021 rev:33 rq:942189 version:0.5.14 Changes: -------- --- /work/SRC/openSUSE:Factory/libopenmpt/libopenmpt.changes 2021-12-06 23:59:03.464633251 +0100 +++ /work/SRC/openSUSE:Factory/.libopenmpt.new.2520/libopenmpt.changes 2021-12-24 20:23:11.318019686 +0100 @@ -1,0 +2,30 @@ +Thu Dec 23 06:48:17 UTC 2021 - Mia Herkt <m...@0x0.st> + +- Update to 0.5.14: + * [Sec] Possible out-of-bounds read in Chorus plugin with NaN + plugin parameters. Most implementations of the ???fast math??? + compiler optimizations will prevent this crash but it is not + guaranteed. (r16096) + * [Bug] Fixed undefined behaviour with custom tunings found with + ubsan. + * OPL: Improved channel allocation strategy when there are lots + of faded-out notes. + * MOD: Digital Tracker MODs have four unknown bytes right after + the magic bytes which seem to be ignored even by Digital + Tracker itself. Just skip over them. + * The logic when to turn off the resonant filter was broken in + some edge cases since libopenmpt 0.5.1. + * IMF: Implemented XE1-XE3 commands, which disable individual + envelopes. Command Nxy (cutoff slide + resonance) is now also + partially supported (only resonance for now). + * IMF: Filter envelopes were upside down. + * MTM: Omitting pattern loading through the load.skip_patterns + ctl caused sample data to be corrupted. + * S3M: Ignore O00 commands in files created with Scream Tracker + 3.00 and 3.01, as this command only gained effect memory in + version 3.03. + * STM: Use S3M-like sample swap behaviour. + * XM: Disable arpeggio quirk for XMs made with Skale Tracker. + Fixes KAPTENFL.XM. + +------------------------------------------------------------------- Old: ---- libopenmpt-0.5.13+release.autotools.tar.gz New: ---- libopenmpt-0.5.14+release.autotools.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libopenmpt.spec ++++++ --- /var/tmp/diff_new_pack.flwGZ1/_old 2021-12-24 20:23:11.754019915 +0100 +++ /var/tmp/diff_new_pack.flwGZ1/_new 2021-12-24 20:23:11.762019919 +0100 @@ -21,7 +21,7 @@ %define libopenmpt_modplug_version 0.8.9.0 Name: libopenmpt -Version: 0.5.13 +Version: 0.5.14 Release: 0 Summary: C++ and C library to decode tracker music files License: BSD-3-Clause ++++++ libopenmpt-0.5.13+release.autotools.tar.gz -> libopenmpt-0.5.14+release.autotools.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/common/versionNumber.h new/libopenmpt-0.5.14+release.autotools/common/versionNumber.h --- old/libopenmpt-0.5.13+release.autotools/common/versionNumber.h 2021-11-14 17:44:35.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/common/versionNumber.h 2021-12-05 14:59:52.000000000 +0100 @@ -17,7 +17,7 @@ // Version definitions. The only thing that needs to be changed when changing version number. #define VER_MAJORMAJOR 1 #define VER_MAJOR 29 -#define VER_MINOR 14 +#define VER_MINOR 15 #define VER_MINORMINOR 00 OPENMPT_NAMESPACE_END diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/configure new/libopenmpt-0.5.14+release.autotools/configure --- old/libopenmpt-0.5.13+release.autotools/configure 2021-11-14 18:11:21.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/configure 2021-12-05 15:55:23.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libopenmpt 0.5.13+release.autotools. +# Generated by GNU Autoconf 2.69 for libopenmpt 0.5.14+release.autotools. # # Report bugs to <https://bugs.openmpt.org/>. # @@ -590,8 +590,8 @@ # Identity of this package. PACKAGE_NAME='libopenmpt' PACKAGE_TARNAME='libopenmpt' -PACKAGE_VERSION='0.5.13+release.autotools' -PACKAGE_STRING='libopenmpt 0.5.13+release.autotools' +PACKAGE_VERSION='0.5.14+release.autotools' +PACKAGE_STRING='libopenmpt 0.5.14+release.autotools' PACKAGE_BUGREPORT='https://bugs.openmpt.org/' PACKAGE_URL='https://lib.openmpt.org/' @@ -1472,7 +1472,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libopenmpt 0.5.13+release.autotools to adapt to many kinds of systems. +\`configure' configures libopenmpt 0.5.14+release.autotools to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1543,7 +1543,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libopenmpt 0.5.13+release.autotools:";; + short | recursive ) echo "Configuration of libopenmpt 0.5.14+release.autotools:";; esac cat <<\_ACEOF @@ -1729,7 +1729,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libopenmpt configure 0.5.13+release.autotools +libopenmpt configure 0.5.14+release.autotools generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2219,7 +2219,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libopenmpt $as_me 0.5.13+release.autotools, which was +It was created by libopenmpt $as_me 0.5.14+release.autotools, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3090,7 +3090,7 @@ # Define the identity of the package. PACKAGE='libopenmpt' - VERSION='0.5.13+release.autotools' + VERSION='0.5.14+release.autotools' cat >>confdefs.h <<_ACEOF @@ -17251,13 +17251,13 @@ -$as_echo "#define MPT_SVNURL \"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.13\"" >>confdefs.h +$as_echo "#define MPT_SVNURL \"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.14\"" >>confdefs.h -$as_echo "#define MPT_SVNVERSION \"15956\"" >>confdefs.h +$as_echo "#define MPT_SVNVERSION \"16119\"" >>confdefs.h -$as_echo "#define MPT_SVNDATE \"2021-11-14T17:01:47.266406Z\"" >>confdefs.h +$as_echo "#define MPT_SVNDATE \"2021-12-05T14:17:40.071493Z\"" >>confdefs.h $as_echo "#define MPT_PACKAGE true" >>confdefs.h @@ -22524,7 +22524,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libopenmpt $as_me 0.5.13+release.autotools, which was +This file was extended by libopenmpt $as_me 0.5.14+release.autotools, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22591,7 +22591,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libopenmpt config.status 0.5.13+release.autotools +libopenmpt config.status 0.5.14+release.autotools configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/configure.ac new/libopenmpt-0.5.14+release.autotools/configure.ac --- old/libopenmpt-0.5.13+release.autotools/configure.ac 2021-11-14 18:11:12.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/configure.ac 2021-12-05 15:54:06.000000000 +0100 @@ -1,4 +1,4 @@ -AC_INIT([libopenmpt], [0.5.13+release.autotools], [https://bugs.openmpt.org/], [libopenmpt], [https://lib.openmpt.org/]) +AC_INIT([libopenmpt], [0.5.14+release.autotools], [https://bugs.openmpt.org/], [libopenmpt], [https://lib.openmpt.org/]) AC_PREREQ([2.68]) AC_CONFIG_MACRO_DIR([m4]) @@ -27,9 +27,9 @@ AC_SUBST([LIBOPENMPT_LTVER_REVISION]) AC_SUBST([LIBOPENMPT_LTVER_AGE]) -AC_DEFINE([MPT_SVNURL], ["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.13"], [svn version]) -AC_DEFINE([MPT_SVNVERSION], ["15956"], [svn version]) -AC_DEFINE([MPT_SVNDATE], ["2021-11-14T17:01:47.266406Z"], [svn date]) +AC_DEFINE([MPT_SVNURL], ["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.14"], [svn version]) +AC_DEFINE([MPT_SVNVERSION], ["16119"], [svn version]) +AC_DEFINE([MPT_SVNDATE], ["2021-12-05T14:17:40.071493Z"], [svn date]) AC_DEFINE([MPT_PACKAGE], [true], [is package]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/libopenmpt/dox/changelog.md new/libopenmpt-0.5.14+release.autotools/libopenmpt/dox/changelog.md --- old/libopenmpt-0.5.13+release.autotools/libopenmpt/dox/changelog.md 2021-11-14 18:01:45.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/libopenmpt/dox/changelog.md 2021-12-05 15:17:38.000000000 +0100 @@ -5,6 +5,37 @@ For fully detailed change log, please see the source repository directly. This is just a high-level summary. +### libopenmpt 0.5.14 (2021-12-05) + + * [**Sec**] Possible out-of-bounds read in Chorus plugin with NaN plugin + parameters. Most implementations of the "fast math" compiler optimizations + will prevent this crash but it is not guaranteed. (r16096) + + * [**Bug**] Fixed undefined behaviour with custom tunings found with ubsan. + + * OPL: Improved channel allocation strategy when there are lots of faded-out + notes. + * MOD: Digital Tracker MODs have four unknown bytes right after the magic + bytes which seem to be ignored even by Digital Tracker itself. Just skip + over them. + * The logic when to turn off the resonant filter was broken in some edge cases + since libopenmpt 0.5.1. + * IMF: Implemented XE1-XE3 commands, which disable individual envelopes. + Command Nxy (cutoff slide + resonance) is now also partially supported + (only resonance for now). + * IMF: Filter envelopes were upside down. + * MTM: Omitting pattern loading through the load.skip_patterns ctl caused + sample data to be corrupted. + * S3M: Ignore O00 commands in files created with Scream Tracker 3.00 and 3.01, + as this command only gained effect memory in version 3.03. + * STM: Use S3M-like sample swap behaviour. + * XM: Disable arpeggio quirk for XMs made with Skale Tracker. + Fixes KAPTENFL.XM. + + * miniz: Update to v2.2.0 (2021-06-27). + * minimp3: Update to commit 50d2aaf360a53653b718fead8e258d654c3a7e41 + (2021-11-27). + ### libopenmpt 0.5.13 (2021-11-14) * [**Bug**] Fixed various undefined behaviour found with ubsan. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.h new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.h --- old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.h 2021-11-14 18:01:45.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.h 2021-12-05 15:17:38.000000000 +0100 @@ -19,7 +19,7 @@ /*! \brief libopenmpt minor version number */ #define OPENMPT_API_VERSION_MINOR 5 /*! \brief libopenmpt patch version number */ -#define OPENMPT_API_VERSION_PATCH 13 +#define OPENMPT_API_VERSION_PATCH 14 /*! \brief libopenmpt pre-release tag */ #define OPENMPT_API_VERSION_PREREL "" /*! \brief libopenmpt pre-release flag */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.mk new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.mk --- old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.mk 2021-11-14 18:01:45.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.mk 2021-12-05 15:17:38.000000000 +0100 @@ -1,8 +1,8 @@ LIBOPENMPT_VERSION_MAJOR=0 LIBOPENMPT_VERSION_MINOR=5 -LIBOPENMPT_VERSION_PATCH=13 +LIBOPENMPT_VERSION_PATCH=14 LIBOPENMPT_VERSION_PREREL= LIBOPENMPT_LTVER_CURRENT=2 -LIBOPENMPT_LTVER_REVISION=13 +LIBOPENMPT_LTVER_REVISION=14 LIBOPENMPT_LTVER_AGE=2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/man/openmpt123.1 new/libopenmpt-0.5.14+release.autotools/man/openmpt123.1 --- old/libopenmpt-0.5.13+release.autotools/man/openmpt123.1 2021-11-14 18:11:12.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/man/openmpt123.1 2021-12-05 15:54:05.000000000 +0100 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.8. -.TH OPENMPT123 "1" "November 2021" "openmpt123 v0.5.13" "User Commands" +.TH OPENMPT123 "1" "December 2021" "openmpt123 v0.5.14" "User Commands" .SH NAME openmpt123 - command line module music player based on libopenmpt .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Dlsbank.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Dlsbank.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Dlsbank.cpp 2021-11-13 15:03:12.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Dlsbank.cpp 2021-12-04 18:42:21.000000000 +0100 @@ -1912,19 +1912,19 @@ ExtractSample(sndFile, nSmp, nIns, nRgn, transpose); extractedSamples.insert(rgn.nWaveLink); } - } else if(duplicateRegion && sndFile.GetSample(nSmp).GetNumChannels() == 1) + } else if(duplicateRegion && sndFile.GetSample(RgnToSmp[dupRegion]).GetNumChannels() == 1) { // Try to combine stereo samples const uint16 pan1 = GetPanning(nIns, nRgn), pan2 = GetPanning(nIns, dupRegion); if((pan1 < 16 && pan2 >= 240) || (pan2 < 16 && pan1 >= 240)) { - ModSample &sample = sndFile.GetSample(nSmp); + ModSample &sample = sndFile.GetSample(RgnToSmp[dupRegion]); ctrlSmp::ConvertToStereo(sample, sndFile); std::vector<uint8> pWaveForm; uint32 dwLen = 0; - if(ExtractWaveForm(nIns, nRgn, pWaveForm, dwLen) && dwLen >= sample.GetSampleSizeInBytes() / 2) + if(ExtractWaveForm(nIns, nRgn, pWaveForm, dwLen)) { - SmpLength len = sample.nLength; + SmpLength len = std::min(dwLen / 2u, sample.nLength); const int16 *src = reinterpret_cast<int16 *>(pWaveForm.data()); int16 *dst = sample.sample16() + ((pan1 == 0) ? 0 : 1); while(len--) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Load_imf.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Load_imf.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_imf.cpp 2021-11-13 02:20:37.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_imf.cpp 2021-12-04 18:50:05.000000000 +0100 @@ -96,7 +96,8 @@ void ConvertEnvelope(InstrumentEnvelope &mptEnv, EnvTypes e) const { - const int shift = (e == volEnv) ? 0 : 2; + const uint8 shift = (e == volEnv) ? 0 : 2; + const uint8 mirror = (e == filterEnv) ? 0xFF : 0x00; mptEnv.dwFlags.set(ENV_ENABLED, (env[e].flags & 1) != 0); mptEnv.dwFlags.set(ENV_SUSTAIN, (env[e].flags & 2) != 0); @@ -112,7 +113,8 @@ { mptEnv[n].tick = minTick = std::max(minTick, nodes[e][n].tick.get()); minTick++; - mptEnv[n].value = static_cast<uint8>(std::min(nodes[e][n].value >> shift, ENVELOPE_MAX)); + uint8 value = static_cast<uint8>(nodes[e][n].value ^ mirror) >> shift; + mptEnv[n].value = std::min(value, uint8(ENVELOPE_MAX)); } mptEnv.Convert(MOD_TYPE_XM, MOD_TYPE_IT); } @@ -205,51 +207,51 @@ static constexpr EffectCommand imfEffects[] = { CMD_NONE, - CMD_SPEED, // 0x01 1xx Set Tempo - CMD_TEMPO, // 0x02 2xx Set BPM - CMD_TONEPORTAMENTO, // 0x03 3xx Tone Portamento - CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide - CMD_VIBRATO, // 0x05 5xy Vibrato - CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide - CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato - CMD_TREMOLO, // 0x08 8xy Tremolo - CMD_ARPEGGIO, // 0x09 9xy Arpeggio - CMD_PANNING8, // 0x0A Axx Set Pan Position - CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide - CMD_VOLUME, // 0x0C Cxx Set Volume - CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide - CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide - CMD_S3MCMDEX, // 0x0F Fxx Set Finetune - CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up - CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down - CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up - CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down - CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up - CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down - CMD_MIDI, // 0x16 Mxx Set Filter Cutoff - XXX - CMD_NONE, // 0x17 Nxy Filter Slide + Resonance - XXX - CMD_OFFSET, // 0x18 Oxx Set Sample Offset - CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX - CMD_KEYOFF, // 0x1A Qxx Key Off - CMD_RETRIG, // 0x1B Rxy Retrig - CMD_TREMOR, // 0x1C Sxy Tremor - CMD_POSITIONJUMP, // 0x1D Txx Position Jump - CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break - CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume - CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide - CMD_S3MCMDEX, // 0x21 Xxx Extended Effect - // X1x Set Filter - // X3x Glissando - // X5x Vibrato Waveform - // X8x Tremolo Waveform - // XAx Pattern Loop - // XBx Pattern Delay - // XCx Note Cut - // XDx Note Delay - // XEx Ignore Envelope - // XFx Invert Loop - CMD_NONE, // 0x22 Yxx Chorus - XXX - CMD_NONE, // 0x23 Zxx Reverb - XXX + CMD_SPEED, // 0x01 1xx Set Tempo + CMD_TEMPO, // 0x02 2xx Set BPM + CMD_TONEPORTAMENTO, // 0x03 3xx Tone Portamento + CMD_TONEPORTAVOL, // 0x04 4xy Tone Portamento + Volume Slide + CMD_VIBRATO, // 0x05 5xy Vibrato + CMD_VIBRATOVOL, // 0x06 6xy Vibrato + Volume Slide + CMD_FINEVIBRATO, // 0x07 7xy Fine Vibrato + CMD_TREMOLO, // 0x08 8xy Tremolo + CMD_ARPEGGIO, // 0x09 9xy Arpeggio + CMD_PANNING8, // 0x0A Axx Set Pan Position + CMD_PANNINGSLIDE, // 0x0B Bxy Pan Slide + CMD_VOLUME, // 0x0C Cxx Set Volume + CMD_VOLUMESLIDE, // 0x0D Dxy Volume Slide + CMD_VOLUMESLIDE, // 0x0E Exy Fine Volume Slide + CMD_S3MCMDEX, // 0x0F Fxx Set Finetune + CMD_NOTESLIDEUP, // 0x10 Gxy Note Slide Up + CMD_NOTESLIDEDOWN, // 0x11 Hxy Note Slide Down + CMD_PORTAMENTOUP, // 0x12 Ixx Slide Up + CMD_PORTAMENTODOWN, // 0x13 Jxx Slide Down + CMD_PORTAMENTOUP, // 0x14 Kxx Fine Slide Up + CMD_PORTAMENTODOWN, // 0x15 Lxx Fine Slide Down + CMD_MIDI, // 0x16 Mxx Set Filter Cutoff + CMD_MIDI, // 0x17 Nxy Filter Slide + Resonance + CMD_OFFSET, // 0x18 Oxx Set Sample Offset + CMD_NONE, // 0x19 Pxx Set Fine Sample Offset - XXX + CMD_KEYOFF, // 0x1A Qxx Key Off + CMD_RETRIG, // 0x1B Rxy Retrig + CMD_TREMOR, // 0x1C Sxy Tremor + CMD_POSITIONJUMP, // 0x1D Txx Position Jump + CMD_PATTERNBREAK, // 0x1E Uxx Pattern Break + CMD_GLOBALVOLUME, // 0x1F Vxx Set Mastervolume + CMD_GLOBALVOLSLIDE, // 0x20 Wxy Mastervolume Slide + CMD_S3MCMDEX, // 0x21 Xxx Extended Effect + // X1x Set Filter + // X3x Glissando + // X5x Vibrato Waveform + // X8x Tremolo Waveform + // XAx Pattern Loop + // XBx Pattern Delay + // XCx Note Cut + // XDx Note Delay + // XEx Ignore Envelope + // XFx Invert Loop + CMD_NONE, // 0x22 Yxx Chorus - XXX + CMD_NONE, // 0x23 Zxx Reverb - XXX }; static void ImportIMFEffect(ModCommand &m) @@ -286,6 +288,9 @@ case 0x16: // cutoff m.param = (0xFF - m.param) / 2u; break; + case 0x17: // cutoff slide + resonance (TODO: cutoff slide is currently not handled) + m.param = 0x80 | (m.param & 0x0F); + break; case 0x1F: // set global volume m.param = mpt::saturate_cast<uint8>(m.param * 2); break; @@ -325,10 +330,18 @@ m.command = CMD_NONE; break; case 0xE: // ignore envelope - /* predicament: we can only disable one envelope at a time. - volume is probably most noticeable, so let's go with that. - (... actually, orpheus doesn't even seem to implement this at all) */ - m.param = 0x77; + switch(m.param & 0x0F) + { + // All envelopes + // Predicament: we can only disable one envelope at a time. Volume is probably most noticeable, so let's go with that. + case 0: m.param = 0x77; break; + // Volume + case 1: m.param = 0x77; break; + // Panning + case 2: m.param = 0x79; break; + // Filter + case 3: m.param = 0x7B; break; + } break; case 0x18: // sample offset // O00 doesn't pick up the previous value diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mod.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mod.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mod.cpp 2021-10-05 11:23:08.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mod.cpp 2021-11-15 23:30:47.000000000 +0100 @@ -690,6 +690,7 @@ { const mpt::uchar *madeWithTracker = nullptr; uint32 invalidByteThreshold = MODSampleHeader::INVALID_BYTE_THRESHOLD; + uint16 patternDataOffset = 1084; CHANNELINDEX numChannels = 0; bool isNoiseTracker = false; bool isStartrekker = false; @@ -738,6 +739,8 @@ // Digital Tracker on Atari Falcon result.madeWithTracker = UL_("Digital Tracker"); result.numChannels = magic[3] - '0'; + // Digital Tracker MODs contain four bytes (00 40 00 00) right after the magic bytes which don't seem to do anything special. + result.patternDataOffset = 1088; } else if((!memcmp(magic, "FLT", 3) || !memcmp(magic, "EXO", 3)) && magic[3] >= '4' && magic[3] <= '9') { // FLTx / EXOx - Startrekker by Exolon / Fairlight @@ -894,7 +897,8 @@ // Read order information MODFileHeader fileHeader; file.ReadStruct(fileHeader); - file.Skip(4); // Magic bytes (we already parsed these) + + file.Seek(modMagicResult.patternDataOffset); if(fileHeader.restartPos > 0) maybeWOW = false; @@ -1012,7 +1016,7 @@ } fix7BitPanning = leftPanning && !extendedPanning && maxPanning >= ENABLE_MOD_PANNING_THRESHOLD; } - file.Seek(1084); + file.Seek(modMagicResult.patternDataOffset); const CHANNELINDEX readChannels = (isFLT8 ? 4 : m_nChannels); // 4 channels per pattern in FLT8 format. if(isFLT8) numPatterns++; // as one logical pattern consists of two real patterns in FLT8 format, the highest pattern number has to be increased by one. @@ -1178,7 +1182,7 @@ // Reading samples if(loadFlags & loadSampleData) { - file.Seek(1084 + (readChannels * 64 * 4) * numPatterns); + file.Seek(modMagicResult.patternDataOffset + (readChannels * 64 * 4) * numPatterns); for(SAMPLEINDEX smp = 1; smp <= 31; smp++) { ModSample &sample = Samples[smp]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mtm.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mtm.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mtm.cpp 2019-11-02 10:13:50.000000000 +0100 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mtm.cpp 2021-12-04 18:47:30.000000000 +0100 @@ -174,7 +174,8 @@ { if(!(loadFlags & loadPatternData) || !Patterns.Insert(pat, rowsPerPat)) { - break; + file.Skip(64); + continue; } for(CHANNELINDEX chn = 0; chn < 32; chn++) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Load_s3m.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Load_s3m.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_s3m.cpp 2021-06-13 22:41:51.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_s3m.cpp 2021-12-04 18:47:30.000000000 +0100 @@ -561,7 +561,7 @@ { const auto [note, instr] = file.ReadArray<uint8, 2>(); if(note < 0xF0) - m.note = (note & 0x0F) + 12 * (note >> 4) + 12 + NOTE_MIN; + m.note = static_cast<ModCommand::NOTE>(Clamp((note & 0x0F) + 12 * (note >> 4) + 12 + NOTE_MIN, NOTE_MIN, NOTE_MAX)); else if(note == s3mNoteOff) m.note = NOTE_NOTECUT; else if(note == s3mNoteNone) @@ -608,6 +608,10 @@ else if(m.param > 0x08) zxxCountRight++; } + } else if(m.command == CMD_OFFSET && m.param == 0 && fileHeader.cwtv <= S3MFileHeader::trkST3_01) + { + // Offset command didn't have effect memory in ST3.01; fixed in ST3.03 + m.command = CMD_DUMMY; } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Load_stm.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Load_stm.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_stm.cpp 2020-07-16 22:48:57.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_stm.cpp 2021-12-04 18:47:30.000000000 +0100 @@ -151,6 +151,8 @@ m_modFormat.madeWithTracker = mpt::format(U_("Scream Tracker %1.%2"))(fileHeader.verMajor, mpt::ufmt::dec0<2>(fileHeader.verMinor)); m_modFormat.charset = mpt::Charset::CP437; + m_playBehaviour.set(kST3SampleSwap); + m_nSamples = 31; m_nChannels = 4; m_nMinPeriod = 64; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Load_xm.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Load_xm.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_xm.cpp 2021-09-15 17:55:06.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_xm.cpp 2021-11-19 23:15:06.000000000 +0100 @@ -647,9 +647,11 @@ // Fix arpeggios in kragle_-_happy_day.xm m_playBehaviour.reset(kFT2Arpeggio); isMadTracker = true; - } else if(!memcmp(fileHeader.trackerName, "Skale Tracker\0", 14)) + } else if(!memcmp(fileHeader.trackerName, "Skale Tracker\0", 14) || !memcmp(fileHeader.trackerName, "Sk@le Tracker\0", 14)) { m_playBehaviour.reset(kFT2ST3OffsetOutOfRange); + // Fix arpeggios in KAPTENFL.XM + m_playBehaviour.reset(kFT2Arpeggio); } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11)) { madeWith = verDigiTrakker; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/ModChannel.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/ModChannel.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/ModChannel.cpp 2021-05-13 14:37:50.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/ModChannel.cpp 2021-11-17 22:26:48.000000000 +0100 @@ -161,7 +161,7 @@ if(sndFile.m_playBehaviour[kITRealNoteMapping] && note >= NOTE_MIN && note <= NOTE_MAX) note = pModInstrument->NoteMap[note - NOTE_MIN]; - nPeriod = mpt::saturate_round<uint32>((nC5Speed << FREQ_FRACBITS) * vibratoFactor * pModInstrument->pTuning->GetRatio(note - NOTE_MIDDLEC + arpeggioSteps, nFineTune + m_PortamentoFineSteps)); + nPeriod = mpt::saturate_round<uint32>(nC5Speed * vibratoFactor * pModInstrument->pTuning->GetRatio(note - NOTE_MIDDLEC + arpeggioSteps, nFineTune + m_PortamentoFineSteps) * (1 << FREQ_FRACBITS)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/OPL.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/OPL.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/OPL.cpp 2020-05-16 16:50:30.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/OPL.cpp 2021-11-14 22:28:37.000000000 +0100 @@ -157,7 +157,10 @@ NoteOff(c); Volume(c, 0, false); // Note that a volume of 0 is not complete silence; the release portion of the sound will still be heard at -48dB if(unassign) + { + m_OPLtoChan[oplCh] = CHANNELINDEX_INVALID; m_ChanToOPL[c] |= OPL_CHANNEL_CUT; + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/S3MTools.h new/libopenmpt-0.5.14+release.autotools/soundlib/S3MTools.h --- old/libopenmpt-0.5.13+release.autotools/soundlib/S3MTools.h 2021-05-13 15:40:40.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/S3MTools.h 2021-12-04 18:47:30.000000000 +0100 @@ -45,6 +45,7 @@ trkST3_00 = 0x1300, trkST3_20 = 0x1320, + trkST3_01 = 0x1301, trkIT2_07 = 0x3207, trkIT2_14 = 0x3214, trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/SampleFormatSFZ.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/SampleFormatSFZ.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/SampleFormatSFZ.cpp 2021-09-21 18:20:19.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/SampleFormatSFZ.cpp 2021-12-04 18:30:26.000000000 +0100 @@ -257,7 +257,7 @@ if(hold > 0) { if(env.empty()) - env.push_back({0, 100.0}); + env.push_back({0.0, 100.0}); env.push_back({hold, env.back().second}); } if(env.empty()) @@ -815,6 +815,7 @@ { filename = file.GetFileName().GetPath() + filename; } + filename = filename.Simplify(); SetSamplePath(smp, filename); InputFile f(filename, SettingCacheCompleteFileBeforeLoading()); FileReader smpFile = GetFileReader(f); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Snd_flt.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Snd_flt.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Snd_flt.cpp 2020-05-25 22:26:42.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Snd_flt.cpp 2021-11-24 22:07:30.000000000 +0100 @@ -1,5 +1,5 @@ /* - * snd_flt.cpp + * Snd_flt.cpp * ----------- * Purpose: Calculation of resonant filter coefficients. * Notes : Extended filter range was introduced in MPT 1.12 and went up to 8652 Hz. @@ -81,11 +81,10 @@ // Filtering is only ever done in IT if either cutoff is not full or if resonance is set. if(m_playBehaviour[kITFilterBehaviour] && resonance == 0 && computedCutoff >= 254) { - if(chn.rowCommand.IsNote() && !chn.rowCommand.IsPortamento() && !chn.nMasterChn - && chn.position.IsZero() && !chn.dwFlags[CHN_WRAPPED_LOOP]) + if(chn.rowCommand.IsNote() && !chn.rowCommand.IsPortamento() && !chn.nMasterChn && chn.isFirstTick) { // Z7F next to a note disables the filter, however in other cases this should not happen. - // Test cases: filter-reset.it, filter-reset-carry.it, filter-nna.it + // Test cases: filter-reset.it, filter-reset-carry.it, filter-reset-envelope.it, filter-nna.it chn.dwFlags.reset(CHN_FILTER); } return -1; @@ -118,17 +117,17 @@ float fb1 = -e / (1.0f + d + e); #if defined(MPT_INTMIXER) -#define FILTER_CONVERT(x) mpt::saturate_round<mixsample_t>((x) * (1 << MIXING_FILTER_PRECISION)) +#define MPT_FILTER_CONVERT(x) mpt::saturate_round<mixsample_t>((x) * (1 << MIXING_FILTER_PRECISION)) #else -#define FILTER_CONVERT(x) (x) +#define MPT_FILTER_CONVERT(x) (x) #endif switch(chn.nFilterMode) { case FilterMode::HighPass: - chn.nFilter_A0 = FILTER_CONVERT(1.0f - fg); - chn.nFilter_B0 = FILTER_CONVERT(fb0); - chn.nFilter_B1 = FILTER_CONVERT(fb1); + chn.nFilter_A0 = MPT_FILTER_CONVERT(1.0f - fg); + chn.nFilter_B0 = MPT_FILTER_CONVERT(fb0); + chn.nFilter_B1 = MPT_FILTER_CONVERT(fb1); #ifdef MPT_INTMIXER chn.nFilter_HP = -1; #else @@ -137,9 +136,9 @@ break; default: - chn.nFilter_A0 = FILTER_CONVERT(fg); - chn.nFilter_B0 = FILTER_CONVERT(fb0); - chn.nFilter_B1 = FILTER_CONVERT(fb1); + chn.nFilter_A0 = MPT_FILTER_CONVERT(fg); + chn.nFilter_B0 = MPT_FILTER_CONVERT(fb0); + chn.nFilter_B1 = MPT_FILTER_CONVERT(fb1); #ifdef MPT_INTMIXER if(chn.nFilter_A0 == 0) chn.nFilter_A0 = 1; // Prevent silence at low filter cutoff and very high sampling rate diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.cpp 2021-09-03 23:49:48.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.cpp 2021-12-04 18:58:46.000000000 +0100 @@ -505,6 +505,7 @@ { filename = filename.RelativePathToAbsolute(GetpModDoc()->GetPathNameMpt().GetPath()); } + filename = filename.Simplify(); if(!LoadExternalSample(nSmp, filename)) { #ifndef MODPLUG_TRACKER @@ -1368,30 +1369,27 @@ if(p->IsNote()) { ModCommand::INSTR instr = p->instr; - if(!p->instr) instr = lastIns[c]; - if (instr) + if(!p->instr) + instr = lastIns[c]; + INSTRUMENTINDEX minInstr = 1, maxInstr = GetNumInstruments(); + if(instr > 0) { - if(IsInRange(instr, (INSTRUMENTINDEX)0, MAX_INSTRUMENTS)) + if(instr <= GetNumInstruments()) { - ModInstrument *pIns = Instruments[p->instr]; - if (pIns) - { - SAMPLEINDEX n = pIns->Keyboard[p->note - NOTE_MIN]; - if (n <= GetNumSamples()) sampleUsed[n] = true; - } + minInstr = maxInstr = instr; } lastIns[c] = instr; } else { // No idea which instrument this note belongs to, so mark it used in any instruments. - for (INSTRUMENTINDEX k = GetNumInstruments(); k >= 1; k--) + } + for(INSTRUMENTINDEX i = minInstr; i <= maxInstr; i++) + { + if(const auto *pIns = Instruments[i]; pIns != nullptr) { - ModInstrument *pIns = Instruments[k]; - if (pIns) - { - SAMPLEINDEX n = pIns->Keyboard[p->note - NOTE_MIN]; - if (n <= GetNumSamples()) sampleUsed[n] = true; - } + SAMPLEINDEX n = pIns->Keyboard[p->note - NOTE_MIN]; + if(n <= GetNumSamples()) + sampleUsed[n] = true; } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.h new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.h --- old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.h 2021-06-05 00:28:37.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.h 2021-12-04 18:30:26.000000000 +0100 @@ -597,7 +597,7 @@ std::vector<mpt::PathString> m_samplePaths; public: - void SetSamplePath(SAMPLEINDEX smp, const mpt::PathString &filename) { if(m_samplePaths.size() < smp) m_samplePaths.resize(smp); m_samplePaths[smp - 1] = filename.Simplify(); } + void SetSamplePath(SAMPLEINDEX smp, mpt::PathString filename) { if(m_samplePaths.size() < smp) m_samplePaths.resize(smp); m_samplePaths[smp - 1] = std::move(filename); } void ResetSamplePath(SAMPLEINDEX smp) { if(m_samplePaths.size() >= smp) m_samplePaths[smp - 1] = mpt::PathString(); Samples[smp].uFlags.reset(SMP_KEEPONDISK | SMP_MODIFIED);} mpt::PathString GetSamplePath(SAMPLEINDEX smp) const { if(m_samplePaths.size() >= smp) return m_samplePaths[smp - 1]; else return mpt::PathString(); } bool SampleHasPath(SAMPLEINDEX smp) const { if(m_samplePaths.size() >= smp) return !m_samplePaths[smp - 1].empty(); else return false; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/LFOPlugin.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/LFOPlugin.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/LFOPlugin.cpp 2021-09-03 23:48:47.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/LFOPlugin.cpp 2021-12-04 18:55:00.000000000 +0100 @@ -349,9 +349,12 @@ && !memcmp(data.magic, "LFO ", 4) && data.version == 0) { - m_amplitude = Clamp<float>(IEEE754binary32LE().SetInt32(data.amplitude), 0.0f, 1.0f); - m_offset = Clamp<float>(IEEE754binary32LE().SetInt32(data.offset), 0.0f, 1.0f); - m_frequency = Clamp<float>(IEEE754binary32LE().SetInt32(data.frequency), 0.0f, 1.0f); + const float amplitude = IEEE754binary32LE().SetInt32(data.amplitude); + m_amplitude = std::isfinite(amplitude) ? std::clamp(amplitude, 0.0f, 1.0f) : 0.5f; + const float offset = IEEE754binary32LE().SetInt32(data.offset); + m_offset = std::isfinite(offset) ? std::clamp(offset, 0.0f, 1.0f) : 0.5f; + const float frequency = IEEE754binary32LE().SetInt32(data.frequency); + m_frequency = std::isfinite(frequency) ? std::clamp(frequency, 0.0f, 1.0f) : 0.290241f; if(data.waveForm < kNumWaveforms) m_waveForm = static_cast<LFOWaveform>(data.waveForm.get()); m_outputParam = data.outputParam; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/PlugInterface.cpp new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/PlugInterface.cpp --- old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/PlugInterface.cpp 2021-05-01 18:29:52.000000000 +0200 +++ new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/PlugInterface.cpp 2021-12-04 18:55:00.000000000 +0100 @@ -516,7 +516,8 @@ BeginSetProgram(); for(uint32 i = 0; i < numParams; i++) { - SetParameter(i, memFile.ReadFloatLE()); + const auto value = memFile.ReadFloatLE(); + SetParameter(i, std::isfinite(value) ? value : 0.0f); } EndSetProgram(); }