From: <sv...@op...> - 2024-04-08 18:12:37
|
Author: sagamusix Date: Mon Apr 8 20:12:23 2024 New Revision: 20529 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20529 Log: [Imp] MED: Improve handling of default tempo, panning and channel volume in files containing more than one song (fixes sugar n spice.mmd3, https://www.un4seen.com/forum/?topic=15448.msg142659#msg142659) Modified: trunk/OpenMPT/soundlib/Load_med.cpp Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Mon Apr 8 19:08:57 2024 (r20528) +++ trunk/OpenMPT/soundlib/Load_med.cpp Mon Apr 8 20:12:23 2024 (r20529) @@ -1197,12 +1197,15 @@ const bool is8Ch = (songHeader.flags & MMDSong::FLAG_8CHANNEL) != 0; const bool bpmMode = (songHeader.flags2 & MMDSong::FLAG2_BPM) != 0; const uint8 rowsPerBeat = 1 + (songHeader.flags2 & MMDSong::FLAG2_BMASK); - m_nDefaultTempo = MMDTempoToBPM(songHeader.defaultTempo, is8Ch, bpmMode, rowsPerBeat); - m_nDefaultSpeed = Clamp<uint8, uint8>(songHeader.tempo2, 1, 32); - if(bpmMode) + if(song == 0) { - m_nDefaultRowsPerBeat = rowsPerBeat; - m_nDefaultRowsPerMeasure = m_nDefaultRowsPerBeat * 4u; + m_nDefaultTempo = MMDTempoToBPM(songHeader.defaultTempo, is8Ch, bpmMode, rowsPerBeat); + m_nDefaultSpeed = Clamp<uint8, uint8>(songHeader.tempo2, 1, 32); + if(bpmMode) + { + m_nDefaultRowsPerBeat = rowsPerBeat; + m_nDefaultRowsPerMeasure = m_nDefaultRowsPerBeat * 4u; + } } if(songHeader.masterVol) @@ -1422,7 +1425,7 @@ } // Fix jump order commands - for(const auto & [from, to] : jumpTargets) + for(const auto &[from, to] : jumpTargets) { PATTERNINDEX pat; if(from > 0 && order.IsValidPat(from - 1)) @@ -1442,6 +1445,21 @@ numPatterns = pat + 1; } + if(numSongs > 1) + { + PATTERNINDEX firstPat = order.EnsureUnique(0); + if(firstPat != PATTERNINDEX_INVALID) + { + for(CHANNELINDEX chn = 0; chn < m_nChannels; chn++) + { + Patterns[firstPat].WriteEffect(EffectWriter(CMD_CHANNELVOLUME, ChnSettings[chn].nVolume).Channel(chn).RetryNextRow()); + Patterns[firstPat].WriteEffect(EffectWriter(CMD_PANNING8, mpt::saturate_cast<ModCommand::PARAM>(ChnSettings[chn].nPan)).Channel(chn).RetryNextRow()); + } + if(firstPat >= numPatterns) + numPatterns = firstPat + 1; + } + } + basePattern += numPatterns; if(!expData.nextModOffset || !file.Seek(expData.nextModOffset)) |