From 7e5e72e3b39679aa2f51777869e8e6c115fa0fad Mon Sep 17 00:00:00 2001 From: Johannes Schultz Date: Mon, 30 Sep 2024 17:06:56 +0000 Subject: [PATCH] Merged revision(s) 21771-21772 from trunk/OpenMPT: [Imp] IT: Don't import SAx High Offset command for IT 1.xx modules. This feature was added in IT 2.00. ........ [Fix] IT: Command fixups need to be done before the command memory is updated. ........ git-svn-id: https://source.openmpt.org/svn/openmpt/branches/OpenMPT-1.31@21773 56274372-70c3-4bfc-bfc3-4c3a0b034d27 --- soundlib/Load_it.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/soundlib/Load_it.cpp b/soundlib/Load_it.cpp index 32b98624d6..b8d235e740 100644 --- a/soundlib/Load_it.cpp +++ b/soundlib/Load_it.cpp @@ -1027,6 +1027,7 @@ bool CSoundFile::ReadIT(FileReader &file, ModLoadingFlags loadFlags) auto patData = Patterns[pat].begin(); ROWINDEX row = 0; + ModCommand dummy{}; while(row < numRows && patternData.CanRead(1)) { uint8 b = patternData.ReadUint8(); @@ -1057,7 +1058,6 @@ bool CSoundFile::ReadIT(FileReader &file, ModLoadingFlags loadFlags) } // Now we grab the data for this particular row/channel. - ModCommand dummy{}; ModCommand &m = ch < m_nChannels ? patData[ch] : dummy; if(chnMask[ch] & 0x10) @@ -1138,15 +1138,21 @@ bool CSoundFile::ReadIT(FileReader &file, ModLoadingFlags loadFlags) { const auto [command, param] = patternData.ReadArray(); S3MConvert(m, command, param, true); - // In some IT-compatible trackers, it is possible to input a parameter without a command. - // In this case, we still need to update the last value memory. OpenMPT didn't do this until v1.25.01.07. - // Example: ckbounce.it - lastValue[ch].command = m.command; - lastValue[ch].param = m.param; + + // IT 1.xx does not support high offset command + if(m.command == CMD_S3MCMDEX && (m.param & 0xF0) == 0xA0 && fileHeader.cmwt < 0x0200) + m.command = CMD_DUMMY; // Fix handling of commands V81-VFF in ITs made with old Schism Tracker versions // (fixed in https://github.com/schismtracker/schismtracker/commit/ab5517d4730d4c717f7ebffb401445679bd30888 - one of the last versions to identify as v0.50) if(m.command == CMD_GLOBALVOLUME && m.param > 0x80 && fileHeader.cwtv >= 0x1000 && fileHeader.cwtv <= 0x1050) m.param = 0x80; + + // In some IT-compatible trackers, it is possible to input a parameter without a command. + // In this case, we still need to update the last value memory (so that we don't reuse a previous non-empty effect). + // OpenMPT didn't do this until v1.25.01.07. + // Example: ckbounce.it + lastValue[ch].command = m.command; + lastValue[ch].param = m.param; } } }