From: <sv...@op...> - 2024-04-08 19:13:32
|
Author: sagamusix Date: Mon Apr 8 21:13:21 2024 New Revision: 20535 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20535 Log: [New] Every sequence can now have its own default tempo and speed (https://bugs.openmpt.org/view.php?id=1322) [Mod] PSM: Import with real sub-songs even in OpenMPT, not just libopenmpt. Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Load_667.cpp trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_amf.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_c67.cpp trunk/OpenMPT/soundlib/Load_dmf.cpp trunk/OpenMPT/soundlib/Load_dsm.cpp trunk/OpenMPT/soundlib/Load_dtm.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_fmt.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_gt2.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mo3.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_plm.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_sfx.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_stp.cpp trunk/OpenMPT/soundlib/Load_symmod.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/ModSequence.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/test/test.cpp trunk/OpenMPT/test/test.mptm Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -1012,11 +1012,11 @@ sndFile.m_MidiCfg.Reset(); // Global vars - sndFile.m_nDefaultTempo.Set(125); - sndFile.m_nDefaultSpeed = 6; sndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; sndFile.m_nSamplePreAmp = 48; sndFile.m_nVSTiVolume = 48; + sndFile.Order().SetDefaultTempoInt(125); + sndFile.Order().SetDefaultSpeed(6); sndFile.Order().SetRestartPos(0); if(sndFile.Order().empty()) Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -243,7 +243,7 @@ double newTempo = 60.0 / secondsPerBeat; if(m_sndFile.m_nTempoMode != TempoMode::Modern) - newTempo *= (m_sndFile.m_nDefaultSpeed * m_sndFile.m_nDefaultRowsPerBeat) / 24.0; + newTempo *= (m_sndFile.Order().GetDefaultSpeed() * m_sndFile.m_nDefaultRowsPerBeat) / 24.0; if(!m_sndFile.GetModSpecifications().hasFractionalTempo) newTempo = std::round(newTempo); TEMPO t(newTempo); @@ -291,7 +291,7 @@ m_tempoMax = specs.GetTempoMax(); // IT Hack: There are legacy OpenMPT-made ITs out there which use a higher default speed than 255. // Changing the upper tempo limit in the mod specs would break them, so do it here instead. - if(m_sndFile.GetType() == MOD_TYPE_IT && m_sndFile.m_nDefaultTempo <= TEMPO(255, 0)) + if(m_sndFile.GetType() == MOD_TYPE_IT && m_sndFile.Order().GetDefaultTempo() <= TEMPO(255, 0)) m_tempoMax.Set(255); // Lower resolution for BPM above 256 if(m_tempoMax >= TEMPO_SPLIT_THRESHOLD) @@ -349,14 +349,23 @@ m_SpinRestartPos.SetRange32(0, std::max(m_sndFile.Order().GetRestartPos(), static_cast<ORDERINDEX>(m_sndFile.Order().GetLengthTailTrimmed() - 1))); SetDlgItemInt(IDC_EDIT_RESTARTPOS, m_sndFile.Order().GetRestartPos(), FALSE); } + + if(updateAll || (hint.GetCategory() == HINTCAT_GENERAL && hintType[HINT_MODGENERAL]) || (hint.GetCategory() == HINTCAT_SEQUENCE && hint.ToType<SequenceHint>().GetSequence() == SEQUENCEINDEX_INVALID)) + { + if(!m_editsLocked) + { + m_EditTempo.SetTempoValue(m_sndFile.Order().GetDefaultTempo()); + SetDlgItemInt(IDC_EDIT_SPEED, m_sndFile.Order().GetDefaultSpeed(), FALSE); + } + m_SliderTempo.SetPos(TempoToSlider(m_sndFile.Order().GetDefaultTempo())); + } + if (updateAll || (hint.GetCategory() == HINTCAT_GENERAL && hintType[HINT_MODGENERAL])) { if (!m_editsLocked) { m_EditTitle.SetWindowText(mpt::ToCString(m_sndFile.GetCharsetInternal(), m_sndFile.GetTitle())); m_EditArtist.SetWindowText(mpt::ToCString(m_sndFile.m_songArtist)); - m_EditTempo.SetTempoValue(m_sndFile.m_nDefaultTempo); - SetDlgItemInt(IDC_EDIT_SPEED, m_sndFile.m_nDefaultSpeed, FALSE); SetDlgItemInt(IDC_EDIT_GLOBALVOL, m_sndFile.m_nDefaultGlobalVolume / GetGlobalVolumeFactor(), FALSE); SetDlgItemInt(IDC_EDIT_VSTIVOL, m_sndFile.m_nVSTiVolume, FALSE); SetDlgItemInt(IDC_EDIT_SAMPLEPA, m_sndFile.m_nSamplePreAmp, FALSE); @@ -365,7 +374,6 @@ m_SliderGlobalVol.SetPos(MAX_SLIDER_GLOBAL_VOL - m_sndFile.m_nDefaultGlobalVolume); m_SliderVSTiVol.SetPos(MAX_SLIDER_VSTI_VOL - m_sndFile.m_nVSTiVolume); m_SliderSamplePreAmp.SetPos(MAX_SLIDER_SAMPLE_VOL - m_sndFile.m_nSamplePreAmp); - m_SliderTempo.SetPos(TempoToSlider(m_sndFile.m_nDefaultTempo)); } if(updateAll || hintType == HINT_MPTOPTIONS || (hint.GetCategory() == HINTCAT_GENERAL && hintType[HINT_MODGENERAL])) @@ -400,9 +408,9 @@ if (pSlider == &m_SliderTempo) { const TEMPO tempo = SliderToTempo(m_SliderTempo.GetPos()); - if ((tempo >= m_sndFile.GetModSpecifications().GetTempoMin()) && (tempo <= m_sndFile.GetModSpecifications().GetTempoMax()) && (tempo != m_sndFile.m_nDefaultTempo)) + if ((tempo >= m_sndFile.GetModSpecifications().GetTempoMin()) && (tempo <= m_sndFile.GetModSpecifications().GetTempoMax()) && (tempo != m_sndFile.Order().GetDefaultTempo())) { - m_sndFile.m_nDefaultTempo = m_sndFile.m_PlayState.m_nMusicTempo = tempo; + m_sndFile.Order().SetDefaultTempo(m_sndFile.m_PlayState.m_nMusicTempo = tempo); m_modDoc.SetModified(); m_modDoc.UpdateAllViews(nullptr, GeneralHint().General(), this); m_EditTempo.SetTempoValue(tempo); @@ -463,9 +471,9 @@ } TEMPO newTempo; newTempo.SetRaw(pos32); - newTempo += m_sndFile.m_nDefaultTempo; + newTempo += m_sndFile.Order().GetDefaultTempo(); Limit(newTempo, m_tempoMin, m_tempoMax); - m_sndFile.m_nDefaultTempo = m_sndFile.m_PlayState.m_nMusicTempo = newTempo; + m_sndFile.Order().SetDefaultTempo(m_sndFile.m_PlayState.m_nMusicTempo = newTempo); m_modDoc.SetModified(); LockControls(); m_modDoc.UpdateAllViews(nullptr, GeneralHint().General(), this); @@ -516,11 +524,11 @@ TEMPO tempo = m_EditTempo.GetTempoValue(); Limit(tempo, m_tempoMin, m_tempoMax); if(!m_sndFile.GetModSpecifications().hasFractionalTempo) tempo.Set(tempo.GetInt()); - if (tempo != m_sndFile.m_nDefaultTempo) + if (tempo != m_sndFile.Order().GetDefaultTempo()) { m_editsLocked = true; m_EditTempo.SetModify(FALSE); - m_sndFile.m_nDefaultTempo = tempo; + m_sndFile.Order().SetDefaultTempo(tempo); m_sndFile.m_PlayState.m_nMusicTempo = tempo; m_modDoc.SetModified(); m_modDoc.UpdateAllViews(nullptr, GeneralHint().General()); @@ -540,11 +548,11 @@ { UINT n = mpt::parse<UINT>(s); n = Clamp(n, m_sndFile.GetModSpecifications().speedMin, m_sndFile.GetModSpecifications().speedMax); - if (n != m_sndFile.m_nDefaultSpeed) + if (n != m_sndFile.Order().GetDefaultSpeed()) { m_editsLocked = true; m_EditSpeed.SetModify(FALSE); - m_sndFile.m_nDefaultSpeed = n; + m_sndFile.Order().SetDefaultSpeed(n); m_sndFile.m_PlayState.m_nMusicSpeed = n; m_modDoc.SetModified(); m_modDoc.UpdateAllViews(nullptr, GeneralHint().General(), this); Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -3050,7 +3050,7 @@ } if(!ptl.GetRaw()) { - ptl = m_sndFile.m_nDefaultTempo; + ptl = m_sndFile.Order().GetDefaultTempo(); } m_EditPitchTempoLock.SetTempoValue(ptl); isZero = true; Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -1519,7 +1519,6 @@ sndFile.Order.SetSequence(newIndex); if(const auto name = sndFile.Order().GetName(); duplicate && !name.empty()) sndFile.Order().SetName(name + U_(" (Copy)")); - m_modDoc.UpdateAllViews(nullptr, SequenceHint(SEQUENCEINDEX_INVALID).Names().Data()); } } else if(seq == sndFile.Order.GetCurrentSequenceIndex()) return; @@ -1536,8 +1535,13 @@ cs.Leave(); if(editSequence) + { m_modDoc.SetModified(); - m_modDoc.UpdateAllViews(nullptr, SequenceHint().Data(), nullptr); + m_modDoc.UpdateAllViews(nullptr, SequenceHint(SEQUENCEINDEX_INVALID).Names().Data(), nullptr); + } else + { + m_modDoc.UpdateAllViews(nullptr, SequenceHint(SEQUENCEINDEX_INVALID).Data(), nullptr); + } } Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MPTHacks.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/MPTHacks.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -350,34 +350,37 @@ if(foundEnvelopes) AddToLog("Two envelope points may not share the same tick"); - // Check for too many orders - if(m_SndFile.Order().GetLengthTailTrimmed() > originalSpecs->ordersMax) + for(auto &order : m_SndFile.Order) { - AddToLog(MPT_AFORMAT("Found too many orders ({} allowed)")(originalSpecs->ordersMax)); - foundHacks = true; - if(autofix) + // Check for too many orders + if(order.GetLengthTailTrimmed() > originalSpecs->ordersMax) { - // Can we be more intelligent here and maybe remove stop patterns and such? - m_SndFile.Order().resize(originalSpecs->ordersMax); + AddToLog(MPT_AFORMAT("Found too many orders ({} allowed)")(originalSpecs->ordersMax)); + foundHacks = true; + if(autofix) + { + // Can we be more intelligent here and maybe remove stop patterns and such? + order.resize(originalSpecs->ordersMax); + } } - } - // Check for invalid default tempo - if(m_SndFile.m_nDefaultTempo > originalSpecs->GetTempoMax() || m_SndFile.m_nDefaultTempo < originalSpecs->GetTempoMin()) - { - AddToLog(MPT_AFORMAT("Found incompatible default tempo (must be between {} and {})")(originalSpecs->GetTempoMin().GetInt(), originalSpecs->GetTempoMax().GetInt())); - foundHacks = true; - if(autofix) - m_SndFile.m_nDefaultTempo = Clamp(m_SndFile.m_nDefaultTempo, originalSpecs->GetTempoMin(), originalSpecs->GetTempoMax()); - } + // Check for invalid default tempo + if(order.GetDefaultTempo() > originalSpecs->GetTempoMax() || order.GetDefaultTempo() < originalSpecs->GetTempoMin()) + { + AddToLog(MPT_AFORMAT("Found incompatible default tempo (must be between {} and {})")(originalSpecs->GetTempoMin().GetInt(), originalSpecs->GetTempoMax().GetInt())); + foundHacks = true; + if(autofix) + order.SetDefaultTempo(Clamp(order.GetDefaultTempo(), originalSpecs->GetTempoMin(), originalSpecs->GetTempoMax())); + } - // Check for invalid default speed - if(m_SndFile.m_nDefaultSpeed > originalSpecs->speedMax || m_SndFile.m_nDefaultSpeed < originalSpecs->speedMin) - { - AddToLog(MPT_AFORMAT("Found incompatible default speed (must be between {} and {})")(originalSpecs->speedMin, originalSpecs->speedMax)); - foundHacks = true; - if(autofix) - m_SndFile.m_nDefaultSpeed = Clamp(m_SndFile.m_nDefaultSpeed, originalSpecs->speedMin, originalSpecs->speedMax); + // Check for invalid default speed + if(order.GetDefaultSpeed() > originalSpecs->speedMax || order.GetDefaultSpeed() < originalSpecs->speedMin) + { + AddToLog(MPT_AFORMAT("Found incompatible default speed (must be between {} and {})")(originalSpecs->speedMin, originalSpecs->speedMax)); + foundHacks = true; + if(autofix) + order.SetDefaultSpeed(Clamp(order.GetDefaultSpeed(), originalSpecs->speedMin, originalSpecs->speedMax)); + } } // Check for invalid rows per beat / measure values @@ -449,7 +452,7 @@ foundHacks = true; if(autofix) { - m_SndFile.Order.RestartPosToPattern(seq); + m_SndFile.Order.WriteGlobalsToPattern(seq, true, false); } } } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/MainFrm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -1667,8 +1667,8 @@ { m_WaveFile.Destroy(); m_WaveFile.Create(FileReader()); - m_WaveFile.m_nDefaultTempo.Set(125); - m_WaveFile.m_nDefaultSpeed = 6; + m_WaveFile.Order().SetDefaultTempoInt(125); + m_WaveFile.Order().SetDefaultSpeed(6); m_WaveFile.m_nType = MOD_TYPE_MPT; m_WaveFile.m_nChannels = 2; m_WaveFile.m_nInstruments = 1; Modified: trunk/OpenMPT/mptrack/ModConvert.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/ModConvert.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -456,22 +456,22 @@ bool firstPatValid = firstPat != m_SndFile.Order().cend(); bool lossy = false; - if(m_SndFile.m_nDefaultSpeed != 6) + if(m_SndFile.Order().GetDefaultSpeed() != 6) { if(firstPatValid) { - m_SndFile.Patterns[*firstPat].WriteEffect(EffectWriter(CMD_SPEED, ModCommand::PARAM(m_SndFile.m_nDefaultSpeed)).RetryNextRow()); + m_SndFile.Patterns[*firstPat].WriteEffect(EffectWriter(CMD_SPEED, ModCommand::PARAM(m_SndFile.Order().GetDefaultSpeed())).RetryNextRow()); } - m_SndFile.m_nDefaultSpeed = 6; + m_SndFile.Order().SetDefaultSpeed(6); lossy = true; } - if(m_SndFile.m_nDefaultTempo != TEMPO(125, 0)) + if(m_SndFile.Order().GetDefaultTempo() != TEMPO(125, 0)) { if(firstPatValid) { - m_SndFile.Patterns[*firstPat].WriteEffect(EffectWriter(CMD_TEMPO, ModCommand::PARAM(m_SndFile.m_nDefaultTempo.GetInt())).RetryNextRow()); + m_SndFile.Patterns[*firstPat].WriteEffect(EffectWriter(CMD_TEMPO, ModCommand::PARAM(m_SndFile.Order().GetDefaultTempo().GetInt())).RetryNextRow()); } - m_SndFile.m_nDefaultTempo.Set(125); + m_SndFile.Order().SetDefaultTempoInt(125); lossy = true; } if(m_SndFile.m_nDefaultGlobalVolume != MAX_GLOBAL_VOLUME || m_SndFile.m_nSamplePreAmp != 48 || m_SndFile.m_nVSTiVolume != 48) @@ -493,7 +493,7 @@ if(m_SndFile.Order(seq).GetRestartPos() > 0 && !specs.hasRestartPos) { // Try to fix it by placing a pattern jump command in the pattern. - if(!m_SndFile.Order.RestartPosToPattern(seq)) + if(!m_SndFile.Order.WriteGlobalsToPattern(seq, true, false)) { // Couldn't fix it! :( warnings.set(wRestartPos); @@ -578,18 +578,20 @@ warnings.set(wMixmode); } - if(!specs.hasFractionalTempo && m_SndFile.m_nDefaultTempo.GetFract() != 0) + for(auto &order : m_SndFile.Order) { - m_SndFile.m_nDefaultTempo.Set(m_SndFile.m_nDefaultTempo.GetInt(), 0); - warnings.set(wFractionalTempo); + if(!specs.hasFractionalTempo && order.GetDefaultTempo().GetFract() != 0) + { + order.SetDefaultTempoInt(order.GetDefaultTempo().GetInt()); + warnings.set(wFractionalTempo); + } + + order.SetDefaultTempo(Clamp(order.GetDefaultTempo(), specs.GetTempoMin(), specs.GetTempoMax())); + order.SetDefaultSpeed(Clamp(order.GetDefaultSpeed(), specs.speedMin, specs.speedMax)); } ChangeFileExtension(nNewType); - // Check mod specifications - Limit(m_SndFile.m_nDefaultTempo, specs.GetTempoMin(), specs.GetTempoMax()); - Limit(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); - for(INSTRUMENTINDEX i = 1; i <= m_SndFile.GetNumInstruments(); i++) if(m_SndFile.Instruments[i] != nullptr) { UpdateEnvelopes(m_SndFile.Instruments[i]->VolEnv, specs, warnings); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/Moddoc.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -637,9 +637,8 @@ Clear(m_SndFile.m_szNames); - m_SndFile.m_PlayState.m_nMusicTempo.Set(125); - m_SndFile.m_nDefaultTempo.Set(125); - m_SndFile.m_PlayState.m_nMusicSpeed = m_SndFile.m_nDefaultSpeed = 6; + m_SndFile.Order().SetDefaultTempoInt(125); + m_SndFile.Order().SetDefaultSpeed(6); // Set up mix levels m_SndFile.m_PlayState.m_nGlobalVolume = m_SndFile.m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -411,10 +411,13 @@ sndFile.m_nTempoMode = static_cast<TempoMode>(m_TempoModeBox.GetItemData(sel)); if(oldMode == TempoMode::Modern && sndFile.m_nTempoMode != TempoMode::Modern) { - double newTempo = sndFile.m_nDefaultTempo.ToDouble() * (sndFile.m_nDefaultSpeed * sndFile.m_nDefaultRowsPerBeat) / ((sndFile.m_nTempoMode == TempoMode::Classic) ? 24 : 60); - if(!newModSpecs.hasFractionalTempo) - newTempo = std::round(newTempo); - sndFile.m_nDefaultTempo = Clamp(TEMPO(newTempo), newModSpecs.GetTempoMin(), newModSpecs.GetTempoMax()); + for(auto &order : sndFile.Order) + { + double newTempo = order.GetDefaultTempo().ToDouble() * (order.GetDefaultSpeed() * sndFile.m_nDefaultRowsPerBeat) / ((sndFile.m_nTempoMode == TempoMode::Classic) ? 24 : 60); + if(!newModSpecs.hasFractionalTempo) + newTempo = std::round(newTempo); + order.SetDefaultTempo(Clamp(TEMPO(newTempo), newModSpecs.GetTempoMin(), newModSpecs.GetTempoMax())); + } } } if(sndFile.m_nTempoMode == TempoMode::Modern) Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -2264,7 +2264,7 @@ float tempoScale = 1.0f; if(sndFile.m_nTempoMode == TempoMode::Modern) { - uint32 ticksPerBeat = sndFile.m_nDefaultRowsPerBeat * sndFile.m_nDefaultSpeed; + uint32 ticksPerBeat = sndFile.m_nDefaultRowsPerBeat * sndFile.Order().GetDefaultSpeed(); if(ticksPerBeat != 0) tempoScale = ticksPerBeat / 24.0f; } Modified: trunk/OpenMPT/soundlib/Load_667.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_667.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_667.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -79,8 +79,8 @@ InitializeGlobals(MOD_TYPE_S3M); m_SongFlags.set(SONG_IMPORTED); - m_nDefaultTempo.Set(150); - m_nDefaultSpeed = fileHeader.speed; + Order().SetDefaultTempoInt(150); + Order().SetDefaultSpeed(fileHeader.speed); m_nChannels = 18; m_nSamples = 64; Modified: trunk/OpenMPT/soundlib/Load_669.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_669.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -138,8 +138,8 @@ InitializeGlobals(MOD_TYPE_669); m_nMinPeriod = 28 << 2; m_nMaxPeriod = 1712 << 3; - m_nDefaultTempo.Set(78); - m_nDefaultSpeed = 4; + Order().SetDefaultTempoInt(78); + Order().SetDefaultSpeed(4); m_nChannels = 8; m_playBehaviour.set(kPeriodsAreHertz); #ifdef MODPLUG_TRACKER Modified: trunk/OpenMPT/soundlib/Load_amf.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_amf.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_amf.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -129,8 +129,8 @@ InitializeChannels(); SetupMODPanning(true); m_nChannels = 8; - m_nDefaultSpeed = fileHeader.defaultSpeed; - m_nDefaultTempo.Set(fileHeader.defaultTempo); + Order().SetDefaultSpeed(fileHeader.defaultSpeed); + Order().SetDefaultTempoInt(fileHeader.defaultTempo); m_nSamples = fileHeader.numSamples; if(fileHeader.restartPos < fileHeader.numOrders) { @@ -633,12 +633,12 @@ auto [tempo, speed] = file.ReadArray<uint8, 2>(); if(tempo < 32) tempo = 125; - m_nDefaultTempo.Set(tempo); - m_nDefaultSpeed = speed; + Order().SetDefaultTempoInt(tempo); + Order().SetDefaultSpeed(speed); } else { - m_nDefaultTempo.Set(125); - m_nDefaultSpeed = 6; + Order().SetDefaultTempoInt(125); + Order().SetDefaultSpeed(6); } // Setup Order List Modified: trunk/OpenMPT/soundlib/Load_ams.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_ams.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -790,29 +790,29 @@ uint16 headerFlags; if(fileHeader.versionLow >= 2) { - uint16 tempo = std::max(uint16(32 << 8), file.ReadUint16LE()); // 8.8 tempo - m_nDefaultTempo.SetRaw((tempo * TEMPO::fractFact) >> 8); - m_nDefaultSpeed = std::max(uint8(1), file.ReadUint8()); - file.Skip(3); // Default values for pattern editor + uint16 tempo = std::max(uint16(32 << 8), file.ReadUint16LE()); // 8.8 tempo + Order().SetDefaultTempo(TEMPO{}.SetRaw((tempo * TEMPO::fractFact) >> 8)); + Order().SetDefaultSpeed(std::max(uint8(1), file.ReadUint8())); + file.Skip(3); // Default values for pattern editor headerFlags = file.ReadUint16LE(); } else { - m_nDefaultTempo.Set(std::max(uint8(32), file.ReadUint8())); - m_nDefaultSpeed = std::max(uint8(1), file.ReadUint8()); + Order().SetDefaultTempoInt(std::max(uint8(32), file.ReadUint8())); + Order().SetDefaultSpeed(std::max(uint8(1), file.ReadUint8())); headerFlags = file.ReadUint8(); } m_SongFlags = SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS | ((headerFlags & AMS2FileHeader::linearSlides) ? SONG_LINEARSLIDES : SongFlags(0)); // Instruments - std::vector<SAMPLEINDEX> firstSample; // First sample of instrument - std::vector<uint16> sampleSettings; // Shadow sample map... Lo byte = Instrument, Hi byte, lo nibble = Sample index in instrument, Hi byte, hi nibble = Sample pack status + std::vector<SAMPLEINDEX> firstSample; // First sample of instrument + std::vector<uint16> sampleSettings; // Shadow sample map... Lo byte = Instrument, Hi byte, lo nibble = Sample index in instrument, Hi byte, hi nibble = Sample pack status enum { - instrIndexMask = 0xFF, // Shadow instrument - sampleIndexMask = 0x7F00, // Sample index in instrument + instrIndexMask = 0xFF, // Shadow instrument + sampleIndexMask = 0x7F00, // Sample index in instrument sampleIndexShift = 8, - packStatusMask = 0x8000, // If bit is set, sample is packed + packStatusMask = 0x8000, // If bit is set, sample is packed }; static_assert(MAX_INSTRUMENTS > 255); @@ -827,11 +827,11 @@ uint8 numSamples = file.ReadUint8(); uint8 sampleAssignment[120]; - MemsetZero(sampleAssignment); // Only really needed for v2.0, where the lowest and highest octave aren't cleared. + MemsetZero(sampleAssignment); // Only really needed for v2.0, where the lowest and highest octave aren't cleared. if(numSamples == 0 - || (fileHeader.versionLow > 0 && !file.ReadArray(sampleAssignment)) // v2.01+: 120 Notes - || (fileHeader.versionLow == 0 && !file.ReadRaw(mpt::span(sampleAssignment + 12, 96)).size())) // v2.0: 96 Notes + || (fileHeader.versionLow > 0 && !file.ReadArray(sampleAssignment)) // v2.01+: 120 Notes + || (fileHeader.versionLow == 0 && !file.ReadRaw(mpt::span(sampleAssignment + 12, 96)).size())) // v2.0: 96 Notes { continue; } Modified: trunk/OpenMPT/soundlib/Load_c67.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_c67.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_c67.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -165,8 +165,8 @@ m_modFormat.madeWithTracker = U_("Composer 670"); m_modFormat.charset = mpt::Charset::CP437; - m_nDefaultSpeed = fileHeader.speed; - m_nDefaultTempo.Set(143); + Order().SetDefaultSpeed(fileHeader.speed); + Order().SetDefaultTempoInt(143); Order().SetRestartPos(fileHeader.restartPos); m_nSamples = 64; m_nChannels = 4 + 9; Modified: trunk/OpenMPT/soundlib/Load_dmf.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_dmf.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_dmf.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -1041,8 +1041,8 @@ InitializeChannels(); m_SongFlags = SONG_LINEARSLIDES | SONG_ITCOMPATGXX; // this will be converted to IT format by MPT. SONG_ITOLDEFFECTS is not set because of tremor and vibrato. - m_nDefaultSpeed = 6; - m_nDefaultTempo.Set(120); + Order().SetDefaultSpeed(6); + Order().SetDefaultTempoInt(120); m_nDefaultGlobalVolume = 256; m_nSamplePreAmp = m_nVSTiVolume = 48; m_playBehaviour.set(kApplyOffsetWithoutNote); Modified: trunk/OpenMPT/soundlib/Load_dsm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_dsm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_dsm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -214,8 +214,8 @@ m_songName = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, songHeader.songName); m_nChannels = std::max(songHeader.numChannels.get(), uint16(1)); - m_nDefaultSpeed = songHeader.speed; - m_nDefaultTempo.Set(songHeader.bpm); + Order().SetDefaultSpeed(songHeader.speed); + Order().SetDefaultTempoInt(songHeader.bpm); m_nDefaultGlobalVolume = std::min(songHeader.globalVol.get(), uint8(64)) * 4u; if(!m_nDefaultGlobalVolume) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; if(songHeader.mastervol == 0x80) Modified: trunk/OpenMPT/soundlib/Load_dtm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_dtm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_dtm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -234,9 +234,9 @@ m_playBehaviour.reset(kITVibratoTremoloPanbrello); // Various files have a default speed or tempo of 0 if(fileHeader.tempo) - m_nDefaultTempo.Set(fileHeader.tempo); + Order().SetDefaultTempoInt(fileHeader.tempo); if(fileHeader.speed) - m_nDefaultSpeed = fileHeader.speed; + Order().SetDefaultSpeed(fileHeader.speed); if(fileHeader.stereoMode == 0) SetupMODPanning(true); @@ -282,7 +282,7 @@ { chunk.Skip(2); // Ticks per quarter note, typically 24 uint32 fractionalTempo = chunk.ReadUint32BE(); - m_nDefaultTempo = TEMPO(m_nDefaultTempo.GetInt() + fractionalTempo / 4294967296.0); + Order().SetDefaultTempo(TEMPO(Order().GetDefaultTempo().GetInt() + fractionalTempo / 4294967296.0)); uint16be panning[32]; chunk.ReadArray(panning); @@ -410,7 +410,7 @@ if(patternFormat == DTM_206_PATTERN_FORMAT) { // The stored data is actually not row-based, but tick-based. - numRows /= m_nDefaultSpeed; + numRows /= Order().GetDefaultSpeed(); } if(!(loadFlags & loadPatternData) || patNum > 255 || !Patterns.Insert(patNum, numRows)) { @@ -474,7 +474,7 @@ tick += (delay & 0x7F) * 0x100 + rowChunk.ReadUint8(); else tick += delay; - position = std::div(tick, m_nDefaultSpeed); + position = std::div(tick, Order().GetDefaultSpeed()); } } } else Modified: trunk/OpenMPT/soundlib/Load_far.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_far.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -165,8 +165,8 @@ InitializeGlobals(MOD_TYPE_FAR); m_nChannels = 16; m_nSamplePreAmp = 32; - m_nDefaultSpeed = fileHeader.defaultSpeed; - m_nDefaultTempo.Set(80); + Order().SetDefaultSpeed(fileHeader.defaultSpeed); + Order().SetDefaultTempoInt(80); m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; m_SongFlags = SONG_LINEARSLIDES; m_playBehaviour.set(kPeriodsAreHertz); Modified: trunk/OpenMPT/soundlib/Load_fmt.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_fmt.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_fmt.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -89,7 +89,7 @@ InitializeChannels(); m_nChannels = 8; m_nSamples = 8; - m_nDefaultTempo = TEMPO(45.5); // 18.2 Hz timer + Order().SetDefaultTempo(TEMPO(45.5)); // 18.2 Hz timer m_playBehaviour.set(kOPLNoteStopWith0Hz); m_SongFlags.set(SONG_IMPORTED); m_songName = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, fileHeader.songName); @@ -118,7 +118,7 @@ if(delay < 1 || delay > 8) return false; } - m_nDefaultSpeed = delays[0]; + Order().SetDefaultSpeed(delays[0]); const PATTERNINDEX numPatterns = fileHeader.lastPattern + 1u; const ROWINDEX numRows = fileHeader.lastRow + 1u; Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -208,8 +208,8 @@ } m_nDefaultGlobalVolume = std::min(fileHeader.masterVol * 4u, 256u); - m_nDefaultSpeed = fileHeader.tempo; - m_nDefaultTempo.Set(fileHeader.bpm); + Order().SetDefaultSpeed(fileHeader.tempo); + Order().SetDefaultTempoInt(fileHeader.bpm); // Read orders if(file.Seek(fileHeader.orderOffset)) Modified: trunk/OpenMPT/soundlib/Load_gt2.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_gt2.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_gt2.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -599,8 +599,8 @@ Patterns.ResizeArray(numPatterns); const uint8 eventSize = fileHeader.fileVersion < 4 ? 4 : 5; - TEMPO currentTempo = m_nDefaultTempo; - uint32 currentSpeed = m_nDefaultSpeed; + TEMPO currentTempo = Order().GetDefaultTempo(); + uint32 currentSpeed = Order().GetDefaultSpeed(); for(PATTERNINDEX pat = 0; pat < numPatterns; pat++) { if(!(loadFlags & loadPatternData) || !file.CanRead(fileHeader.numRows * GetNumChannels() * eventSize) || !Patterns.Insert(pat, fileHeader.numRows)) @@ -1234,8 +1234,8 @@ if(fileHeader.fileVersion <= 5) { - m_nDefaultSpeed = std::max(fileHeader.speed.get(), uint16(1)); - m_nDefaultTempo.Set(std::max(fileHeader.tempo.get(), uint16(1))); + Order().SetDefaultSpeed(std::max(fileHeader.speed.get(), uint16(1))); + Order().SetDefaultTempoInt(std::max(fileHeader.tempo.get(), uint16(1))); m_nDefaultGlobalVolume = std::min(Util::muldivr_unsigned(fileHeader.masterVol, MAX_GLOBAL_VOLUME, 4095), uint32(MAX_GLOBAL_VOLUME)); uint16 tracks = fileHeader.numPannedTracks; LimitMax(tracks, MAX_BASECHANNELS); @@ -1296,8 +1296,8 @@ if(auto chunk = chunks.GetChunk(GT2Chunk::idTCN2); chunk.CanRead(12)) { const auto [chunkVersion, bpmInt, bpmFract, speed, timeSigNum, timeSigDenum] = chunk.ReadArray<uint16be, 6>(); - m_nDefaultTempo = TEMPO(Clamp<uint16, uint16>(bpmInt, 32, 999), Util::muldivr_unsigned(bpmFract, TEMPO::fractFact, 65536)); - m_nDefaultSpeed = Clamp<uint16, uint16>(speed, 1, 255); + Order().SetDefaultTempo(TEMPO(Clamp<uint16, uint16>(bpmInt, 32, 999), Util::muldivr_unsigned(bpmFract, TEMPO::fractFact, 65536))); + Order().SetDefaultSpeed(Clamp<uint16, uint16>(speed, 1, 255)); m_nDefaultRowsPerBeat = 16 / Clamp<uint16, uint16>(timeSigDenum, 1, 16); m_nDefaultRowsPerMeasure = m_nDefaultRowsPerBeat * Clamp<uint16, uint16>(timeSigNum, 1, 16); if(chunkVersion >= 1) @@ -1520,8 +1520,8 @@ auto patterns = chunks.GetAllChunks(GT2Chunk::idPATD); Patterns.ResizeArray(static_cast<PATTERNINDEX>(patterns.size())); - TEMPO currentTempo = m_nDefaultTempo; - uint32 currentSpeed = m_nDefaultSpeed; + TEMPO currentTempo = Order().GetDefaultTempo(); + uint32 currentSpeed = Order().GetDefaultSpeed(); for(auto &patChunk : patterns) { if(!(loadFlags & loadPatternData) || !patChunk.CanRead(24)) Modified: trunk/OpenMPT/soundlib/Load_imf.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_imf.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -489,8 +489,8 @@ m_songName = mpt::String::ReadBuf(mpt::String::nullTerminated, fileHeader.title); m_SongFlags.set(SONG_LINEARSLIDES, fileHeader.flags & IMFFileHeader::linearSlides); - m_nDefaultSpeed = fileHeader.tempo; - m_nDefaultTempo.Set(fileHeader.bpm); + Order().SetDefaultSpeed(fileHeader.tempo); + Order().SetDefaultTempoInt(fileHeader.bpm); m_nDefaultGlobalVolume = fileHeader.master * 4u; m_nSamplePreAmp = fileHeader.amp; Modified: trunk/OpenMPT/soundlib/Load_it.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_it.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -533,8 +533,8 @@ if(m_nDefaultGlobalVolume > MAX_GLOBAL_VOLUME) m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; if(fileHeader.speed) - m_nDefaultSpeed = fileHeader.speed; - m_nDefaultTempo.Set(std::max(uint8(31), static_cast<uint8>(fileHeader.tempo))); + Order().SetDefaultSpeed(fileHeader.speed); + Order().SetDefaultTempoInt(std::max(uint8(31), static_cast<uint8>(fileHeader.tempo))); m_nSamplePreAmp = std::min(static_cast<uint8>(fileHeader.mv), uint8(128)); // Reading Channels Pan Positions @@ -1548,8 +1548,8 @@ itHeader.globalvol = static_cast<uint8>(m_nDefaultGlobalVolume / 2u); itHeader.mv = static_cast<uint8>(std::min(m_nSamplePreAmp, uint32(128))); - itHeader.speed = mpt::saturate_cast<uint8>(m_nDefaultSpeed); - itHeader.tempo = mpt::saturate_cast<uint8>(m_nDefaultTempo.GetInt()); // We save the real tempo in an extension below if it exceeds 255. + itHeader.speed = mpt::saturate_cast<uint8>(Order().GetDefaultSpeed()); + itHeader.tempo = mpt::saturate_cast<uint8>(Order().GetDefaultTempo().GetInt()); // We save the real tempo in an extension below if it exceeds 255. itHeader.sep = 128; // pan separation // IT doesn't have a per-instrument Pitch Wheel Depth setting, so we just store the first non-zero PWD setting in the header. for(INSTRUMENTINDEX ins = 1; ins <= GetNumInstruments(); ins++) @@ -2249,14 +2249,14 @@ mpt::IO::WriteIntLE(f, field); \ } - if(m_nDefaultTempo.GetInt() > 255) + if(Order().GetDefaultTempo().GetInt() > 255) { - uint32 tempo = m_nDefaultTempo.GetInt(); + uint32 tempo = Order().GetDefaultTempo().GetInt(); WRITEMODULAR(MagicBE("DT.."), tempo); } - if(m_nDefaultTempo.GetFract() != 0 && specs.hasFractionalTempo) + if(Order().GetDefaultTempo().GetFract() != 0 && specs.hasFractionalTempo) { - uint32 tempo = m_nDefaultTempo.GetFract(); + uint32 tempo = Order().GetDefaultTempo().GetFract(); WRITEMODULAR(MagicLE("DTFR"), tempo); } @@ -2472,8 +2472,8 @@ switch (code) // interpret field code { - case MagicBE("DT.."): { uint32 tempo; ReadField(chunk, size, tempo); m_nDefaultTempo.Set(tempo, m_nDefaultTempo.GetFract()); break; } - case MagicLE("DTFR"): { uint32 tempoFract; ReadField(chunk, size, tempoFract); m_nDefaultTempo.Set(m_nDefaultTempo.GetInt(), tempoFract); break; } + case MagicBE("DT.."): { uint32 tempo; ReadField(chunk, size, tempo); Order().SetDefaultTempo(TEMPO(tempo, Order().GetDefaultTempo().GetFract())); break; } + case MagicLE("DTFR"): { uint32 tempoFract; ReadField(chunk, size, tempoFract); Order().SetDefaultTempo(TEMPO(Order().GetDefaultTempo().GetInt(), tempoFract)); break; } case MagicBE("RPB."): ReadField(chunk, size, m_nDefaultRowsPerBeat); break; case MagicBE("RPM."): ReadField(chunk, size, m_nDefaultRowsPerMeasure); break; // FIXME: If there are only PC events on the last few channels in an MPTM MO3, they won't be imported! @@ -2589,7 +2589,7 @@ } // Validate read values. - Limit(m_nDefaultTempo, GetModSpecifications().GetTempoMin(), GetModSpecifications().GetTempoMax()); + Order().SetDefaultTempo(Clamp(Order().GetDefaultTempo(), GetModSpecifications().GetTempoMin(), GetModSpecifications().GetTempoMax())); if(m_nTempoMode >= TempoMode::NumModes) m_nTempoMode = TempoMode::Classic; if(m_nMixLevels >= MixLevels::NumMixLevels) Modified: trunk/OpenMPT/soundlib/Load_itp.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_itp.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -193,8 +193,8 @@ m_nDefaultGlobalVolume = file.ReadUint32LE(); m_nSamplePreAmp = file.ReadUint32LE(); - m_nDefaultSpeed = std::max(uint32(1), file.ReadUint32LE()); - m_nDefaultTempo.Set(std::max(uint32(32), file.ReadUint32LE())); + Order().SetDefaultSpeed(std::max(uint32(1), file.ReadUint32LE())); + Order().SetDefaultTempoInt(std::max(uint32(32), file.ReadUint32LE())); m_nChannels = static_cast<CHANNELINDEX>(file.ReadUint32LE()); if(m_nChannels == 0 || m_nChannels > MAX_BASECHANNELS) { Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -483,8 +483,8 @@ m_songArtist = mpt::ToUnicode(mpt::Charset::CP437, mpt::String::ReadBuf(mpt::String::spacePadded, info.composer)); m_nDefaultGlobalVolume = info.globalVol + 1; - m_nDefaultSpeed = Clamp<uint8, uint8>(info.speed, 1, 255); - m_nDefaultTempo.Set(Clamp<uint8, uint8>(info.tempo, 4, 255)); + Order().SetDefaultSpeed(Clamp<uint8, uint8>(info.speed, 1, 255)); + Order().SetDefaultTempoInt(Clamp<uint8, uint8>(info.tempo, 4, 255)); ReadOrderFromFile<uint8>(Order(), chunk, info.numOrders); Order().SetRestartPos(info.restartPos); Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_med.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -1197,15 +1197,12 @@ 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); - if(song == 0) + order.SetDefaultTempo(MMDTempoToBPM(songHeader.defaultTempo, is8Ch, bpmMode, rowsPerBeat)); + order.SetDefaultSpeed(Clamp<uint8, uint8>(songHeader.tempo2, 1, 32)); + if(bpmMode) { - 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; - } + m_nDefaultRowsPerBeat = rowsPerBeat; + m_nDefaultRowsPerMeasure = m_nDefaultRowsPerBeat * 4u; } if(songHeader.masterVol) Modified: trunk/OpenMPT/soundlib/Load_mid.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_mid.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -649,13 +649,13 @@ SetMixLevels(MixLevels::v1_17RC3); m_nTempoMode = TempoMode::Modern; m_SongFlags = SONG_LINEARSLIDES; - m_nDefaultTempo.Set(120); - m_nDefaultSpeed = ticksPerRow; + TEMPO tempo{120, 0}; + Order().SetDefaultTempo(tempo); + Order().SetDefaultSpeed(ticksPerRow); m_nChannels = MAX_BASECHANNELS; m_nDefaultRowsPerBeat = quantize / 4; m_nDefaultRowsPerMeasure = 4 * m_nDefaultRowsPerBeat; m_nSamplePreAmp = m_nVSTiVolume = 32; - TEMPO tempo = m_nDefaultTempo; uint16 ppqn = fileHeader.division; if(ppqn & 0x8000) { @@ -832,7 +832,7 @@ TEMPO newTempo(60000000.0 / tempoInt); if(!tick) { - m_nDefaultTempo = newTempo; + Order().SetDefaultTempo(newTempo); } else if(newTempo != tempo) { patRow[tempoChannel].command = CMD_TEMPO; Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mo3.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_mo3.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -835,8 +835,8 @@ Order().SetRestartPos(fileHeader.restartPos); m_nInstruments = fileHeader.numInstruments; m_nSamples = fileHeader.numSamples; - m_nDefaultSpeed = fileHeader.defaultSpeed ? fileHeader.defaultSpeed : 6; - m_nDefaultTempo.Set(fileHeader.defaultTempo ? fileHeader.defaultTempo : 125, 0); + Order().SetDefaultSpeed(fileHeader.defaultSpeed ? fileHeader.defaultSpeed : 6); + Order().SetDefaultTempoInt(fileHeader.defaultTempo ? fileHeader.defaultTempo : 125); if(fileHeader.flags & MO3FileHeader::isIT) SetType(MOD_TYPE_IT); Modified: trunk/OpenMPT/soundlib/Load_mod.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_mod.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -980,8 +980,8 @@ Order().SetRestartPos(0); } - m_nDefaultSpeed = 6; - m_nDefaultTempo.Set(125); + Order().SetDefaultSpeed(6); + Order().SetDefaultTempoInt(125); m_nMinPeriod = 14 * 4; m_nMaxPeriod = 3424 * 4; // Prevent clipping based on number of channels... If all channels are playing at full volume, "256 / #channels" @@ -1595,11 +1595,11 @@ if(!memcmp(songname, "jjk55", 6)) fileHeader.restartPos = 0x78; // Sample 7 in echoing.mod won't "loop" correctly if we don't convert the VBlank tempo. - m_nDefaultTempo.Set(125); + Order().SetDefaultTempoInt(125); if(fileHeader.restartPos != 0x78) { // Convert to CIA timing - m_nDefaultTempo = TEMPO((709379.0 * 125.0 / 50.0) / ((240 - fileHeader.restartPos) * 122.0)); + Order().SetDefaultTempo(TEMPO((709379.0 * 125.0 / 50.0) / ((240 - fileHeader.restartPos) * 122.0))); if(minVersion > UST1_80) { // D.O.C. SoundTracker IX re-introduced the variable tempo after some other versions dropped it. @@ -2009,8 +2009,8 @@ // Now we can be pretty sure that this is a valid MOD file. Set up default song settings. m_nChannels = 4; m_nInstruments = 0; - m_nDefaultSpeed = 6; - m_nDefaultTempo.Set(125); + Order().SetDefaultSpeed(6); + Order().SetDefaultTempoInt(125); m_nMinPeriod = 14 * 4; m_nMaxPeriod = 3424 * 4; m_nSamplePreAmp = 64; @@ -2227,7 +2227,7 @@ if(info.volume != 0) m_nSamplePreAmp = std::min(uint16(64), static_cast<uint16>(info.volume)); if(info.tempo != 0 && !vblank) - m_nDefaultTempo.Set(info.tempo); + Order().SetDefaultTempoInt(info.tempo); if(info.name[0]) m_songName = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, info.name); Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -457,8 +457,8 @@ m_songName = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, fileHeader.songName); m_nChannels = fileHeader.numChannels; - m_nDefaultSpeed = Clamp<uint8, uint8>(fileHeader.ticksPerLine, 1, 31); - m_nDefaultTempo.Set(125); + Order().SetDefaultSpeed(Clamp<uint8, uint8>(fileHeader.ticksPerLine, 1, 31)); + Order().SetDefaultTempoInt(125); m_SongFlags = SONG_LINEARSLIDES | SONG_ITCOMPATGXX | SONG_EXFILTERRANGE; m_nInstruments = fileHeader.numInstruments; m_nSamples = fileHeader.numSamples; @@ -563,11 +563,11 @@ { if(hasLegacyTempo) { - m_nDefaultTempo.SetRaw(Util::muldivr(110250, TEMPO::fractFact, fileHeader.samplesPerTick)); + Order().SetDefaultTempo(TEMPO{}.SetRaw(Util::muldivr(110250, TEMPO::fractFact, fileHeader.samplesPerTick))); m_nTempoMode = TempoMode::Classic; } else { - m_nDefaultTempo = TEMPO(44100.0 * 60.0 / (m_nDefaultSpeed * m_nDefaultRowsPerBeat * fileHeader.samplesPerTick)); + Order().SetDefaultTempo(TEMPO(44100.0 * 60.0 / (Order().GetDefaultSpeed() * m_nDefaultRowsPerBeat * fileHeader.samplesPerTick))); m_nTempoMode = TempoMode::Modern; } } @@ -589,7 +589,7 @@ double d = chunk.ReadDoubleLE(); if(d > 0.00000001) { - m_nDefaultTempo = TEMPO(44100.0 * 60.0 / (m_nDefaultSpeed * m_nDefaultRowsPerBeat * d)); + Order().SetDefaultTempo(TEMPO(44100.0 * 60.0 / (Order().GetDefaultSpeed() * m_nDefaultRowsPerBeat * d))); } } break; Modified: trunk/OpenMPT/soundlib/Load_okt.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_okt.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_okt.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -403,7 +403,7 @@ // Read default speed if(chunk.GetLength() >= 2) { - m_nDefaultSpeed = Clamp(chunk.ReadUint16BE(), uint16(1), uint16(255)); + Order().SetDefaultSpeed(Clamp(chunk.ReadUint16BE(), uint16(1), uint16(255))); } break; @@ -446,7 +446,7 @@ if(m_nChannels == 0) return false; - m_nDefaultTempo.Set(125); + Order().SetDefaultTempoInt(125); m_nDefaultGlobalVolume = MAX_GLOBAL_VOLUME; m_nSamplePreAmp = m_nVSTiVolume = 48; m_nMinPeriod = 113 * 4; Modified: trunk/OpenMPT/soundlib/Load_plm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_plm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_plm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -158,8 +158,8 @@ m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, fileHeader.songName); m_nChannels = fileHeader.numChannels + 1; // Additional channel for writing pattern breaks m_nSamplePreAmp = fileHeader.amplify; - m_nDefaultTempo.Set(fileHeader.tempo); - m_nDefaultSpeed = fileHeader.speed; + Order().SetDefaultTempoInt(fileHeader.tempo); + Order().SetDefaultSpeed(fileHeader.speed); for(CHANNELINDEX chn = 0; chn < fileHeader.numChannels; chn++) { ChnSettings[chn].nPan = fileHeader.panPos[chn] * 0x11; Modified: trunk/OpenMPT/soundlib/Load_psm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_psm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -14,10 +14,6 @@ #include "mpt/parse/parse.hpp" -#ifdef LIBOPENMPT_BUILD -#define MPT_PSM_USE_REAL_SUBSONGS -#endif - OPENMPT_NAMESPACE_BEGIN //////////////////////////////////////////////////////////// @@ -166,8 +162,6 @@ { std::vector<uint8> channelPanning, channelVolume; std::vector<bool> channelSurround; - ORDERINDEX startOrder = ORDERINDEX_INVALID, endOrder = ORDERINDEX_INVALID, restartPos = 0; - uint8 defaultTempo = 125, defaultSpeed = 6; char songName[10] = {}; PSMSubSong() @@ -360,7 +354,6 @@ PSMSubSong subsong; mpt::String::WriteAutoBuf(subsong.songName) = mpt::String::ReadBuf(mpt::String::nullTerminated, songHeader.songType); -#ifdef MPT_PSM_USE_REAL_SUBSONGS if(!Order().empty()) { // Add a new sequence for this subsong @@ -368,7 +361,6 @@ break; } Order().SetName(mpt::ToUnicode(mpt::Charset::CP437, subsong.songName)); -#endif // MPT_PSM_USE_REAL_SUBSONGS // Read "Sub chunks" auto subChunks = chunk.ReadChunks<PSMChunk>(1); @@ -422,9 +414,6 @@ { case 0x01: // Play order list item { - if(subsong.startOrder == ORDERINDEX_INVALID) - subsong.startOrder = Order().GetLength(); - subsong.endOrder = Order().GetLength(); PATTERNINDEX pat = ReadPSMPatternIndex(subChunk, sinariaFormat); if(pat == 0xFF) pat = Order.GetInvalidPatIndex(); @@ -446,8 +435,7 @@ { uint16 restartChunk = subChunk.ReadUint16LE(); if(restartChunk >= firstOrderChunk) - subsong.restartPos = static_cast<ORDERINDEX>(restartChunk - firstOrderChunk); // Close enough - we assume that order list is continuous (like in any real-world PSM) - Order().SetRestartPos(subsong.restartPos); + Order().SetRestartPos(static_cast<ORDERINDEX>(restartChunk - firstOrderChunk)); // Close enough - we assume that order list is continuous (like in any real-world PSM) if(opcode == 0x03) subChunk.Skip(1); } @@ -465,11 +453,11 @@ break; case 0x07: // Default Speed - subsong.defaultSpeed = subChunk.ReadUint8(); + Order().SetDefaultSpeed(subChunk.ReadUint8()); break; case 0x08: // Default Tempo - subsong.defaultTempo = subChunk.ReadUint8(); + Order().SetDefaultTempoInt(subChunk.ReadUint8()); break; case 0x0C: // Sample map table @@ -545,17 +533,11 @@ } // Attach this subsong to the subsong list - finally, all "sub sub sub ..." chunks are parsed. - if(subsong.startOrder != ORDERINDEX_INVALID && subsong.endOrder != ORDERINDEX_INVALID) - { - // Separate subsongs by "---" patterns - Order().push_back(); + if(!Order().empty()) subsongs.push_back(subsong); - } } -#ifdef MPT_PSM_USE_REAL_SUBSONGS Order.SetSequence(0); -#endif // MPT_PSM_USE_REAL_SUBSONGS if(subsongs.empty()) return false; @@ -608,9 +590,6 @@ } // Make the default variables of the first subsong global - m_nDefaultSpeed = subsongs[0].defaultSpeed; - m_nDefaultTempo.Set(subsongs[0].defaultTempo); - Order().SetRestartPos(subsongs[0].restartPos); for(CHANNELINDEX chn = 0; chn < m_nChannels; chn++) { ChnSettings[chn].Reset(); @@ -874,16 +853,11 @@ // Write subsong "configuration" to patterns (only if there are multiple subsongs) for(size_t i = 0; i < subsongs.size(); i++) { -#ifdef MPT_PSM_USE_REAL_SUBSONGS - ModSequence &order = Order(static_cast<SEQUENCEINDEX>(i)); -#else - ModSequence &order = Order(); -#endif // MPT_PSM_USE_REAL_SUBSONGS const PSMSubSong &subsong = subsongs[i]; - PATTERNINDEX startPattern = order[subsong.startOrder]; - if(Patterns.IsValidPat(startPattern)) + ModSequence &order = Order(static_cast<SEQUENCEINDEX>(i)); + if(order.IsValidPat(0)) { - startPattern = order.EnsureUnique(subsong.startOrder); + PATTERNINDEX startPattern = startPattern = order.EnsureUnique(0); // Subsongs with different panning setup -> write to pattern (MUSIC_C.PSM) // Don't write channel volume for now, as there is no real-world module which needs it. if(subsongPanningDiffers) @@ -896,37 +870,7 @@ Patterns[startPattern].WriteEffect(EffectWriter(CMD_PANNING8, subsong.channelPanning[chn]).Row(0).Channel(chn).RetryNextRow()); } } - // Write default tempo/speed to pattern - Patterns[startPattern].WriteEffect(EffectWriter(CMD_SPEED, subsong.defaultSpeed).Row(0).RetryNextRow()); - Patterns[startPattern].WriteEffect(EffectWriter(CMD_TEMPO, subsong.defaultTempo).Row(0).RetryNextRow()); - } - -#ifndef MPT_PSM_USE_REAL_SUBSONGS - // Add restart position to the last pattern - PATTERNINDEX endPattern = order[subsong.endOrder]; - if(Patterns.IsValidPat(endPattern)) - { - endPattern = order.EnsureUnique(subsong.endOrder); - ROWINDEX lastRow = Patterns[endPattern].GetNumRows() - 1; - auto m = Patterns[endPattern].cbegin(); - for(uint32 cell = 0; cell < m_nChannels * Patterns[endPattern].GetNumRows(); cell++, m++) - { - if(m->command == CMD_PATTERNBREAK || m->command == CMD_POSITIONJUMP) - { - lastRow = cell / m_nChannels; - break; - } - } - Patterns[endPattern].WriteEffect(EffectWriter(CMD_POSITIONJUMP, mpt::saturate_cast<ModCommand::PARAM>(subsong.startOrder + subsong.restartPos)).Row(lastRow).RetryPreviousRow()); - } - - // Set the subsong name to all pattern names - for(ORDERINDEX ord = subsong.startOrder; ord <= subsong.endOrder; ord++) - { - if(Patterns.IsValidIndex(order[ord])) - Patterns[order[ord]].SetName(subsong.songName); } -#endif // MPT_PSM_USE_REAL_SUBSONGS } } @@ -1122,8 +1066,8 @@ // Most of the time, the master volume value makes sense... Just not when it's 255. m_nSamplePreAmp = 48; } - m_nDefaultSpeed = fileHeader.songSpeed; - m_nDefaultTempo.Set(fileHeader.songTempo); + Order().SetDefaultSpeed(fileHeader.songSpeed); + Order().SetDefaultTempoInt(fileHeader.songTempo); m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, fileHeader.songName); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -403,21 +403,17 @@ m_SongFlags.set(SONG_FASTVOLSLIDES); } - // Speed - m_nDefaultSpeed = fileHeader.speed; - if(m_nDefaultSpeed == 0 || (m_nDefaultSpeed == 255 && isST3)) - { - // Even though ST3 accepts the command AFF as expected, it mysteriously fails to load a default speed of 255... - m_nDefaultSpeed = 6; - } + // Even though ST3 accepts the command AFF as expected, it mysteriously fails to load a default speed of 255... + if(fileHeader.speed == 0 || (fileHeader.speed == 255 && isST3)) + Order().SetDefaultSpeed(6); + else + Order().SetDefaultSpeed(fileHeader.speed); - // Tempo - m_nDefaultTempo.Set(fileHeader.tempo); + // ST3 also fails to load an otherwise valid default tempo of 32... if(fileHeader.tempo < 33) - { - // ST3 also fails to load an otherwise valid default tempo of 32... - m_nDefaultTempo.Set(isST3 ? 125 : 32); - } + Order().SetDefaultTempoInt(isST3 ? 125 : 32); + else + Order().SetDefaultTempoInt(fileHeader.tempo); // Global Volume m_nDefaultGlobalVolume = std::min(fileHeader.globalVol.get(), uint8(64)) * 4u; @@ -790,8 +786,8 @@ // Song Variables fileHeader.globalVol = static_cast<uint8>(std::min(m_nDefaultGlobalVolume / 4u, uint32(64))); - fileHeader.speed = static_cast<uint8>(Clamp(m_nDefaultSpeed, 1u, 254u)); - fileHeader.tempo = static_cast<uint8>(Clamp(m_nDefaultTempo.GetInt(), 33u, 255u)); + fileHeader.speed = static_cast<uint8>(Clamp(Order().GetDefaultSpeed(), 1u, 254u)); + fileHeader.tempo = static_cast<uint8>(Clamp(Order().GetDefaultTempo().GetInt(), 33u, 255u)); fileHeader.masterVolume = static_cast<uint8>(Clamp(m_nSamplePreAmp, 16u, 127u) | 0x80); fileHeader.ultraClicks = 16; fileHeader.usePanningTable = S3MFileHeader::idPanning; Modified: trunk/OpenMPT/soundlib/Load_sfx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_sfx.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_sfx.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -192,8 +192,8 @@ m_nChannels = 4; m_nInstruments = 0; - m_nDefaultTempo = TEMPO((14565.0 * 122.0) / fileHeader.speed); - m_nDefaultSpeed = 6; + Order().SetDefaultTempo(TEMPO((14565.0 * 122.0) / fileHeader.speed)); + Order().SetDefaultSpeed(6); m_nMinPeriod = 14 * 4; m_nMaxPeriod = 3424 * 4; m_nSamplePreAmp = 64; Modified: trunk/OpenMPT/soundlib/Load_stm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_stm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_stm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -253,8 +253,8 @@ if(initTempo == 0) initTempo = 0x60; - m_nDefaultTempo = ConvertST2Tempo(initTempo); - m_nDefaultSpeed = initTempo >> 4; + Order().SetDefaultTempo(ConvertST2Tempo(initTempo)); + Order().SetDefaultSpeed(initTempo >> 4); if(fileHeader.verMinor > 10) m_nDefaultGlobalVolume = std::min(fileHeader.globalVolume, uint8(64)) * 4u; @@ -475,8 +475,8 @@ if(initTempo == 0) initTempo = 0x60; - m_nDefaultTempo = ConvertST2Tempo(initTempo); - m_nDefaultSpeed = initTempo >> 4; + Order().SetDefaultTempo(ConvertST2Tempo(initTempo)); + Order().SetDefaultSpeed(initTempo >> 4); m_nDefaultGlobalVolume = std::min(fileHeader.globalVolume, uint8(64)) * 4u; // Setting up channels Modified: trunk/OpenMPT/soundlib/Load_stp.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_stp.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_stp.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -263,8 +263,8 @@ m_nChannels = 4; m_nSamples = 0; - m_nDefaultSpeed = fileHeader.speed; - m_nDefaultTempo = ConvertTempo(fileHeader.timerCount); + Order().SetDefaultSpeed(fileHeader.speed); + Order().SetDefaultTempo(ConvertTempo(fileHeader.timerCount)); m_nMinPeriod = 14 * 4; m_nMaxPeriod = 3424 * 4; Modified: trunk/OpenMPT/soundlib/Load_symmod.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_symmod.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_symmod.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -1075,7 +1075,7 @@ break; case ChunkType::Tempo: - m_nDefaultTempo = TEMPO(1.24 * std::min(file.ReadUint32BE(), uint32(800))); + Order().SetDefaultTempo(TEMPO(1.24 * std::min(file.ReadUint32BE(), uint32(800)))); break; // Unused values Modified: trunk/OpenMPT/soundlib/Load_wav.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_wav.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_wav.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -111,8 +111,8 @@ m_nSamples = wavFile.GetNumChannels(); m_nInstruments = 0; - m_nDefaultSpeed = ticksPerRow; - m_nDefaultTempo.Set(125); + Order().SetDefaultSpeed(ticksPerRow); + Order().SetDefaultTempoInt(125); m_SongFlags = SONG_LINEARSLIDES; for(CHANNELINDEX channel = 0; channel < m_nChannels; channel++) Modified: trunk/OpenMPT/soundlib/Load_xm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp Mon Apr 8 20:39:45 2024 (r20534) +++ trunk/OpenMPT/soundlib/Load_xm.cpp Mon Apr 8 21:13:21 2024 (r20535) @@ -666,9 +666,9 @@ m_nChannels = fileHeader.channels; m_nInstruments = std::min(static_cast<uint16>(fileHeader.instruments), static_cast<uint16>(MAX_INSTRUMENTS - 1)); if(fileHeader.speed) - m_nDefaultSpeed = fileHeader.speed; + Order().SetDefaultSpeed(fileHeader.speed); if(fileHeader.tempo) - m_nDefaultTempo = Clamp(TEMPO(fileHeader.tempo, 0), ModSpecs::xmEx.GetTempoMin(), ModSpecs::xmEx.GetTempoMax()); + Order().SetDefaultTempo(Clamp(TEMPO(fileHeader.tempo, 0), ModSpecs::xmEx.GetTempoMin(), ModSpecs::xmEx.GetTempoMax())); m_SongFlags.reset(); m_SongFlags.set(SONG_LINEARSLIDES, (fileHeader.flags & XMFileHeader::linearSlides) != 0); @@ -1135,8 +1135,8 @@ fileHeader.flags = fileHeader.flags; // Fasttracker 2 will happily accept any tempo faster than 255 BPM. XMPlay does also support this, great! - fileHeader.tempo = mpt::saturate_cast<uint16>(m_nDefaultTempo.GetInt()); - fileHeader.speed = static_cast<uint16>(Clamp(m_nDefaultSpeed, 1u, 31u)); + fileHeader.tempo = mpt::saturate_cast<uint16>(Order().GetDefaultTempo().GetInt()); + fileHeader.speed = static_cast<uint16>(Clamp(Order().GetDefaultSpeed(), 1u, 31u)); mpt::IO::Write(f, fileHeader); Modified: trunk/OpenMPT/soundlib/ModSequence.cpp ==============================================================================... [truncated message content] |