From: <sv...@op...> - 2025-03-23 16:20:23
|
Author: sagamusix Date: Sun Mar 23 17:20:10 2025 New Revision: 23076 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23076 Log: [Mod] Allow MIDI library entries unset by user to stay unset after restarting OpenMPT (https://bugs.openmpt.org/view.php?id=1870). Modified: trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/soundlib/Load_mid.cpp Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Sun Mar 23 15:31:18 2025 (r23075) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Sun Mar 23 17:20:10 2025 (r23076) @@ -400,7 +400,7 @@ { for(uint32 ins = 0; ins < 256; ins++) { - if(replaceAll || midiLibrary[ins].empty()) + if(replaceAll || !midiLibrary[ins] || midiLibrary[ins]->empty()) { uint32 prog = (ins < 128) ? ins : 0xFF; uint32 key = (ins < 128) ? 0xFF : ins & 0x7F; @@ -457,36 +457,40 @@ filename = localPatchDir + filename + P_(".pat"); } } - if(!filename.empty()) - { - filename = theApp.PathInstallRelativeToAbsolute(filename); - midiLibrary[prog] = filename; - } + + if(filename == P_("*empty")) + midiLibrary[prog] = P_(""); + else if(!filename.empty()) + midiLibrary[prog] = theApp.PathInstallRelativeToAbsolute(filename); } } void CTrackApp::ExportMidiConfig(const mpt::PathString &filename) { - if(filename.empty()) return; + if(filename.empty()) + return; IniFileSettingsContainer file(filename); ExportMidiConfig(file); } void CTrackApp::ExportMidiConfig(SettingsContainer &file) { - for(uint32 prog = 0; prog < 256; prog++) if (!midiLibrary[prog].empty()) + for(uint32 prog = 0; prog < 256; prog++) { - mpt::PathString szFileName = midiLibrary[prog]; - - if(!szFileName.empty()) + const mpt::ustring key = MPT_UFORMAT("{}{}")((prog < 128) ? U_("Midi") : U_("Perc"), prog & 0x7F); + if(!midiLibrary[prog]) { - if(theApp.IsPortableMode()) - szFileName = theApp.PathAbsoluteToInstallRelative(szFileName); - - mpt::ustring key = MPT_UFORMAT("{}{}")((prog < 128) ? U_("Midi") : U_("Perc"), prog & 0x7F); - file.Write<mpt::PathString>(U_("Midi Library"), key, szFileName); + file.Forget(U_("Midi Library"), key); + continue; } + + mpt::PathString fileName = *midiLibrary[prog]; + if(midiLibrary[prog]->empty()) + fileName = P_("*empty"); + else if(theApp.IsPortableMode()) + fileName = theApp.PathAbsoluteToInstallRelative(fileName); + file.Write<mpt::PathString>(U_("Midi Library"), key, fileName); } } @@ -1384,9 +1388,6 @@ RUNTIME_CLASS(CModControlView)); AddDocTemplate(m_pModTemplate); - // Load Midi Library - ImportMidiConfig(theApp.GetSettings(), {}, true); - // Enable DDE Execute open // requires m_pDocManager EnableShellOpen(); @@ -1424,9 +1425,11 @@ // Set default note names CSoundFile::SetDefaultNoteNames(); - // Load DLS Banks + // Load Soundfonts and default MIDI Library if (!cmdInfo.m_noDls) m_scannedDlsBanks = LoadDefaultDLSBanks(); + // Load user-defined MIDI Library + ImportMidiConfig(theApp.GetSettings(), {}, true); // Initialize Plugins if (!cmdInfo.m_noPlugins) InitializeDXPlugins(); Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Sun Mar 23 15:31:18 2025 (r23075) +++ trunk/OpenMPT/mptrack/Mptrack.h Sun Mar 23 17:20:10 2025 (r23076) @@ -61,7 +61,9 @@ ///////////////////////////////////////////////////////////////////////////// // Midi Library -using MidiLibrary = std::array<mpt::PathString, 128 * 2>; // 128 instruments + 128 percussions +// 128 melodic instruments + 128 percussions +// std::nullopt = default, empty string = unassigned by user +using MidiLibrary = std::array<std::optional<mpt::PathString>, 128 * 2>; ////////////////////////////////////////////////////////////////////////// Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Sun Mar 23 15:31:18 2025 (r23075) +++ trunk/OpenMPT/mptrack/View_tre.cpp Sun Mar 23 17:20:10 2025 (r23076) @@ -535,9 +535,9 @@ int image = IMAGE_INSTRMUTE; s = mpt::cfmt::val(iMidi) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiProgramNames[iMidi]); const LPARAM param = (MODITEM_MIDIINSTRUMENT << MIDILIB_SHIFT) | iMidi; - if(!midiLib[iMidi].empty()) + if(midiLib[iMidi] && !midiLib[iMidi]->empty()) { - s += _T(": ") + midiLib[iMidi].GetFilename().ToCString(); + s += _T(": ") + midiLib[iMidi]->GetFilename().ToCString(); image = IMAGE_INSTRUMENTS; } if(!m_tiMidi[iMidi]) @@ -571,9 +571,9 @@ s = mpt::ToCString(CSoundFile::GetNoteName((ModCommand::NOTE)(iPerc + NOTE_MIN), CSoundFile::GetDefaultNoteNames())) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiPercussionNames[iPerc - 24]); const LPARAM param = (MODITEM_MIDIPERCUSSION << MIDILIB_SHIFT) | iPerc; - if(!midiLib[iPerc | 0x80].empty()) + if(midiLib[iPerc | 0x80] && !midiLib[iPerc | 0x80]->empty()) { - s += _T(": ") + midiLib[iPerc | 0x80].GetFilename().ToCString(); + s += _T(": ") + midiLib[iPerc | 0x80]->GetFilename().ToCString(); image = IMAGE_SAMPLES; } if(!m_tiPerc[iPerc]) @@ -1585,20 +1585,20 @@ case MODITEM_MIDIINSTRUMENT: { const MidiLibrary &midiLib = CTrackApp::GetMidiLibrary(); - if(modItemID < midiLib.size() && !midiLib[modItemID].empty()) + if(modItemID < midiLib.size() && midiLib[modItemID] && !midiLib[modItemID]->empty()) { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CDLSBank *dlsBank = nullptr; - if(!mpt::PathCompareNoCase(m_cachedBankName, midiLib[modItemID])) + if(!mpt::PathCompareNoCase(m_cachedBankName, *midiLib[modItemID])) { dlsBank = m_cachedBank.get(); } - if(dlsBank == nullptr && CDLSBank::IsDLSBank(midiLib[modItemID])) + if(dlsBank == nullptr && CDLSBank::IsDLSBank(*midiLib[modItemID])) { m_cachedBank = std::make_unique<CDLSBank>(); - if(m_cachedBank->Open(midiLib[modItemID])) + if(m_cachedBank->Open(*midiLib[modItemID])) { - m_cachedBankName = midiLib[modItemID]; + m_cachedBankName = *midiLib[modItemID]; dlsBank = m_cachedBank.get(); } } @@ -1616,7 +1616,7 @@ } } else { - pMainFrm->PlaySoundFile(midiLib[modItemID], note, volume); + pMainFrm->PlaySoundFile(*midiLib[modItemID], note, volume); } } } @@ -2543,11 +2543,12 @@ dropInfo.dropItem |= 0x80; [[fallthrough]]; case MODITEM_MIDIINSTRUMENT: + if(dropInfo.dropItem < CTrackApp::GetMidiLibrary().size()) { - MidiLibrary &midiLib = CTrackApp::GetMidiLibrary(); - if(!midiLib[dropInfo.dropItem & 0xFF].empty()) + const auto &libItem = CTrackApp::GetMidiLibrary()[dropInfo.dropItem]; + if(libItem && !libItem->empty()) { - fullPath = midiLib[dropInfo.dropItem & 0xFF]; + fullPath = *libItem; dropInfo.dropType = DRAGONDROP_MIDIINSTR; dropInfo.dropParam = reinterpret_cast<uintptr_t>(&fullPath); } Modified: trunk/OpenMPT/soundlib/Load_mid.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp Sun Mar 23 15:31:18 2025 (r23075) +++ trunk/OpenMPT/soundlib/Load_mid.cpp Sun Mar 23 17:20:10 2025 (r23076) @@ -1359,7 +1359,7 @@ continue; } - const mpt::PathString &midiMapName = midiLib[midiCode]; + const mpt::PathString &midiMapName = midiLib[midiCode].value_or(P_("")); if(!midiMapName.empty()) { // Load from DLS/SF2 Bank |