From: <sv...@op...> - 2024-07-26 18:06:11
|
Author: sagamusix Date: Fri Jul 26 20:06:04 2024 New Revision: 21295 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21295 Log: Merged revision(s) 21286, 21292 from trunk/OpenMPT: [Fix] Fix inconsistency in length calculation and actual playback length in libopenmpt with tempo commands below 32 BPM in various formats (MDL, MED among others). [Imp] MED: Allow tempo parameters < 32 BPM in OpenMPT. libopenmpt already supported them. ........ [Fix] MED: Command 09 (set speed) was limited to 20 ticks per row instead of 0x20 ticks per row... (https://www.un4seen.com/forum/?topic=15448.msg143294#msg143294) ........ Modified: branches/OpenMPT-1.29/ (props changed) branches/OpenMPT-1.29/soundlib/Load_med.cpp branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.29/soundlib/Load_med.cpp ============================================================================== --- branches/OpenMPT-1.29/soundlib/Load_med.cpp Fri Jul 26 20:04:32 2024 (r21294) +++ branches/OpenMPT-1.29/soundlib/Load_med.cpp Fri Jul 26 20:06:04 2024 (r21295) @@ -399,7 +399,7 @@ m.command = CMD_NONE; break; case 0x09: // Set secondary speed - if(m.param > 0 && m.param <= 20) + if(m.param > 0 && m.param <= 0x20) m.command = CMD_SPEED; else m.command = CMD_NONE; @@ -430,10 +430,6 @@ m.param = 0x70; else m.param = mpt::saturate_round<ModCommand::PARAM>(MMDTempoToBPM(m.param, is8ch, bpmMode, rowsPerBeat).ToDouble()); -#ifdef MODPLUG_TRACKER - if(m.param < 0x20) - m.param = 0x20; -#endif // MODPLUG_TRACKER } else switch(m.param) { case 0xF1: // Play note twice Modified: branches/OpenMPT-1.29/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Fri Jul 26 20:04:32 2024 (r21294) +++ branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Fri Jul 26 20:06:04 2024 (r21295) @@ -44,6 +44,12 @@ static uint32 GetFineLinearSlideDownTable(const CSoundFile *sndFile, uint32 i) { MPT_ASSERT(i < CountOf(FineLinearSlideDownTable)); return sndFile->m_playBehaviour[kHertzInLinearMode] ? FineLinearSlideDownTable[i] : FineLinearSlideUpTable[i]; } static uint32 GetFineLinearSlideUpTable (const CSoundFile *sndFile, uint32 i) { MPT_ASSERT(i < CountOf(FineLinearSlideDownTable)); return sndFile->m_playBehaviour[kHertzInLinearMode] ? FineLinearSlideUpTable[i] : FineLinearSlideDownTable[i]; } +// Minimum parameter of tempo command that is considered to be a BPM rather than a tempo slide +static constexpr TEMPO GetMinimumTempoParam(MODTYPE modType) +{ + return (modType & (MOD_TYPE_MDL | MOD_TYPE_MED | MOD_TYPE_XM | MOD_TYPE_MOD)) ? TEMPO(1, 0) : TEMPO(32, 0); +} + //////////////////////////////////////////////////////////// // Length @@ -652,7 +658,7 @@ } const auto &specs = GetModSpecifications(); - if(tempo.GetInt() >= 0x20) + if(tempo >= GetMinimumTempoParam(GetType())) { #if MPT_MSVC_BEFORE(2019, 0) // Work-around for VS2017 /std:c++17 /permissive- @@ -5881,7 +5887,7 @@ const CModSpecifications &specs = GetModSpecifications(); // Anything lower than the minimum tempo is considered to be a tempo slide - const TEMPO minTempo = (GetType() & (MOD_TYPE_MDL | MOD_TYPE_MED)) ? TEMPO(1, 0) : TEMPO(32, 0); + const TEMPO minTempo = GetMinimumTempoParam(GetType()); if(setFromUI) { |