From: <sv...@op...> - 2024-10-20 12:31:27
|
Author: sagamusix Date: Sun Oct 20 14:31:15 2024 New Revision: 21873 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21873 Log: Merged revision(s) 21788 from trunk/OpenMPT: [Imp] Insert pattern break commands in MOD/S3M when trying to save patterns shorter than 64 rows. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Load_mod.cpp branches/OpenMPT-1.31/soundlib/Load_s3m.cpp branches/OpenMPT-1.31/soundlib/pattern.cpp branches/OpenMPT-1.31/soundlib/pattern.h Modified: branches/OpenMPT-1.31/soundlib/Load_mod.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_mod.cpp Sun Oct 20 14:26:40 2024 (r21872) +++ branches/OpenMPT-1.31/soundlib/Load_mod.cpp Sun Oct 20 14:31:15 2024 (r21873) @@ -2451,6 +2451,7 @@ continue; } const auto rowBase = Patterns[pat].GetRow(row); + bool writePatternBreak = (Patterns[pat].GetNumRows() < 64 && row + 1 == Patterns[pat].GetNumRows() && !Patterns[pat].RowHasJump(row)); events.resize(writeChannels * 4); size_t eventByte = 0; @@ -2466,6 +2467,11 @@ command = 0x0C; param = std::min(m.vol, uint8(64)); } + if(writePatternBreak && !command && !param) + { + command = 0x0D; + writePatternBreak = false; + } uint16 period = 0; // Convert note to period Modified: branches/OpenMPT-1.31/soundlib/Load_s3m.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_s3m.cpp Sun Oct 20 14:26:40 2024 (r21872) +++ branches/OpenMPT-1.31/soundlib/Load_s3m.cpp Sun Oct 20 14:31:15 2024 (r21873) @@ -930,6 +930,7 @@ const auto rowBase = Patterns[pat].GetRow(row); CHANNELINDEX writeChannels = std::min(CHANNELINDEX(32), GetNumChannels()); + bool writePatternBreak = (Patterns[pat].GetNumRows() < 64 && row + 1 == Patterns[pat].GetNumRows() && !Patterns[pat].RowHasJump(row)); for(CHANNELINDEX chn = 0; chn < writeChannels; chn++) { const ModCommand &m = rowBase[chn]; @@ -995,6 +996,12 @@ } } } + if(writePatternBreak && !(info & s3mEffectPresent)) + { + info |= s3mEffectPresent; + command = 'C' ^ 0x40; + writePatternBreak = false; + } if(info & s3mAnyPresent) { Modified: branches/OpenMPT-1.31/soundlib/pattern.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/pattern.cpp Sun Oct 20 14:26:40 2024 (r21872) +++ branches/OpenMPT-1.31/soundlib/pattern.cpp Sun Oct 20 14:31:15 2024 (r21873) @@ -37,21 +37,32 @@ bool CPattern::IsEmptyRow(ROWINDEX row) const noexcept { if(m_ModCommands.empty() || !IsValidRow(row)) - { return true; - } for(const auto &m : GetRow(row)) { if(!m.IsEmpty()) - { return false; - } } return true; } +// Check if the row contains any position jumps or pattern breaks. +bool CPattern::RowHasJump(ROWINDEX row) const noexcept +{ + if(m_ModCommands.empty() || !IsValidRow(row)) + return false; + + for(const auto &m : GetRow(row)) + { + if(m.command == CMD_PATTERNBREAK || m.command == CMD_POSITIONJUMP) + return true; + } + return false; +} + + bool CPattern::SetSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept { if(rowsPerBeat < 1 Modified: branches/OpenMPT-1.31/soundlib/pattern.h ============================================================================== --- branches/OpenMPT-1.31/soundlib/pattern.h Sun Oct 20 14:26:40 2024 (r21872) +++ branches/OpenMPT-1.31/soundlib/pattern.h Sun Oct 20 14:31:15 2024 (r21873) @@ -60,6 +60,8 @@ // Check if there is any note data on a given row. bool IsEmptyRow(ROWINDEX row) const noexcept; + // Check if the row contains any position jumps or pattern breaks. + bool RowHasJump(ROWINDEX row) const noexcept; // Allocate new pattern memory and replace old pattern data. bool AllocatePattern(ROWINDEX rows); |