From fe863c3e3238ee48cc0c0046aee3096078bb1ed5 Mon Sep 17 00:00:00 2001 From: Johannes Schultz Date: Mon, 8 Apr 2024 18:12:42 +0000 Subject: [PATCH] Merged revision(s) 20529 from trunk/OpenMPT: [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) ........ git-svn-id: https://source.openmpt.org/svn/openmpt/branches/OpenMPT-1.31@20530 56274372-70c3-4bfc-bfc3-4c3a0b034d27 --- soundlib/Load_med.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/soundlib/Load_med.cpp b/soundlib/Load_med.cpp index 3305f4ab50f..a51ed958fb2 100644 --- a/soundlib/Load_med.cpp +++ b/soundlib/Load_med.cpp @@ -1197,12 +1197,15 @@ bool CSoundFile::ReadMED(FileReader &file, ModLoadingFlags loadFlags) 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(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(songHeader.tempo2, 1, 32); + if(bpmMode) + { + m_nDefaultRowsPerBeat = rowsPerBeat; + m_nDefaultRowsPerMeasure = m_nDefaultRowsPerBeat * 4u; + } } if(songHeader.masterVol) @@ -1422,7 +1425,7 @@ bool CSoundFile::ReadMED(FileReader &file, ModLoadingFlags loadFlags) } // 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 @@ bool CSoundFile::ReadMED(FileReader &file, ModLoadingFlags loadFlags) 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(ChnSettings[chn].nPan)).Channel(chn).RetryNextRow()); + } + if(firstPat >= numPatterns) + numPatterns = firstPat + 1; + } + } + basePattern += numPatterns; if(!expData.nextModOffset || !file.Seek(expData.nextModOffset))