Author: sagamusix
Date: Mon Apr 8 20:12:42 2024
New Revision: 20530
URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20530
Log:
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)
........
Modified:
branches/OpenMPT-1.31/ (props changed)
branches/OpenMPT-1.31/soundlib/Load_med.cpp
Modified: branches/OpenMPT-1.31/soundlib/Load_med.cpp
==============================================================================
--- branches/OpenMPT-1.31/soundlib/Load_med.cpp Mon Apr 8 20:12:23 2024 (r20529)
+++ branches/OpenMPT-1.31/soundlib/Load_med.cpp Mon Apr 8 20:12:42 2024 (r20530)
@@ -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))
|