From: <sag...@us...> - 2012-10-21 15:29:37
|
Revision: 1375 http://modplug.svn.sourceforge.net/modplug/?rev=1375&view=rev Author: saga-games Date: 2012-10-21 15:29:30 +0000 (Sun, 21 Oct 2012) Log Message: ----------- [New] Tree View: It is now possible to rearrange / insert / duplicate samples and instruments. [Mod] OpenMPT: Version is now 1.20.03.05 Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -1157,8 +1157,11 @@ LockControls(); if (dwHintMask & HINT_MIXPLUGINS) OnMixPlugChanged(); UnlockControls(); - if (!(dwHintMask & (HINT_INSTRUMENT|HINT_ENVELOPE|HINT_MODTYPE))) return; - if (((dwHintMask >> HINT_SHIFT_INS) != m_nInstrument) && (dwHintMask & (HINT_INSTRUMENT|HINT_ENVELOPE)) && (!(dwHintMask & HINT_MODTYPE))) return; + if(!(dwHintMask & (HINT_INSTRUMENT | HINT_ENVELOPE| HINT_MODTYPE))) return; + + const INSTRUMENTINDEX updateIns = (dwHintMask >> HINT_SHIFT_INS); + + if(updateIns != m_nInstrument && updateIns != 0 && (dwHintMask & (HINT_INSTRUMENT | HINT_ENVELOPE)) && !(dwHintMask & HINT_MODTYPE)) return; LockControls(); if (!m_bInitialized) dwHintMask |= HINT_MODTYPE; @@ -2191,6 +2194,10 @@ pIns->nMidiChannel = MidiFirstChannel; UpdateView((m_nInstrument << HINT_SHIFT_INS) | HINT_INSTRUMENT, NULL); } + if(pIns->midiPWD == 0) + { + pIns->midiPWD = 2; + } // If we just dialled up an instrument plugin, zap the sample assignments. const std::set<SAMPLEINDEX> referencedSamples = pIns->GetSamples(); @@ -2389,7 +2396,7 @@ //---------------------------------------------------------------------- { CModControlDlg::OnVScroll(nCode, nPos, pSB); - //if (nCode == SB_ENDSCROLL) SwitchToView(); + if (nCode == SB_ENDSCROLL) SwitchToView(); } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -554,7 +554,10 @@ m_ToolBar2.UpdateStyle(); } if (!(dwHintMask & (HINT_SAMPLEINFO|HINT_MODTYPE))) return; - if (((dwHintMask >> HINT_SHIFT_SMP) != m_nSample) && (!(dwHintMask & HINT_MODTYPE))) return; + + const SAMPLEINDEX updateSmp = (dwHintMask >> HINT_SHIFT_SMP); + + if(updateSmp != m_nSample && updateSmp != 0 && !(dwHintMask & HINT_MODTYPE)) return; LockControls(); if (!m_bInitialized) dwHintMask |= HINT_MODTYPE; // Updating Ranges Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -2771,7 +2771,7 @@ for(INSTRUMENTINDEX nIns = 1; nIns <= m_SndFile.GetNumInstruments(); nIns++) { if(m_SndFile.Instruments[nIns] != nullptr) - { + { StringFixer::FixNullString(m_SndFile.Instruments[nIns]->name); StringFixer::FixNullString(m_SndFile.Instruments[nIns]->filename); } @@ -2831,3 +2831,20 @@ OnSaveDocument(fdr.first_file.c_str(), true/*template file*/); m_strPathName = sOldPath; } + + +// Create an undo point that stores undo data for all existing patterns +void CModDoc::PrepareUndoForAllPatterns(bool storeChannelInfo) +//------------------------------------------------------------ +{ + bool linkUndo = false; + for(PATTERNINDEX pat = 0; pat < m_SndFile.Patterns.Size(); pat++) + { + if(m_SndFile.Patterns.IsValidPat(pat)) + { + GetPatternUndo().PrepareUndo(pat, 0, 0, GetNumChannels(), m_SndFile.Patterns[pat].GetNumRows(), linkUndo, storeChannelInfo); + linkUndo = true; + storeChannelInfo = false; + } + } +} Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/Moddoc.h 2012-10-21 15:29:30 UTC (rev 1375) @@ -216,6 +216,7 @@ void SongProperties(); + void PrepareUndoForAllPatterns(bool storeChannelInfo = false); CPatternUndo &GetPatternUndo() { return m_PatternUndo; } CSampleUndo &GetSampleUndo() { return m_SampleUndo; } SplitKeyboardSettings &GetSplitKeyboardSettings() { return m_SplitKeyboardSettings; } @@ -233,6 +234,10 @@ CHANNELINDEX ReArrangeChannels(const vector<CHANNELINDEX> &fromToArray, const bool createUndoPoint = true); void CheckUsedChannels(vector<bool> &usedMask, CHANNELINDEX maxRemoveCount = MAX_BASECHANNELS) const; + SAMPLEINDEX ReArrangeSamples(const vector<SAMPLEINDEX> &newOrder); + + INSTRUMENTINDEX ReArrangeInstruments(const vector<INSTRUMENTINDEX> &newOrder); + bool ConvertInstrumentsToSamples(); bool ConvertSamplesToInstruments(); UINT RemovePlugs(const vector<bool> &keepMask); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -159,29 +159,16 @@ return GetNumChannels(); } - bool first = true; - // Find highest valid pattern number for storing channel undo data with, since the pattern with the highest number will be undone first. - PATTERNINDEX highestPattern = 0; - for(PATTERNINDEX nPat = m_SndFile.Patterns.Size() - 1; nPat > 0; nPat--) + CriticalSection cs; + if(createUndoPoint) { - if(m_SndFile.Patterns.IsValidPat(nPat)) - { - highestPattern = nPat; - break; - } + PrepareUndoForAllPatterns(true); } - CriticalSection cs; - for(PATTERNINDEX nPat = 0; nPat <= highestPattern; nPat++) + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) { if(m_SndFile.Patterns.IsValidPat(nPat)) { - if(createUndoPoint) - { - GetPatternUndo().PrepareUndo(nPat, 0, 0, GetNumChannels(), m_SndFile.Patterns[nPat].GetNumRows(), !first, (nPat == highestPattern)); - first = false; - } - ModCommand *oldPatData = m_SndFile.Patterns[nPat]; ModCommand *newPatData = CPattern::AllocatePattern(m_SndFile.Patterns[nPat].GetNumRows(), nRemainingChannels); if(!newPatData) @@ -207,7 +194,7 @@ } } - ModChannel chns[MAX_BASECHANNELS]; + ModChannel chns[MAX_BASECHANNELS]; ModChannelSettings settings[MAX_BASECHANNELS]; vector<BYTE> recordStates(GetNumChannels(), 0); vector<bool> chnMutePendings(GetNumChannels(), false); @@ -253,6 +240,206 @@ } +// Functor for rewriting instrument numbers in patterns. +struct RewriteInstrumentReferencesInPatterns +//========================================== +{ + RewriteInstrumentReferencesInPatterns(const vector<ModCommand::INSTR> &indices) : instrumentIndices(indices) + { + } + + void operator()(ModCommand& m) + { + if(!m.IsPcNote() && m.instr < instrumentIndices.size()) + { + m.instr = instrumentIndices[m.instr]; + } + } + + const vector<ModCommand::INSTR> &instrumentIndices; +}; + + +// Base code for adding, removing, moving and duplicating samples. Returns new number of samples on success, SAMPLEINDEX_INVALID otherwise. +// The new sample vector can contain SAMPLEINDEX_INVALID for adding new (empty) samples. +// newOrder indices are zero-based, i.e. newOrder[0] will define the contents of the first sample slot. +SAMPLEINDEX CModDoc::ReArrangeSamples(const vector<SAMPLEINDEX> &newOrder) +//------------------------------------------------------------------------ +{ + if(newOrder.size() > m_SndFile.GetModSpecifications().samplesMax) + { + return SAMPLEINDEX_INVALID; + } + + CriticalSection cs; + + const SAMPLEINDEX oldNumSamples = m_SndFile.GetNumSamples(); + m_SndFile.m_nSamples = static_cast<SAMPLEINDEX>(newOrder.size()); + + for(SAMPLEINDEX i = 0; i < Util::Min(GetNumSamples(), oldNumSamples); i++) + { + if(newOrder[i] != i + 1) + { + GetSampleUndo().PrepareUndo(i + 1, sundo_replace); + } + } + + vector<int> sampleCount(oldNumSamples + 1, 0); + vector<ModSample> sampleHeaders(oldNumSamples + 1); + vector<SAMPLEINDEX> newIndex(oldNumSamples + 1, SAMPLEINDEX_INVALID); // One of the new indexes for the old sample + vector<std::string> sampleNames(oldNumSamples + 1); + + for(size_t i = 0; i < newOrder.size(); i++) + { + const SAMPLEINDEX origSlot = newOrder[i]; + if(origSlot > 0 && origSlot <= oldNumSamples) + { + sampleCount[origSlot]++; + sampleHeaders[origSlot] = m_SndFile.GetSample(origSlot); + newIndex[origSlot] = i + 1; + } + } + + // First, delete all samples that will be removed anyway. + for(SAMPLEINDEX i = 1; i < sampleCount.size(); i++) + { + if(sampleCount[i] == 0) + { + m_SndFile.DestroySample(i); + } + sampleNames[i] = m_SndFile.m_szNames[i]; + } + + // Now, create new sample list. + for(SAMPLEINDEX i = 0; i < newOrder.size(); i++) + { + const SAMPLEINDEX origSlot = newOrder[i]; + if(origSlot > 0 && origSlot <= oldNumSamples) + { + // Copy an original sample. + m_SndFile.GetSample(i + 1) = sampleHeaders[origSlot]; + if(--sampleCount[origSlot] > 0 && sampleHeaders[origSlot].pSample != nullptr) + { + // This sample slot is referenced multiple times, so we have to copy the actual sample. + m_SndFile.GetSample(i + 1).pSample = m_SndFile.AllocateSample(m_SndFile.GetSample(i + 1).GetSampleSizeInBytes()); + memcpy(m_SndFile.GetSample(i + 1).pSample, sampleHeaders[origSlot].pSample, m_SndFile.GetSample(i + 1).GetSampleSizeInBytes()); + ctrlSmp::AdjustEndOfSample(m_SndFile.GetSample(i + 1), &m_SndFile); + } + strcpy(m_SndFile.m_szNames[i + 1], sampleNames[origSlot].c_str()); + } else + { + // Invalid sample reference. + m_SndFile.GetSample(i + 1).Initialize(m_SndFile.GetType()); + m_SndFile.GetSample(i + 1).pSample = nullptr; + strcpy(m_SndFile.m_szNames[i + 1], ""); + } + } + + if(m_SndFile.GetNumInstruments()) + { + // Instrument mode: Update sample maps. + for(INSTRUMENTINDEX i = 0; i <= m_SndFile.GetNumInstruments(); i++) + { + ModInstrument *ins = m_SndFile.Instruments[i]; + if(ins == nullptr) + { + continue; + } + for(size_t note = 0; note < CountOf(ins->Keyboard); note++) + { + if(ins->Keyboard[note] > 0 && ins->Keyboard[note] <= oldNumSamples && newIndex[ins->Keyboard[note]] != SAMPLEINDEX_INVALID) + { + ins->Keyboard[note] = newIndex[ins->Keyboard[note]]; + } else + { + ins->Keyboard[note] = 0; + } + } + } + } else + { + PrepareUndoForAllPatterns(); + + vector<ModCommand::INSTR> indices(newOrder.size() + 1, 0); + for(size_t i = 0; i < newOrder.size(); i++) + { + indices[i + 1] = newIndex[i]; + } + m_SndFile.Patterns.ForEachModCommand(RewriteInstrumentReferencesInPatterns(indices)); + } + + return GetNumSamples(); +} + + +// Base code for adding, removing, moving and duplicating instruments. Returns new number of instruments on success, INSTRUMENTINDEX_INVALID otherwise. +// The new instrument vector can contain INSTRUMENTINDEX_INVALID for adding new (empty) instruments. +// newOrder indices are zero-based, i.e. newOrder[0] will define the contents of the first instrument slot. +INSTRUMENTINDEX CModDoc::ReArrangeInstruments(const vector<INSTRUMENTINDEX> &newOrder) +//------------------------------------------------------------------------------------ +{ + if(newOrder.size() > m_SndFile.GetModSpecifications().instrumentsMax || GetNumInstruments() == 0) + { + return INSTRUMENTINDEX_INVALID; + } + + CriticalSection cs; + + const INSTRUMENTINDEX oldNumInstruments = m_SndFile.GetNumInstruments(); + m_SndFile.m_nInstruments = static_cast<INSTRUMENTINDEX>(newOrder.size()); + + vector<ModInstrument> instrumentHeaders(oldNumInstruments + 1); + vector<SAMPLEINDEX> newIndex(oldNumInstruments + 1, INSTRUMENTINDEX_INVALID); // One of the new indexes for the old instrument + for(size_t i = 0; i < newOrder.size(); i++) + { + const INSTRUMENTINDEX origSlot = newOrder[i]; + if(origSlot > 0 && origSlot <= oldNumInstruments) + { + if(m_SndFile.Instruments[origSlot] != nullptr) + instrumentHeaders[origSlot] = *m_SndFile.Instruments[origSlot]; + newIndex[origSlot] = i + 1; + } + } + + // Now, create new instrument list. + for(INSTRUMENTINDEX i = 0; i < newOrder.size(); i++) + { + if(m_SndFile.Instruments[i + 1] == nullptr) + { + m_SndFile.Instruments[i + 1] = new ModInstrument(); + } + + const INSTRUMENTINDEX origSlot = newOrder[i]; + if(origSlot > 0 && origSlot <= oldNumInstruments) + { + // Copy an original instrument. + *m_SndFile.Instruments[i + 1] = instrumentHeaders[origSlot]; + } else + { + // Invalid sample instrument. + *m_SndFile.Instruments[i + 1] = ModInstrument(); + } + } + // Free unused instruments + for(INSTRUMENTINDEX i = newOrder.size(); i < oldNumInstruments; i++) + { + delete m_SndFile.Instruments[i + 1]; + m_SndFile.Instruments[i + 1] = nullptr; + } + + PrepareUndoForAllPatterns(); + + vector<ModCommand::INSTR> indices(newOrder.size() + 1, 0); + for(size_t i = 1; i < newOrder.size(); i++) + { + indices[i + 1] = newIndex[i]; + } + m_SndFile.Patterns.ForEachModCommand(RewriteInstrumentReferencesInPatterns(indices)); + + return GetNumInstruments(); +} + + // Functor for converting instrument numbers to sample numbers in the patterns struct ConvertInstrumentsToSamplesInPatterns //========================================== Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -769,9 +769,10 @@ void CViewInstrument::UpdateView(DWORD dwHintMask, CObject *) //----------------------------------------------------------- { - if ((dwHintMask & (HINT_MPTOPTIONS|HINT_MODTYPE)) - || ((dwHintMask & HINT_ENVELOPE) && (m_nInstrument == (dwHintMask >> HINT_SHIFT_INS))) - || ((dwHintMask & HINT_SPEEDCHANGE))) //rewbs.envRowGrid + const INSTRUMENTINDEX updateIns = (dwHintMask >> HINT_SHIFT_INS); + if((dwHintMask & (HINT_MPTOPTIONS | HINT_MODTYPE)) + || ((dwHintMask & HINT_ENVELOPE) && (m_nInstrument == updateIns || updateIns == 0)) + || ((dwHintMask & HINT_SPEEDCHANGE))) //rewbs.envRowGrid { UpdateScrollSize(); UpdateNcButtonState(); Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -438,8 +438,9 @@ void CViewSample::UpdateView(DWORD dwHintMask, CObject *) //------------------------------------------------------- { - if ((dwHintMask & (HINT_MPTOPTIONS|HINT_MODTYPE)) - || ((dwHintMask & HINT_SAMPLEDATA) && (m_nSample == (dwHintMask >> HINT_SHIFT_SMP))) ) + const SAMPLEINDEX updateSmp = (dwHintMask >> HINT_SHIFT_SMP); + if((dwHintMask & (HINT_MPTOPTIONS | HINT_MODTYPE)) + || ((dwHintMask & HINT_SAMPLEDATA) && (m_nSample == updateSmp || updateSmp == 0))) { UpdateScrollSize(); UpdateNcButtonState(); Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2012-10-21 15:29:30 UTC (rev 1375) @@ -1298,6 +1298,7 @@ case MODITEM_INSLIB_INSTRUMENT: if (m_szSongName[0]) { + // Preview sample / instrument in module CHAR szName[64]; lstrcpyn(szName, GetItemText(hItem), sizeof(szName)); UINT n = 0; @@ -1317,6 +1318,7 @@ } } else { + // Preview sample / instrument file CHAR szFullPath[_MAX_PATH] = ""; InsLibGetFullPath(hItem, szFullPath); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); @@ -1923,7 +1925,7 @@ if (SetCurrentDirectory(lpszDir)) { m_szSongName[0] = 0; - if (m_SongFile.m_nType) m_SongFile.Destroy(); + if (m_SongFile.GetType() != MOD_TYPE_NONE) m_SongFile.Destroy(); GetCurrentDirectory(sizeof(m_szInstrLibPath), m_szInstrLibPath); PostMessage(WM_COMMAND, ID_MODTREE_REFRESHINSTRLIB); bOk = TRUE; @@ -2101,8 +2103,8 @@ if(Reporting::Confirm(_T("Replace the current orderlist?"), _T("Sequence import")) == cnfNo) return false; } - pSndFile->Order.resize(min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLength()), pSndFile->Order.GetInvalidPatIndex()); - for(ORDERINDEX nOrd = 0; nOrd < min(pSndFile->GetModSpecifications().ordersMax,pOrigSeq->GetLengthTailTrimmed()); nOrd++) + pSndFile->Order.resize(Util::Min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLength()), pSndFile->Order.GetInvalidPatIndex()); + for(ORDERINDEX nOrd = 0; nOrd < Util::Min(pSndFile->GetModSpecifications().ordersMax, pOrigSeq->GetLengthTailTrimmed()); nOrd++) { PATTERNINDEX nOrigPat = pDragSndFile->Order.GetSequence(nOrigSeq)[nOrd]; // translate pattern index @@ -2125,9 +2127,57 @@ break; case MODITEM_SAMPLE: + // Reorder samples in a module + if(modItemDragType == MODITEM_SAMPLE && pInfoDrag != nullptr && pModDoc == pInfoDrag->pModDoc) + { + if(bDoDrop) + { + const SAMPLEINDEX from = static_cast<SAMPLEINDEX>(modItemDragID - 1), to = static_cast<SAMPLEINDEX>(modItemDropID - 1); + + vector<SAMPLEINDEX> newOrder(pModDoc->GetNumSamples()); + for(SAMPLEINDEX smp = 0; smp < pModDoc->GetNumSamples(); smp++) + { + newOrder[smp] = smp + 1; + } + + newOrder.erase(newOrder.begin() + from); + newOrder.insert(newOrder.begin() + to, from + 1); + + pModDoc->ReArrangeSamples(newOrder); + + pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); + pModDoc->SetModified(); + SelectItem(hItem); + } + return true; + } break; case MODITEM_INSTRUMENT: + // Reorder instruments in a module + if(modItemDragType == MODITEM_INSTRUMENT && pInfoDrag != nullptr && pModDoc == pInfoDrag->pModDoc) + { + if(bDoDrop) + { + const INSTRUMENTINDEX from = static_cast<INSTRUMENTINDEX>(modItemDragID - 1), to = static_cast<INSTRUMENTINDEX>(modItemDropID - 1); + + vector<INSTRUMENTINDEX> newOrder(pModDoc->GetNumInstruments()); + for(INSTRUMENTINDEX ins = 0; ins < pModDoc->GetNumInstruments(); ins++) + { + newOrder[ins] = ins + 1; + } + + newOrder.erase(newOrder.begin() + from); + newOrder.insert(newOrder.begin() + to, from + 1); + + pModDoc->ReArrangeInstruments(newOrder); + + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES | HINT_INSTRUMENT | HINT_ENVELOPE, NULL); + pModDoc->SetModified(); + SelectItem(hItem); + } + return true; + } break; case MODITEM_MIDIINSTRUMENT: @@ -2463,6 +2513,8 @@ AppendMenu(hMenu, MF_STRING, nDefault, "&View Sample"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, "&Play Sample"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Sample"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Sample"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "&Duplicate Sample"); if ((pModDoc) && (!pModDoc->GetNumInstruments())) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); @@ -2480,6 +2532,8 @@ AppendMenu(hMenu, MF_STRING, nDefault, "&View Instrument"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, "&Play Instrument"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Instrument"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Instrument"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "&Duplicate Instrument"); if ((pModDoc) && (pModDoc->GetNumInstruments())) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); @@ -2950,6 +3004,21 @@ } +// Helper function for generating an insert vector for samples/instruments +template<typename T> +vector<T> GenerateInsertVector(size_t howMany, size_t insertPos, T insertId) +//-------------------------------------------------------------------------- +{ + vector<T> newOrder(howMany); + for(T i = 0; i < howMany; i++) + { + newOrder[i] = i + 1; + } + newOrder.insert(newOrder.begin() + insertPos, insertId); + return newOrder; +} + + void CModTree::OnDuplicateTreeItem() //---------------------------------- { @@ -2963,13 +3032,41 @@ pModDoc = GetDocumentFromItem(hItem); CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; - if (pModDoc && pSndFile && ((modItemType == MODITEM_SEQUENCE) || (modItemType == MODITEM_HDR_ORDERS))) + if(pModDoc && pSndFile) { - pSndFile->Order.SetSequence((SEQUENCEINDEX)modItemID); - pSndFile->Order.AddSequence(true); - pModDoc->SetModified(); - UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); - pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE); + if(modItemType == MODITEM_SEQUENCE || modItemType == MODITEM_HDR_ORDERS) + { + // Duplicate sequence + pSndFile->Order.SetSequence((SEQUENCEINDEX)modItemID); + pSndFile->Order.AddSequence(true); + pModDoc->SetModified(); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); + pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE); + } else if(modItemType == MODITEM_SAMPLE) + { + // Duplicate sample + vector<SAMPLEINDEX> newOrder = GenerateInsertVector<SAMPLEINDEX>(pSndFile->GetNumSamples(), modItemID, modItemID); + if(pModDoc->ReArrangeSamples(newOrder) != SAMPLEINDEX_INVALID) + { + pModDoc->SetModified(); + pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA); + } else + { + Reporting::Error("Maximum number of samples reached."); + } + } else if(modItemType == MODITEM_INSTRUMENT) + { + // Duplicate instrument + vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(pSndFile->GetNumInstruments(), modItemID, modItemID); + if(pModDoc->ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) + { + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES| HINT_INSTRUMENT | HINT_ENVELOPE); + pModDoc->SetModified(); + } else + { + Reporting::Error("Maximum number of samples reached."); + } + } } } @@ -2982,17 +3079,45 @@ const uint64 modItem = GetModItem(hItem); const uint32 modItemType = GetModItemType(modItem); - //const uint32 modItemID = GetModItemID(modItem); + const uint32 modItemID = GetModItemID(modItem); pModDoc = GetDocumentFromItem(hItem); CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; - if (pModDoc && pSndFile && ((modItemType == MODITEM_SEQUENCE) || (modItemType == MODITEM_HDR_ORDERS))) + if(pModDoc && pSndFile) { - pSndFile->Order.AddSequence(false); - pModDoc->SetModified(); - UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); - pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE); + if(modItemType == MODITEM_SEQUENCE || modItemType == MODITEM_HDR_ORDERS) + { + // Insert sequence + pSndFile->Order.AddSequence(false); + pModDoc->SetModified(); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); + pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE); + } else if(modItemType == MODITEM_SAMPLE) + { + // Insert sample + vector<SAMPLEINDEX> newOrder = GenerateInsertVector<SAMPLEINDEX>(pSndFile->GetNumSamples(), modItemID, 0); + if(pModDoc->ReArrangeSamples(newOrder) != SAMPLEINDEX_INVALID) + { + pModDoc->SetModified(); + pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA); + } else + { + Reporting::Error("Maximum number of samples reached."); + } + } else if(modItemType == MODITEM_INSTRUMENT) + { + // Insert instrument + vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(pSndFile->GetNumInstruments(), modItemID, 0); + if(pModDoc->ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) + { + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES| HINT_INSTRUMENT | HINT_ENVELOPE); + pModDoc->SetModified(); + } else + { + Reporting::Error("Maximum number of samples reached."); + } + } } } Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/View_tre.h 2012-10-21 15:29:30 UTC (rev 1375) @@ -82,10 +82,6 @@ { tiPatterns.resize(pSndFile->Patterns.Size(), NULL); tiOrders.resize(pSndFile->Order.GetNumSequences()); - for(SEQUENCEINDEX i = 0; i < tiOrders.size(); i++) - { - //tiOrders[i].resize(pSndFile->Order.GetSequence(i)->GetLength(), NULL); - } tiSequences.resize(pSndFile->Order.GetNumSequences(), NULL); } MemsetZero(tiSamples); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2012-10-21 15:26:55 UTC (rev 1374) +++ trunk/OpenMPT/mptrack/version.h 2012-10-21 15:29:30 UTC (rev 1375) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 03 -#define VER_MINORMINOR 04 +#define VER_MINORMINOR 05 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-10-24 22:21:49
|
Revision: 1376 http://modplug.svn.sourceforge.net/modplug/?rev=1376&view=rev Author: saga-games Date: 2012-10-24 22:21:42 +0000 (Wed, 24 Oct 2012) Log Message: ----------- [Fix] Treeview: Fixed mnemonics in context menu. [Fix] EZDrummer didn't load its samples until playback was started (tx coda). Another plugin that didn't like revision 1230... Revision Links: -------------- http://modplug.svn.sourceforge.net/modplug/?rev=1230&view=rev Modified Paths: -------------- trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2012-10-21 15:29:30 UTC (rev 1375) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2012-10-24 22:21:42 UTC (rev 1376) @@ -2512,14 +2512,14 @@ nDefault = ID_MODTREE_EXECUTE; AppendMenu(hMenu, MF_STRING, nDefault, "&View Sample"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, "&Play Sample"); - AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Sample"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Sample"); - AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "&Duplicate Sample"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "D&uplicate Sample"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Sample"); if ((pModDoc) && (!pModDoc->GetNumInstruments())) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); AppendMenu(hMenu, (pModDoc->IsSampleMuted((SAMPLEINDEX)modItemID) ? MF_CHECKED : 0) | MF_STRING, ID_MODTREE_MUTE, "&Mute Sample"); - AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, "&Solo Sample"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, "S&olo Sample"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, "&Unmute all"); } } @@ -2531,9 +2531,9 @@ nDefault = ID_MODTREE_EXECUTE; AppendMenu(hMenu, MF_STRING, nDefault, "&View Instrument"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, "&Play Instrument"); - AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Instrument"); AppendMenu(hMenu, MF_STRING, ID_MODTREE_INSERT, "&Insert Instrument"); - AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "&Duplicate Instrument"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_DUPLICATE, "D&uplicate Instrument"); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, "&Delete Instrument"); if ((pModDoc) && (pModDoc->GetNumInstruments())) { AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); @@ -3023,14 +3023,13 @@ //---------------------------------- { HTREEITEM hItem = GetSelectedItem(); - CModDoc *pModDoc; - + const uint64 modItem = GetModItem(hItem); const uint32 modItemType = GetModItemType(modItem); const uint32 modItemID = GetModItemID(modItem); - pModDoc = GetDocumentFromItem(hItem); - CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; + CModDoc *pModDoc = GetDocumentFromItem(hItem); + CSoundFile *pSndFile = (pModDoc != nullptr) ? pModDoc->GetSoundFile() : nullptr; if(pModDoc && pSndFile) { @@ -3060,11 +3059,11 @@ vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(pSndFile->GetNumInstruments(), modItemID, modItemID); if(pModDoc->ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) { - pModDoc->UpdateAllViews(NULL, HINT_INSNAMES| HINT_INSTRUMENT | HINT_ENVELOPE); + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES | HINT_INSTRUMENT | HINT_ENVELOPE); pModDoc->SetModified(); } else { - Reporting::Error("Maximum number of samples reached."); + Reporting::Error("Maximum number of instruments reached."); } } } @@ -3075,13 +3074,12 @@ //------------------------------- { HTREEITEM hItem = GetSelectedItem(); - CModDoc *pModDoc; const uint64 modItem = GetModItem(hItem); const uint32 modItemType = GetModItemType(modItem); const uint32 modItemID = GetModItemID(modItem); - pModDoc = GetDocumentFromItem(hItem); + CModDoc *pModDoc = GetDocumentFromItem(hItem); CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; if(pModDoc && pSndFile) @@ -3115,7 +3113,7 @@ pModDoc->SetModified(); } else { - Reporting::Error("Maximum number of samples reached."); + Reporting::Error("Maximum number of instruments reached."); } } } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2012-10-21 15:29:30 UTC (rev 1375) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2012-10-24 22:21:42 UTC (rev 1376) @@ -1447,9 +1447,12 @@ // Korg Wavestation GUI won't work until plugin was resumed at least once. // On the other hand, some other plugins (notably Synthedit plugins like Superwave P8 2.3 or Rez 3.0) don't like this - // and won't load their stored plugin data instantly, so only do this for the Korg Wavestation... - // Tentatively also apply this fix for Korg's M1 plugin, maybe this will fix older versions of said plugin, newer versions don't require the fix. - if(GetUID() == CCONST('K', 'L', 'W', 'V') || GetUID() == CCONST('K', 'L', 'M', '1')) + // and won't load their stored plugin data instantly, so only do this for the troublesome plugins... + // Also apply this fix for Korg's M1 plugin, as this will fixes older versions of said plugin, newer versions don't require the fix. + // EZDrummer won't load its samples until playback has started. + if(GetUID() == CCONST('K', 'L', 'W', 'V') // Wavestation + || GetUID() == CCONST('K', 'L', 'M', '1') // M1 + || GetUID() == CCONST('d', 'f', 'h', 'e')) // EZDrummer { Resume(); Suspend(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-10-28 18:14:56
|
Revision: 1408 http://modplug.svn.sourceforge.net/modplug/?rev=1408&view=rev Author: saga-games Date: 2012-10-28 18:14:48 +0000 (Sun, 28 Oct 2012) Log Message: ----------- [Fix] Rearrange samples/instruments was really buggy (how could I not notice this?) [Fix] Rearranging / duplicating / inserting samples and instruments from the treeview didn't update instrument numbers in the pattern view immediately. [Ref] Removed duplicate code in song cleanup that can now be done using RearrangeSamples/Instruments. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2012-10-28 17:55:29 UTC (rev 1407) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2012-10-28 18:14:48 UTC (rev 1408) @@ -91,6 +91,7 @@ //}}AFX_MSG_MAP END_MESSAGE_MAP() + BOOL CModCleanupDlg::OnInitDialog() //--------------------------------- { @@ -226,6 +227,7 @@ CheckDlgButton(IDC_CHK_SAMPLEPACK, BST_UNCHECKED); } + void CModCleanupDlg::OnPresetCompoCleanup() //----------------------------------------- { @@ -251,6 +253,7 @@ CheckDlgButton(IDC_CHK_SAMPLEPACK, BST_CHECKED); } + BOOL CModCleanupDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) //---------------------------------------------------------------------------- { @@ -422,7 +425,7 @@ cs.Leave(); EndWaitCursor(); wsprintf(s, "%d pattern%s present in file, but not used in the song\nDo you want to reorder the sequence list and remove these patterns?", nWaste, (nWaste == 1) ? "" : "s"); - if (Reporting::Confirm(s, "Pattern Cleanup") != cnfYes) return false; + if (Reporting::Confirm(s, "Pattern Cleanup", false, false, this) != cnfYes) return false; BeginWaitCursor(); cs.Enter(); } @@ -547,7 +550,7 @@ // We don't remove an instrument's unused samples in an ITP. wsprintf(s, "OpenMPT detected %d sample%s referenced by an instrument,\n" "but not used in the song. Do you want to remove them?", unusedInsSamples, (unusedInsSamples == 1) ? "" : "s"); - if(Reporting::Confirm(s, "Sample Cleanup") == cnfYes) + if(Reporting::Confirm(s, "Sample Cleanup", false, false, this) == cnfYes) { nRemoved += pSndFile->RemoveSelectedSamples(samplesUsed); } @@ -570,38 +573,38 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); if(pSndFile == nullptr) return false; - UINT nLoopOpt = 0; + SAMPLEINDEX numLoopOpt = 0; for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->GetNumSamples(); nSmp++) { const ModSample &sample = pSndFile->GetSample(nSmp); // Determine how much of the sample will be played - UINT loopLength = sample.nLength; + SmpLength loopLength = sample.nLength; if(sample.uFlags & CHN_LOOP) { loopLength = sample.nLoopEnd; } if(sample.uFlags & CHN_SUSTAINLOOP) { - loopLength = max(sample.nLoopEnd, sample.nSustainEnd); + loopLength = Util::Max(sample.nLoopEnd, sample.nSustainEnd); } - if(sample.pSample && sample.nLength > loopLength + 2) nLoopOpt++; + if(sample.pSample && sample.nLength > loopLength + 2) numLoopOpt++; } - if (nLoopOpt == 0) return false; + if (numLoopOpt == 0) return false; - CHAR s[512]; + char s[512]; wsprintf(s, "%d sample%s unused data after the loop end point,\n" - "Do you want to optimize %s and remove this unused data?", nLoopOpt, (nLoopOpt == 1) ? " has" : "s have", (nLoopOpt == 1) ? "it" : "them"); - if (Reporting::Confirm(s, "Sample Optimization") == cnfYes) + "Do you want to optimize %s and remove this unused data?", numLoopOpt, (numLoopOpt == 1) ? " has" : "s have", (numLoopOpt == 1) ? "it" : "them"); + if(Reporting::Confirm(s, "Sample Optimization", false, false, this) == cnfYes) { - for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->m_nSamples; nSmp++) + for(SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->m_nSamples; nSmp++) { ModSample &sample = pSndFile->GetSample(nSmp); // Determine how much of the sample will be played - UINT loopLength = sample.nLength; + SmpLength loopLength = sample.nLength; if(sample.uFlags & CHN_LOOP) { loopLength = sample.nLoopEnd; @@ -609,21 +612,21 @@ // Sustain loop is played before normal loop, and it can actually be located after the normal loop. if(sample.uFlags & CHN_SUSTAINLOOP) { - loopLength = max(sample.nLoopEnd, sample.nSustainEnd); + loopLength = Util::Max(sample.nLoopEnd, sample.nSustainEnd); } } - if (sample.nLength > loopLength + 2) + if(sample.nLength > loopLength + 2) { - UINT lmax = loopLength + 2; - if ((lmax < sample.nLength) && (lmax >= 2)) + SmpLength lmax = loopLength + 2; + if(lmax < sample.nLength && lmax >= 2) { m_pModDoc->GetSampleUndo().PrepareUndo(nSmp, sundo_delete, lmax, sample.nLength); ctrlSmp::ResizeSample(sample, lmax, pSndFile); } } } - wsprintf(s, "%d sample loop%s optimized\n" ,nLoopOpt, (nLoopOpt == 1) ? "" : "s"); + wsprintf(s, "%d sample loop%s optimized\n" ,numLoopOpt, (numLoopOpt == 1) ? "" : "s"); m_pModDoc->AddToLog(s); return true; } @@ -636,79 +639,29 @@ //------------------------------------- { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if(pSndFile == nullptr) return false; - if(pSndFile->m_nSamples < 2) + if(pSndFile == nullptr || pSndFile->GetNumSamples() < 2) return false; - SAMPLEINDEX nRemap = 0; // remap count - std::vector<SAMPLEINDEX> nSampleMap(pSndFile->GetNumSamples() + 1); - for(SAMPLEINDEX i = 0; i <= pSndFile->GetNumSamples(); i++) - { - nSampleMap[i] = i; - } + std::vector<SAMPLEINDEX> sampleMap; + sampleMap.reserve(pSndFile->GetNumSamples()); - // First, find out which sample slots are unused and create the new sample map + // First, find out which sample slots are unused and create the new sample map only with used samples for(SAMPLEINDEX i = 1; i <= pSndFile->GetNumSamples(); i++) { - if(pSndFile->GetSample(i).pSample == nullptr) + if(pSndFile->GetSample(i).pSample != nullptr) { - // Move all following samples - nRemap++; - nSampleMap[i] = 0; - for(UINT j = i + 1; j <= pSndFile->GetNumSamples(); j++) - nSampleMap[j]--; + sampleMap.push_back(i); } } - if(!nRemap) - return false; - - // Now, move everything around - for(SAMPLEINDEX i = 1; i <= pSndFile->GetNumSamples(); i++) + // Nothing found to remove... + if(pSndFile->GetNumSamples() == sampleMap.size()) { - if(nSampleMap[i] != i) - { - // This gotta be moved - CriticalSection cs; - pSndFile->MoveSample(i, nSampleMap[i]); - pSndFile->GetSample(i).pSample = nullptr; - if(nSampleMap[i] > 0) strcpy(pSndFile->m_szNames[nSampleMap[i]], pSndFile->m_szNames[i]); - MemsetZero(pSndFile->m_szNames[i]); - - // Also update instrument mapping (if module is in instrument mode) - for(INSTRUMENTINDEX nIns = 1; nIns <= pSndFile->GetNumInstruments(); nIns++) - { - ModInstrument *pIns = pSndFile->Instruments[nIns]; - if(pIns) - { - for(size_t iNote = 0; iNote < 128; iNote++) - if(pIns->Keyboard[iNote] == i) pIns->Keyboard[iNote] = nSampleMap[i]; - } - } - } + return false; } - // Go through the patterns and remap samples (if module is in sample mode) - if(!pSndFile->GetNumInstruments()) - { - for (PATTERNINDEX nPat = 0; nPat < pSndFile->Patterns.Size(); nPat++) if (pSndFile->Patterns[nPat]) - { - ModCommand *m = pSndFile->Patterns[nPat]; - for(UINT len = pSndFile->Patterns[nPat].GetNumRows() * pSndFile->GetNumChannels(); len; m++, len--) - { - if(!m->IsPcNote() && m->instr <= pSndFile->GetNumSamples()) m->instr = (BYTE)nSampleMap[m->instr]; - } - } - } - - // Too lazy to fix sample undo... - m_pModDoc->GetSampleUndo().ClearUndo(); - - pSndFile->m_nSamples -= nRemap; - - return true; - + return (m_pModDoc->ReArrangeSamples(sampleMap) != SAMPLEINDEX_INVALID); } @@ -717,106 +670,77 @@ //-------------------------------------------- { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if(pSndFile == nullptr) return false; - if (!pSndFile->GetNumInstruments()) return false; + if(pSndFile == nullptr || !pSndFile->GetNumInstruments()) + return false; deleteInstrumentSamples removeSamples = doNoDeleteAssociatedSamples; if(!pSndFile->m_SongFlags[SONG_ITPROJECT]) // Never remove an instrument's samples in ITP. { - if(Reporting::Confirm("Remove samples associated with an instrument if they are unused?", "Removing unused instruments") == cnfYes) + if(Reporting::Confirm("Remove samples associated with an instrument if they are unused?", "Removing unused instruments", false, false, this) == cnfYes) { removeSamples = deleteAssociatedSamples; } } else { - Reporting::Information("This is an IT project file, so no samples associated with an used instrument will be removed.", "Removing unused instruments"); + Reporting::Information("Samples associated with an used instrument won't be removed in IT Project files.", "Removing unused instruments", this); } BeginWaitCursor(); - vector<bool> usedmap(pSndFile->GetNumInstruments() + 1, false); - vector<INSTRUMENTINDEX> swapmap(pSndFile->GetNumInstruments() + 1, 0); - vector<INSTRUMENTINDEX> swapdest(pSndFile->GetNumInstruments() + 1, 0); - INSTRUMENTINDEX nRemoved = 0; - INSTRUMENTINDEX nSwap, nIndex; - bool bReorg = false; - for(INSTRUMENTINDEX i = pSndFile->GetNumInstruments(); i >= 1; i--) + vector<bool> instrUsed(pSndFile->GetNumInstruments()); + bool prevUsed = true, reorder = false; + INSTRUMENTINDEX numUsed = 0, lastUsed = 1; + for(INSTRUMENTINDEX i = 0; i < pSndFile->GetNumInstruments(); i++) { - if (!pSndFile->IsInstrumentUsed(i)) + instrUsed[i] = (pSndFile->IsInstrumentUsed(i + 1)); + if(instrUsed[i]) { - CriticalSection cs; - - if(pSndFile->DestroyInstrument(i, removeSamples)) + numUsed++; + lastUsed = i; + if(!prevUsed) { - if ((i == pSndFile->GetNumInstruments()) && (i > 1)) - pSndFile->m_nInstruments--; - else - bReorg = true; - nRemoved++; + reorder = true; } - } else - { - usedmap[i] = true; } + prevUsed = instrUsed[i]; } + EndWaitCursor(); - if ((bReorg) && (pSndFile->m_nInstruments > 1) - && (Reporting::Confirm("Do you want to reorganize the remaining instruments?", "Removing unused instruments") == cnfYes)) + + if(reorder && numUsed > 1) { + reorder = (Reporting::Confirm("Do you want to reorganize the remaining instruments?", "Removing unused instruments", false, false, this) == cnfYes); + } else + { + reorder = false; + } + + const INSTRUMENTINDEX numRemoved = pSndFile->GetNumInstruments() - numUsed; + + if(numRemoved != 0) + { BeginWaitCursor(); - CriticalSection cs; - nSwap = 0; - nIndex = 1; - for (INSTRUMENTINDEX nIns = 1; nIns <= pSndFile->GetNumInstruments(); nIns++) - { - if (usedmap[nIns]) - { - while (nIndex<nIns) - { - if ((!usedmap[nIndex]) && (!pSndFile->Instruments[nIndex])) - { - swapmap[nSwap] = nIns; - swapdest[nSwap] = nIndex; - pSndFile->Instruments[nIndex] = pSndFile->Instruments[nIns]; - pSndFile->Instruments[nIns] = nullptr; - usedmap[nIndex] = true; - usedmap[nIns] = false; - nSwap++; - nIndex++; - break; - } - nIndex++; - } - } - } - while ((pSndFile->m_nInstruments > 1) && (!pSndFile->Instruments[pSndFile->m_nInstruments])) pSndFile->m_nInstruments--; - if (nSwap > 0) + vector<INSTRUMENTINDEX> instrMap; + instrMap.reserve(pSndFile->GetNumInstruments()); + for(INSTRUMENTINDEX i = 0; i < pSndFile->GetNumInstruments(); i++) { - for (PATTERNINDEX iPat = 0; iPat < pSndFile->Patterns.Size(); iPat++) if (pSndFile->Patterns[iPat]) + if(instrUsed[i]) { - ModCommand *p = pSndFile->Patterns[iPat]; - UINT nLen = pSndFile->m_nChannels * pSndFile->Patterns[iPat].GetNumRows(); - while (nLen--) - { - if (p->instr && !p->IsPcNote()) - { - for (UINT k=0; k<nSwap; k++) - { - if (p->instr == swapmap[k]) p->instr = (ModCommand::INSTR)swapdest[k]; - } - } - p++; - } + instrMap.push_back(i + 1); + } else if(!reorder && i < lastUsed) + { + instrMap.push_back(INSTRUMENTINDEX_INVALID); } } + + m_pModDoc->ReArrangeInstruments(instrMap, removeSamples); + EndWaitCursor(); - } - if (nRemoved) - { - CHAR s[64]; - wsprintf(s, "%d unused instrument%s removed\n", nRemoved, (nRemoved == 1) ? "" : "s"); + + char s[64]; + wsprintf(s, "%d unused instrument%s removed\n", numRemoved, (numRemoved == 1) ? "" : "s"); m_pModDoc->AddToLog(s); return true; } @@ -889,7 +813,7 @@ if(pSndFile == nullptr) return false; //jojo.compocleanup - if(Reporting::Confirm(TEXT("WARNING: OpenMPT will convert the module to IT format and reset all song, sample and instrument attributes to default values. Continue?"), TEXT("Resetting variables")) == cnfNo) + if(Reporting::Confirm(TEXT("WARNING: OpenMPT will convert the module to IT format and reset all song, sample and instrument attributes to default values. Continue?"), TEXT("Resetting variables"), false, false, this) == cnfNo) return false; // Stop play. Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2012-10-28 17:55:29 UTC (rev 1407) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2012-10-28 18:14:48 UTC (rev 1408) @@ -238,7 +238,9 @@ InvalidateChannelsHeaders(); UpdateScrollSize(); } - if((HintFlagPart(dwHintMask) == HINT_PATTERNDATA) && (m_nPattern != (dwHintMask >> HINT_SHIFT_PAT))) + + const PATTERNINDEX updatePat = (dwHintMask >> HINT_SHIFT_PAT); + if(HintFlagPart(dwHintMask) == HINT_PATTERNDATA && m_nPattern != updatePat && updatePat != 0) return; if(dwHintMask & (HINT_MODTYPE|HINT_PATTERNDATA)) Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2012-10-28 17:55:29 UTC (rev 1407) +++ trunk/OpenMPT/mptrack/Moddoc.h 2012-10-28 18:14:48 UTC (rev 1408) @@ -10,10 +10,6 @@ #pragma once -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - #include "sndfile.h" #include "../common/misc_util.h" #include "Undo.h" @@ -236,7 +232,7 @@ SAMPLEINDEX ReArrangeSamples(const vector<SAMPLEINDEX> &newOrder); - INSTRUMENTINDEX ReArrangeInstruments(const vector<INSTRUMENTINDEX> &newOrder); + INSTRUMENTINDEX ReArrangeInstruments(const vector<INSTRUMENTINDEX> &newOrder, deleteInstrumentSamples removeSamples = doNoDeleteAssociatedSamples); bool ConvertInstrumentsToSamples(); bool ConvertSamplesToInstruments(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2012-10-28 17:55:29 UTC (rev 1407) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2012-10-28 18:14:48 UTC (rev 1408) @@ -273,10 +273,9 @@ CriticalSection cs; - const SAMPLEINDEX oldNumSamples = m_SndFile.GetNumSamples(); - m_SndFile.m_nSamples = static_cast<SAMPLEINDEX>(newOrder.size()); + const SAMPLEINDEX oldNumSamples = m_SndFile.GetNumSamples(), newNumSamples = static_cast<SAMPLEINDEX>(newOrder.size()); - for(SAMPLEINDEX i = 0; i < Util::Min(GetNumSamples(), oldNumSamples); i++) + for(SAMPLEINDEX i = 0; i < Util::Min(newNumSamples, oldNumSamples); i++) { if(newOrder[i] != i + 1) { @@ -286,7 +285,7 @@ vector<int> sampleCount(oldNumSamples + 1, 0); vector<ModSample> sampleHeaders(oldNumSamples + 1); - vector<SAMPLEINDEX> newIndex(oldNumSamples + 1, SAMPLEINDEX_INVALID); // One of the new indexes for the old sample + vector<SAMPLEINDEX> newIndex(oldNumSamples + 1, 0); // One of the new indexes for the old sample vector<std::string> sampleNames(oldNumSamples + 1); for(size_t i = 0; i < newOrder.size(); i++) @@ -310,8 +309,15 @@ sampleNames[i] = m_SndFile.m_szNames[i]; } + // Remove sample data references from now unused slots. + for(SAMPLEINDEX i = newNumSamples + 1; i <= oldNumSamples; i++) + { + m_SndFile.GetSample(i).pSample = nullptr; + } + // Now, create new sample list. - for(SAMPLEINDEX i = 0; i < newOrder.size(); i++) + m_SndFile.m_nSamples = newNumSamples; + for(SAMPLEINDEX i = 0; i < newNumSamples; i++) { const SAMPLEINDEX origSlot = newOrder[i]; if(origSlot > 0 && origSlot <= oldNumSamples) @@ -347,7 +353,7 @@ } for(size_t note = 0; note < CountOf(ins->Keyboard); note++) { - if(ins->Keyboard[note] > 0 && ins->Keyboard[note] <= oldNumSamples && newIndex[ins->Keyboard[note]] != SAMPLEINDEX_INVALID) + if(ins->Keyboard[note] > 0 && ins->Keyboard[note] <= oldNumSamples) { ins->Keyboard[note] = newIndex[ins->Keyboard[note]]; } else @@ -360,10 +366,10 @@ { PrepareUndoForAllPatterns(); - vector<ModCommand::INSTR> indices(newOrder.size() + 1, 0); - for(size_t i = 0; i < newOrder.size(); i++) + vector<ModCommand::INSTR> indices(newIndex.size(), 0); + for(size_t i = 0; i < newIndex.size(); i++) { - indices[i + 1] = newIndex[i]; + indices[i] = newIndex[i]; } m_SndFile.Patterns.ForEachModCommand(RewriteInstrumentReferencesInPatterns(indices)); } @@ -375,8 +381,8 @@ // Base code for adding, removing, moving and duplicating instruments. Returns new number of instruments on success, INSTRUMENTINDEX_INVALID otherwise. // The new instrument vector can contain INSTRUMENTINDEX_INVALID for adding new (empty) instruments. // newOrder indices are zero-based, i.e. newOrder[0] will define the contents of the first instrument slot. -INSTRUMENTINDEX CModDoc::ReArrangeInstruments(const vector<INSTRUMENTINDEX> &newOrder) -//------------------------------------------------------------------------------------ +INSTRUMENTINDEX CModDoc::ReArrangeInstruments(const vector<INSTRUMENTINDEX> &newOrder, deleteInstrumentSamples removeSamples) +//--------------------------------------------------------------------------------------------------------------------------- { if(newOrder.size() > m_SndFile.GetModSpecifications().instrumentsMax || GetNumInstruments() == 0) { @@ -389,7 +395,7 @@ m_SndFile.m_nInstruments = static_cast<INSTRUMENTINDEX>(newOrder.size()); vector<ModInstrument> instrumentHeaders(oldNumInstruments + 1); - vector<SAMPLEINDEX> newIndex(oldNumInstruments + 1, INSTRUMENTINDEX_INVALID); // One of the new indexes for the old instrument + vector<INSTRUMENTINDEX> newIndex(oldNumInstruments + 1, 0); // One of the new indexes for the old instrument for(size_t i = 0; i < newOrder.size(); i++) { const INSTRUMENTINDEX origSlot = newOrder[i]; @@ -401,38 +407,44 @@ } } + // Delete unused instruments first. + for(INSTRUMENTINDEX i = 1; i <= oldNumInstruments; i++) + { + if(newIndex[i] == 0) + { + m_SndFile.DestroyInstrument(i, removeSamples); + } + } + // Now, create new instrument list. for(INSTRUMENTINDEX i = 0; i < newOrder.size(); i++) { - if(m_SndFile.Instruments[i + 1] == nullptr) + ModInstrument *ins = m_SndFile.AllocateInstrument(i + 1); + if(ins == nullptr) { - m_SndFile.Instruments[i + 1] = new ModInstrument(); + continue; } const INSTRUMENTINDEX origSlot = newOrder[i]; if(origSlot > 0 && origSlot <= oldNumInstruments) { // Copy an original instrument. - *m_SndFile.Instruments[i + 1] = instrumentHeaders[origSlot]; - } else - { - // Invalid sample instrument. - *m_SndFile.Instruments[i + 1] = ModInstrument(); + *ins = instrumentHeaders[origSlot]; } } + // Free unused instruments - for(INSTRUMENTINDEX i = newOrder.size(); i < oldNumInstruments; i++) + for(INSTRUMENTINDEX i = newOrder.size() + 1; i <= oldNumInstruments; i++) { - delete m_SndFile.Instruments[i + 1]; - m_SndFile.Instruments[i + 1] = nullptr; + m_SndFile.DestroyInstrument(i, doNoDeleteAssociatedSamples); } PrepareUndoForAllPatterns(); - vector<ModCommand::INSTR> indices(newOrder.size() + 1, 0); - for(size_t i = 1; i < newOrder.size(); i++) + vector<ModCommand::INSTR> indices(newIndex.size(), 0); + for(size_t i = 0; i < newIndex.size(); i++) { - indices[i + 1] = newIndex[i]; + indices[i] = newIndex[i]; } m_SndFile.Patterns.ForEachModCommand(RewriteInstrumentReferencesInPatterns(indices)); Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2012-10-28 17:55:29 UTC (rev 1407) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2012-10-28 18:14:48 UTC (rev 1408) @@ -2145,7 +2145,7 @@ pModDoc->ReArrangeSamples(newOrder); - pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); + pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA | HINT_PATTERNDATA, NULL); pModDoc->SetModified(); SelectItem(hItem); } @@ -2172,7 +2172,7 @@ pModDoc->ReArrangeInstruments(newOrder); - pModDoc->UpdateAllViews(NULL, HINT_INSNAMES | HINT_INSTRUMENT | HINT_ENVELOPE, NULL); + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES | HINT_INSTRUMENT | HINT_ENVELOPE | HINT_PATTERNDATA, NULL); pModDoc->SetModified(); SelectItem(hItem); } @@ -3048,7 +3048,7 @@ if(pModDoc->ReArrangeSamples(newOrder) != SAMPLEINDEX_INVALID) { pModDoc->SetModified(); - pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA); + pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA | HINT_PATTERNDATA); } else { Reporting::Error("Maximum number of samples reached."); @@ -3059,7 +3059,7 @@ vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(pSndFile->GetNumInstruments(), modItemID, modItemID); if(pModDoc->ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) { - pModDoc->UpdateAllViews(NULL, HINT_INSNAMES | HINT_INSTRUMENT | HINT_ENVELOPE); + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES | HINT_INSTRUMENT | HINT_ENVELOPE | HINT_PATTERNDATA); pModDoc->SetModified(); } else { @@ -3098,7 +3098,7 @@ if(pModDoc->ReArrangeSamples(newOrder) != SAMPLEINDEX_INVALID) { pModDoc->SetModified(); - pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA); + pModDoc->UpdateAllViews(NULL, HINT_SMPNAMES | HINT_SAMPLEINFO | HINT_SAMPLEDATA | HINT_PATTERNDATA); } else { Reporting::Error("Maximum number of samples reached."); @@ -3109,7 +3109,7 @@ vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(pSndFile->GetNumInstruments(), modItemID, 0); if(pModDoc->ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) { - pModDoc->UpdateAllViews(NULL, HINT_INSNAMES| HINT_INSTRUMENT | HINT_ENVELOPE); + pModDoc->UpdateAllViews(NULL, HINT_INSNAMES| HINT_INSTRUMENT | HINT_ENVELOPE | HINT_PATTERNDATA); pModDoc->SetModified(); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-11-02 20:42:09
|
Revision: 1415 http://modplug.svn.sourceforge.net/modplug/?rev=1415&view=rev Author: saga-games Date: 2012-11-02 20:42:01 +0000 (Fri, 02 Nov 2012) Log Message: ----------- [Imp] VST Editor: Presets menu is now filled in a separate thread to avoid the GUI becoming unresponsive with plugins like Synth1. [Ref] Various small refactoring changes in Vstplug.cpp Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2012-11-02 14:42:24 UTC (rev 1414) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2012-11-02 20:42:01 UTC (rev 1415) @@ -92,8 +92,8 @@ } m_pPresetMenuGroup.clear(); - m_pVstPlugin->m_pEditor = NULL; - m_pVstPlugin = NULL; + m_pVstPlugin->m_pEditor = nullptr; + m_pVstPlugin = nullptr; } } @@ -241,29 +241,28 @@ if (pMsg) { //We handle keypresses before Windows has a chance to handle them (for alt etc..) - if ( (!m_pVstPlugin->m_bPassKeypressesToPlug) && - ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || - (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) ) + if(!m_pVstPlugin->m_bPassKeypressesToPlug && + (pMsg->message == WM_SYSKEYUP || pMsg->message == WM_KEYUP || + pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_KEYDOWN) ) { - CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); + CInputHandler *ih = (CMainFrame::GetMainFrame())->GetInputHandler(); //Translate message manually UINT nChar = pMsg->wParam; UINT nRepCnt = LOWORD(pMsg->lParam); UINT nFlags = HIWORD(pMsg->lParam); KeyEventType kT = ih->GetKeyEventType(nFlags); - InputTargetContext ctx = (InputTargetContext)(kCtxVSTGUI); // If we successfully mapped to a command and plug does not listen for keypresses, no need to pass message on. - if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT, (CWnd*)this) != kcNull) + if(ih->KeyEvent(kCtxVSTGUI, nChar, nRepCnt, nFlags, kT, (CWnd*)this) != kcNull) { return true; } // Don't forward key repeats if plug does not listen for keypresses // (avoids system beeps on note hold) - if (kT == kKeyEventRepeat) + if(kT == kKeyEventRepeat) { return true; } @@ -277,12 +276,12 @@ void CAbstractVstEditor::SetTitle() //--------------------------------- { - if (m_pVstPlugin && m_pVstPlugin->m_pMixStruct) + if(m_pVstPlugin && m_pVstPlugin->m_pMixStruct) { CString Title; Title.Format("FX %02d: ", m_pVstPlugin->m_nSlot + 1); - if (strcmp(m_pVstPlugin->m_pMixStruct->GetName(), "")) + if(strcmp(m_pVstPlugin->m_pMixStruct->GetName(), "")) Title.Append(m_pVstPlugin->m_pMixStruct->GetName()); else Title.Append(m_pVstPlugin->m_pMixStruct->GetLibraryName()); @@ -294,7 +293,7 @@ LRESULT CAbstractVstEditor::OnCustomKeyMsg(WPARAM wParam, LPARAM /*lParam*/) //-------------------------------------------------------------------------- { - if (wParam == kcNull) + if(wParam == kcNull) return NULL; // CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); @@ -340,7 +339,7 @@ bool CAbstractVstEditor::ValidateCurrentInstrument() //-------------------------------------------------- { - if (!CheckInstrument(m_nInstrument)) + if(!CheckInstrument(m_nInstrument)) m_nInstrument = GetBestInstrumentCandidate(); //only show messagebox if plug is able to process notes. @@ -375,51 +374,32 @@ #define PRESETS_PER_COLUMN 32 #define PRESETS_PER_GROUP 128 -void CAbstractVstEditor::UpdatePresetMenu() -//----------------------------------------- + +DWORD WINAPI CAbstractVstEditor::UpdatePresetMenuThread(LPVOID param) +//------------------------------------------------------------------- { - long numProgs = m_pVstPlugin->GetNumPrograms(); - long curProg = m_pVstPlugin->GetCurrentProgram(); + CAbstractVstEditor *that = static_cast<CAbstractVstEditor *>(param); + CVstPlugin *pVstPlugin = that->m_pVstPlugin; - if (m_pPresetMenu->m_hMenu) // We rebuild menu from scratch - { // So remove any exiting menus... - if (curProg == m_nCurProg) //.. unless menu exists and is accurate, - return; //in which case we are done. + const VstInt32 numProgs = pVstPlugin->GetNumPrograms(); + const VstInt32 curProg = pVstPlugin->GetCurrentProgram(); - for(size_t i = 0; i < m_pPresetMenuGroup.size(); i++) - { - //Destroy any submenus - if (m_pPresetMenuGroup[i]->m_hMenu) - { - m_pPresetMenuGroup[i]->DestroyMenu(); - delete m_pPresetMenuGroup[i]; - } - } - m_pPresetMenuGroup.clear(); + // Prevent the menu from being accessed. + that->m_pMenu->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED); - m_pPresetMenu->DestroyMenu(); //Destroy Factory preset menu - m_pMenu->DeleteMenu(1, MF_BYPOSITION); - - } - if (!m_pPresetMenu->m_hMenu) - { - // Create Factory preset menu - m_pPresetMenu->CreatePopupMenu(); - } - const int numSubMenus = ((numProgs - 1) / PRESETS_PER_GROUP) + 1; if(numSubMenus > 1) { // Create sub menus if necessary - m_pPresetMenuGroup.resize(numSubMenus); + that->m_pPresetMenuGroup.resize(numSubMenus); for(int bank = 0, prog = 1; bank < numSubMenus; bank++, prog += PRESETS_PER_GROUP) { - m_pPresetMenuGroup[bank] = new CMenu(); - m_pPresetMenuGroup[bank]->CreatePopupMenu(); + that->m_pPresetMenuGroup[bank] = new CMenu(); + that->m_pPresetMenuGroup[bank]->CreatePopupMenu(); CString label; - label.Format("Bank %d (%d-%d)", bank + 1, prog, min(prog + PRESETS_PER_GROUP - 1, numProgs)); - m_pPresetMenu->AppendMenu(MF_POPUP | (bank % 32 == 0 ? MF_MENUBREAK : 0), (UINT) m_pPresetMenuGroup[bank]->m_hMenu, label); + label.Format("Bank %d (%d-%d)", bank + 1, prog, Util::Min(prog + PRESETS_PER_GROUP - 1, numProgs)); + that->m_pPresetMenu->AppendMenu(MF_POPUP | (bank % 32 == 0 ? MF_MENUBREAK : 0), reinterpret_cast<UINT_PTR>(that->m_pPresetMenuGroup[bank]->m_hMenu), label); } } @@ -428,18 +408,18 @@ int entryInThisColumn = 0; // If there would be only one sub menu, we add directly to factory menu - CMenu *targetMenu = (numProgs > PRESETS_PER_GROUP) ? m_pPresetMenuGroup[subMenuIndex] : m_pPresetMenu; + CMenu *targetMenu = (numProgs > PRESETS_PER_GROUP) ? that->m_pPresetMenuGroup[subMenuIndex] : that->m_pPresetMenu; - for (long p = 0; p < numProgs; p++) + for(VstInt32 p = 0; p < numProgs; p++) { - CString programName = m_pVstPlugin->GetFormattedProgramName(p, p == curProg); + CString programName = pVstPlugin->GetFormattedProgramName(p, p == curProg); UINT splitMenuFlag = 0; if(entryInThisMenu++ == PRESETS_PER_GROUP) { // Advance to next preset group (sub menu) subMenuIndex++; - targetMenu = m_pPresetMenuGroup[subMenuIndex]; + targetMenu = that->m_pPresetMenuGroup[subMenuIndex]; entryInThisMenu = 1; entryInThisColumn = 1; } else if(entryInThisColumn++ == PRESETS_PER_COLUMN) @@ -448,31 +428,76 @@ entryInThisColumn = 1; splitMenuFlag = MF_MENUBARBREAK; } - + targetMenu->AppendMenu(MF_STRING | (p == curProg ? MF_CHECKED : MF_UNCHECKED) | splitMenuFlag, ID_PRESET_SET + p, programName); } + that->m_nCurProg = curProg; + + // Enable the preset menu now that it's filled with entries. + that->m_pMenu->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED); + that->DrawMenuBar(); + + return 0; +} + + +void CAbstractVstEditor::UpdatePresetMenu() +//----------------------------------------- +{ + const VstInt32 numProgs = m_pVstPlugin->GetNumPrograms(); + const VstInt32 curProg = m_pVstPlugin->GetCurrentProgram(); + + if(m_pPresetMenu->m_hMenu) // We rebuild menu from scratch + { // So remove any exiting menus... + if(curProg == m_nCurProg) // ... unless menu exists and is accurate, + return; // in which case we are done. + + for(size_t i = 0; i < m_pPresetMenuGroup.size(); i++) + { + // Destroy any submenus + if (m_pPresetMenuGroup[i]->m_hMenu) + { + m_pPresetMenuGroup[i]->DestroyMenu(); + delete m_pPresetMenuGroup[i]; + } + } + m_pPresetMenuGroup.clear(); + + m_pPresetMenu->DestroyMenu(); //Destroy Factory preset menu + m_pMenu->DeleteMenu(1, MF_BYPOSITION); + + } + if(!m_pPresetMenu->m_hMenu) + { + // Create Factory preset menu + m_pPresetMenu->CreatePopupMenu(); + } + // Add Factory menu to main menu - m_pMenu->InsertMenu(1, MF_BYPOSITION | MF_POPUP | (numProgs ? 0 : MF_GRAYED), (UINT) m_pPresetMenu->m_hMenu, (LPCTSTR)"&Presets"); + m_pMenu->InsertMenu(1, MF_BYPOSITION | MF_POPUP | (numProgs ? 0 : MF_GRAYED), reinterpret_cast<UINT_PTR>(m_pPresetMenu->m_hMenu), "&Presets"); - m_nCurProg=curProg; + // Depending on the plugin and its number of presets, creating the menu entries can take quite a while (e.g. Synth1), + // so we fill the menu in a separate thread, so that the GUI remains responsive. + DWORD dummy; + CreateThread(NULL, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(&CAbstractVstEditor::UpdatePresetMenuThread), static_cast<LPVOID>(this), 0, &dummy); } void CAbstractVstEditor::UpdateInputMenu() //---------------------------------------- { - CMenu* pInfoMenu = m_pMenu->GetSubMenu(2); + CMenu *pInfoMenu = m_pMenu->GetSubMenu(2); pInfoMenu->DeleteMenu(0, MF_BYPOSITION); CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); CSoundFile* pSndFile = pModDoc->GetSoundFile(); - if (m_pInputMenu->m_hMenu) + if(m_pInputMenu->m_hMenu) { m_pInputMenu->DestroyMenu(); } - if (!m_pInputMenu->m_hMenu) + if(!m_pInputMenu->m_hMenu) { m_pInputMenu->CreatePopupMenu(); } @@ -489,13 +514,13 @@ vector<CHANNELINDEX> inputChannels; m_pVstPlugin->GetInputChannelList(inputChannels); - for (size_t nChn=0; nChn<inputChannels.size(); nChn++) + for(size_t nChn=0; nChn<inputChannels.size(); nChn++) { - if (nChn==0 && inputPlugs.size()) + if(nChn == 0 && inputPlugs.size()) { m_pInputMenu->AppendMenu(MF_SEPARATOR); } - name.Format("Chn%02d: %s", inputChannels[nChn]+1, pSndFile->ChnSettings[inputChannels[nChn]].szName); + name.Format("Chn%02d: %s", inputChannels[nChn] + 1, pSndFile->ChnSettings[inputChannels[nChn]].szName); m_pInputMenu->AppendMenu(MF_STRING, NULL, name); } @@ -504,37 +529,37 @@ for(size_t nIns = 0; nIns<inputInstruments.size(); nIns++) { bool checked = false; - if (nIns==0 && (inputPlugs.size() || inputChannels.size())) + if(nIns == 0 && (inputPlugs.size() || inputChannels.size())) { m_pInputMenu->AppendMenu(MF_SEPARATOR); } - name.Format("Ins%02d: %s", inputInstruments[nIns], (LPCTSTR)pSndFile->GetInstrumentName(inputInstruments[nIns])); - if (inputInstruments[nIns] == (UINT)m_nInstrument) checked = true; - m_pInputMenu->AppendMenu(MF_STRING|(checked?MF_CHECKED:0), ID_SELECTINST+inputInstruments[nIns], name); + name.Format("Ins%02d: %s", inputInstruments[nIns], pSndFile->GetInstrumentName(inputInstruments[nIns])); + if(inputInstruments[nIns] == m_nInstrument) checked = true; + m_pInputMenu->AppendMenu(MF_STRING | (checked ? MF_CHECKED : 0), ID_SELECTINST + inputInstruments[nIns], name); } - if ((inputPlugs.size() == 0) && - (inputChannels.size() == 0) && - (inputInstruments.size() == 0)) + if(inputPlugs.size() == 0 && + inputChannels.size() == 0 && + inputInstruments.size() == 0) { - m_pInputMenu->AppendMenu(MF_STRING|MF_GRAYED, NULL, "None"); + m_pInputMenu->AppendMenu(MF_STRING | MF_GRAYED, NULL, "None"); } - pInfoMenu->InsertMenu(0, MF_BYPOSITION|MF_POPUP, (UINT)m_pInputMenu->m_hMenu, "I&nputs"); + pInfoMenu->InsertMenu(0, MF_BYPOSITION | MF_POPUP, reinterpret_cast<UINT_PTR>(m_pInputMenu->m_hMenu), "I&nputs"); } void CAbstractVstEditor::UpdateOutputMenu() //----------------------------------------- { - CMenu* pInfoMenu = m_pMenu->GetSubMenu(2); + CMenu *pInfoMenu = m_pMenu->GetSubMenu(2); pInfoMenu->DeleteMenu(1, MF_BYPOSITION); - if (m_pOutputMenu->m_hMenu) + if(m_pOutputMenu->m_hMenu) { m_pOutputMenu->DestroyMenu(); } - if (!m_pOutputMenu->m_hMenu) + if(!m_pOutputMenu->m_hMenu) { m_pOutputMenu->CreatePopupMenu(); } @@ -543,9 +568,9 @@ m_pVstPlugin->GetOutputPlugList(outputPlugs); CString name; - for (size_t nPlug = 0; nPlug < outputPlugs.size(); nPlug++) + for(size_t nPlug = 0; nPlug < outputPlugs.size(); nPlug++) { - if (outputPlugs[nPlug] != nullptr) + if(outputPlugs[nPlug] != nullptr) { name.Format("FX%02d: %s", outputPlugs[nPlug]->m_nSlot + 1, outputPlugs[nPlug]->m_pMixStruct->GetName()); @@ -553,11 +578,11 @@ } else { name = "Master Output"; - m_pOutputMenu->AppendMenu(MF_STRING|MF_GRAYED, NULL, name); + m_pOutputMenu->AppendMenu(MF_STRING | MF_GRAYED, NULL, name); } } - pInfoMenu->InsertMenu(1, MF_BYPOSITION|MF_POPUP, (UINT)m_pOutputMenu->m_hMenu, "Ou&tputs"); + pInfoMenu->InsertMenu(1, MF_BYPOSITION | MF_POPUP, reinterpret_cast<UINT_PTR>(m_pOutputMenu->m_hMenu), "Ou&tputs"); } @@ -568,25 +593,25 @@ bool greyed; int action; - CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); - if (!pModDoc) + CModDoc *pModDoc = m_pVstPlugin->GetModDoc(); + if(!pModDoc) { return; } - CMenu* pInfoMenu = m_pMenu->GetSubMenu(2); + CMenu *pInfoMenu = m_pMenu->GetSubMenu(2); pInfoMenu->DeleteMenu(2, MF_BYPOSITION); - if (m_pMacroMenu->m_hMenu) + if(m_pMacroMenu->m_hMenu) { m_pMacroMenu->DestroyMenu(); } - if (!m_pMacroMenu->m_hMenu) + if(!m_pMacroMenu->m_hMenu) { m_pMacroMenu->CreatePopupMenu(); } - for (int nMacro = 0; nMacro < NUM_MACROS; nMacro++) + for(int nMacro = 0; nMacro < NUM_MACROS; nMacro++) { action = NULL; greyed = true; @@ -613,17 +638,17 @@ m_pMacroMenu->AppendMenu(MF_STRING | (greyed ? MF_GRAYED : 0), action, label); } - pInfoMenu->InsertMenu(2, MF_BYPOSITION | MF_POPUP, (UINT)m_pMacroMenu->m_hMenu, "&Macros"); + pInfoMenu->InsertMenu(2, MF_BYPOSITION | MF_POPUP, reinterpret_cast<UINT_PTR>(m_pMacroMenu->m_hMenu), "&Macros"); } void CAbstractVstEditor::UpdateOptionsMenu() //------------------------------------------ { - if (m_pOptionsMenu->m_hMenu) - m_pOptionsMenu->DestroyMenu(); + if(m_pOptionsMenu->m_hMenu) + m_pOptionsMenu->DestroyMenu(); - CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); + CInputHandler *ih = (CMainFrame::GetMainFrame())->GetInputHandler(); m_pOptionsMenu->CreatePopupMenu(); @@ -639,7 +664,7 @@ m_pMenu->DeleteMenu(3, MF_BYPOSITION); - m_pMenu->InsertMenu(3, MF_BYPOSITION|MF_POPUP, (UINT)m_pOptionsMenu->m_hMenu, "&Options"); + m_pMenu->InsertMenu(3, MF_BYPOSITION|MF_POPUP, reinterpret_cast<UINT_PTR>(m_pOptionsMenu->m_hMenu), "&Options"); } @@ -647,11 +672,11 @@ void CAbstractVstEditor::OnToggleEditor(UINT nID) //----------------------------------------------- { - CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); + CModDoc *pModDoc = m_pVstPlugin->GetModDoc(); - if (pModDoc) + if(pModDoc) { - pModDoc->TogglePluginEditor(nID-ID_PLUGSELECT); + pModDoc->TogglePluginEditor(nID - ID_PLUGSELECT); } } Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.h 2012-11-02 14:42:24 UTC (rev 1414) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.h 2012-11-02 20:42:01 UTC (rev 1415) @@ -70,6 +70,7 @@ CMenu *m_pMacroMenu; CMenu *m_pOptionsMenu; + static DWORD WINAPI UpdatePresetMenuThread(LPVOID param); void UpdatePresetMenu(); void UpdateInputMenu(); void UpdateOutputMenu(); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2012-11-02 14:42:24 UTC (rev 1414) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2012-11-02 20:42:01 UTC (rev 1415) @@ -772,7 +772,7 @@ timeInfo.ppqPos = 0; } } - if ((value & kVstTempoValid)) + if((value & kVstTempoValid)) { timeInfo.tempo = pSndFile->GetCurrentBPM(); if (timeInfo.tempo) @@ -780,7 +780,7 @@ timeInfo.flags |= kVstTempoValid; } } - if ((value & kVstTimeSigValid)) + if((value & kVstTimeSigValid)) { timeInfo.flags |= kVstTimeSigValid; @@ -1310,7 +1310,9 @@ m_pEditor = nullptr; m_nInputs = m_nOutputs = 0; m_nEditorX = m_nEditorY = -1; +#ifdef MODPLUG_TRACKER m_pModDoc = nullptr; //rewbs.plugDocAware +#endif // MODPLUG_TRACKER m_pProcessFP = nullptr; // Insert ourselves in the beginning of the list @@ -1354,7 +1356,9 @@ m_pEffect->resvd1 = ToVstPtr(this); //rewbs.plugDocAware m_pSndFile = pSndFile; +#ifdef MODPLUG_TRACKER m_pModDoc = pSndFile->GetpModDoc(); +#endif // MODPLUG_TRACKER m_nSlot = FindSlot(); //end rewbs.plugDocAware @@ -2052,7 +2056,7 @@ float gain = 0.1f * static_cast<float>(m_pMixStruct ? m_pMixStruct->GetGain() : 10); if(gain < 0.1f) gain = 1.0f; - if (m_bIsInstrument && m_pSndFile) + if(m_bIsInstrument && m_pSndFile) { gain /= m_pSndFile->m_pConfig->getVSTiAttenuation(); gain = static_cast<float>(gain * (m_pSndFile->m_nVSTiVolume / m_pSndFile->m_pConfig->getNormalVSTiVol())); @@ -2181,7 +2185,7 @@ // -> mixop == 3 : MIX -= WET - DRY * wetRatio // -> mixop == 4 : MIX -= middle - WET * wetRatio + middle - DRY // -> mixop == 5 : MIX_L += wetRatio * (WET_L - DRY_L) + dryRatio * (DRY_R - WET_R) - // MIX_R += dryRatio * (WET_L - DRY_L) + wetRatio * (DRY_R - WET_R) + // MIX_R += dryRatio * (WET_L - DRY_L) + wetRatio * (DRY_R - WET_R) int mixop; if(m_bIsInstrument || m_pMixStruct == nullptr) @@ -2314,7 +2318,7 @@ Resume(); } - for(uint8 mc = 0; mc < 16; mc++) //all midi chans + for(uint8 mc = 0; mc < CountOf(m_MidiCh); mc++) //all midi chans { VSTInstrChannel &channel = m_MidiCh[mc]; @@ -2323,14 +2327,14 @@ MidiSend(MIDIEvents::CC(MIDIEvents::MIDICC_AllNotesOff, mc, 0)); // all notes off MidiSend(MIDIEvents::CC(MIDIEvents::MIDICC_AllSoundOff, mc, 0)); // all sounds off - for(size_t i = 0; i < CountOf(channel.uNoteOnMap); i++) //all notes + for(size_t i = 0; i < CountOf(channel.noteOnMap); i++) //all notes { - for(CHANNELINDEX c = 0; c < CountOf(channel.uNoteOnMap[i]); c++) + for(CHANNELINDEX c = 0; c < CountOf(channel.noteOnMap[i]); c++) { - while(channel.uNoteOnMap[i][c]) + while(channel.noteOnMap[i][c]) { MidiSend(MIDIEvents::NoteOff(mc, static_cast<uint8>(i), 0)); - channel.uNoteOnMap[i][c]--; + channel.noteOnMap[i][c]--; } } } @@ -2398,7 +2402,7 @@ } -//Set MIDI pitch for given MIDI channel using fixed point pitch bend value (converted back to 0-16383 MIDI range) +// Set MIDI pitch for given MIDI channel using fixed point pitch bend value (converted back to 0-16383 MIDI range) void CVstPlugin::MidiPitchBend(uint8 nMidiCh, int32 newPitchBendPos) //------------------------------------------------------------------ { @@ -2476,13 +2480,12 @@ // Specific Note Off - if (note > NOTE_MAX_SPECIAL) //rewbs.vstiLive + if(note > NOTE_MAX_SPECIAL) { - note -= NOTE_MIN; - uint8 i = static_cast<uint8>(note - NOTE_MAX_SPECIAL); - if(channel.uNoteOnMap[i][trackChannel]) + uint8 i = static_cast<uint8>(note - NOTE_MAX_SPECIAL - NOTE_MIN); + if(channel.noteOnMap[i][trackChannel]) { - channel.uNoteOnMap[i][trackChannel]--; + channel.noteOnMap[i][trackChannel]--; MidiSend(MIDIEvents::NoteOff(nMidiCh, i, 0)); } } @@ -2490,15 +2493,15 @@ // "Hard core" All Sounds Off on this midi and tracker channel // This one doesn't check the note mask - just one note off per note. // Also less likely to cause a VST event buffer overflow. - else if (note == NOTE_NOTECUT) // ^^ + else if(note == NOTE_NOTECUT) // ^^ { MidiSend(MIDIEvents::CC(MIDIEvents::MIDICC_AllNotesOff, nMidiCh, 0)); MidiSend(MIDIEvents::CC(MIDIEvents::MIDICC_AllSoundOff, nMidiCh, 0)); // Turn off all notes - for(uint8 i = 0; i < 128; i++) + for(uint8 i = 0; i < CountOf(channel.noteOnMap); i++) { - channel.uNoteOnMap[i][trackChannel] = 0; + channel.noteOnMap[i][trackChannel] = 0; MidiSend(MIDIEvents::NoteOff(nMidiCh, i, volume)); } @@ -2508,14 +2511,14 @@ // using note mask. else if(note == NOTE_KEYOFF || note == NOTE_FADE) // ==, ~~ { - for(uint8 i = 0; i < 128; i++) + for(uint8 i = 0; i < CountOf(channel.noteOnMap); i++) { // Some VSTis need a note off for each instance of a note on, e.g. fabfilter. - while(channel.uNoteOnMap[i][trackChannel]) + while(channel.noteOnMap[i][trackChannel]) { if(MidiSend(MIDIEvents::NoteOff(nMidiCh, i, volume))) { - channel.uNoteOnMap[i][trackChannel]--; + channel.noteOnMap[i][trackChannel]--; } else { // VST event queue overflow, no point in submitting more note offs. @@ -2543,8 +2546,8 @@ // Problem: if a note dies out naturally and we never send a note off, this counter // will block at max until note off. Is this a problem? // Safe to assume we won't need more than 16 note offs max on a given note? - if(channel.uNoteOnMap[note][trackChannel] < 17) - channel.uNoteOnMap[note][trackChannel]++; + if(channel.noteOnMap[note][trackChannel] < 17) + channel.noteOnMap[note][trackChannel]++; MidiSend(MIDIEvents::NoteOn(nMidiCh, static_cast<uint8>(note), volume)); } @@ -2555,7 +2558,7 @@ //------------------------------------------------------------------ { note -= NOTE_MIN; - return (m_MidiCh[midiChn].uNoteOnMap[note][trackerChn] != 0); + return (m_MidiCh[midiChn].noteOnMap[note][trackerChn] != 0); } @@ -2565,11 +2568,11 @@ note -= NOTE_MIN; VSTInstrChannel *pMidiCh = &m_MidiCh[midiChn & 0x0f]; - if (!(pMidiCh->uNoteOnMap[note][sourceTrackerChn])) + if (!(pMidiCh->noteOnMap[note][sourceTrackerChn])) return false; - pMidiCh->uNoteOnMap[note][sourceTrackerChn]--; - pMidiCh->uNoteOnMap[note][destTrackerChn]++; + pMidiCh->noteOnMap[note][sourceTrackerChn]--; + pMidiCh->noteOnMap[note][destTrackerChn]++; return true; } //end rewbs.introVST @@ -2595,6 +2598,7 @@ void CVstPlugin::AutomateParameter(PlugParamIndex param) //------------------------------------------------------ { +#ifdef MODPLUG_TRACKER CModDoc* pModDoc = GetModDoc(); if(pModDoc == nullptr) { @@ -2642,6 +2646,7 @@ pVstEditor->SetLearnMacro(-1); } } +#endif // MODPLUG_TRACKER } @@ -2692,7 +2697,7 @@ } } // This plug doesn't support chunks: save parameters - UINT nParams = (m_pEffect->numParams > 0) ? m_pEffect->numParams : 0; + PlugParamIndex nParams = (m_pEffect->numParams > 0) ? m_pEffect->numParams : 0; UINT nLen = nParams * sizeof(float); if (!nLen) return; nLen += 4; @@ -2714,7 +2719,7 @@ float *p = (float *)m_pMixStruct->pPluginData; *(ULONG *)p = 0; p++; - for (UINT i = 0; i < nParams; i++) + for(PlugParamIndex i = 0; i < nParams; i++) { p[i] = GetParameter(i); } @@ -2828,7 +2833,7 @@ Dispatch(effSetBypass, bypass ? 1 : 0, nullptr, nullptr, 0.0f); #ifdef MODPLUG_TRACKER - if (m_pModDoc) + if(m_pModDoc) m_pModDoc->UpdateAllViews(nullptr, HINT_MIXPLUGINS, nullptr); #endif // MODPLUG_TRACKER } @@ -2849,9 +2854,9 @@ //------------------------------ { PLUGINDEX slot = 0; - if (m_pSndFile) + if(m_pSndFile) { - while ((m_pMixStruct != &(m_pSndFile->m_MixPlugins[slot])) && slot < MAX_MIXPLUGINS - 1) + while(m_pMixStruct != &(m_pSndFile->m_MixPlugins[slot]) && slot < MAX_MIXPLUGINS - 1) { slot++; } Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2012-11-02 14:42:24 UTC (rev 1414) +++ trunk/OpenMPT/mptrack/Vstplug.h 2012-11-02 20:42:01 UTC (rev 1415) @@ -104,10 +104,10 @@ struct VSTInstrChannel { - int32 midiPitchBendPos; // Current Pitch Wheel position, in 16.11 fixed point format. Lowest bit is used for indicating that vibrato was applied. Vibrato offset itself is not stored in this value. + int32 midiPitchBendPos; // Current Pitch Wheel position, in 16.11 fixed point format. Lowest bit is used for indicating that vibrato was applied. Vibrato offset itself is not stored in this value. uint16 currentProgram; - uint16 currentBank; //rewbs.MidiBank - uint8 uNoteOnMap[128][MAX_CHANNELS]; + uint16 currentBank; + uint8 noteOnMap[128][MAX_CHANNELS]; }; @@ -142,9 +142,11 @@ SNDMIXPLUGIN *m_pMixStruct; AEffect *m_pEffect; void (*m_pProcessFP)(AEffect*, float**, float**, VstInt32); //Function pointer to AEffect processReplacing if supported, else process. - CAbstractVstEditor *m_pEditor; //rewbs.defaultPlugGUI - CModDoc *m_pModDoc; //rewbs.plugDocAware - CSoundFile *m_pSndFile; //rewbs.plugDocAware + CAbstractVstEditor *m_pEditor; +#ifdef MODPLUG_TRACKER + CModDoc *m_pModDoc; +#endif // MODPLUG_TRACKER + CSoundFile *m_pSndFile; size_t m_nRefCount; static const uint32 nInvalidSampleRate = UINT_MAX; @@ -176,16 +178,18 @@ VstInt32 GetNumPrograms(); PlugParamIndex GetNumParameters(); VstInt32 GetCurrentProgram(); - VstInt32 GetNumProgramCategories(); //rewbs.VSTpresets + VstInt32 GetNumProgramCategories(); CString GetFormattedProgramName(VstInt32 index, bool allowFallback = false); bool LoadProgram(CString fileName); bool SaveProgram(CString fileName); - VstInt32 GetUID(); //rewbs.VSTpresets - VstInt32 GetVersion(); //rewbs.VSTpresets - bool GetParams(float* param, VstInt32 min, VstInt32 max); //rewbs.VSTpresets - bool RandomizeParams(PlugParamIndex minParam = 0, PlugParamIndex maxParam = 0); //rewbs.VSTpresets - inline CModDoc* GetModDoc() {return m_pModDoc;} - inline CSoundFile* GetSoundFile() {return m_pSndFile;} + VstInt32 GetUID(); + VstInt32 GetVersion(); + bool GetParams(float* param, VstInt32 min, VstInt32 max); + bool RandomizeParams(PlugParamIndex minParam = 0, PlugParamIndex maxParam = 0); +#ifdef MODPLUG_TRACKER + inline CModDoc *GetModDoc() { return m_pModDoc; } +#endif // MODPLUG_TRACKER + inline CSoundFile *GetSoundFile() { return m_pSndFile; } PLUGINDEX FindSlot(); void SetSlot(PLUGINDEX slot); PLUGINDEX GetSlot(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-11-04 18:08:03
|
Revision: 1416 http://modplug.svn.sourceforge.net/modplug/?rev=1416&view=rev Author: saga-games Date: 2012-11-04 18:07:54 +0000 (Sun, 04 Nov 2012) Log Message: ----------- [Fix] VST Editor: As some plugins don't like multiple GUI threads (e.g. SQ8L), Revision 1415 has been changed to only fill the preset menu on click (in the single GUI thread). [Fix] Pattern Editor: Resizing a pattern only created an undo point when the pattern was reduced. Revision Links: -------------- http://modplug.svn.sourceforge.net/modplug/?rev=1415&view=rev Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.h trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2012-11-02 20:42:01 UTC (rev 1415) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2012-11-04 18:07:54 UTC (rev 1416) @@ -25,6 +25,7 @@ BEGIN_MESSAGE_MAP(CAbstractVstEditor, CDialog) ON_WM_CLOSE() ON_WM_INITMENU() + ON_WM_MENUSELECT() ON_COMMAND(ID_PRESET_LOAD, OnLoadPreset) ON_COMMAND(ID_PLUG_BYPASS, OnBypassPlug) ON_COMMAND(ID_PLUG_RECORDAUTOMATION,OnRecordAutomation) @@ -97,7 +98,8 @@ } } -VOID CAbstractVstEditor::OnLoadPreset() + +void CAbstractVstEditor::OnLoadPreset() //------------------------------------- { if(!m_pVstPlugin) return; @@ -120,7 +122,8 @@ } } -VOID CAbstractVstEditor::OnSavePreset() + +void CAbstractVstEditor::OnSavePreset() //------------------------------------- { if(!m_pVstPlugin) return; @@ -138,7 +141,8 @@ } -VOID CAbstractVstEditor::OnRandomizePreset() + +void CAbstractVstEditor::OnRandomizePreset() //----------------------------------------- { if(m_pVstPlugin && Reporting::Confirm("Are you sure you want to randomize parameters?\nYou will lose current parameter values.", false, false, this) == cnfYes) @@ -148,7 +152,8 @@ } } -VOID CAbstractVstEditor::SetupMenu() + +void CAbstractVstEditor::SetupMenu() //---------------------------------- { //TODO: create menus on click so they are only updated when required @@ -165,6 +170,7 @@ return; } + void CAbstractVstEditor::UpdatePresetField() //------------------------------------------ { @@ -313,7 +319,7 @@ { if(ValidateCurrentInstrument()) { - CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); + CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); CMainFrame* pMainFrm = CMainFrame::GetMainFrame(); pModDoc->PlayNote(wParam - kcVSTGUIStartNotes + 1 + pMainFrm->GetBaseOctave() * 12, m_nInstrument, 0, false); } @@ -323,7 +329,7 @@ { if(ValidateCurrentInstrument()) { - CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); + CModDoc* pModDoc = m_pVstPlugin->GetModDoc(); CMainFrame* pMainFrm = CMainFrame::GetMainFrame(); pModDoc->NoteOff(wParam - kcVSTGUIStartNoteStops + 1 + pMainFrm->GetBaseOctave() * 12, false, m_nInstrument); } @@ -371,35 +377,47 @@ } + +void CAbstractVstEditor::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hMenu) +//--------------------------------------------------------------------------- +{ + if((nFlags & MF_POPUP) && nItemID == 1) + { + // Generate preset menu on click. + FillPresetMenu(); + } +} + + #define PRESETS_PER_COLUMN 32 #define PRESETS_PER_GROUP 128 -DWORD WINAPI CAbstractVstEditor::UpdatePresetMenuThread(LPVOID param) -//------------------------------------------------------------------- +void CAbstractVstEditor::FillPresetMenu() +//--------------------------------------- { - CAbstractVstEditor *that = static_cast<CAbstractVstEditor *>(param); - CVstPlugin *pVstPlugin = that->m_pVstPlugin; + if(m_pPresetMenu->GetMenuItemCount() != 0) + { + // Already filled... + return; + } - const VstInt32 numProgs = pVstPlugin->GetNumPrograms(); - const VstInt32 curProg = pVstPlugin->GetCurrentProgram(); + const VstInt32 numProgs = m_pVstPlugin->GetNumPrograms(); + const VstInt32 curProg = m_pVstPlugin->GetCurrentProgram(); - // Prevent the menu from being accessed. - that->m_pMenu->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED); - const int numSubMenus = ((numProgs - 1) / PRESETS_PER_GROUP) + 1; if(numSubMenus > 1) { // Create sub menus if necessary - that->m_pPresetMenuGroup.resize(numSubMenus); + m_pPresetMenuGroup.resize(numSubMenus); for(int bank = 0, prog = 1; bank < numSubMenus; bank++, prog += PRESETS_PER_GROUP) { - that->m_pPresetMenuGroup[bank] = new CMenu(); - that->m_pPresetMenuGroup[bank]->CreatePopupMenu(); + m_pPresetMenuGroup[bank] = new CMenu(); + m_pPresetMenuGroup[bank]->CreatePopupMenu(); CString label; label.Format("Bank %d (%d-%d)", bank + 1, prog, Util::Min(prog + PRESETS_PER_GROUP - 1, numProgs)); - that->m_pPresetMenu->AppendMenu(MF_POPUP | (bank % 32 == 0 ? MF_MENUBREAK : 0), reinterpret_cast<UINT_PTR>(that->m_pPresetMenuGroup[bank]->m_hMenu), label); + m_pPresetMenu->AppendMenu(MF_POPUP | (bank % 32 == 0 ? MF_MENUBREAK : 0), reinterpret_cast<UINT_PTR>(m_pPresetMenuGroup[bank]->m_hMenu), label); } } @@ -408,18 +426,18 @@ int entryInThisColumn = 0; // If there would be only one sub menu, we add directly to factory menu - CMenu *targetMenu = (numProgs > PRESETS_PER_GROUP) ? that->m_pPresetMenuGroup[subMenuIndex] : that->m_pPresetMenu; + CMenu *targetMenu = (numProgs > PRESETS_PER_GROUP) ? m_pPresetMenuGroup[subMenuIndex] : m_pPresetMenu; for(VstInt32 p = 0; p < numProgs; p++) { - CString programName = pVstPlugin->GetFormattedProgramName(p, p == curProg); + CString programName = m_pVstPlugin->GetFormattedProgramName(p, p == curProg); UINT splitMenuFlag = 0; if(entryInThisMenu++ == PRESETS_PER_GROUP) { // Advance to next preset group (sub menu) subMenuIndex++; - targetMenu = that->m_pPresetMenuGroup[subMenuIndex]; + targetMenu = m_pPresetMenuGroup[subMenuIndex]; entryInThisMenu = 1; entryInThisColumn = 1; } else if(entryInThisColumn++ == PRESETS_PER_COLUMN) @@ -432,13 +450,7 @@ targetMenu->AppendMenu(MF_STRING | (p == curProg ? MF_CHECKED : MF_UNCHECKED) | splitMenuFlag, ID_PRESET_SET + p, programName); } - that->m_nCurProg = curProg; - - // Enable the preset menu now that it's filled with entries. - that->m_pMenu->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED); - that->DrawMenuBar(); - - return 0; + m_nCurProg = curProg; } @@ -464,7 +476,7 @@ } m_pPresetMenuGroup.clear(); - m_pPresetMenu->DestroyMenu(); //Destroy Factory preset menu + m_pPresetMenu->DestroyMenu(); // Destroy Factory preset menu m_pMenu->DeleteMenu(1, MF_BYPOSITION); } @@ -478,9 +490,7 @@ m_pMenu->InsertMenu(1, MF_BYPOSITION | MF_POPUP | (numProgs ? 0 : MF_GRAYED), reinterpret_cast<UINT_PTR>(m_pPresetMenu->m_hMenu), "&Presets"); // Depending on the plugin and its number of presets, creating the menu entries can take quite a while (e.g. Synth1), - // so we fill the menu in a separate thread, so that the GUI remains responsive. - DWORD dummy; - CreateThread(NULL, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(&CAbstractVstEditor::UpdatePresetMenuThread), static_cast<LPVOID>(this), 0, &dummy); + // so we fill the menu only on demand (when it is clicked), so that the editor GUI creation doesn't take forever. } @@ -829,4 +839,3 @@ } #endif // NO_VST - Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.h 2012-11-02 20:42:01 UTC (rev 1415) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.h 2012-11-04 18:07:54 UTC (rev 1416) @@ -46,6 +46,7 @@ afx_msg void OnVSTPresetBackwardJump(); afx_msg void OnVSTPresetForwardJump(); afx_msg void OnCreateInstrument(); + afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hMenu); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys //Overridden methods: @@ -70,7 +71,7 @@ CMenu *m_pMacroMenu; CMenu *m_pOptionsMenu; - static DWORD WINAPI UpdatePresetMenuThread(LPVOID param); + void FillPresetMenu(); void UpdatePresetMenu(); void UpdateInputMenu(); void UpdateOutputMenu(); Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2012-11-02 20:42:01 UTC (rev 1415) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2012-11-04 18:07:54 UTC (rev 1416) @@ -579,7 +579,7 @@ const ROWINDEX newSize = (ROWINDEX)GetDlgItemInt(IDC_COMBO1, NULL, FALSE); // Check if any pattern data would be removed. - bool resize = true; + bool resize = (newSize != pSndFile->Patterns[m_nPattern].GetNumRows()); for(ROWINDEX row = newSize; row < pSndFile->Patterns[m_nPattern].GetNumRows(); row++) { if(!pSndFile->Patterns[m_nPattern].IsEmptyRow(row)) @@ -591,7 +591,7 @@ if(resize) { - m_pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0, newSize, pSndFile->Patterns[m_nPattern].GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows() - newSize); + m_pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, pSndFile->Patterns[m_nPattern].GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); m_pModDoc->BeginWaitCursor(); if(pSndFile->Patterns[m_nPattern].Resize(newSize)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-11-16 22:41:30
|
Revision: 1428 http://modplug.svn.sourceforge.net/modplug/?rev=1428&view=rev Author: saga-games Date: 2012-11-16 22:41:23 +0000 (Fri, 16 Nov 2012) Log Message: ----------- [Imp] Added context menu shortcuts for Record Select. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-11-16 22:34:22 UTC (rev 1427) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-11-16 22:41:23 UTC (rev 1428) @@ -1460,7 +1460,7 @@ { if (BuildSoloMuteCtxMenu(hMenu, ih, nChn, pSndFile)) AppendMenu(hMenu, MF_SEPARATOR, 0, ""); - BuildRecordCtxMenu(hMenu, nChn, pModDoc); + BuildRecordCtxMenu(hMenu, ih, nChn, pModDoc); BuildChannelControlCtxMenu(hMenu); } } @@ -5762,11 +5762,11 @@ return true; } -bool CViewPattern::BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc* pModDoc) const -//----------------------------------------------------------------------------------- +bool CViewPattern::BuildRecordCtxMenu(HMENU hMenu, CInputHandler *ih, UINT nChn, CModDoc* pModDoc) const +//------------------------------------------------------------------------------------------------------ { - AppendMenu(hMenu, pModDoc->IsChannelRecord1(nChn) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_EDIT_RECSELECT, "Record select"); - AppendMenu(hMenu, pModDoc->IsChannelRecord2(nChn) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_EDIT_SPLITRECSELECT, "Split Record select"); + AppendMenu(hMenu, pModDoc->IsChannelRecord1(nChn) ? (MF_STRING | MF_CHECKED) : MF_STRING, ID_EDIT_RECSELECT, "Record select\t" + ih->GetKeyTextFromCommand(kcChannelRecordSelect)); + AppendMenu(hMenu, pModDoc->IsChannelRecord2(nChn) ? (MF_STRING | MF_CHECKED) : MF_STRING, ID_EDIT_SPLITRECSELECT, "Split Record select\t" + ih->GetKeyTextFromCommand(kcChannelSplitRecordSelect)); return true; } Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2012-11-16 22:34:22 UTC (rev 1427) +++ trunk/OpenMPT/mptrack/View_pat.h 2012-11-16 22:41:23 UTC (rev 1428) @@ -428,7 +428,7 @@ bool BuildChannelControlCtxMenu(HMENU hMenu) const; bool BuildPluginCtxMenu(HMENU hMenu, UINT nChn, CSoundFile *pSndFile) const; - bool BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc *pModDoc) const; + bool BuildRecordCtxMenu(HMENU hMenu, CInputHandler *ih, UINT nChn, CModDoc *pModDoc) const; bool BuildSoloMuteCtxMenu(HMENU hMenu, CInputHandler *ih, UINT nChn, CSoundFile *pSndFile) const; bool BuildRowInsDelCtxMenu(HMENU hMenu, CInputHandler *ih) const; bool BuildMiscCtxMenu(HMENU hMenu, CInputHandler *ih) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-11-20 20:18:09
|
Revision: 1435 http://modplug.svn.sourceforge.net/modplug/?rev=1435&view=rev Author: saga-games Date: 2012-11-20 20:18:02 +0000 (Tue, 20 Nov 2012) Log Message: ----------- [Fix] Sample Editor: Reducing the size of the sample undo buffer could sometimes lead to freezes. [Mod] OpenMPT: Version is now 1.20.04.05 Modified Paths: -------------- trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/Undo.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2012-11-20 20:16:27 UTC (rev 1434) +++ trunk/OpenMPT/mptrack/Undo.cpp 2012-11-20 20:18:02 UTC (rev 1435) @@ -203,7 +203,7 @@ if(linkToPrevious) { - nPattern = Undo(true); + nPattern = Undo(true); } return nPattern; @@ -297,8 +297,8 @@ // Save old sample header sUndo.OldSample = oldsample; - MemCopy(sUndo.szOldName, pSndFile->m_szNames[smp]); - sUndo.nChangeType = changeType; + MemCopy(sUndo.oldName, pSndFile->m_szNames[smp]); + sUndo.changeType = changeType; if(changeType == sundo_replace) { @@ -311,9 +311,9 @@ changeStart = changeEnd = 0; } - sUndo.nChangeStart = changeStart; - sUndo.nChangeEnd = changeEnd; - sUndo.SamplePtr = nullptr; + sUndo.changeStart = changeStart; + sUndo.changeEnd = changeEnd; + sUndo.samplePtr = nullptr; switch(changeType) { @@ -332,9 +332,9 @@ size_t nBytesPerSample = oldsample.GetBytesPerSample(); size_t nChangeLen = changeEnd - changeStart; - sUndo.SamplePtr = pSndFile->AllocateSample(nChangeLen * nBytesPerSample + 4 * nBytesPerSample); - if(sUndo.SamplePtr == nullptr) return false; - memcpy(sUndo.SamplePtr, oldsample.pSample + changeStart * nBytesPerSample, nChangeLen * nBytesPerSample); + sUndo.samplePtr = pSndFile->AllocateSample(nChangeLen * nBytesPerSample + 4 * nBytesPerSample); + if(sUndo.samplePtr == nullptr) return false; + memcpy(sUndo.samplePtr, oldsample.pSample + changeStart * nBytesPerSample, nChangeLen * nBytesPerSample); #ifdef _DEBUG char s[64]; @@ -376,55 +376,55 @@ LPSTR pNewSample = nullptr; // a new sample is possibly going to be allocated, depending on what's going to be undone. UINT nBytesPerSample = undo.OldSample.GetBytesPerSample(); - UINT nChangeLen = undo.nChangeEnd - undo.nChangeStart; + UINT nChangeLen = undo.changeEnd - undo.changeStart; - switch(undo.nChangeType) + switch(undo.changeType) { case sundo_none: break; case sundo_invert: // invert again - ctrlSmp::InvertSample(sample, undo.nChangeStart, undo.nChangeEnd, pSndFile); + ctrlSmp::InvertSample(sample, undo.changeStart, undo.changeEnd, pSndFile); break; case sundo_reverse: // reverse again - ctrlSmp::ReverseSample(sample, undo.nChangeStart, undo.nChangeEnd, pSndFile); + ctrlSmp::ReverseSample(sample, undo.changeStart, undo.changeEnd, pSndFile); break; case sundo_unsign: // unsign again - ctrlSmp::UnsignSample(sample, undo.nChangeStart, undo.nChangeEnd, pSndFile); + ctrlSmp::UnsignSample(sample, undo.changeStart, undo.changeEnd, pSndFile); break; case sundo_insert: // delete inserted data ASSERT(nChangeLen == sample.nLength - undo.OldSample.nLength); - memcpy(pCurrentSample + undo.nChangeStart * nBytesPerSample, pCurrentSample + undo.nChangeEnd * nBytesPerSample, (sample.nLength - undo.nChangeEnd) * nBytesPerSample); + memcpy(pCurrentSample + undo.changeStart * nBytesPerSample, pCurrentSample + undo.changeEnd * nBytesPerSample, (sample.nLength - undo.changeEnd) * nBytesPerSample); // also clean the sample end memset(pCurrentSample + undo.OldSample.nLength * nBytesPerSample, 0, (sample.nLength - undo.OldSample.nLength) * nBytesPerSample); break; case sundo_update: // simply replace what has been updated. - if(sample.nLength < undo.nChangeEnd) return false; - memcpy(pCurrentSample + undo.nChangeStart * nBytesPerSample, undo.SamplePtr, nChangeLen * nBytesPerSample); + if(sample.nLength < undo.changeEnd) return false; + memcpy(pCurrentSample + undo.changeStart * nBytesPerSample, undo.samplePtr, nChangeLen * nBytesPerSample); break; case sundo_delete: // insert deleted data pNewSample = pSndFile->AllocateSample(undo.OldSample.GetSampleSizeInBytes() + 4 * nBytesPerSample); if(pNewSample == nullptr) return false; - memcpy(pNewSample, pCurrentSample, undo.nChangeStart * nBytesPerSample); - memcpy(pNewSample + undo.nChangeStart * nBytesPerSample, undo.SamplePtr, nChangeLen * nBytesPerSample); - memcpy(pNewSample + undo.nChangeEnd * nBytesPerSample, pCurrentSample + undo.nChangeStart * nBytesPerSample, (undo.OldSample.nLength - undo.nChangeEnd) * nBytesPerSample); + memcpy(pNewSample, pCurrentSample, undo.changeStart * nBytesPerSample); + memcpy(pNewSample + undo.changeStart * nBytesPerSample, undo.samplePtr, nChangeLen * nBytesPerSample); + memcpy(pNewSample + undo.changeEnd * nBytesPerSample, pCurrentSample + undo.changeStart * nBytesPerSample, (undo.OldSample.nLength - undo.changeEnd) * nBytesPerSample); break; case sundo_replace: // simply exchange sample pointer - pNewSample = undo.SamplePtr; - undo.SamplePtr = nullptr; // prevent sample from being deleted + pNewSample = undo.samplePtr; + undo.samplePtr = nullptr; // prevent sample from being deleted break; default: @@ -435,7 +435,7 @@ // Restore old sample header sample = undo.OldSample; sample.pSample = pCurrentSample; // select the "correct" old sample - MemCopy(pSndFile->m_szNames[smp], undo.szOldName); + MemCopy(pSndFile->m_szNames[smp], undo.oldName); if(pNewSample != nullptr) { @@ -466,7 +466,7 @@ //------------------------------------------------------------------------ { if(!SampleBufferExists(smp, false) || step >= UndoBuffer[smp - 1].size()) return; - CSoundFile::FreeSample(UndoBuffer[smp - 1][step].SamplePtr); + CSoundFile::FreeSample(UndoBuffer[smp - 1][step].samplePtr); UndoBuffer[smp - 1].erase(UndoBuffer[smp - 1].begin() + step); } @@ -490,10 +490,18 @@ { for(SAMPLEINDEX smp = 1; smp <= UndoBuffer.size(); smp++) { - if(UndoBuffer[smp - 1].size() != 0 && UndoBuffer[smp - 1][0].SamplePtr != nullptr) + for(size_t i = 0; i < UndoBuffer[smp - 1].size(); i++) { - capacity -= (UndoBuffer[smp - 1][0].nChangeEnd - UndoBuffer[smp - 1][0].nChangeStart) * UndoBuffer[smp - 1][0].OldSample.GetBytesPerSample(); - DeleteUndoStep(smp, 0); + if(UndoBuffer[smp - 1][i].samplePtr != nullptr) + { + capacity -= (UndoBuffer[smp - 1][i].changeEnd - UndoBuffer[smp - 1][i].changeStart) * UndoBuffer[smp - 1][i].OldSample.GetBytesPerSample(); + for(size_t j = 0; j <= i; j++) + { + DeleteUndoStep(smp, j); + } + // Try to evenly spread out the restriction, i.e. move on to other samples before deleting another step for this sample. + break; + } } if(capacity <= CMainFrame::GetSettings().m_nSampleUndoMaxBuffer) return; } @@ -510,9 +518,9 @@ { for(size_t nStep = 0; nStep < UndoBuffer[smp].size(); nStep++) { - if(UndoBuffer[smp][nStep].SamplePtr != nullptr) + if(UndoBuffer[smp][nStep].samplePtr != nullptr) { - sum += (UndoBuffer[smp][nStep].nChangeEnd - UndoBuffer[smp][nStep].nChangeStart) + sum += (UndoBuffer[smp][nStep].changeEnd - UndoBuffer[smp][nStep].changeStart) * UndoBuffer[smp][nStep].OldSample.GetBytesPerSample(); } } Modified: trunk/OpenMPT/mptrack/Undo.h =================================================================== --- trunk/OpenMPT/mptrack/Undo.h 2012-11-20 20:16:27 UTC (rev 1434) +++ trunk/OpenMPT/mptrack/Undo.h 2012-11-20 20:18:02 UTC (rev 1435) @@ -42,12 +42,12 @@ struct UndoInfo { + ModCommand *pbuffer; + ChannelInfo *channelInfo; + ROWINDEX patternsize; + ROWINDEX firstRow, numRows; PATTERNINDEX pattern; - ROWINDEX patternsize; CHANNELINDEX firstChannel, numChannels; - ROWINDEX firstRow, numRows; - ModCommand *pbuffer; - ChannelInfo *channelInfo; bool linkToPrevious; }; @@ -60,11 +60,15 @@ public: - // Pattern undo functions + // Removes all undo steps from the buffer. void ClearUndo(); + // Adds a new action to the undo buffer. bool PrepareUndo(PATTERNINDEX pattern, CHANNELINDEX firstChn, ROWINDEX firstRow, CHANNELINDEX numChns, ROWINDEX numRows, bool linkToPrevious = false, bool storeChannelInfo = false); + // Undoes the most recent action. PATTERNINDEX Undo(); + // Returns true if any actions can currently be undone. bool CanUndo() const; + // Remove the latest added undo step from the undo buffer void RemoveLastUndoStep(); void SetParent(CModDoc *pModDoc) { m_pModDoc = pModDoc; } @@ -110,10 +114,10 @@ struct UndoInfo { ModSample OldSample; - char szOldName[MAX_SAMPLENAME]; - LPSTR SamplePtr; - SmpLength nChangeStart, nChangeEnd; - sampleUndoTypes nChangeType; + char oldName[MAX_SAMPLENAME]; + LPSTR samplePtr; + SmpLength changeStart, changeEnd; + sampleUndoTypes changeType; }; // Undo buffer Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2012-11-20 20:16:27 UTC (rev 1434) +++ trunk/OpenMPT/mptrack/version.h 2012-11-20 20:18:02 UTC (rev 1435) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 04 -#define VER_MINORMINOR 04 +#define VER_MINORMINOR 05 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-01 15:19:57
|
Revision: 1440 http://modplug.svn.sourceforge.net/modplug/?rev=1440&view=rev Author: saga-games Date: 2012-12-01 15:19:49 +0000 (Sat, 01 Dec 2012) Log Message: ----------- [Fix] Plugin Editor: Changing preset didn't mark the module as modified. [Fix] Sample Editor: Fixed a possible crashe when creating undo points (e.g. when using loop crossfade). [Mod] OpenMPT: Version is now 1.20.04.06 Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2012-11-23 17:26:20 UTC (rev 1439) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2012-12-01 15:19:49 UTC (rev 1440) @@ -202,7 +202,10 @@ m_pVstPlugin->SetCurrentProgram(nIndex); UpdatePresetField(); - //SetupMenu(); + if(m_pVstPlugin->m_pSndFile->GetModSpecifications().supportsPlugins) + { + m_pVstPlugin->GetModDoc()->SetModified(); + } } } Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp 2012-11-23 17:26:20 UTC (rev 1439) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp 2012-12-01 15:19:49 UTC (rev 1440) @@ -240,6 +240,6 @@ //-------------------------- { m_nSamples = GetDlgItemInt(IDC_EDIT1, NULL, FALSE); + LimitMax(m_nSamples, m_nMaxSamples); CDialog::OnOK(); } - Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2012-11-23 17:26:20 UTC (rev 1439) +++ trunk/OpenMPT/mptrack/Undo.cpp 2012-12-01 15:19:49 UTC (rev 1440) @@ -291,30 +291,37 @@ RestrictBufferSize(); // Create new undo slot - UndoInfo sUndo; + UndoInfo undo; - const ModSample &oldsample = pSndFile->GetSample(smp); + const ModSample &oldSample = pSndFile->GetSample(smp); // Save old sample header - sUndo.OldSample = oldsample; - MemCopy(sUndo.oldName, pSndFile->m_szNames[smp]); - sUndo.changeType = changeType; + undo.OldSample = oldSample; + MemCopy(undo.oldName, pSndFile->m_szNames[smp]); + undo.changeType = changeType; if(changeType == sundo_replace) { // ensure that size information is correct here. changeStart = 0; - changeEnd = oldsample.nLength; + changeEnd = oldSample.nLength; } else if(changeType == sundo_none) { // we do nothing... changeStart = changeEnd = 0; } - sUndo.changeStart = changeStart; - sUndo.changeEnd = changeEnd; - sUndo.samplePtr = nullptr; + if(changeStart > oldSample.nLength || changeStart > changeEnd) + { + // Something is surely screwed up. + ASSERT(false); + return false; + } + undo.changeStart = changeStart; + undo.changeEnd = changeEnd; + undo.samplePtr = nullptr; + switch(changeType) { case sundo_none: // we are done, no sample changes here. @@ -327,18 +334,18 @@ case sundo_update: case sundo_delete: case sundo_replace: - if(oldsample.pSample != nullptr) + if(oldSample.pSample != nullptr) { - size_t nBytesPerSample = oldsample.GetBytesPerSample(); - size_t nChangeLen = changeEnd - changeStart; + const size_t bytesPerSample = oldSample.GetBytesPerSample(); + const size_t changeLen = changeEnd - changeStart; - sUndo.samplePtr = pSndFile->AllocateSample(nChangeLen * nBytesPerSample + 4 * nBytesPerSample); - if(sUndo.samplePtr == nullptr) return false; - memcpy(sUndo.samplePtr, oldsample.pSample + changeStart * nBytesPerSample, nChangeLen * nBytesPerSample); + undo.samplePtr = pSndFile->AllocateSample((changeLen + 4) * bytesPerSample); + if(undo.samplePtr == nullptr) return false; + memcpy(undo.samplePtr, oldSample.pSample + changeStart * bytesPerSample, changeLen * bytesPerSample); #ifdef _DEBUG char s[64]; - const size_t nSize = (GetUndoBufferCapacity() + nChangeLen * nBytesPerSample) >> 10; + const size_t nSize = (GetUndoBufferCapacity() + changeLen * bytesPerSample) >> 10; wsprintf(s, "Sample undo buffer size is now %u.%u MB\n", nSize >> 10, (nSize & 1023) * 100 / 1024); Log(s); #endif @@ -351,7 +358,7 @@ return false; } - UndoBuffer[smp - 1].push_back(sUndo); + UndoBuffer[smp - 1].push_back(undo); m_pModDoc->UpdateAllViews(NULL, HINT_UNDO); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2012-11-23 17:26:20 UTC (rev 1439) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2012-12-01 15:19:49 UTC (rev 1440) @@ -39,7 +39,7 @@ #define ENV_LEFTBAR_CYBTN 22 -const UINT cLeftBarButtons[ENV_LEFTBAR_BUTTONS] = +const UINT cLeftBarButtons[ENV_LEFTBAR_BUTTONS] = { ID_ENVSEL_VOLUME, ID_ENVSEL_PANNING, @@ -127,10 +127,10 @@ MemsetZero(m_dwNotifyPos); MemsetZero(m_NcButtonState); m_bmpEnvBar.Create(IDB_ENVTOOLBAR, 20, 0, RGB(192,192,192)); - MemsetZero(m_baPlayingNote); //rewbs.customKeys + m_baPlayingNote.assign(128, false); m_nPlayingChannel = CHANNELINDEX_INVALID; //rewbs.customKeys //rewbs.envRowGrid - m_bGrid=true; + m_bGrid=true; m_bGridForceRedraw=false; m_GridSpeed = -1; m_GridScrollPos = -1; @@ -159,7 +159,7 @@ { SIZE sizeTotal, sizePage, sizeLine; UINT ntickmax = EnvGetTick(EnvGetLastPoint()); - + sizeTotal.cx = (INT)((ntickmax + 2) * m_fZoom); sizeTotal.cy = 1; sizeLine.cx = (INT)m_fZoom; @@ -720,13 +720,13 @@ CModDoc *pModDoc = GetDocument(); CSoundFile *pSndFile; CDC *pDC = NULL; - + if (!pModDoc) return; pSndFile = pModDoc->GetSoundFile(); for (UINT i=0; i<ENV_LEFTBAR_BUTTONS; i++) if (cLeftBarButtons[i] != ID_SEPARATOR) { DWORD dwStyle = 0; - + switch(cLeftBarButtons[i]) { case ID_ENVSEL_VOLUME: if (m_nEnv == ENV_VOLUME) dwStyle |= NCBTNS_CHECKED; break; @@ -837,7 +837,7 @@ m_dcGrid.MoveTo(x+1, 0); m_dcGrid.LineTo(x+1, m_rcClient.bottom); - + } } } @@ -859,9 +859,9 @@ int ymed = (m_rcClient.bottom - 1) / 2; //rewbs.envRowGrid - // to avoid flicker, establish a memory dc, draw to it + // to avoid flicker, establish a memory dc, draw to it // and then BitBlt it to the destination "pDC" - + //check for window resize if (m_dcMemMain.GetSafeHdc()) { @@ -958,7 +958,7 @@ } DrawPositionMarks(m_dcMemMain.m_hDC); if (oldpen) m_dcMemMain.SelectObject(oldpen); - + //rewbs.envRowGrid pDC->BitBlt(m_rcClient.left, m_rcClient.top, m_rcClient.right-m_rcClient.left, m_rcClient.bottom-m_rcClient.top, &m_dcMemMain, 0, 0, SRCCOPY); @@ -1156,7 +1156,7 @@ InvalidateEnvelope(); break; } - MemsetZero(m_baPlayingNote); //rewbs.instViewNNA + m_baPlayingNote.assign(128, false); m_nPlayingChannel = CHANNELINDEX_INVALID; //rewbs.instViewNNA } } else @@ -1205,7 +1205,7 @@ DWORD dwStyle = m_NcButtonState[nBtn]; COLORREF c3, c4; int xofs = 0, yofs = 0, nImage = 0; - + c1 = c2 = c3 = c4 = crFc; if (!(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_FLATBUTTONS)) { @@ -1405,7 +1405,7 @@ LRESULT CViewInstrument::OnNcHitTest(CPoint point) #else UINT CViewInstrument::OnNcHitTest(CPoint point) -#endif +#endif //--------------------------------------------- { CRect rect; @@ -1811,7 +1811,7 @@ } } -void CViewInstrument::OnEnvToggleReleasNode() +void CViewInstrument::OnEnvToggleReleasNode() //------------------------------------------- { if(IsDragItemEnvPoint() && EnvToggleReleaseNode(m_nDragItem - 1)) @@ -1875,7 +1875,7 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); - + } //end rewbs.envRowGrid @@ -1955,7 +1955,7 @@ m_baPlayingNote[note] = true; //rewbs.instViewNNA m_nPlayingChannel = pModDoc->PlayNote(note, m_nInstrument, 0, false); //rewbs.instViewNNA s[0] = 0; - if ((note) && (note <= NOTE_MAX)) + if ((note) && (note <= NOTE_MAX)) { const std::string temp = pModDoc->GetSoundFile()->GetNoteName(static_cast<int16>(note), m_nInstrument); if(temp.size() >= sizeofS) @@ -2026,7 +2026,7 @@ bCanDrop = ((lpDropInfo->dwDropItem < MAX_DLS_BANKS) && (CTrackApp::gpDLSBanks[lpDropInfo->dwDropItem])); break; - + case DRAGONDROP_SOUNDFILE: case DRAGONDROP_MIDIINSTR: bCanDrop = ((lpDropInfo->lDropParam) @@ -2142,7 +2142,7 @@ if(!pSndFile) return 0; const BYTE nNote = midiByte1 + NOTE_MIN; - int nVol = midiByte2; + int nVol = midiByte2; MIDIEvents::EventType event = MIDIEvents::GetTypeFromEvent(dwMidiData); if((event == MIDIEvents::evNoteOn) && !nVol) event = MIDIEvents::evNoteOff; //Convert event to note-off if req'd @@ -2197,7 +2197,7 @@ plug->MidiSend(dwMidiData); // Sending midi may modify the plug. For now, if MIDI data // is not active sensing or aftertouch messages, set modified. - if(dwMidiData != MIDIEvents::System(MIDIEvents::sysActiveSense) && event != MIDIEvents::evPolyAftertouch && event != MIDIEvents::evChannelAftertouch) + if(dwMidiData != MIDIEvents::System(MIDIEvents::sysActiveSense) && event != MIDIEvents::evPolyAftertouch && event != MIDIEvents::evChannelAftertouch && pSndFile->GetModSpecifications().supportsPlugins) { CMainFrame::GetMainFrame()->ThreadSafeSetModified(pModDoc); } @@ -2210,29 +2210,29 @@ } BOOL CViewInstrument::PreTranslateMessage(MSG *pMsg) -//----------------------------------------------- +//-------------------------------------------------- { if (pMsg) { //We handle keypresses before Windows has a chance to handle them (for alt etc..) - if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || + if((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) { CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); - + //Translate message manually UINT nChar = pMsg->wParam; UINT nRepCnt = LOWORD(pMsg->lParam); UINT nFlags = HIWORD(pMsg->lParam); KeyEventType kT = ih->GetKeyEventType(nFlags); InputTargetContext ctx = (InputTargetContext)(kCtxViewInstruments); - - if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull) + + if(ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT) != kcNull) return true; // Mapped to a command, no need to pass message on. } } - + return CModScrollView::PreTranslateMessage(pMsg); } @@ -2241,11 +2241,11 @@ { if (wParam == kcNull) return NULL; - - CModDoc *pModDoc = GetDocument(); - if (!pModDoc) return NULL; - - //CSoundFile *pSndFile = pModDoc->GetSoundFile(); + + CModDoc *pModDoc = GetDocument(); + if(!pModDoc) return NULL; + + //CSoundFile *pSndFile = pModDoc->GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); switch(wParam) @@ -2260,7 +2260,7 @@ case kcNoteCut: PlayNote(NOTE_NOTECUT); return wParam; case kcInstrumentLoad: SendCtrlMessage(IDC_INSTRUMENT_OPEN); return wParam; case kcInstrumentSave: SendCtrlMessage(IDC_INSTRUMENT_SAVEAS); return wParam; - case kcInstrumentNew: SendCtrlMessage(IDC_INSTRUMENT_NEW); return wParam; + case kcInstrumentNew: SendCtrlMessage(IDC_INSTRUMENT_NEW); return wParam; // envelope editor case kcInstrumentEnvelopeZoomIn: OnEnvZoomIn(); return wParam; @@ -2281,15 +2281,15 @@ case kcInstrumentEnvelopeSetSustainLoopEnd: EnvKbdSetSustainEnd(); return wParam; case kcInstrumentEnvelopeToggleReleaseNode: EnvKbdToggleReleaseNode(); return wParam; } - if (wParam>=kcInstrumentStartNotes && wParam<=kcInstrumentEndNotes) + if(wParam >= kcInstrumentStartNotes && wParam <= kcInstrumentEndNotes) { - PlayNote(wParam-kcInstrumentStartNotes+1+pMainFrm->GetBaseOctave()*12); + PlayNote(wParam - kcInstrumentStartNotes + 1 + pMainFrm->GetBaseOctave() * 12); return wParam; } - if (wParam>=kcInstrumentStartNoteStops && wParam<=kcInstrumentEndNoteStops) - { - int note =wParam-kcInstrumentStartNoteStops+1+pMainFrm->GetBaseOctave()*12; - m_baPlayingNote[note] = false; + if(wParam >= kcInstrumentStartNoteStops && wParam <= kcInstrumentEndNoteStops) + { + int note =wParam - kcInstrumentStartNoteStops + 1 + pMainFrm->GetBaseOctave() * 12; + m_baPlayingNote[note] = false; pModDoc->NoteOff(note, false, m_nInstrument); return wParam; } @@ -2319,7 +2319,7 @@ } } - + } @@ -2413,7 +2413,7 @@ if(pEnv == nullptr || !IsDragItemEnvPoint()) return; if(pEnv->Values[m_nDragItem - 1] >= ENVELOPE_MIN + stepsize) pEnv->Values[m_nDragItem - 1] -= stepsize; - else + else pEnv->Values[m_nDragItem - 1] = ENVELOPE_MIN; SetInstrumentModified(); @@ -2537,7 +2537,7 @@ // First do some standard checks... ModInstrument *pIns = GetInstrumentPtr(); if(pIns == nullptr) return nullptr; - + return &pIns->GetEnvelope(m_nEnv); } @@ -2547,7 +2547,7 @@ { InstrumentEnvelope *pEnv = GetEnvelopePtr(); if(pEnv == nullptr) return false; - + // Can't move first point if(envPoint == 0) { @@ -2577,7 +2577,7 @@ { // Ctrl + mouse wheel: envelope zoom. if (nFlags == MK_CONTROL) - { + { // Speed up zoom scrolling by some factor (might need some tuning). const float speedUpFactor = Util::Max(1.0f, m_fZoom * 7.0f / ENV_MAX_ZOOM); EnvSetZoom(m_fZoom + speedUpFactor * (zDelta / WHEEL_DELTA)); Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2012-11-23 17:26:20 UTC (rev 1439) +++ trunk/OpenMPT/mptrack/View_ins.h 2012-12-01 15:19:49 UTC (rev 1440) @@ -26,7 +26,7 @@ CImageList m_bmpEnvBar; POINT m_ptMenu; RECT m_rcClient; - bool m_baPlayingNote[128]; //rewbs.instViewNNA + vector<bool> m_baPlayingNote; INSTRUMENTINDEX m_nInstrument; enmEnvelopeTypes m_nEnv; UINT m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2012-11-23 17:26:20 UTC (rev 1439) +++ trunk/OpenMPT/mptrack/version.h 2012-12-01 15:19:49 UTC (rev 1440) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 04 -#define VER_MINORMINOR 05 +#define VER_MINORMINOR 06 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-01 18:30:26
|
Revision: 1441 http://modplug.svn.sourceforge.net/modplug/?rev=1441&view=rev Author: saga-games Date: 2012-12-01 18:30:17 +0000 (Sat, 01 Dec 2012) Log Message: ----------- [Fix] Pattern Editor: Set Instrument also works if "No Instrument" is chosen (http://forum.openmpt.org/index.php?topic=4178.0) [Imp] Pattern Editor: Data Entry works better in note column now. [Imp] Instrument Editor: Moving envelope tail also works properly if distance between the moved point and the follow-up point is small. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2012-12-01 15:19:49 UTC (rev 1440) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2012-12-01 18:30:17 UTC (rev 1441) @@ -124,7 +124,7 @@ m_rcClient.bottom = 2; m_dwStatus = 0; m_nBtnMouseOver = 0xFFFF; - MemsetZero(m_dwNotifyPos); + m_dwNotifyPos.assign(MAX_CHANNELS, 0); MemsetZero(m_NcButtonState); m_bmpEnvBar.Create(IDB_ENVTOOLBAR, 20, 0, RGB(192,192,192)); m_baPlayingNote.assign(128, false); @@ -271,48 +271,65 @@ } -bool CViewInstrument::EnvSetValue(int nPoint, int nTick, int nValue) -//------------------------------------------------------------------ +bool CViewInstrument::EnvSetValue(int nPoint, int nTick, int nValue, bool moveTail) +//--------------------------------------------------------------------------------- { - if(nPoint < 0) return false; - InstrumentEnvelope *envelope = GetEnvelopePtr(); - if(envelope == nullptr) return false; + if(envelope == nullptr || nPoint < 0) return false; - bool bOK = false; - if (!nPoint) nTick = 0; - if (nPoint < (int)envelope->nNodes) + if(nPoint == 0) { - if (nTick >= 0) + nTick = 0; + moveTail = false; + } + int tickDiff = 0; + + bool ok = false; + if(nPoint < (int)envelope->nNodes) + { + if(nTick >= 0) { + tickDiff = envelope->Ticks[nPoint]; int mintick = (nPoint) ? envelope->Ticks[nPoint - 1] : 0; int maxtick = envelope->Ticks[nPoint + 1]; - if (nPoint + 1 == (int)envelope->nNodes) maxtick = ENVELOPE_MAX_LENGTH; + if(nPoint + 1 == (int)envelope->nNodes || moveTail) maxtick = ENVELOPE_MAX_LENGTH; + // Can't have multiple points on same tick if(nPoint > 0 && mintick < maxtick - 1) { mintick++; - if (nPoint + 1 < (int)envelope->nNodes) maxtick--; + if(nPoint + 1 < (int)envelope->nNodes) maxtick--; } - if (nTick < mintick) nTick = mintick; - if (nTick > maxtick) nTick = maxtick; - if (nTick != envelope->Ticks[nPoint]) + if(nTick < mintick) nTick = mintick; + if(nTick > maxtick) nTick = maxtick; + if(nTick != envelope->Ticks[nPoint]) { - envelope->Ticks[nPoint] = (WORD)nTick; - bOK = true; + envelope->Ticks[nPoint] = (uint16)nTick; + ok = true; } } - if (nValue >= 0) + if(nValue >= 0) { - if (nValue > 64) nValue = 64; - if (nValue != envelope->Values[nPoint]) + if(nValue > 64) nValue = 64; + if(nValue != envelope->Values[nPoint]) { - envelope->Values[nPoint] = (BYTE)nValue; - bOK = true; + envelope->Values[nPoint] = (uint8)nValue; + ok = true; } } } - return bOK; + + if(ok && moveTail) + { + // Move all points after modified point as well. + tickDiff = envelope->Ticks[nPoint] - tickDiff; + for(uint32 i = nPoint + 1; i < envelope->nNodes; i++) + { + envelope->Ticks[i] = (uint16)(Util::Max(0, (int)envelope->Ticks[i] + tickDiff)); + } + } + + return ok; } @@ -973,16 +990,18 @@ // -! NEW_FEATURE#0015 } -BYTE CViewInstrument::EnvGetReleaseNode() -//--------------------------------------- + +uint8 CViewInstrument::EnvGetReleaseNode() +//---------------------------------------- { InstrumentEnvelope *envelope = GetEnvelopePtr(); if(envelope == nullptr) return ENV_RELEASE_NODE_UNSET; return envelope->nReleaseNode; } -WORD CViewInstrument::EnvGetReleaseNodeValue() -//-------------------------------------------- + +uint16 CViewInstrument::EnvGetReleaseNodeValue() +//---------------------------------------------- { InstrumentEnvelope *envelope = GetEnvelopePtr(); if(envelope == nullptr) return 0; @@ -990,8 +1009,8 @@ } -WORD CViewInstrument::EnvGetReleaseNodeTick() -//------------------------------------------- +uint16 CViewInstrument::EnvGetReleaseNodeTick() +//--------------------------------------------- { InstrumentEnvelope *envelope = GetEnvelopePtr(); if(envelope == nullptr) return 0; @@ -1042,6 +1061,7 @@ return false; } + // Insert point. Returns 0 if error occured, else point ID + 1. UINT CViewInstrument::EnvInsertPoint(int nTick, int nValue) //--------------------------------------------------------- @@ -1066,18 +1086,18 @@ } - BYTE cDefaultValue; + uint8 defaultValue; switch(m_nEnv) { case ENV_VOLUME: - cDefaultValue = 64; + defaultValue = 64; break; case ENV_PANNING: - cDefaultValue = 32; + defaultValue = 32; break; case ENV_PITCH: - cDefaultValue = (pIns->PitchEnv.dwFlags & ENV_FILTER) ? 64 : 32; + defaultValue = (pIns->PitchEnv.dwFlags & ENV_FILTER) ? 64 : 32; break; default: return 0; @@ -1088,13 +1108,13 @@ if (!envelope->nNodes) { envelope->Ticks[0] = 0; - envelope->Values[0] = cDefaultValue; + envelope->Values[0] = defaultValue; envelope->nNodes = 1; envelope->dwFlags.set(ENV_ENABLED); } - UINT i = 0; + uint32 i = 0; for (i = 0; i < envelope->nNodes; i++) if (nTick <= envelope->Ticks[i]) break; - for (UINT j = envelope->nNodes; j > i; j--) + for (uint32 j = envelope->nNodes; j > i; j--) { envelope->Ticks[j] = envelope->Ticks[j - 1]; envelope->Values[j] = envelope->Values[j - 1]; @@ -1123,7 +1143,7 @@ //---------------------------------------------- { CRect rect; - for (UINT i=0; i<MAX_CHANNELS; i++) if (m_dwNotifyPos[i] & MPTNOTIFY_POSVALID) + for(UINT i = 0; i < MAX_CHANNELS; i++) if (m_dwNotifyPos[i] & MPTNOTIFY_POSVALID) { rect.top = -2; rect.left = TickToScreen(m_dwNotifyPos[i] & 0xFFFF); @@ -1150,9 +1170,9 @@ { for (CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) { - if (m_dwNotifyPos[i]) + if(m_dwNotifyPos[i]) { - MemsetZero(m_dwNotifyPos); + m_dwNotifyPos.assign(MAX_CHANNELS, 0); InvalidateEnvelope(); break; } @@ -1439,7 +1459,7 @@ } int nTick = ScreenToTick(pt.x); int nVal = ScreenToValue(pt.y); - nVal = CLAMP(nVal, ENVELOPE_MIN, ENVELOPE_MAX); + nVal = Clamp(nVal, ENVELOPE_MIN, ENVELOPE_MAX); if (nTick < 0) nTick = 0; if (nTick <= EnvGetReleaseNodeTick() + 1 || EnvGetReleaseNode() == ENV_RELEASE_NODE_UNSET) { @@ -1464,18 +1484,8 @@ if (pt.x >= m_rcClient.right - 2) nTick++; if (IsDragItemEnvPoint()) { - int nRelTick = pEnv->Ticks[m_nDragItem - 1]; - bChanged = EnvSetValue(m_nDragItem - 1, nTick, nVal); - // Ctrl pressed -> move tail of envelope - if(m_nDragItem > 1 && CMainFrame::GetMainFrame()->GetInputHandler()->CtrlPressed()) - { - nRelTick = pEnv->Ticks[m_nDragItem - 1] - nRelTick; - for(size_t i = m_nDragItem; i < pEnv->nNodes; i++) - { - pEnv->Ticks[i] = (WORD)(max(0, (int)pEnv->Ticks[i] + nRelTick)); - } - } + bChanged = EnvSetValue(m_nDragItem - 1, nTick, nVal, CMainFrame::GetMainFrame()->GetInputHandler()->CtrlPressed()); } else { int nPoint = ScreenToPoint(pt.x, pt.y); @@ -1691,10 +1701,10 @@ if (pSubMenu != NULL) { m_nDragItem = ScreenToPoint(pt.x, pt.y) + 1; - const UINT maxpoint = (pSndFile->m_nType == MOD_TYPE_XM) ? 11 : 24; - const UINT lastpoint = EnvGetLastPoint(); + const uint32 maxPoint = (pSndFile->GetType() == MOD_TYPE_XM) ? 11 : 24; + const uint32 lastpoint = EnvGetLastPoint(); const bool forceRelease = !pSndFile->GetModSpecifications().hasReleaseNode && (EnvGetReleaseNode() != ENV_RELEASE_NODE_UNSET); - pSubMenu->EnableMenuItem(ID_ENVELOPE_INSERTPOINT, (lastpoint < maxpoint) ? MF_ENABLED : MF_GRAYED); + pSubMenu->EnableMenuItem(ID_ENVELOPE_INSERTPOINT, (lastpoint < maxPoint) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_REMOVEPOINT, ((m_nDragItem) && (lastpoint > 0)) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_CARRY, (pSndFile->GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) ? MF_ENABLED : MF_GRAYED); pSubMenu->EnableMenuItem(ID_ENVELOPE_TOGGLERELEASENODE, ((pSndFile->GetModSpecifications().hasReleaseNode && m_nEnv == ENV_VOLUME) || forceRelease) ? MF_ENABLED : MF_GRAYED); Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2012-12-01 15:19:49 UTC (rev 1440) +++ trunk/OpenMPT/mptrack/View_ins.h 2012-12-01 18:30:17 UTC (rev 1441) @@ -27,14 +27,14 @@ POINT m_ptMenu; RECT m_rcClient; vector<bool> m_baPlayingNote; + vector<DWORD> m_dwNotifyPos; INSTRUMENTINDEX m_nInstrument; enmEnvelopeTypes m_nEnv; UINT m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel; DWORD m_dwStatus; DWORD m_NcButtonState[ENV_LEFTBAR_BUTTONS]; - DWORD m_dwNotifyPos[MAX_CHANNELS]; //rewbs.envRowGrid - bool m_bGrid; + bool m_bGrid; bool m_bGridForceRedraw; CBitmap *m_pbmpOldGrid; CBitmap m_bmpGrid; @@ -90,7 +90,7 @@ bool EnvSetCarry(bool enable) const {return EnvSetFlag(ENV_CARRY, enable);}; // Misc. - bool EnvSetValue(int nPoint, int nTick=-1, int nValue=-1); + bool EnvSetValue(int nPoint, int nTick = -1, int nValue = -1, bool moveTail = false); bool CanMovePoint(UINT envPoint, int step); // Set loop points @@ -122,7 +122,7 @@ void EnvKbdSetSustainEnd(); void EnvKbdToggleReleaseNode(); - bool IsDragItemEnvPoint() const { return (m_nDragItem < 1 || m_nDragItem > EnvGetLastPoint() + 1) ? false : true; } + bool IsDragItemEnvPoint() const { return !(m_nDragItem < 1 || m_nDragItem > EnvGetLastPoint() + 1); } //////////////////////// // Misc stuff @@ -138,15 +138,15 @@ int ScreenToTick(int x) const; int QuickScreenToTick(int x, int cachedScrollPos) const; int ScreenToPoint(int x, int y) const; - int ValueToScreen(int val) const { return m_rcClient.bottom - 1 - (val * (m_rcClient.bottom-1)) / 64; } + int ValueToScreen(int val) const { return m_rcClient.bottom - 1 - (val * (m_rcClient.bottom - 1)) / 64; } int ScreenToValue(int y) const; void InvalidateEnvelope() { InvalidateRect(NULL, FALSE); } void DrawPositionMarks(HDC hdc); void DrawNcButton(CDC *pDC, UINT nBtn); BOOL GetNcButtonRect(UINT nBtn, LPRECT lpRect); void UpdateNcButtonState(); - void PlayNote(UINT note); //rewbs.customKeys - void DrawGrid(CDC *memDC, UINT speed); //rewbs.envRowGrid + void PlayNote(UINT note); + void DrawGrid(CDC *memDC, UINT speed); void OnEnvZoomIn() { EnvSetZoom(m_fZoom + 1); }; void OnEnvZoomOut() { EnvSetZoom(m_fZoom - 1); }; @@ -213,7 +213,7 @@ DECLARE_MESSAGE_MAP() private: - BYTE EnvGetReleaseNode(); - WORD EnvGetReleaseNodeValue(); - WORD EnvGetReleaseNodeTick(); + uint8 EnvGetReleaseNode(); + uint16 EnvGetReleaseNodeValue(); + uint16 EnvGetReleaseNodeTick(); }; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-01 15:19:49 UTC (rev 1440) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-01 18:30:17 UTC (rev 1441) @@ -2916,14 +2916,34 @@ PatternRow m = pSndFile->Patterns[m_nPattern].GetRow(row); for(CHANNELINDEX chn = startChan; chn <= endChan; chn++) { - if(m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::noteColumn)) && m[chn].IsNote()) + if(m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::noteColumn))) { - int note = m[chn].note + offset; - Limit(note, noteMin, noteMax); - m[chn].note = (ModCommand::NOTE)note; + // Increase / decrease note + if(m[chn].IsNote()) + { + int note = m[chn].note + offset; + Limit(note, noteMin, noteMax); + m[chn].note = (ModCommand::NOTE)note; + } else if(m[chn].note >= NOTE_MIN_SPECIAL) + { + int note = m[chn].note; + do + { + note += offset; + if(note < NOTE_MIN_SPECIAL || note > NOTE_MAX_SPECIAL) + { + break; + } + } while(!pSndFile->GetModSpecifications().HasNote((ModCommand::NOTE)note)); + if(note >= NOTE_MIN_SPECIAL && note <= NOTE_MAX_SPECIAL) + { + m[chn].note = (ModCommand::NOTE)note; + } + } } if(m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::instrColumn))) { + // Increase / decrease instrument int instr = m[chn].instr + offset; if(m[chn].IsInstrPlug()) { @@ -2936,6 +2956,7 @@ } if(m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::volumeColumn))) { + // Increase / decrease volume parameter if(m[chn].IsPcNote()) { int val = m[chn].GetValueVolCol() + offset; @@ -2952,6 +2973,7 @@ } if(m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::effectColumn)) || m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::paramColumn))) { + // Increase / decrease effect parameter if(m[chn].IsPcNote()) { int val = m[chn].GetValueEffectCol() + offset; @@ -3023,6 +3045,8 @@ end.Sanitize(pSndFile->Patterns[m_nPattern].GetNumRows(), pSndFile->GetNumChannels()); PatternRect destination(begin, end); + const bool moveSelection = !(m_dwStatus & (psKeyboardDragSelect | psCtrlDragSelect)); + BeginWaitCursor(); pModDoc->GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); @@ -3044,7 +3068,7 @@ } else if(m_Selection.Contains(cell)) { // Current cell is from source rectangle (clear) - if(!(m_dwStatus & (psKeyboardDragSelect|psCtrlDragSelect))) + if(moveSelection) { xsrc = -1; } @@ -4096,10 +4120,10 @@ if (wParam == kcNull) return NULL; - CModDoc *pModDoc = GetDocument(); + CModDoc *pModDoc = GetDocument(); if (!pModDoc) return NULL; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); + CSoundFile *pSndFile = pModDoc->GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); switch(wParam) @@ -5081,7 +5105,7 @@ if(recordEnabled) { PatternCursor sel(nRow, nChn, m_Cursor.GetColumnType()); - if(liveRecord == false) + if(!liveRecord) { // Update only when not recording live. SetCurSel(sel); @@ -5090,16 +5114,16 @@ if(modified) // Has it really changed? { pModDoc->SetModified(); - if(liveRecord == false) + InvalidateCell(sel); + if(!liveRecord) { // Update only when not recording live. - InvalidateCell(sel); UpdateIndicator(); } } // Set new cursor position (row spacing) - if (!liveRecord) + if(!liveRecord) { if((m_nSpacing > 0) && (m_nSpacing <= MAX_SPACING)) { @@ -5570,16 +5594,7 @@ void CViewPattern::OnSelectInstrument(UINT nID) //--------------------------------------------- { - const UINT newIns = nID - ID_CHANGE_INSTRUMENT; - - if (newIns == 0) - { - RowMask sp(false, true, false, false, false); // Setup mask to only clear instrument data in OnClearSelection - OnClearSelection(false, sp); // Clears instrument selection from pattern - } else - { - SetSelectionInstrument(newIns); - } + SetSelectionInstrument(nID - ID_CHANGE_INSTRUMENT); } @@ -6391,7 +6406,7 @@ //------------------------------------------------------------------- { CSoundFile *pSndFile = GetSoundFile(); - if(nIns == 0 || pSndFile == nullptr || !pSndFile->Patterns.IsValidPat(m_nPattern)) + if(pSndFile == nullptr || !pSndFile->Patterns.IsValidPat(m_nPattern)) { return; } @@ -6407,15 +6422,15 @@ CHANNELINDEX startChan = m_Selection.GetStartChannel(); CHANNELINDEX endChan = m_Selection.GetEndChannel(); - for (ROWINDEX r = startRow; r <= endRow; r++) + for(ROWINDEX r = startRow; r <= endRow; r++) { ModCommand *p = pSndFile->Patterns[m_nPattern].GetpModCommand(r, startChan); - for (CHANNELINDEX c = startChan; c <= endChan; c++, p++) + for(CHANNELINDEX c = startChan; c <= endChan; c++, p++) { // If a note or an instr is present on the row, do the change, if required. // Do not set instr if note and instr are both blank, // but set instr if note is a PC note and instr is blank. - if ((p->IsNote() || p->IsPcNote() || p->instr) && (p->instr != nIns)) + if((p->IsNote() || p->IsPcNote() || p->instr) && (p->instr != nIns)) { p->instr = nIns; modified = true; @@ -6423,7 +6438,7 @@ } } - if (modified) + if(modified) { SetModified(); InvalidatePattern(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-02 00:58:13
|
Revision: 1442 http://modplug.svn.sourceforge.net/modplug/?rev=1442&view=rev Author: saga-games Date: 2012-12-02 00:58:03 +0000 (Sun, 02 Dec 2012) Log Message: ----------- [New] Pattern Editor: Added option to quantize notes that are recorded live (select from context menu). Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-01 18:30:17 UTC (rev 1441) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-02 00:58:03 UTC (rev 1442) @@ -128,6 +128,7 @@ ON_COMMAND(ID_CLEAR_SELECTION, OnClearSelectionFromMenu) ON_COMMAND(ID_SHOWTIMEATROW, OnShowTimeAtRow) ON_COMMAND(ID_PATTERN_EDIT_PCNOTE_PLUGIN, OnTogglePCNotePluginEditor) + ON_COMMAND(ID_SETQUANTIZE, OnSetQuantize) ON_COMMAND_RANGE(ID_CHANGE_INSTRUMENT, ID_CHANGE_INSTRUMENT+MAX_INSTRUMENTS, OnSelectInstrument) ON_COMMAND_RANGE(ID_CHANGE_PCNOTE_PARAM, ID_CHANGE_PCNOTE_PARAM + ModCommand::maxColumnValue, OnSelectPCNoteParam) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateUndo) @@ -175,6 +176,7 @@ m_nPlayPat = PATTERNINDEX_INVALID; m_nPlayRow = 0; m_nMidRow = 0; + m_nQuantize = 0; m_nDragItem = 0; m_bDragging = false; m_bInItemRect = false; @@ -298,16 +300,15 @@ } else //row >= 0 if (row >= pSndFile->Patterns[m_nPattern].GetNumRows()) { - if (m_dwStatus & (psKeyboardDragSelect|psMouseDragSelect)) + if(m_dwStatus & (psKeyboardDragSelect|psMouseDragSelect)) { row = pSndFile->Patterns[m_nPattern].GetNumRows()-1; - } else - if (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_CONTSCROLL) + } else if(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_CONTSCROLL) { - UINT nCurOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - if ((nCurOrder+1 < pSndFile->Order.size()) && (m_nPattern == pSndFile->Order[nCurOrder])) + ORDERINDEX curOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); + if(curOrder + 1 < pSndFile->Order.size() && m_nPattern == pSndFile->Order[curOrder]) { - const ORDERINDEX nextOrder = pSndFile->Order.GetNextOrderIgnoringSkips(nCurOrder); + const ORDERINDEX nextOrder = pSndFile->Order.GetNextOrderIgnoringSkips(curOrder); const PATTERNINDEX nextPat = pSndFile->Order[nextOrder]; if ((nextPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nextPat].GetNumRows())) { @@ -318,8 +319,7 @@ } } row = pSndFile->Patterns[m_nPattern].GetNumRows()-1; - } else - if (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_WRAP) + } else if(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_WRAP) { row %= pSndFile->Patterns[m_nPattern].GetNumRows(); } @@ -1440,7 +1440,6 @@ quickChannelProperties.Show(GetDocument(), nChn, m_nPattern, pt); } else if(nChn < pSndFile->GetNumChannels() && pSndFile->Patterns.IsValidPat(m_nPattern) && !(flags & (MK_CONTROL | MK_SHIFT))) { - CString MenuText; CInputHandler *ih = (CMainFrame::GetMainFrame())->GetInputHandler(); //------ Plugin Header Menu --------- : @@ -1486,7 +1485,18 @@ AppendMenu(hMenu, MF_SEPARATOR, 0, ""); if(BuildMiscCtxMenu(hMenu, ih)) AppendMenu(hMenu, MF_SEPARATOR, 0, ""); - BuildRowInsDelCtxMenu(hMenu, ih); + if(BuildRowInsDelCtxMenu(hMenu, ih)) + AppendMenu(hMenu, MF_SEPARATOR, 0, ""); + + CString s = "Quantize "; + if(m_nQuantize != 0) + { + s.AppendFormat("(Currently: %d Rows)", m_nQuantize); + } else + { + s.Append("Settings..."); + } + AppendMenu(hMenu, MF_STRING | (m_nQuantize != 0 ? MF_CHECKED : 0), ID_SETQUANTIZE, s); } ClientToScreen(&pt); @@ -3655,8 +3665,8 @@ } } - //Write the data, but we only overwrite if the command is a macro anyway. - if (pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) + // Write the data, but we only overwrite if the command is a macro anyway. + if(pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { pModDoc->GetPatternUndo().PrepareUndo(nPattern, nChn, nRow, 1, 1); @@ -3668,12 +3678,11 @@ } return 0; - } -ModCommandPos CViewPattern::GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const -//----------------------------------------------------------------------------------- +CViewPattern::ModCommandPos CViewPattern::GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const +//------------------------------------------------------------------------------------------------- { ModCommandPos editpos; if(bLiveRecord) @@ -4718,12 +4727,12 @@ const CHANNELINDEX nChnCursor = GetCurrentChannel(); - BYTE* activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; + BYTE *activeNoteMap = isSplit ? splitActiveNoteChannel : activeNoteChannel; const CHANNELINDEX nChn = (activeNoteMap[note] < pSndFile->GetNumChannels()) ? activeNoteMap[note] : nChnCursor; activeNoteMap[note] = 0xFF; //unlock channel - if (!((CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_KBDNOTEOFF) || fromMidi)) + if(!((CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_KBDNOTEOFF) || fromMidi)) { // We don't want to write the note-off into the pattern if this feature is disabled and we're not recording from MIDI. return; @@ -4739,33 +4748,39 @@ if(usePlaybackPosition) SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); - ModCommand* pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + const bool quantize = usePlaybackPosition && (m_nQuantize != 0); + if(quantize) + { + QuantizeRow(nPat, nRow); + } - //don't overwrite: - if (pTarget->note || pTarget->instr || pTarget->volcmd) + ModCommand *pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + + // Don't overwrite: + if(pTarget->note != NOTE_NONE || pTarget->instr || pTarget->volcmd != VOLCMD_NONE) { - //if there's a note in the current location and the song is playing and following, - //the user probably just tapped the key - let's try the next row down. + // If there's a note in the current location and the song is playing and following, + // the user probably just tapped the key - let's try the next row down. nRow++; - if (pTarget->note==note && liveRecord && pSndFile->Patterns[nPat].IsValidRow(nRow)) + if(pTarget->note == note && liveRecord && pSndFile->Patterns[nPat].IsValidRow(nRow)) { pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); - if (pTarget->note || (!bChordMode && (pTarget->instr || pTarget->volcmd)) ) + if(pTarget->note || (!bChordMode && (pTarget->instr || pTarget->volcmd))) return; + } else + { + return; } - else - return; } // Create undo-point. - pModDoc->GetPatternUndo().PrepareUndo(nPat, nChn, nRow, 1, 1); + pModDoc->GetPatternUndo().PrepareUndo(nPat, nChn, nRow, 1, 1, "Note Stop Entry"); // -- write sdx if playing live - if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted - if (pTarget->command == 0) { //make sure we don't overwrite any existing commands. - pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; - pTarget->param = 0xD0 | min(0xF, nTick); - } + if(usePlaybackPosition && nTick && pTarget->command == CMD_NONE && !quantize) + { + pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; + pTarget->param = 0xD0 | min(0xF, nTick); } //Enter note off @@ -4781,7 +4796,7 @@ } else { // we don't have anything to cut (MOD format) - use volume or ECx - if(usePlaybackPosition && nTick) // ECx + if(usePlaybackPosition && nTick && !quantize) // ECx { pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; pTarget->param = 0xC0 | min(0xF, nTick); @@ -4798,11 +4813,18 @@ pModDoc->SetModified(); + if(nPat == m_nPattern) + { + PatternCursor sel(nRow, nChn); + InvalidateCell(sel); + } else + { + InvalidatePattern(); + } + // Update only if not recording live. if(!liveRecord) { - PatternCursor sel(nRow, nChn); - InvalidateCell(sel); UpdateIndicator(); } @@ -4974,6 +4996,13 @@ if(usePlaybackPosition) SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); + // Quantize + const bool doQuantize = usePlaybackPosition && (m_nQuantize != 0); + if(doQuantize) + { + QuantizeRow(nPat, nRow); + } + // -- Work out where to put the new note ModCommand *pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); ModCommand newcmd = *pTarget; @@ -5038,9 +5067,9 @@ } // -- write sdx if playing live - if (usePlaybackPosition && nTick) // avoid SD0 which will be mis-interpreted + if(usePlaybackPosition && nTick && !doQuantize) // avoid SD0 which will be mis-interpreted { - if (newcmd.command == CMD_NONE) //make sure we don't overwrite any existing commands. + if(newcmd.command == CMD_NONE) //make sure we don't overwrite any existing commands. { newcmd.command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; UINT maxSpeed = 0x0F; @@ -5114,7 +5143,10 @@ if(modified) // Has it really changed? { pModDoc->SetModified(); - InvalidateCell(sel); + if(nPat == m_nPattern) + InvalidateCell(sel); + else + InvalidatePattern(); if(!liveRecord) { // Update only when not recording live. @@ -5426,6 +5458,81 @@ } +// Apply quantization factor to given row. +void CViewPattern::QuantizeRow(PATTERNINDEX &pat, ROWINDEX &row) const +//-------------------------------------------------------------------- +{ + const CSoundFile *sndFile = GetSoundFile(); + if(sndFile == nullptr || m_nQuantize == 0) + { + return; + } + + const ROWINDEX currentTick = sndFile->m_nMusicSpeed * row + sndFile->m_nTickCount; + const ROWINDEX ticksPerNote = m_nQuantize * sndFile->m_nMusicSpeed; + + // Previous quantization step + const ROWINDEX quantLow = (currentTick / ticksPerNote) * ticksPerNote; + // Next quantization step + const ROWINDEX quantHigh = (1 + (currentTick / ticksPerNote)) * ticksPerNote; + + if(currentTick - quantLow < quantHigh - currentTick) + { + row = quantLow / sndFile->m_nMusicSpeed; + } else + { + row = quantHigh / sndFile->m_nMusicSpeed; + } + + if(!sndFile->Patterns[pat].IsValidRow(row)) + { + // Quantization exceeds current pattern, try stuffing note into next pattern instead. + PATTERNINDEX nextPat = GetNextPattern(); + if(nextPat != PATTERNINDEX_INVALID) + { + pat = nextPat; + row = 0; + } else + { + row = sndFile->Patterns[pat].GetNumRows() - 1; + } + } +} + + +// Get follow-up pattern in order list +PATTERNINDEX CViewPattern::GetNextPattern() const +//----------------------------------------------- +{ + const CSoundFile *sndFile = GetSoundFile(); + if(sndFile != nullptr) + { + const ORDERINDEX curOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); + if(curOrder + 1 < sndFile->Order.size() && m_nPattern == sndFile->Order[curOrder]) + { + const ORDERINDEX nextOrder = sndFile->Order.GetNextOrderIgnoringSkips(curOrder); + const PATTERNINDEX nextPat = sndFile->Order[nextOrder]; + if(sndFile->Patterns.IsValidPat(nextPat) && sndFile->Patterns[nextPat].GetNumRows()) + { + return nextPat; + } + } + } + return PATTERNINDEX_INVALID; +} + + +void CViewPattern::OnSetQuantize() +//-------------------------------- +{ + CInputDlg dlg(this, "Quantize amount in rows for live recording (0 to disable):", 0, MAX_PATTERN_ROWS, m_nQuantize); + if(dlg.DoModal()) + { + m_nQuantize = static_cast<ROWINDEX>(dlg.resultNumber); + } +} + + // Find a free channel for a record group, starting search from a given channel. // If forceFreeChannel is true and all channels in the specified record group are active, some channel is picked from the specified record group. CHANNELINDEX CViewPattern::FindGroupRecordChannel(BYTE recordGroup, bool forceFreeChannel, CHANNELINDEX startChannel) const @@ -6480,8 +6587,7 @@ // Channel is only partly selected => expand to whole channel first. endColumn = PatternCursor::lastColumn; // Extend to param column } - } - else + } else { // Some arbitrary selection: Remember start / end column startColumn = m_Selection.GetStartColumn(); Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2012-12-01 18:30:17 UTC (rev 1441) +++ trunk/OpenMPT/mptrack/View_pat.h 2012-12-02 00:58:03 UTC (rev 1442) @@ -78,12 +78,6 @@ } }; -struct ModCommandPos -{ - PATTERNINDEX nPat; - ROWINDEX nRow; - CHANNELINDEX nChn; -}; // Find/Replace data struct FindReplaceStruct @@ -130,6 +124,13 @@ psDragActive = psDragVScroll | psDragHScroll | psMouseDragSelect | psRowSelection | psChannelSelection, }; + struct ModCommandPos + { + PATTERNINDEX nPat; + ROWINDEX nRow; + CHANNELINDEX nChn; + }; + CFastBitmap m_Dib; CEditCommand *m_pEditWnd; CPatternGotoDialog *m_pGotoWnd; @@ -138,6 +139,7 @@ UINT m_nMidRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; PATTERNINDEX m_nPlayPat; ROWINDEX m_nPlayRow; + ROWINDEX m_nQuantize; int m_nXScroll, m_nYScroll; PatternCursor::Columns m_nDetailLevel; // Visible Columns @@ -291,6 +293,9 @@ void TempEnterFXparam(int v); void EnterAftertouch(int note, int atValue); + void QuantizeRow(PATTERNINDEX &pat, ROWINDEX &row) const; + PATTERNINDEX GetNextPattern() const; + void SetSpacing(int n); void OnClearField(const RowMask &mask, bool step, bool ITStyle = false); void InsertRows(CHANNELINDEX colmin, CHANNELINDEX colmax); @@ -407,6 +412,7 @@ afx_msg void OnRunScript(); afx_msg void OnShowTimeAtRow(); afx_msg void OnTogglePCNotePluginEditor(); + afx_msg void OnSetQuantize(); //}}AFX_MSG DECLARE_MESSAGE_MAP() Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2012-12-01 18:30:17 UTC (rev 1441) +++ trunk/OpenMPT/mptrack/resource.h 2012-12-02 00:58:03 UTC (rev 1442) @@ -1213,6 +1213,7 @@ #define ID_SAMPLE_MONOCONVERT_LEFT 44606 #define ID_SAMPLE_MONOCONVERT_RIGHT 44607 #define ID_SAMPLE_MONOCONVERT_SPLIT 44608 +#define ID_SETQUANTIZE 44609 // Next default values for new objects // @@ -1220,7 +1221,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 536 -#define _APS_NEXT_COMMAND_VALUE 44609 +#define _APS_NEXT_COMMAND_VALUE 44610 #define _APS_NEXT_CONTROL_VALUE 2441 #define _APS_NEXT_SYMED_VALUE 901 #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-02 16:12:04
|
Revision: 1443 http://modplug.svn.sourceforge.net/modplug/?rev=1443&view=rev Author: saga-games Date: 2012-12-02 16:11:56 +0000 (Sun, 02 Dec 2012) Log Message: ----------- [Imp] Sample/Instrument Editor: It is now possible to drag&drop multiple samples/instruments. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_smp.cpp Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2012-12-02 00:58:03 UTC (rev 1442) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2012-12-02 16:11:56 UTC (rev 1443) @@ -1168,7 +1168,7 @@ } if (pnotify->dwType & MPTNOTIFY_STOP) { - for (CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) + for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) { if(m_dwNotifyPos[i]) { @@ -1995,13 +1995,20 @@ void CViewInstrument::OnDropFiles(HDROP hDropInfo) //------------------------------------------------ { - UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); - if (nFiles) + const UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); + for(UINT f = 0; f < nFiles; f++) { TCHAR szFileName[_MAX_PATH] = ""; CMainFrame::GetMainFrame()->SetForegroundWindow(); - ::DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH); - if (szFileName[0]) SendCtrlMessage(CTRLMSG_INS_OPENFILE, (LPARAM)szFileName); + ::DragQueryFile(hDropInfo, f, szFileName, _MAX_PATH); + if(szFileName[0]) + { + if(SendCtrlMessage(CTRLMSG_INS_OPENFILE, (LPARAM)szFileName) && f < nFiles - 1) + { + // Insert more instrument slots + SendCtrlMessage(IDC_INSTRUMENT_NEW); + } + } } ::DragFinish(hDropInfo); } Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2012-12-02 00:58:03 UTC (rev 1442) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2012-12-02 16:11:56 UTC (rev 1443) @@ -2290,13 +2290,20 @@ void CViewSample::OnDropFiles(HDROP hDropInfo) //-------------------------------------------- { - UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); - if (nFiles) + const UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); + for(UINT f = 0; f < nFiles; f++) { TCHAR szFileName[_MAX_PATH] = ""; CMainFrame::GetMainFrame()->SetForegroundWindow(); - ::DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH); - if (szFileName[0]) SendCtrlMessage(CTRLMSG_SMP_OPENFILE, (LPARAM)szFileName); + ::DragQueryFile(hDropInfo, f, szFileName, _MAX_PATH); + if(szFileName[0]) + { + if(SendCtrlMessage(CTRLMSG_SMP_OPENFILE, (LPARAM)szFileName) && f < nFiles - 1) + { + // Insert more sample slots + SendCtrlMessage(IDC_SAMPLE_NEW); + } + } } ::DragFinish(hDropInfo); } @@ -2868,4 +2875,4 @@ m_nGridSegments = dlg.m_nSegments; InvalidateSample(); } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-03 00:35:57
|
Revision: 1444 http://modplug.svn.sourceforge.net/modplug/?rev=1444&view=rev Author: saga-games Date: 2012-12-03 00:35:49 +0000 (Mon, 03 Dec 2012) Log Message: ----------- [Imp] Added quantize settings shortcut [Fix] Note quantization also works on the first played note when using "continue playing as soon as MIDI notes are being received". Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2012-12-02 16:11:56 UTC (rev 1443) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2012-12-03 00:35:49 UTC (rev 1444) @@ -644,6 +644,7 @@ DefineKeyCommand(kcSampleMonoLeft, 1889, _T("Convert to Mono (Left Channel)")); DefineKeyCommand(kcSampleMonoRight, 1890, _T("Convert to Mono (Right Channel)")); DefineKeyCommand(kcSampleMonoSplit, 1891, _T("Convert to Mono (Split Sample)")); + DefineKeyCommand(kcQuantizeSettings, 1892, _T("Quantize Settings")); // Add new key commands here. @@ -975,11 +976,12 @@ switch (inCmd) { case kcSelect: cmdOff = kcSelectOff; break; - case kcSelectWithNav: cmdOff = kcSelectOffWithNav; break; - case kcCopySelect: cmdOff = kcCopySelectOff; break; - case kcCopySelectWithNav: cmdOff = kcCopySelectOffWithNav; break; + case kcSelectWithNav: cmdOff = kcSelectOffWithNav; break; + case kcCopySelect: cmdOff = kcCopySelectOff; break; + case kcCopySelectWithNav: cmdOff = kcCopySelectOffWithNav; break; case kcSelectWithCopySelect: cmdOff = kcSelectOffWithCopySelect; break; case kcCopySelectWithSelect: cmdOff = kcCopySelectOffWithSelect; break; + default: ruleApplies = false; } Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2012-12-02 16:11:56 UTC (rev 1443) +++ trunk/OpenMPT/mptrack/CommandSet.h 2012-12-03 00:35:49 UTC (rev 1444) @@ -21,7 +21,7 @@ enum InputTargetContext { - kCtxUnknownContext = -1, + kCtxUnknownContext = -1, kCtxAllContexts = 0, kCtxViewGeneral, @@ -250,7 +250,8 @@ kcChangeLoopStatus, kcShowEditMenu, kcTimeAtRow, - kcEndPatternEditMisc=kcTimeAtRow, + kcQuantizeSettings, + kcEndPatternEditMisc=kcQuantizeSettings, kcStartChannelKeys, kcChannelMute = kcStartChannelKeys, Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-02 16:11:56 UTC (rev 1443) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-03 00:35:49 UTC (rev 1444) @@ -43,6 +43,7 @@ }; // Static initializers +ROWINDEX CViewPattern::m_nQuantize = 0; ModCommand CViewPattern::m_cmdOld = ModCommand::Empty(); PatternClipboard CViewPattern::patternClipboard; @@ -176,7 +177,6 @@ m_nPlayPat = PATTERNINDEX_INVALID; m_nPlayRow = 0; m_nMidRow = 0; - m_nQuantize = 0; m_nDragItem = 0; m_bDragging = false; m_bInItemRect = false; @@ -1496,6 +1496,7 @@ { s.Append("Settings..."); } + s.Append("\t" + ih->GetKeyTextFromCommand(kcQuantizeSettings)); AppendMenu(hMenu, MF_STRING | (m_nQuantize != 0 ? MF_CHECKED : 0), ID_SETQUANTIZE, s); } @@ -3820,12 +3821,12 @@ nVol = CMainFrame::ApplyVolumeRelatedSettings(dwMidiData, midivolume); if(nVol < 0) nVol = -1; else nVol = (nVol + 3) / 4; //Value from [0,256] to [0,64] - TempEnterNote(nNote, true, nVol); - + TempEnterNote(nNote, true, nVol, true); + // continue playing as soon as MIDI notes are being received (http://forum.openmpt.org/index.php?topic=2813.0) if(pSndFile->IsPaused() && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN)) pModDoc->OnPatternPlayNoLoop(); - + break; case MIDIEvents::evPolyAftertouch: // Polyphonic aftertouch @@ -4340,6 +4341,7 @@ case kcSwitchToOrderList: OnSwitchToOrderList(); case kcSwitchOverflowPaste: CMainFrame::GetSettings().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam; case kcPatternEditPCNotePlugin: OnTogglePCNotePluginEditor(); return wParam; + case kcQuantizeSettings: OnSetQuantize(); return wParam; case kcChannelSettings: { // Open centered Quick Channel Settings dialog. @@ -4748,8 +4750,8 @@ if(usePlaybackPosition) SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); - const bool quantize = usePlaybackPosition && (m_nQuantize != 0); - if(quantize) + const bool doQuantize = (liveRecord || (fromMidi && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN))) && m_nQuantize != 0; + if(doQuantize) { QuantizeRow(nPat, nRow); } @@ -4777,7 +4779,7 @@ pModDoc->GetPatternUndo().PrepareUndo(nPat, nChn, nRow, 1, 1, "Note Stop Entry"); // -- write sdx if playing live - if(usePlaybackPosition && nTick && pTarget->command == CMD_NONE && !quantize) + if(usePlaybackPosition && nTick && pTarget->command == CMD_NONE && !doQuantize) { pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; pTarget->param = 0xD0 | min(0xF, nTick); @@ -4796,7 +4798,7 @@ } else { // we don't have anything to cut (MOD format) - use volume or ECx - if(usePlaybackPosition && nTick && !quantize) // ECx + if(usePlaybackPosition && nTick && !doQuantize) // ECx { pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; pTarget->param = 0xC0 | min(0xF, nTick); @@ -4922,8 +4924,8 @@ // Enter a note in the pattern -void CViewPattern::TempEnterNote(int note, bool oldStyle, int vol) -//---------------------------------------------------------------- +void CViewPattern::TempEnterNote(int note, bool oldStyle, int vol, bool fromMidi) +//------------------------------------------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -4997,7 +4999,7 @@ SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); // Quantize - const bool doQuantize = usePlaybackPosition && (m_nQuantize != 0); + const bool doQuantize = (liveRecord || (fromMidi && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN))) && m_nQuantize != 0; if(doQuantize) { QuantizeRow(nPat, nRow); Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2012-12-02 16:11:56 UTC (rev 1443) +++ trunk/OpenMPT/mptrack/View_pat.h 2012-12-03 00:35:49 UTC (rev 1444) @@ -139,7 +139,7 @@ UINT m_nMidRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; PATTERNINDEX m_nPlayPat; ROWINDEX m_nPlayRow; - ROWINDEX m_nQuantize; + static ROWINDEX m_nQuantize; int m_nXScroll, m_nYScroll; PatternCursor::Columns m_nDetailLevel; // Visible Columns @@ -281,8 +281,8 @@ //rewbs.customKeys void CursorJump(DWORD distance, bool upwards, bool snap); - void TempEnterNote(int n, bool oldStyle = false, int vol = -1); - void TempStopNote(int note, bool fromMidi=false, const bool bChordMode=false); + void TempEnterNote(int n, bool oldStyle = false, int vol = -1, bool fromMidi = false); + void TempStopNote(int note, bool fromMidi = false, const bool bChordMode = false); void TempEnterChord(int n); void TempStopChord(int note) {TempStopNote(note, false, true);} void TempEnterIns(int val); @@ -462,13 +462,14 @@ // Return true if recording live (i.e. editing while following playback). bool IsLiveRecord() const { - CMainFrame *mainFrm = CMainFrame::GetMainFrame(); - if(mainFrm == nullptr || GetDocument() == nullptr || GetSoundFile() == nullptr) + const CMainFrame *mainFrm = CMainFrame::GetMainFrame(); + const CSoundFile *sndFile = GetSoundFile(); + if(mainFrm == nullptr || sndFile == nullptr) { return false; } // (following song) && (following in correct document) && (playback is on) - return (m_dwStatus & psFollowSong) && mainFrm->GetFollowSong(GetDocument()) == m_hWnd && !GetSoundFile()->IsPaused(); + return (m_dwStatus & psFollowSong) && mainFrm->GetFollowSong(GetDocument()) == m_hWnd && !sndFile->IsPaused(); }; // If given edit positions are valid, sets them to iRow and iPat. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-10 18:21:01
|
Revision: 1453 http://sourceforge.net/p/modplug/code/1453 Author: saga-games Date: 2012-12-10 18:20:55 +0000 (Mon, 10 Dec 2012) Log Message: ----------- [Imp] Sample Map: Dragging the mouse over the sample map does not invert every hovered note's sample assignment but rather do the same action for all hovered keys. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2012-12-09 23:16:17 UTC (rev 1452) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2012-12-10 18:20:55 UTC (rev 1453) @@ -1613,7 +1613,7 @@ "Konstanty for the XMMS-ModPlug resampling implementation |" "http://modplug-xmms.sourceforge.net/|" "Stephan M. Bernsee for pitch shifting source code|" - "http://www.dspdimension.com|" + "http://www.dspdimension.com/|" "Olli Parviainen for SoundTouch Library (time stretching)|" "http://www.surina.net/soundtouch/|" "Hermann Seib for his example VST Host implementation|" @@ -1623,7 +1623,7 @@ "Jean-loup Gailly and Mark Adler for zlib|" "http://zlib.net/|" "Josh Coalson for libFLAC|" - "http://flac.sourceforge.net/" + "http://flac.sourceforge.net/|" "Storlek for all the IT compatibility hints and testcases|" "as well as the IMF, OKT and ULT loaders|" "http://schismtracker.org/|" Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2012-12-09 23:16:17 UTC (rev 1452) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2012-12-10 18:20:55 UTC (rev 1453) @@ -988,9 +988,19 @@ if ((wParam == KBDNOTIFY_LBUTTONDOWN) && (nSample < MAX_SAMPLES) && (pIns)) { UINT iNote = nBaseOctave * 12 + lParam; - if (KeyboardMap[iNote] == nSample) + + if(mouseAction == mouseUnknown) { - KeyboardMap[iNote] = pIns->Keyboard[iNote]; + // Mouse down -> decide if we are going to set or remove notes + mouseAction = (KeyboardMap[iNote] == nSample) ? mouseUnset : mouseSet; + } + + if(mouseAction == mouseUnset) + { + if(KeyboardMap[iNote] == pIns->Keyboard[iNote]) + KeyboardMap[iNote] = 0; + else + KeyboardMap[iNote] = pIns->Keyboard[iNote]; } else { KeyboardMap[iNote] = nSample; @@ -1011,6 +1021,10 @@ OnUpdateKeyboard(); } } + if(wParam == KBDNOTIFY_LBUTTONUP) + { + mouseAction = mouseUnknown; + } SetDlgItemText(IDC_TEXT2, s); return 0; } Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2012-12-09 23:16:17 UTC (rev 1452) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2012-12-10 18:20:55 UTC (rev 1453) @@ -174,15 +174,23 @@ //================================= { protected: + enum MouseAction + { + mouseUnknown, // Didn't mouse-down yet + mouseSet, // Set selected sample + mouseUnset, // Unset (revert to original keymap) + }; + CKeyboardControl m_Keyboard; CComboBox m_CbnSample; CSliderCtrl m_SbOctave; CSoundFile *m_pSndFile; UINT m_nInstrument; SAMPLEINDEX KeyboardMap[NOTE_MAX]; + MouseAction mouseAction; public: - CSampleMapDlg(CSoundFile *pSndFile, UINT nInstr, CWnd *parent=NULL):CDialog(IDD_EDITSAMPLEMAP, parent) + CSampleMapDlg(CSoundFile *pSndFile, UINT nInstr, CWnd *parent=NULL) : CDialog(IDD_EDITSAMPLEMAP, parent), mouseAction(mouseUnknown) { m_pSndFile = pSndFile; m_nInstrument = nInstr; } protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-15 15:45:37
|
Revision: 1462 http://sourceforge.net/p/modplug/code/1462 Author: saga-games Date: 2012-12-15 15:45:30 +0000 (Sat, 15 Dec 2012) Log Message: ----------- [Mod] Added coarse Data Entry shortcuts (+12/+10/+16 depending on column) Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/KeyConfigDlg.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2012-12-15 15:25:36 UTC (rev 1461) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2012-12-15 15:45:30 UTC (rev 1462) @@ -645,6 +645,8 @@ DefineKeyCommand(kcSampleMonoRight, 1890, _T("Convert to Mono (Right Channel)")); DefineKeyCommand(kcSampleMonoSplit, 1891, _T("Convert to Mono (Split Sample)")); DefineKeyCommand(kcQuantizeSettings, 1892, _T("Quantize Settings")); + DefineKeyCommand(kcDataEntryUpCoarse, 1893, _T("Data Entry Up (Coarse)")); + DefineKeyCommand(kcDataEntryDownCoarse, 1894, _T("Data Entry Down (Coarse)")); // Add new key commands here. Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2012-12-15 15:25:36 UTC (rev 1461) +++ trunk/OpenMPT/mptrack/CommandSet.h 2012-12-15 15:45:30 UTC (rev 1462) @@ -266,13 +266,17 @@ kcChannelSettings, kcEndChannelKeys = kcChannelSettings, kcCopyAndLoseSelection, - kcTransposeUp, + kcBeginTranspose, + kcTransposeUp = kcBeginTranspose, kcTransposeDown, kcTransposeOctUp, kcTransposeOctDown, kcTransposeCustom, kcDataEntryUp, kcDataEntryDown, + kcDataEntryUpCoarse, + kcDataEntryDownCoarse, + kcEndTranspose = kcDataEntryDownCoarse, kcPatternAmplify, kcPatternInterpolateNote, kcPatternInterpolateVol, Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2012-12-15 15:25:36 UTC (rev 1461) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2012-12-15 15:45:30 UTC (rev 1462) @@ -485,7 +485,7 @@ if(drawDefaultVolume) { // Displaying sample default volume if there is no volume command. - const CSoundFile *pSndFile = GetDocument()->GetSoundFile(); + const CSoundFile *pSndFile = GetSoundFile(); SAMPLEINDEX sample = mc.instr; if(pSndFile->GetNumInstruments()) { @@ -531,8 +531,8 @@ CHAR s[256]; HGDIOBJ oldpen; CRect rcClient, rect, rc; - CModDoc *pModDoc; - CSoundFile *pSndFile; + const CModDoc *pModDoc; + const CSoundFile *pSndFile; HDC hdc; CHANNELINDEX xofs; ROWINDEX yofs; @@ -779,9 +779,9 @@ } -void CViewPattern::DrawPatternData(HDC hdc, CSoundFile *pSndFile, PATTERNINDEX nPattern, bool selEnable, - bool isPlaying, ROWINDEX startRow, ROWINDEX numRows, CHANNELINDEX startChan, CRect &rcClient, int *pypaint) -//--------------------------------------------------------------------------------------------------------------------------------- +void CViewPattern::DrawPatternData(HDC hdc, const CSoundFile *pSndFile, PATTERNINDEX nPattern, bool selEnable, + bool isPlaying, ROWINDEX startRow, ROWINDEX numRows, CHANNELINDEX startChan, CRect &rcClient, int *pypaint) +//------------------------------------------------------------------------------------------------------------- { uint8 selectedCols[MAX_BASECHANNELS]; // Bit mask of selected channel components static_assert(PatternCursor::lastColumn <= 7, "Columns are used as bitmasks here."); @@ -834,7 +834,7 @@ if (!::RectVisible(hdc, &rect)) { // No speedup for these columns next time - for (UINT iup=startChan; iup<maxcol; iup++) selectedCols[iup] &= ~0x40; + for (CHANNELINDEX iup=startChan; iup<maxcol; iup++) selectedCols[iup] &= ~0x40; goto SkipRow; } rect.right = rect.left + m_szHeader.cx; @@ -1170,14 +1170,12 @@ void CViewPattern::DrawDragSel(HDC hdc) //------------------------------------- { - CModDoc *pModDoc; - CSoundFile *pSndFile; + const CSoundFile *pSndFile = GetSoundFile(); CRect rect; int x1, y1, x2, y2; int nChannels, nRows; - if ((pModDoc = GetDocument()) == nullptr) return; - pSndFile = pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return; // Compute relative movement int dx = (int)m_DragPos.GetChannel() - (int)m_StartSel.GetChannel(); @@ -1296,13 +1294,12 @@ void CViewPattern::UpdateScrollSize() //----------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) + const CSoundFile *pSndFile = GetSoundFile(); + if(pSndFile) { CRect rect; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); SIZE sizeTotal, sizePage, sizeLine; - sizeTotal.cx = m_szHeader.cx + pSndFile->m_nChannels * m_szCell.cx; + sizeTotal.cx = m_szHeader.cx + pSndFile->GetNumChannels() * m_szCell.cx; sizeTotal.cy = m_szHeader.cy + pSndFile->Patterns[m_nPattern].GetNumRows() * m_szCell.cy; sizeLine.cx = m_szCell.cx; sizeLine.cy = m_szCell.cy; @@ -1443,14 +1440,10 @@ PatternRect oldSel = m_Selection; m_Selection = PatternRect(beginSel, endSel); - const CModDoc *pModDoc = GetDocument(); - if(pModDoc != nullptr) + const CSoundFile *pSndFile = GetSoundFile(); + if(pSndFile != nullptr) { - const CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if(pSndFile != nullptr) - { - m_Selection.Sanitize(pSndFile->Patterns[m_nPattern].GetNumRows(), pSndFile->GetNumChannels()); - } + m_Selection.Sanitize(pSndFile->Patterns[m_nPattern].GetNumRows(), pSndFile->GetNumChannels()); } // Get current selection area @@ -1511,10 +1504,9 @@ void CViewPattern::InvalidateRow(ROWINDEX n) //------------------------------------------ { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) + const CSoundFile *pSndFile = GetSoundFile(); + if(pSndFile) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); int yofs = GetYScrollPos() - m_nMidRow; if (n == ROWINDEX_INVALID) n = GetCurrentRow(); if (((int)n < yofs) || (n >= pSndFile->Patterns[m_nPattern].GetNumRows())) return; @@ -1567,11 +1559,10 @@ void CViewPattern::UpdateIndicator() //---------------------------------- { - CModDoc *pModDoc = GetDocument(); + const CSoundFile *pSndFile = GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if ((pMainFrm) && (pModDoc)) + if(pMainFrm != nullptr && pSndFile != nullptr) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); EffectInfo effectInfo(*pSndFile); CHAR s[128]; @@ -1586,7 +1577,7 @@ && (m_Selection.GetUpperLeft() == m_Selection.GetLowerRight()) && (pSndFile->Patterns[m_nPattern]) && (GetCurrentRow() < pSndFile->Patterns[m_nPattern].GetNumRows()) && (nChn < pSndFile->m_nChannels)) { - ModCommand *m = pSndFile->Patterns[m_nPattern].GetpModCommand(GetCurrentRow(), nChn); + const ModCommand *m = pSndFile->Patterns[m_nPattern].GetpModCommand(GetCurrentRow(), nChn); switch(m_Cursor.GetColumnType()) { @@ -1688,13 +1679,10 @@ UINT nChn = GetCurrentChannel(); CString xtraInfo; - CModDoc *pModDoc = GetDocument(); + const CSoundFile *pSndFile = GetSoundFile(); CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if ((pMainFrm) && (pModDoc)) + if(pMainFrm != nullptr && pSndFile != nullptr) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if (!pSndFile) return; - //xtraInfo.Format("Chan: %d; macro: %X; cutoff: %X; reso: %X; pan: %X", xtraInfo.Format("Chn:%d; Vol:%X; Mac:%X; Cut:%X%s; Res:%X; Pan:%X%s", nChn + 1, @@ -1718,8 +1706,8 @@ //------------------------------------------------------------ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - CModDoc *pModDoc = GetDocument(); - CSoundFile *pSndFile; + const CModDoc *pModDoc = GetDocument(); + const CSoundFile *pSndFile; CRect rcClient; HDC hdc; BOOL bPlaying; Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2012-12-15 15:25:36 UTC (rev 1461) +++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2012-12-15 15:45:30 UTC (rev 1462) @@ -276,9 +276,9 @@ for(int c = kcStartChannelKeys; c <= kcEndChannelKeys; c++) newCat.commands.Add(c); newCat.separators.Add(kcEndChannelKeys); //-------------------------------------- - for(int c = kcTransposeUp; c <= kcDataEntryDown; c++) + for(int c = kcBeginTranspose; c <= kcEndTranspose; c++) newCat.commands.Add(c); - newCat.separators.Add(kcDataEntryDown); //-------------------------------------- + newCat.separators.Add(kcEndTranspose); //-------------------------------------- for(int c = kcPatternAmplify; c <= kcPatternShrinkSelection; c++) newCat.commands.Add(c); newCat.separators.Add(kcPatternShrinkSelection); //-------------------------------------- Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-15 15:25:36 UTC (rev 1461) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-15 15:45:30 UTC (rev 1462) @@ -2900,8 +2900,8 @@ } -bool CViewPattern::DataEntry(int offset) -//-------------------------------------- +bool CViewPattern::DataEntry(bool up, bool coarse) +//------------------------------------------------ { CSoundFile *pSndFile = GetSoundFile(); if(pSndFile == nullptr || !pSndFile->Patterns.IsValidPat(m_nPattern)) @@ -2919,6 +2919,7 @@ const ModCommand::NOTE noteMax = pSndFile->GetModSpecifications().noteMax; const int instrMax = Util::Min(static_cast<int>(Util::MaxValueOfType(ModCommand::INSTR())), static_cast<int>(pSndFile->GetNumInstruments() ? pSndFile->GetModSpecifications().instrumentsMax : pSndFile->GetModSpecifications().samplesMax)); const EffectInfo effectInfo(*pSndFile); + const int offset = up ? 1 : -1; PrepareUndo(m_Selection); @@ -2932,7 +2933,7 @@ // Increase / decrease note if(m[chn].IsNote()) { - int note = m[chn].note + offset; + int note = m[chn].note + offset * (coarse ? 12 : 1); Limit(note, noteMin, noteMax); m[chn].note = (ModCommand::NOTE)note; } else if(m[chn].note >= NOTE_MIN_SPECIAL) @@ -2948,6 +2949,10 @@ } while(!pSndFile->GetModSpecifications().HasNote((ModCommand::NOTE)note)); if(note >= NOTE_MIN_SPECIAL && note <= NOTE_MAX_SPECIAL) { + if(m[chn].IsPcNote() != ModCommand::IsPcNote((ModCommand::NOTE)note)) + { + m[chn].Clear(); + } m[chn].note = (ModCommand::NOTE)note; } } @@ -2955,7 +2960,7 @@ if(m_Selection.ContainsHorizontal(PatternCursor(0, chn, PatternCursor::instrColumn))) { // Increase / decrease instrument - int instr = m[chn].instr + offset; + int instr = m[chn].instr + offset * (coarse ? 10 : 1); if(m[chn].IsInstrPlug()) { Limit(instr, 0, int(MAX_MIXPLUGINS)); @@ -2970,12 +2975,12 @@ // Increase / decrease volume parameter if(m[chn].IsPcNote()) { - int val = m[chn].GetValueVolCol() + offset; + int val = m[chn].GetValueVolCol() + offset * (coarse ? 10 : 1); Limit(val, 0, int(ModCommand::maxColumnValue)); m[chn].SetValueVolCol(val); } else { - int vol = m[chn].vol + offset; + int vol = m[chn].vol + offset * (coarse ? 10 : 1); DWORD minValue = 0, maxValue = 64; effectInfo.GetVolCmdInfo(effectInfo.GetIndexFromVolCmd(m[chn].volcmd), nullptr, &minValue, &maxValue); Limit(vol, (int)minValue, (int)maxValue); @@ -2987,12 +2992,12 @@ // Increase / decrease effect parameter if(m[chn].IsPcNote()) { - int val = m[chn].GetValueEffectCol() + offset; + int val = m[chn].GetValueEffectCol() + offset * (coarse ? 10 : 1); Limit(val, 0, int(ModCommand::maxColumnValue)); m[chn].SetValueEffectCol(val); } else { - int param = m[chn].param + offset; + int param = m[chn].param + offset * (coarse ? 16 : 1); DWORD minValue = 0, maxValue = 0xFF; effectInfo.GetEffectInfo(effectInfo.GetIndexFromEffect(m[chn].command, m[chn].param), nullptr, false, &minValue, &maxValue); Limit(param, (int)minValue, (int)maxValue); @@ -4161,8 +4166,10 @@ case kcTransposeOctUp: OnTransposeOctUp(); return wParam; case kcTransposeOctDown: OnTransposeOctDown(); return wParam; case kcTransposeCustom: OnTransposeCustom(); return wParam; - case kcDataEntryUp: DataEntry(1); return wParam; - case kcDataEntryDown: DataEntry(-1); return wParam; + case kcDataEntryUp: DataEntry(true, false); return wParam; + case kcDataEntryDown: DataEntry(false, false); return wParam; + case kcDataEntryUpCoarse: DataEntry(true, true); return wParam; + case kcDataEntryDownCoarse: DataEntry(false, true); return wParam; case kcSelectColumn: OnSelectCurrentColumn(); return wParam; case kcPatternAmplify: OnPatternAmplify(); return wParam; case kcPatternSetInstrument: OnSetSelInstrument(); return wParam; Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2012-12-15 15:25:36 UTC (rev 1461) +++ trunk/OpenMPT/mptrack/View_pat.h 2012-12-15 15:45:30 UTC (rev 1462) @@ -256,7 +256,7 @@ void MoveCursor(bool moveRight); bool TransposeSelection(int transp); - bool DataEntry(int offset); + bool DataEntry(bool up, bool coarse); bool PrepareUndo(const PatternRect &selection) { return PrepareUndo(selection.GetUpperLeft(), selection.GetLowerRight()); }; bool PrepareUndo(const PatternCursor &beginSel, const PatternCursor &endSel); @@ -266,7 +266,7 @@ void ProcessChar(UINT nChar, UINT nFlags); public: - void DrawPatternData(HDC hdc, CSoundFile *pSndFile, PATTERNINDEX nPattern, bool selEnable, bool isPlaying, ROWINDEX startRow, ROWINDEX numRows, CHANNELINDEX startChan, CRect &rcClient, int *pypaint); + void DrawPatternData(HDC hdc, const CSoundFile *pSndFile, PATTERNINDEX nPattern, bool selEnable, bool isPlaying, ROWINDEX startRow, ROWINDEX numRows, CHANNELINDEX startChan, CRect &rcClient, int *pypaint); void DrawLetter(int x, int y, char letter, int sizex=10, int ofsx=0); void DrawNote(int x, int y, UINT note, CTuning* pTuning = NULL); void DrawInstrument(int x, int y, UINT instr); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-21 23:28:24
|
Revision: 1470 http://sourceforge.net/p/modplug/code/1470 Author: saga-games Date: 2012-12-21 23:28:12 +0000 (Fri, 21 Dec 2012) Log Message: ----------- [Imp] Pattern Editor: Quantize settings are now remembered between sessions. Modified Paths: -------------- trunk/OpenMPT/mptrack/MPTHacks.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/MPTHacks.cpp =================================================================== --- trunk/OpenMPT/mptrack/MPTHacks.cpp 2012-12-21 18:34:13 UTC (rev 1469) +++ trunk/OpenMPT/mptrack/MPTHacks.cpp 2012-12-21 23:28:12 UTC (rev 1470) @@ -190,7 +190,7 @@ // REQUIRES AUTOFIX } if(foundHere) - AddToLog("Found VST plugins\n"); + AddToLog("Found plugins\n"); // Check for invalid order items for(ORDERINDEX i = m_SndFile.Order.GetLengthTailTrimmed(); i > 0; i--) Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2012-12-21 18:34:13 UTC (rev 1469) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2012-12-21 23:28:12 UTC (rev 1470) @@ -89,9 +89,11 @@ | PATTERN_SMALLFONT | PATTERN_CENTERROW | PATTERN_DRAGNDROPEDIT | PATTERN_FLATBUTTONS | PATTERN_NOEXTRALOUD | PATTERN_2NDHIGHLIGHT | PATTERN_STDHIGHLIGHT | PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL - | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE; + | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE + | PATTERN_LARGECOMMENTS | PATTERN_SHOWDEFAULTVOLUME; m_nRowHighlightMeasures = 16; m_nRowHighlightBeats = 4; + recordQuantizeRows = 0; m_nSampleUndoMaxBuffer = 0; // Real sample buffer undo size will be set later. @@ -100,29 +102,29 @@ // Directory Arrays (Default + Last) for(size_t i = 0; i < NUM_DIRS; i++) { - if (i == DIR_TUNING) // Hack: Tuning folder is already set so don't reset it. + if(i == DIR_TUNING) // Hack: Tuning folder is already set so don't reset it. continue; - MemsetZero(m_szDefaultDirectory[i]); - MemsetZero(m_szWorkingDirectory[i]); + m_szDefaultDirectory[i][0] = '\0'; + m_szWorkingDirectory[i][0] = '\0'; } - MemsetZero(m_szKbdFile); //rewbs.customKeys + m_szKbdFile[0] = '\0'; // Default chords MemsetZero(Chords); - for (UINT ichord=0; ichord<3*12; ichord++) + for(UINT ichord = 0; ichord < 3 * 12; ichord++) { Chords[ichord].key = (BYTE)ichord; Chords[ichord].notes[0] = 0; Chords[ichord].notes[1] = 0; Chords[ichord].notes[2] = 0; - if (ichord < 12) + if(ichord < 12) { // Major Chords Chords[ichord].notes[0] = (BYTE)(ichord+5); Chords[ichord].notes[1] = (BYTE)(ichord+8); Chords[ichord].notes[2] = (BYTE)(ichord+11); - } else if (ichord < 24) + } else if(ichord < 24) { // Minor Chords Chords[ichord].notes[0] = (BYTE)(ichord-8); @@ -390,6 +392,7 @@ gbPatternRecord = CMainFrame::GetPrivateProfileDWord("Pattern Editor", "Record", gbPatternRecord, iniFile); gnAutoChordWaitTime = CMainFrame::GetPrivateProfileDWord("Pattern Editor", "AutoChordWaitTime", gnAutoChordWaitTime, iniFile); orderlistMargins = GetPrivateProfileInt("Pattern Editor", "DefaultSequenceMargins", orderlistMargins, iniFile); + recordQuantizeRows = CMainFrame::GetPrivateProfileDWord("Pattern Editor", "RecordQuantize", recordQuantizeRows, iniFile); gbShowHackControls = (0 != CMainFrame::GetPrivateProfileDWord("Misc", "ShowHackControls", gbShowHackControls ? 1 : 0, iniFile)); CSoundFile::s_DefaultPlugVolumeHandling = static_cast<uint8>(GetPrivateProfileInt("Misc", "DefaultPlugVolumeHandling", CSoundFile::s_DefaultPlugVolumeHandling, iniFile)); if(CSoundFile::s_DefaultPlugVolumeHandling >= PLUGIN_VOLUMEHANDLING_MAX) CSoundFile::s_DefaultPlugVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; @@ -753,6 +756,7 @@ CMainFrame::WritePrivateProfileDWord("Pattern Editor", "Plugin-Names", gbPatternPluginNames, iniFile); CMainFrame::WritePrivateProfileDWord("Pattern Editor", "Record", gbPatternRecord, iniFile); CMainFrame::WritePrivateProfileDWord("Pattern Editor", "AutoChordWaitTime", gnAutoChordWaitTime, iniFile); + CMainFrame::WritePrivateProfileDWord("Pattern Editor", "RecordQuantize", recordQuantizeRows, iniFile); // Write default paths const bool bConvertPaths = theApp.IsPortableMode(); Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2012-12-21 18:34:13 UTC (rev 1469) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2012-12-21 23:28:12 UTC (rev 1470) @@ -71,6 +71,7 @@ BOOL gbPatternVUMeters, gbPatternPluginNames, gbPatternRecord; DWORD m_dwPatternSetup, m_nKeyboardCfg; DWORD m_nRowHighlightMeasures, m_nRowHighlightBeats; // primary (measures) and secondary (beats) highlight + ROWINDEX recordQuantizeRows; bool m_bHideUnavailableCtxMenuItems; int orderlistMargins; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-21 18:34:13 UTC (rev 1469) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-21 23:28:12 UTC (rev 1470) @@ -43,7 +43,6 @@ }; // Static initializers -ROWINDEX CViewPattern::m_nQuantize = 0; ModCommand CViewPattern::m_cmdOld = ModCommand::Empty(); PatternClipboard CViewPattern::patternClipboard; @@ -1489,15 +1488,15 @@ AppendMenu(hMenu, MF_SEPARATOR, 0, ""); CString s = "Quantize "; - if(m_nQuantize != 0) + if(CMainFrame::GetSettings().recordQuantizeRows != 0) { - s.AppendFormat("(Currently: %d Rows)", m_nQuantize); + s.AppendFormat("(Currently: %d Rows)", CMainFrame::GetSettings().recordQuantizeRows); } else { s.Append("Settings..."); } s.Append("\t" + ih->GetKeyTextFromCommand(kcQuantizeSettings)); - AppendMenu(hMenu, MF_STRING | (m_nQuantize != 0 ? MF_CHECKED : 0), ID_SETQUANTIZE, s); + AppendMenu(hMenu, MF_STRING | (CMainFrame::GetSettings().recordQuantizeRows != 0 ? MF_CHECKED : 0), ID_SETQUANTIZE, s); } ClientToScreen(&pt); @@ -4757,7 +4756,7 @@ if(usePlaybackPosition) SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); - const bool doQuantize = (liveRecord || (fromMidi && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN))) && m_nQuantize != 0; + const bool doQuantize = (liveRecord || (fromMidi && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN))) && CMainFrame::GetSettings().recordQuantizeRows != 0; if(doQuantize) { QuantizeRow(nPat, nRow); @@ -5006,7 +5005,7 @@ SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); // Quantize - const bool doQuantize = (liveRecord || (fromMidi && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN))) && m_nQuantize != 0; + const bool doQuantize = (liveRecord || (fromMidi && (CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN))) && CMainFrame::GetSettings().recordQuantizeRows != 0; if(doQuantize) { QuantizeRow(nPat, nRow); @@ -5472,13 +5471,13 @@ //-------------------------------------------------------------------- { const CSoundFile *sndFile = GetSoundFile(); - if(sndFile == nullptr || m_nQuantize == 0) + if(sndFile == nullptr || CMainFrame::GetSettings().recordQuantizeRows == 0) { return; } const ROWINDEX currentTick = sndFile->m_nMusicSpeed * row + sndFile->m_nTickCount; - const ROWINDEX ticksPerNote = m_nQuantize * sndFile->m_nMusicSpeed; + const ROWINDEX ticksPerNote = CMainFrame::GetSettings().recordQuantizeRows * sndFile->m_nMusicSpeed; // Previous quantization step const ROWINDEX quantLow = (currentTick / ticksPerNote) * ticksPerNote; @@ -5534,10 +5533,10 @@ void CViewPattern::OnSetQuantize() //-------------------------------- { - CInputDlg dlg(this, "Quantize amount in rows for live recording (0 to disable):", 0, MAX_PATTERN_ROWS, m_nQuantize); + CInputDlg dlg(this, "Quantize amount in rows for live recording (0 to disable):", 0, MAX_PATTERN_ROWS, CMainFrame::GetSettings().recordQuantizeRows); if(dlg.DoModal()) { - m_nQuantize = static_cast<ROWINDEX>(dlg.resultNumber); + CMainFrame::GetSettings().recordQuantizeRows = static_cast<ROWINDEX>(dlg.resultNumber); } } Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2012-12-21 18:34:13 UTC (rev 1469) +++ trunk/OpenMPT/mptrack/View_pat.h 2012-12-21 23:28:12 UTC (rev 1470) @@ -139,7 +139,6 @@ UINT m_nMidRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; PATTERNINDEX m_nPlayPat; ROWINDEX m_nPlayRow; - static ROWINDEX m_nQuantize; int m_nXScroll, m_nYScroll; PatternCursor::Columns m_nDetailLevel; // Visible Columns This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-23 19:30:47
|
Revision: 1475 http://sourceforge.net/p/modplug/code/1475 Author: saga-games Date: 2012-12-23 19:30:34 +0000 (Sun, 23 Dec 2012) Log Message: ----------- [New] Added pattern editor shortcut to find nearest instrument number in a channel [New] Added pattern editor shortcuts to toggle PC keyboard/MIDI record note off (http://bugs.openmpt.org/view.php?id=326) [Imp] Added fake grace note support for record quantization. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2012-12-22 21:07:21 UTC (rev 1474) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2012-12-23 19:30:34 UTC (rev 1475) @@ -539,7 +539,7 @@ DefineKeyCommand(kcSampleInvert, 1784, _T("Invert Sample Phase")); DefineKeyCommand(kcSampleSignUnsign, 1785, _T("Signed / Unsigned Conversion")); DefineKeyCommand(kcChannelReset, 1786, _T("Reset Channel")); - DefineKeyCommand(kcSwitchOverflowPaste, 1787, _T("Toggle overflow paste")); + DefineKeyCommand(kcToggleOverflowPaste, 1787, _T("Toggle overflow paste")); DefineKeyCommand(kcNotePC, 1788, _T("Parameter control(MPTm only)")); DefineKeyCommand(kcNotePCS, 1789, _T("Parameter control(smooth)(MPTm only)")); DefineKeyCommand(kcSampleRemoveDCOffset, 1790, _T("Remove DC Offset")); @@ -647,6 +647,9 @@ DefineKeyCommand(kcQuantizeSettings, 1892, _T("Quantize Settings")); DefineKeyCommand(kcDataEntryUpCoarse, 1893, _T("Data Entry Up (Coarse)")); DefineKeyCommand(kcDataEntryDownCoarse, 1894, _T("Data Entry Down (Coarse)")); + DefineKeyCommand(kcToggleNoteOffRecordPC, 1895, _T("Toggle Note Off record (PC keyboard)")); + DefineKeyCommand(kcToggleNoteOffRecordMIDI, 1896, _T("Toggle Note Off record (MIDI)")); + DefineKeyCommand(kcFindInstrument, 1897, _T("Pick up nearest instrument number")); // Add new key commands here. Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2012-12-22 21:07:21 UTC (rev 1474) +++ trunk/OpenMPT/mptrack/CommandSet.h 2012-12-23 19:30:34 UTC (rev 1475) @@ -103,7 +103,6 @@ kcEditMixPasteITStyle, kcEditPasteFlood, kcEditPushForwardPaste, - kcSwitchOverflowPaste, kcEditSelectAll, kcEditFind, kcEditFindNext, @@ -223,6 +222,7 @@ kcToggleFollowSong=kcStartPatternEditMisc, kcCursorCopy, kcCursorPaste, + kcFindInstrument, kcPatternRecord, kcPatternPlayRow, kcSetSpacing, @@ -251,7 +251,10 @@ kcShowEditMenu, kcTimeAtRow, kcQuantizeSettings, - kcEndPatternEditMisc=kcQuantizeSettings, + kcToggleOverflowPaste, + kcToggleNoteOffRecordPC, + kcToggleNoteOffRecordMIDI, + kcEndPatternEditMisc=kcToggleNoteOffRecordMIDI, kcStartChannelKeys, kcChannelMute = kcStartChannelKeys, Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-22 21:07:21 UTC (rev 1474) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-23 19:30:34 UTC (rev 1475) @@ -4345,9 +4345,12 @@ case kcNewPattern: SendCtrlMessage(CTRLMSG_PAT_NEWPATTERN); return wParam; case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam; case kcSwitchToOrderList: OnSwitchToOrderList(); - case kcSwitchOverflowPaste: CMainFrame::GetSettings().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam; + case kcToggleOverflowPaste: CMainFrame::GetSettings().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam; + case kcToggleNoteOffRecordPC: CMainFrame::GetSettings().m_dwPatternSetup ^= PATTERN_KBDNOTEOFF; return wParam; + case kcToggleNoteOffRecordMIDI: CMainFrame::GetSettings().m_dwMidiSetup ^= MIDISETUP_RECORDNOTEOFF; return wParam; case kcPatternEditPCNotePlugin: OnTogglePCNotePluginEditor(); return wParam; case kcQuantizeSettings: OnSetQuantize(); return wParam; + case kcFindInstrument: FindInstrument(); return wParam; case kcChannelSettings: { // Open centered Quick Channel Settings dialog. @@ -5009,6 +5012,11 @@ if(doQuantize) { QuantizeRow(nPat, nRow); + // "Grace notes" are stuffed into the next row, if possible + if(pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn)->IsNote() && nRow < pSndFile->Patterns[nPat].GetNumRows() - 1) + { + nRow++; + } } // -- Work out where to put the new note @@ -6606,6 +6614,28 @@ } +// Sweep pattern channel to find instrument number to use +void CViewPattern::FindInstrument() +//--------------------------------- +{ + CSoundFile *sndFile = GetSoundFile(); + if(sndFile == nullptr || !sndFile->Patterns.IsValidPat(m_nPattern)) + { + return; + } + ROWINDEX row = m_Cursor.GetRow(); + do + { + ModCommand &m = *sndFile->Patterns[m_nPattern].GetpModCommand(row, m_Cursor.GetChannel()); + if(!m.IsPcNote() && m.instr != 0) + { + SendCtrlMessage(CTRLMSG_SETCURRENTINSTRUMENT, m.instr); + break; + } + } while(row-- != 0); +} + + // Copy to clipboard bool CViewPattern::CopyPattern(PATTERNINDEX nPattern, const PatternRect &selection) //--------------------------------------------------------------------------------- Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2012-12-22 21:07:21 UTC (rev 1474) +++ trunk/OpenMPT/mptrack/View_pat.h 2012-12-23 19:30:34 UTC (rev 1475) @@ -277,7 +277,6 @@ // True if default volume should be drawn for a given cell. static bool DrawDefaultVolume(const ModCommand *m) { return (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_SHOWDEFAULTVOLUME) && m->volcmd == VOLCMD_NONE && m->command != CMD_VOLUME && m->instr != 0 && m->IsNote(); } - //rewbs.customKeys void CursorJump(DWORD distance, bool upwards, bool snap); void TempEnterNote(int n, bool oldStyle = false, int vol = -1, bool fromMidi = false); @@ -299,8 +298,9 @@ void OnClearField(const RowMask &mask, bool step, bool ITStyle = false); void InsertRows(CHANNELINDEX colmin, CHANNELINDEX colmax); void SetSelectionInstrument(const INSTRUMENTINDEX nIns); - //end rewbs.customKeys + void FindInstrument(); + void TogglePluginEditor(int chan); //rewbs.patPlugName void ExecutePaste(PatternClipboard::PasteModes mode); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2012-12-27 10:12:39
|
Revision: 1480 http://sourceforge.net/p/modplug/code/1480 Author: saga-games Date: 2012-12-27 10:12:32 +0000 (Thu, 27 Dec 2012) Log Message: ----------- [Fix] Sample rearranging was even more broken now. [Fix] Find Instrument in pattern was also even more broken now (tx coda) Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2012-12-26 00:28:39 UTC (rev 1479) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2012-12-27 10:12:32 UTC (rev 1480) @@ -308,6 +308,13 @@ sampleNames[i] = m_SndFile.m_szNames[i]; } + // Remove sample data references from now unused slots. + for(SAMPLEINDEX i = newNumSamples + 1; i <= oldNumSamples; i++) + { + m_SndFile.GetSample(i).pSample = nullptr; + m_SndFile.GetSample(i).nLength = 0; + } + // Now, create new sample list. m_SndFile.m_nSamples = newNumSamples; for(SAMPLEINDEX i = 0; i < newNumSamples; i++) @@ -334,12 +341,6 @@ } } - // Remove sample data references from now unused slots. - for(SAMPLEINDEX i = newNumSamples + 1; i <= oldNumSamples; i++) - { - m_SndFile.DestroySample(i); - } - if(m_SndFile.GetNumInstruments()) { // Instrument mode: Update sample maps. Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-26 00:28:39 UTC (rev 1479) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2012-12-27 10:12:32 UTC (rev 1480) @@ -6636,20 +6636,20 @@ if(!m.IsPcNote() && m.instr != 0) { SendCtrlMessage(CTRLMSG_SETCURRENTINSTRUMENT, m.instr); - break; + return; } } while(row-- != 0); // Try previous pattern if(ord == 0) { - break; + return; } ord = sndFile->Order.GetPreviousOrderIgnoringSkips(ord); pat = sndFile->Order[ord]; if(!sndFile->Patterns.IsValidPat(pat)) { - break; + return; } row = sndFile->Patterns[pat].GetNumRows() - 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-01-13 18:15:45
|
Revision: 1488 http://sourceforge.net/p/modplug/code/1488 Author: saga-games Date: 2013-01-13 18:15:37 +0000 (Sun, 13 Jan 2013) Log Message: ----------- [Imp] Number of sound banks is no longer limited to 100. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-01-13 18:15:37 UTC (rev 1488) @@ -1335,6 +1335,7 @@ { CSoundFile::gpSndMixHook = NULL; } + if (!audioOpenDevice()) { m_pSndFile = NULL; @@ -1400,9 +1401,6 @@ } if (m_pSndFile) { - //m_pSndFile->LoopPattern(-1); - //Commented above line - why loop should be disabled when pausing? - m_pSndFile->m_SongFlags.reset(SONG_PAUSED); if (m_pSndFile == &m_WaveFile) { @@ -1410,16 +1408,16 @@ m_WaveFile.Destroy(); } else { - for (UINT i=m_pSndFile->m_nChannels; i<MAX_CHANNELS; i++) + for(CHANNELINDEX i = m_pSndFile->m_nChannels; i < MAX_CHANNELS; i++) { - if (!(m_pSndFile->Chn[i].nMasterChn)) + if(!(m_pSndFile->Chn[i].nMasterChn)) { m_pSndFile->Chn[i].nPos = m_pSndFile->Chn[i].nPosLo = m_pSndFile->Chn[i].nLength = 0; } } } + } - } m_pModPlaying = NULL; m_pSndFile = NULL; m_hFollowSong = NULL; @@ -1466,7 +1464,7 @@ BOOL CMainFrame::PlayDLSInstrument(UINT nDLSBank, UINT nIns, UINT nRgn) //--------------------------------------------------------------------- { - if ((nDLSBank >= MAX_DLS_BANKS) || (!CTrackApp::gpDLSBanks[nDLSBank])) return FALSE; + if(nDLSBank >= CTrackApp::gpDLSBanks.size() || !CTrackApp::gpDLSBanks[nDLSBank]) return FALSE; BeginWaitCursor(); PlaySoundFile((LPCSTR)NULL); m_WaveFile.m_nInstruments = 1; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2013-01-13 18:15:37 UTC (rev 1488) @@ -453,7 +453,7 @@ // DLS Banks support #define MPTRACK_REG_DLS "Software\\Olivier Lapicque\\ModPlug Tracker\\DLS Banks" -CDLSBank *CTrackApp::gpDLSBanks[MAX_DLS_BANKS]; +vector<CDLSBank *> CTrackApp::gpDLSBanks; BOOL CTrackApp::LoadDefaultDLSBanks() @@ -546,10 +546,10 @@ TCHAR s[64]; TCHAR szPath[_MAX_PATH]; DWORD nBanks = 0; - for (UINT i=0; i<MAX_DLS_BANKS; i++) + for(size_t i = 0; i < gpDLSBanks.size(); i++) { - if (!gpDLSBanks[i] || !gpDLSBanks[i]->GetFileName() || !gpDLSBanks[i]->GetFileName()[0]) + if(!gpDLSBanks[i] || !gpDLSBanks[i]->GetFileName() || !gpDLSBanks[i]->GetFileName()[0]) continue; _tcsncpy(szPath, gpDLSBanks[i]->GetFileName(), CountOf(szPath) - 1); @@ -571,9 +571,10 @@ BOOL CTrackApp::RemoveDLSBank(UINT nBank) //--------------------------------------- { - if ((nBank >= MAX_DLS_BANKS) || (!gpDLSBanks[nBank])) return FALSE; + if(nBank >= gpDLSBanks.size() || !gpDLSBanks[nBank]) return FALSE; delete gpDLSBanks[nBank]; - gpDLSBanks[nBank] = NULL; + gpDLSBanks[nBank] = nullptr; + //gpDLSBanks.erase(gpDLSBanks.begin() + nBank); return TRUE; } @@ -581,18 +582,22 @@ BOOL CTrackApp::AddDLSBank(LPCSTR lpszFileName) //--------------------------------------------- { - if ((!lpszFileName) || (!lpszFileName[0]) || (!CDLSBank::IsDLSBank(lpszFileName))) return FALSE; - for (UINT j=0; j<MAX_DLS_BANKS; j++) if (gpDLSBanks[j]) + if(!lpszFileName || !lpszFileName[0] || !CDLSBank::IsDLSBank(lpszFileName)) return FALSE; + // Check for dupes + for(size_t i = 0; i < gpDLSBanks.size(); i++) { - if (!lstrcmpi(lpszFileName, gpDLSBanks[j]->GetFileName())) return TRUE; + if(gpDLSBanks[i] && !lstrcmpi(lpszFileName, gpDLSBanks[i]->GetFileName())) return TRUE; } - for (UINT i=0; i<MAX_DLS_BANKS; i++) if (!gpDLSBanks[i]) + CDLSBank *bank = new CDLSBank; + if(bank->Open(lpszFileName)) { - gpDLSBanks[i] = new CDLSBank; - gpDLSBanks[i]->Open(lpszFileName); + gpDLSBanks.push_back(bank); return TRUE; + } else + { + delete bank; + return FALSE; } - return FALSE; } @@ -649,7 +654,6 @@ m_bDebugMode = FALSE; m_hAlternateResourceHandle = NULL; m_szConfigFileName[0] = 0; - for (size_t i = 0; i < MAX_DLS_BANKS; i++) gpDLSBanks[i] = NULL; } ///////////////////////////////////////////////////////////////////////////// @@ -997,14 +1001,11 @@ glpMidiLibrary = NULL; } SaveDefaultDLSBanks(); - for (UINT i=0; i<MAX_DLS_BANKS; i++) + for(size_t i = 0; i < gpDLSBanks.size(); i++) { - if (gpDLSBanks[i]) - { - delete gpDLSBanks[i]; - gpDLSBanks[i] = NULL; - } + delete gpDLSBanks[i]; } + gpDLSBanks.clear(); // Uninitialize Plugins UninitializeDXPlugins(); Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/Mptrack.h 2013-01-13 18:15:37 UTC (rev 1488) @@ -22,6 +22,7 @@ class CModDoc; class CVstPluginManager; +class CDLSBank; ///////////////////////////////////////////////////////////////////////////// // 16-colors DIB @@ -42,14 +43,6 @@ } MIDILIBSTRUCT, *LPMIDILIBSTRUCT; -///////////////////////////////////////////////////////////////////////////// -// DLS Sound Banks - -#define MAX_DLS_BANKS 100 //rewbs.increaseMaxDLSBanks - -class CDLSBank; - - ///////////////////////////////////////////////////////////////////////// // Chords @@ -115,7 +108,7 @@ public: static MEMORYSTATUS gMemStatus; - static CDLSBank *gpDLSBanks[MAX_DLS_BANKS]; + static vector<CDLSBank *> gpDLSBanks; #if (_MSC_VER < MSVC_VER_2010) virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName, BOOL bAddToMRU = TRUE) Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2013-01-13 18:15:37 UTC (rev 1488) @@ -2040,7 +2040,7 @@ break; case DRAGONDROP_DLS: - bCanDrop = ((lpDropInfo->dwDropItem < MAX_DLS_BANKS) + bCanDrop = ((lpDropInfo->dwDropItem < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[lpDropInfo->dwDropItem])); break; Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-01-13 18:15:37 UTC (rev 1488) @@ -1897,7 +1897,7 @@ if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { pfmt->freqHz = ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); - } + } pfmt->channels = (sample.uFlags & CHN_STEREO) ? (WORD)2 : (WORD)1; pfmt->bitspersample = (sample.uFlags & CHN_16BIT) ? (WORD)16 : (WORD)8; pfmt->samplesize = pfmt->channels * pfmt->bitspersample / 8; @@ -1908,9 +1908,9 @@ LPBYTE psamples = p + sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER) + sizeof(WAVEDATAHEADER); memcpy(psamples, sample.pSample+dwSmpOffset, dwSmpLen); if (pfmt->bitspersample == 8) - { + { for (UINT i = 0; i < dwSmpLen; i++) psamples[i] += 0x80; - } + } if (bExtra) { WAVESMPLHEADER *psh = (WAVESMPLHEADER *)(psamples+dwSmpLen); @@ -1925,7 +1925,7 @@ WAVESAMPLERINFO *psmpl = (WAVESAMPLERINFO *)psh; MemsetZero(psmpl->wsiLoops); if((sample.uFlags & CHN_SUSTAINLOOP) != 0) - { + { psmpl->wsiLoops[psmpl->wsiHdr.dwSampleLoops++].SetLoop(sample.nSustainStart, sample.nSustainEnd, (sample.uFlags & CHN_PINGPONGSUSTAIN) != 0); psmpl->wsiHdr.smpl_len += sizeof(SAMPLELOOPSTRUCT); } @@ -1953,18 +1953,18 @@ // XM vibrato is upside down pxh->nVibSweep = 255 - pxh->nVibSweep; } - + if ((pSndFile->m_szNames[m_nSample][0]) || (sample.filename[0])) - { + { LPSTR pszText = (LPSTR)(pxh+1); memcpy(pszText, pSndFile->m_szNames[m_nSample], MAX_SAMPLENAME); pxh->xtra_len += MAX_SAMPLENAME; if (sample.filename[0]) - { + { memcpy(pszText + MAX_SAMPLENAME, sample.filename, MAX_SAMPLEFILENAME); pxh->xtra_len += MAX_SAMPLEFILENAME; - } } + } phdr->filesize += (psh->smpl_len + 8) + (pxh->xtra_len + 8); } GlobalUnlock(hCpy); @@ -2004,9 +2004,9 @@ sample.pSample = 0; pSndFile->ReadSampleFromFile(m_nSample, p, dwMemSize); if (!pSndFile->m_szNames[m_nSample][0]) - { +{ memcpy(pSndFile->m_szNames[m_nSample], s, 32); - } +} if (!sample.filename[0]) { memcpy(sample.filename, s2, 22); @@ -2250,7 +2250,7 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); ModSample &sample = pSndFile->GetSample(m_nSample); - uint32 freq = pSndFile->GetFreqFromPeriod(pSndFile->GetPeriodFromNote(note + sample.RelativeTone, sample.nFineTune, sample.nC5Speed), sample.nC5Speed, 0); + uint32 freq = pSndFile->GetFreqFromPeriod(pSndFile->GetPeriodFromNote(note + (pSndFile->GetType() == MOD_TYPE_XM ? sample.RelativeTone : 0), sample.nFineTune, sample.nC5Speed), sample.nC5Speed, 0); wsprintf(s, "%s%d (%d Hz)", szNoteNames[(note - 1) % 12], (note - 1) / 12, freq); } @@ -2333,7 +2333,7 @@ break; case DRAGONDROP_DLS: - bCanDrop = ((lpDropInfo->dwDropItem < MAX_DLS_BANKS) + bCanDrop = ((lpDropInfo->dwDropItem < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[lpDropInfo->dwDropItem])); break; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-01-13 18:15:37 UTC (rev 1488) @@ -127,7 +127,6 @@ MemsetZero(m_tiMidiGrp); MemsetZero(m_tiMidi); MemsetZero(m_tiPerc); - MemsetZero(m_tiDLS); DocInfo.clear(); } @@ -463,11 +462,17 @@ HTREEITEM hDlsRoot = m_hMidiLib; if (!m_pDataTree) return; - for (UINT iDls=0; iDls<MAX_DLS_BANKS; iDls++) + + if(m_tiDLS.size() < CTrackApp::gpDLSBanks.size()) { - if (CTrackApp::gpDLSBanks[iDls]) + m_tiDLS.resize(CTrackApp::gpDLSBanks.size(), nullptr); + } + + for(size_t iDls=0; iDls < CTrackApp::gpDLSBanks.size(); iDls++) + { + if(CTrackApp::gpDLSBanks[iDls]) { - if (!m_tiDLS[iDls]) + if(!m_tiDLS[iDls]) { CHAR szName[_MAX_PATH] = "", szExt[_MAX_EXT] = ".dls"; TV_SORTCB tvs; @@ -1150,7 +1155,7 @@ } } // Dls Instruments - for (UINT iDls=0; iDls<MAX_DLS_BANKS; iDls++) if (m_tiDLS[iDls]) + for (UINT iDls = 0; iDls < m_tiDLS.size(); iDls++) if (m_tiDLS[iDls]) { if (hItem == m_tiDLS[iDls]) return (MODITEM_DLSBANK_FOLDER | (iDls << 16)); if (m_tiDLS[iDls] == hRootParent) @@ -1344,7 +1349,7 @@ { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); UINT bank = (modItem & 0x3F000000) >> 24; - if ((bank < MAX_DLS_BANKS) && (CTrackApp::gpDLSBanks[bank]) && (pMainFrm)) + if ((bank < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[bank]) && (pMainFrm)) { CDLSBank *pDLSBank = CTrackApp::gpDLSBanks[bank]; UINT rgn = 0, instr = (modItem & 0x00007FFF); @@ -1854,7 +1859,7 @@ if ((lParam1 & 0xFF00FFFF) == (lParam2 & 0xFF00FFFF)) { UINT iDls = (lParam1 >> 24) & 0xFF; - if ((iDls < MAX_DLS_BANKS) && (CTrackApp::gpDLSBanks[iDls])) + if ((iDls < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[iDls])) { CDLSBank *pDLSBank = CTrackApp::gpDLSBanks[iDls]; DLSINSTRUMENT *pDlsIns = pDLSBank->GetInstrument(lParam1 & 0xFFFF); @@ -3384,7 +3389,7 @@ if ((modItemType & 0xFFFF) == MODITEM_DLSBANK_FOLDER) { UINT nBank = modItemID; - if ((nBank < MAX_DLS_BANKS) && (CTrackApp::gpDLSBanks[nBank])) + if ((nBank < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[nBank])) { CSoundBankProperties dlg(CTrackApp::gpDLSBanks[nBank], this); dlg.DoModal(); Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2013-01-13 16:44:46 UTC (rev 1487) +++ trunk/OpenMPT/mptrack/View_tre.h 2013-01-13 18:15:37 UTC (rev 1488) @@ -127,9 +127,9 @@ HTREEITEM m_hItemDrag, m_hItemDrop; HTREEITEM m_hInsLib, m_hMidiLib; HTREEITEM m_tiMidiGrp[17]; - HTREEITEM m_tiDLS[MAX_DLS_BANKS]; HTREEITEM m_tiMidi[128]; HTREEITEM m_tiPerc[128]; + vector<HTREEITEM> m_tiDLS; vector<ModTreeDocInfo *> DocInfo; CHAR m_szInstrLibPath[_MAX_PATH], m_szOldPath[_MAX_PATH], m_szSongName[_MAX_PATH]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-01-17 00:59:35
|
Revision: 1489 http://sourceforge.net/p/modplug/code/1489 Author: saga-games Date: 2013-01-17 00:59:24 +0000 (Thu, 17 Jan 2013) Log Message: ----------- [Fix] Inserting samples did not clear previous sample names since some time ago. [Imp] Pattern Editor: Find/Replace now creates only one internal undo point per pattern. Having one undo point per cell can quickly reach the undo buffer limit, which slows down the program quite a bit (http://bugs.openmpt.org/view.php?id=334). [Mod] OpenMPT: Version is now 1.21.01.06 Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2013-01-13 18:15:37 UTC (rev 1488) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2013-01-17 00:59:24 UTC (rev 1489) @@ -643,8 +643,9 @@ ErrorBox(IDS_ERR_TOOMANYSMP, CMainFrame::GetMainFrame()); return SAMPLEINDEX_INVALID; } - if (!m_SndFile.m_szNames[i][0]) strcpy(m_SndFile.m_szNames[i], "untitled"); - if (i > m_SndFile.GetNumSamples()) m_SndFile.m_nSamples = i; + const bool newSlot = (i > m_SndFile.GetNumSamples()); + if(newSlot || !m_SndFile.m_szNames[i][0]) strcpy(m_SndFile.m_szNames[i], "untitled"); + if(newSlot) m_SndFile.m_nSamples = i; m_SndFile.GetSample(i).Initialize(m_SndFile.GetType()); SetModified(); return i; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2013-01-13 18:15:37 UTC (rev 1488) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2013-01-17 00:59:24 UTC (rev 1489) @@ -2062,7 +2062,7 @@ PATTERNINDEX nPatStart = m_nPattern; PATTERNINDEX nPatEnd = m_nPattern + 1; - if (m_findReplace.dwFindFlags & PATSEARCH_FULLSEARCH) + if(m_findReplace.dwFindFlags & PATSEARCH_FULLSEARCH) { nPatStart = 0; nPatEnd = pSndFile->Patterns.Size(); @@ -2072,14 +2072,14 @@ nPatEnd = nPatStart + 1; } - if (m_bContinueSearch) + if(m_bContinueSearch) { nPatStart = m_nPattern; } // Do we search for an extended effect? bool isExtendedEffect = false; - if (m_findReplace.dwFindFlags & PATSEARCH_COMMAND) + if(m_findReplace.dwFindFlags & PATSEARCH_COMMAND) { UINT fxndx = effectInfo.GetIndexFromEffect(m_findReplace.cmdFind.command, m_findReplace.cmdFind.param); isExtendedEffect = effectInfo.IsExtendedEffect(fxndx); @@ -2126,7 +2126,10 @@ } } - for(; row < pSndFile->Patterns[pat].GetNumRows(); row++) + bool firstInPat = true; + const ROWINDEX numRows = pSndFile->Patterns[pat].GetNumRows(); + + for(; row < numRows; row++) { ModCommand *m = pSndFile->Patterns[pat].GetpModCommand(row, chn); @@ -2251,28 +2254,38 @@ } if(replace) { - // Just create one logic undo step when auto-replacing all occurences. - const bool linkUndoBuffer = (nFound > 1) && (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) != 0; - GetDocument()->GetPatternUndo().PrepareUndo(pat, chn, row, 1, 1, linkUndoBuffer); + if((m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL)) + { + // Just create one logic undo step per pattern when auto-replacing all occurences. + if(firstInPat) + { + GetDocument()->GetPatternUndo().PrepareUndo(pat, firstChannel, row, lastChannel - firstChannel + 1, numRows - row + 1, (nFound > 1)); + firstInPat = false; + } + } else + { + // Create separately undo-able items when replacing manually. + GetDocument()->GetPatternUndo().PrepareUndo(pat, chn, row, 1, 1); + } if ((m_findReplace.dwReplaceFlags & PATSEARCH_NOTE)) { if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNoteMinusOctave) { // -1 octave - if (m->note > (12 + NOTE_MIN - 1) && m->note <= NOTE_MAX) m->note -= 12; + if(m->note > (12 + NOTE_MIN - 1) && m->note <= NOTE_MAX) m->note -= 12; } else if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNotePlusOctave) { // +1 octave - if (m->note <= NOTE_MAX - 12 && m->note >= NOTE_MIN) m->note += 12; + if(m->note <= NOTE_MAX - 12 && m->note >= NOTE_MIN) m->note += 12; } else if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNoteMinusOne) { // Note-- - if (m->note > NOTE_MIN && m->note <= NOTE_MAX) m->note--; + if(m->note > NOTE_MIN && m->note <= NOTE_MAX) m->note--; } else if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNotePlusOne) { // Note++ - if (m->note < NOTE_MAX && m->note >= NOTE_MIN) m->note++; + if(m->note < NOTE_MAX && m->note >= NOTE_MIN) m->note++; } else { // Replace with another note @@ -3800,7 +3813,7 @@ ModCommandPos editpos = GetEditPos(*pSndFile, liveRecord); ModCommand &m = GetModCommand(*pSndFile, editpos); pModDoc->GetPatternUndo().PrepareUndo(editpos.nPat, editpos.nChn, editpos.nRow, 1, 1); - m.Set(NOTE_PCS, mappedIndex, static_cast<uint16>(paramIndex), static_cast<uint16>((paramValue * ModCommand::maxColumnValue)/127)); + m.Set(NOTE_PCS, mappedIndex, static_cast<uint16>(paramIndex), static_cast<uint16>((paramValue * ModCommand::maxColumnValue) / 127)); if(!liveRecord) InvalidateRow(editpos.nRow); pMainFrm->ThreadSafeSetModified(pModDoc); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2013-01-13 18:15:37 UTC (rev 1488) +++ trunk/OpenMPT/mptrack/version.h 2013-01-17 00:59:24 UTC (rev 1489) @@ -19,7 +19,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 21 #define VER_MINOR 01 -#define VER_MINORMINOR 05 +#define VER_MINORMINOR 06 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-01-18 21:29:08
|
Revision: 1495 http://sourceforge.net/p/modplug/code/1495 Author: saga-games Date: 2013-01-18 21:28:59 +0000 (Fri, 18 Jan 2013) Log Message: ----------- [Var] Updated and fixes test cases [Ref] Unified channel reallocation in pattern undo (no functional change). Modified Paths: -------------- trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/test/test.cpp Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2013-01-18 21:22:13 UTC (rev 1494) +++ trunk/OpenMPT/mptrack/Undo.cpp 2013-01-18 21:28:59 UTC (rev 1495) @@ -140,24 +140,16 @@ if(pUndo->channelInfo != nullptr) { - if(pUndo->channelInfo->oldNumChannels > pSndFile->GetNumChannels()) + if(pUndo->channelInfo->oldNumChannels != pSndFile->GetNumChannels()) { - // First add some channels again... + // Add or remove channels vector<CHANNELINDEX> channels(pUndo->channelInfo->oldNumChannels, CHANNELINDEX_INVALID); - for(CHANNELINDEX i = 0; i < pSndFile->GetNumChannels(); i++) + const CHANNELINDEX copyCount = Util::Min(pSndFile->GetNumChannels(), pUndo->channelInfo->oldNumChannels); + for(CHANNELINDEX i = 0; i < copyCount; i++) { channels[i] = i; } m_pModDoc->ReArrangeChannels(channels, false); - } else if(pUndo->channelInfo->oldNumChannels < pSndFile->GetNumChannels()) - { - // ... or remove newly added channels - vector<CHANNELINDEX> channels(pUndo->channelInfo->oldNumChannels); - for(CHANNELINDEX i = 0; i < pUndo->channelInfo->oldNumChannels; i++) - { - channels[i] = i; - } - m_pModDoc->ReArrangeChannels(channels, false); } memcpy(pSndFile->ChnSettings, pUndo->channelInfo->settings, sizeof(ModChannelSettings) * pUndo->channelInfo->oldNumChannels); Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2013-01-18 21:22:13 UTC (rev 1494) +++ trunk/OpenMPT/mptrack/test/test.cpp 2013-01-18 21:28:59 UTC (rev 1495) @@ -502,7 +502,6 @@ VERIFY_EQUAL_NONCONT(plug.fDryRatio, 0.26f); VERIFY_EQUAL_NONCONT(plug.IsMasterEffect(), true); VERIFY_EQUAL_NONCONT(plug.GetGain(), 11); - } @@ -760,8 +759,8 @@ // Check if our test file was loaded correctly. -void TestLoadS3MFile(const CModDoc *pModDoc) -//------------------------------------------ +void TestLoadS3MFile(const CModDoc *pModDoc, bool resaved) +//-------------------------------------------------------- { const CSoundFile *pSndFile = pModDoc->GetSoundFile(); @@ -775,7 +774,7 @@ VERIFY_EQUAL_NONCONT((pSndFile->m_SongFlags & SONG_FILE_FLAGS), SONG_FASTVOLSLIDES); VERIFY_EQUAL_NONCONT(pSndFile->m_nMixLevels, mixLevels_compatible); VERIFY_EQUAL_NONCONT(pSndFile->m_nTempoMode, tempo_mode_classic); - VERIFY_EQUAL_NONCONT(pSndFile->m_dwLastSavedWithVersion, MAKE_VERSION_NUMERIC(1, 20, 00, 00)); + VERIFY_EQUAL_NONCONT(pSndFile->m_dwLastSavedWithVersion, resaved ? (MptVersion::num & 0xFFFF0000) : MAKE_VERSION_NUMERIC(1, 20, 00, 00)); VERIFY_EQUAL_NONCONT(pSndFile->m_nRestartPos, 0); // Channels @@ -918,6 +917,14 @@ CModDoc *pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "xm", FALSE); TestLoadXMFile(pModDoc); + // In OpenMPT 1.20 (up to revision 1459), there was a bug in the XM saver + // that would create broken XMs if the sample map contained samples that + // were only referenced below C-1 or above B-8 (such samples should not + // be written). Let's insert a sample there and check if re-loading the + // file still works. + pModDoc->GetSoundFile()->m_nSamples++; + pModDoc->GetSoundFile()->Instruments[1]->Keyboard[110] = pModDoc->GetSoundFile()->GetNumSamples(); + // Test file saving pModDoc->DoSave(theFile + "saved.xm"); pModDoc->OnCloseDocument(); @@ -934,7 +941,7 @@ // Test S3M file loading { CModDoc *pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "s3m", FALSE); - TestLoadS3MFile(pModDoc); + TestLoadS3MFile(pModDoc, false); // Test file saving pModDoc->DoSave(theFile + "saved.s3m"); @@ -945,7 +952,7 @@ // Reload the saved file and test if everything is still working correctly. pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "saved.s3m", FALSE); - TestLoadS3MFile(pModDoc); + TestLoadS3MFile(pModDoc, true); pModDoc->OnCloseDocument(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-01-22 15:01:36
|
Revision: 1506 http://sourceforge.net/p/modplug/code/1506 Author: saga-games Date: 2013-01-22 15:01:28 +0000 (Tue, 22 Jan 2013) Log Message: ----------- [Imp] Mouse wheel can be used in Sample Map (http://bugs.openmpt.org/view.php?id=345). Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-01-21 21:41:04 UTC (rev 1505) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-01-22 15:01:28 UTC (rev 1506) @@ -36,6 +36,7 @@ ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() + ON_WM_MOUSEWHEEL() ON_COMMAND(ID_NOTEMAP_TRANS_UP, OnMapTransposeUp) ON_COMMAND(ID_NOTEMAP_TRANS_DOWN, OnMapTransposeDown) ON_COMMAND(ID_NOTEMAP_COPY_NOTE, OnMapCopyNote) @@ -375,6 +376,14 @@ } +BOOL CNoteMapWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) +//------------------------------------------------------------------ +{ + SetCurrentNote(m_nNote - sgn(zDelta)); + return CStatic::OnMouseWheel(nFlags, zDelta, pt); +} + + void CNoteMapWnd::OnMapCopyNote() //------------------------------- { Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2013-01-21 21:41:04 UTC (rev 1505) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2013-01-22 15:01:28 UTC (rev 1506) @@ -65,6 +65,7 @@ afx_msg void OnLButtonUp(UINT, CPoint); afx_msg void OnRButtonDown(UINT, CPoint); afx_msg void OnLButtonDblClk(UINT, CPoint); + afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); afx_msg void OnSetFocus(CWnd *pOldWnd); afx_msg void OnKillFocus(CWnd *pNewWnd); afx_msg BOOL OnEraseBkGnd(CDC *) { return TRUE; } @@ -77,7 +78,7 @@ afx_msg void OnEditSample(UINT nID); afx_msg void OnEditSampleMap(); afx_msg void OnInstrumentDuplicate(); - afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys + afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys //}}AFX_MSG DECLARE_MESSAGE_MAP() }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-01-30 21:49:27
|
Revision: 1510 http://sourceforge.net/p/modplug/code/1510 Author: saga-games Date: 2013-01-30 21:49:18 +0000 (Wed, 30 Jan 2013) Log Message: ----------- [Imp] Instrument Editor: Also allow to click the sample map using the middle mouse button (http://bugs.openmpt.org/view.php?id=345#c1084) Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-01-30 16:58:33 UTC (rev 1509) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-01-30 21:49:18 UTC (rev 1510) @@ -34,6 +34,7 @@ ON_WM_SETFOCUS() ON_WM_KILLFOCUS() ON_WM_LBUTTONDOWN() + ON_WM_MBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() ON_WM_MOUSEWHEEL() Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2013-01-30 16:58:33 UTC (rev 1509) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2013-01-30 21:49:18 UTC (rev 1510) @@ -62,6 +62,7 @@ protected: //{{AFX_MSG(CNoteMapWnd) afx_msg void OnLButtonDown(UINT, CPoint); + afx_msg void OnMButtonDown(UINT flags, CPoint pt) { OnLButtonDown(flags, pt); } afx_msg void OnLButtonUp(UINT, CPoint); afx_msg void OnRButtonDown(UINT, CPoint); afx_msg void OnLButtonDblClk(UINT, CPoint); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-01-30 16:58:33 UTC (rev 1509) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-01-30 21:49:18 UTC (rev 1510) @@ -232,7 +232,6 @@ m_szInfoText[0] = 0; m_szXInfoText[0]= 0; //rewbs.xinfo - m_dTotalCPU=0; MemsetZero(gpenVuMeter); // Create Audio Critical Section Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-01-30 16:58:33 UTC (rev 1509) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-01-30 21:49:18 UTC (rev 1510) @@ -446,14 +446,14 @@ CModDoc *m_pModPlaying; CSoundFile *m_pSndFile; HWND m_hFollowSong, m_hWndMidi; - DWORD m_dwStatus, m_dwElapsedTime, m_dwTimeSec, m_dwNotifyType; - UINT m_nTimer, m_nAvgMixChn, m_nMixChn; + DWORD m_dwStatus, m_dwTimeSec, m_dwNotifyType; + UINT_PTR m_nTimer; + UINT m_nAvgMixChn, m_nMixChn; CHAR m_szUserText[512], m_szInfoText[512], m_szXInfoText[512]; //rewbs.xinfo // Notification Buffer MPTNOTIFICATION NotifyBuffer[MAX_UPDATE_HISTORY]; // Misc bool m_bOptionsLocked; //rewbs.customKeys - double m_dTotalCPU; CModDoc* m_pJustModifiedDoc; public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-02-07 00:40:08
|
Revision: 1515 http://sourceforge.net/p/modplug/code/1515 Author: saga-games Date: 2013-02-07 00:39:58 +0000 (Thu, 07 Feb 2013) Log Message: ----------- [Fix] VST: Preset menu is now cleared correctly if plugin requests GUI update. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.h trunk/OpenMPT/mptrack/Vstplug.cpp Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-02-04 16:31:55 UTC (rev 1514) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-02-07 00:39:58 UTC (rev 1515) @@ -153,13 +153,13 @@ } -void CAbstractVstEditor::SetupMenu() +void CAbstractVstEditor::SetupMenu(bool force) //---------------------------------- { //TODO: create menus on click so they are only updated when required if (m_pVstPlugin) { - UpdatePresetMenu(); + UpdatePresetMenu(force); UpdateInputMenu(); UpdateOutputMenu(); UpdateMacroMenu(); @@ -381,8 +381,8 @@ } -void CAbstractVstEditor::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hMenu) -//--------------------------------------------------------------------------- +void CAbstractVstEditor::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU) +//--------------------------------------------------------------------- { if((nFlags & MF_POPUP) && nItemID == 1) { @@ -457,15 +457,15 @@ } -void CAbstractVstEditor::UpdatePresetMenu() -//----------------------------------------- +void CAbstractVstEditor::UpdatePresetMenu(bool force) +//--------------------------------------------------- { const VstInt32 numProgs = m_pVstPlugin->GetNumPrograms(); const VstInt32 curProg = m_pVstPlugin->GetCurrentProgram(); if(m_pPresetMenu->m_hMenu) // We rebuild menu from scratch { // So remove any exiting menus... - if(curProg == m_nCurProg) // ... unless menu exists and is accurate, + if(curProg == m_nCurProg && !force) // ... unless menu exists and is accurate, return; // in which case we are done. for(size_t i = 0; i < m_pPresetMenuGroup.size(); i++) Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.h 2013-02-04 16:31:55 UTC (rev 1514) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.h 2013-02-07 00:39:58 UTC (rev 1515) @@ -26,7 +26,7 @@ int m_nCurProg; CAbstractVstEditor(CVstPlugin *pPlugin); virtual ~CAbstractVstEditor(); - void SetupMenu(); + void SetupMenu(bool force = false); void SetTitle(); void SetLearnMacro(int inMacro); int GetLearnMacro(); @@ -72,7 +72,7 @@ CMenu *m_pOptionsMenu; void FillPresetMenu(); - void UpdatePresetMenu(); + void UpdatePresetMenu(bool force = false); void UpdateInputMenu(); void UpdateOutputMenu(); void UpdateMacroMenu(); Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-02-04 16:31:55 UTC (rev 1514) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-02-07 00:39:58 UTC (rev 1515) @@ -1031,11 +1031,11 @@ case audioMasterUpdateDisplay: if (pVstPlugin != nullptr) { - // Note to self for testing: Electri-Q sends opcode. + // Note to self for testing: Electri-Q sends opcode. Korg M1 sends this when switchin between Combi and Multi mode to update the preset names. CAbstractVstEditor *pVstEditor = pVstPlugin->GetEditor(); if (pVstEditor && ::IsWindow(pVstEditor->m_hWnd)) { - pVstEditor->SetupMenu(); + pVstEditor->SetupMenu(true); } } return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-02-15 17:54:21
|
Revision: 1530 http://sourceforge.net/p/modplug/code/1530 Author: saga-games Date: 2013-02-15 17:54:10 +0000 (Fri, 15 Feb 2013) Log Message: ----------- [Ref] Resource cleanup and stuff. Modified Paths: -------------- trunk/OpenMPT/mptrack/VSTEditor.cpp trunk/OpenMPT/mptrack/VstPresets.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/VSTEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/VSTEditor.cpp 2013-02-15 17:25:30 UTC (rev 1529) +++ trunk/OpenMPT/mptrack/VSTEditor.cpp 2013-02-15 17:54:10 UTC (rev 1530) @@ -37,12 +37,10 @@ if(m_pVstPlugin) { // Set editor window size - ERect *pRect; - - pRect = NULL; - m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, (LPRECT)&pRect, 0); - m_pVstPlugin->Dispatch(effEditOpen, 0, 0, (void *)m_hWnd, 0); - m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, (LPRECT)&pRect, 0); + ERect *pRect = nullptr; + m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, &pRect, 0); + m_pVstPlugin->Dispatch(effEditOpen, 0, 0, m_hWnd, 0); + m_pVstPlugin->Dispatch(effEditGetRect, 0, 0, &pRect, 0); if((pRect) && (pRect->right > pRect->left) && (pRect->bottom > pRect->top)) { // Plugin provided valid window size. Modified: trunk/OpenMPT/mptrack/VstPresets.cpp =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.cpp 2013-02-15 17:25:30 UTC (rev 1529) +++ trunk/OpenMPT/mptrack/VstPresets.cpp 2013-02-15 17:54:10 UTC (rev 1530) @@ -140,7 +140,7 @@ header.fxVersion = plugin.GetVersion(); // Write unfinished header... We need to update the size once we're done writing. - fwrite(&header, sizeof(header), 1, f); + Write(header, f); uint32 numProgs = plugin.GetNumPrograms(), curProg = plugin.GetCurrentProgram(); WriteBE(numProgs, f); @@ -173,7 +173,7 @@ header.byteSize = end - 8; header.ConvertEndianness(); fseek(f, 0, SEEK_SET); - fwrite(&header, sizeof(header), 1, f); + Write(header, f); } fclose(f); @@ -194,7 +194,7 @@ // Write unfinished header... We need to update the size once we're done writing. off_t start = ftell(f); - fwrite(&header, sizeof(header), 1, f); + Write(header, f); const uint32 numParams = plugin.GetNumParameters(); WriteBE(numParams, f); @@ -225,7 +225,7 @@ header.byteSize = end - start - 8; header.ConvertEndianness(); fseek(f, start, SEEK_SET); - fwrite(&header, sizeof(header), 1, f); + Write(header, f); fseek(f, end, SEEK_SET); } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-02-15 17:25:30 UTC (rev 1529) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-02-15 17:54:10 UTC (rev 1530) @@ -196,7 +196,7 @@ END IDD_CLOSEDOCUMENTS DIALOGEX 0, 0, 370, 197 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Save modified files" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN @@ -1444,7 +1444,7 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CLIENTEDGE CAPTION "Editor" -MENU IDR_PLUGINMENU +MENU IDR_VSTMENU FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN END @@ -2756,8 +2756,8 @@ BEGIN POPUP "&File" BEGIN - MENUITEM "&Load Preset...", ID_PRESET_LOAD - MENUITEM "&Save Preset As...", ID_PRESET_SAVE + MENUITEM "&Load Preset / Bank...", ID_PRESET_LOAD + MENUITEM "&Save Preset / Bank...", ID_PRESET_SAVE MENUITEM "Create instrument from plugin", ID_PLUGINTOINSTRUMENT MENUITEM SEPARATOR MENUITEM "&Randomize Parameters", ID_PRESET_RANDOM @@ -2775,20 +2775,7 @@ END END -IDR_PLUGINMENU MENU -BEGIN - POPUP "File" - BEGIN - MENUITEM "Open", ID_FILE_OPENPRESET - MENUITEM "Save", ID_FILE_SAVEPRESET - END - POPUP "Factory preset" - BEGIN - MENUITEM SEPARATOR - END -END - ///////////////////////////////////////////////////////////////////////////// // // Dialog Info Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2013-02-15 17:25:30 UTC (rev 1529) +++ trunk/OpenMPT/mptrack/resource.h 2013-02-15 17:54:10 UTC (rev 1530) @@ -119,7 +119,6 @@ #define IDD_DEFAULTPLUGINEDITOR 438 #define IDD_CHANNELMANAGER 440 #define IDD_SOUNDBANK_INFO1 441 -#define IDR_PLUGINMENU 442 #define IDD_PITCHSHIFT 442 #define IDD_OPTIONS_AUTOSAVE 443 #define IDD_EDIT_GOTO 444 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2013-02-17 15:06:04
|
Revision: 1534 http://sourceforge.net/p/modplug/code/1534 Author: saga-games Date: 2013-02-17 15:05:54 +0000 (Sun, 17 Feb 2013) Log Message: ----------- [New] VST Editor: Can now copy & paste current preset. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/AbstractVstEditor.h trunk/OpenMPT/mptrack/VstPresets.cpp trunk/OpenMPT/mptrack/VstPresets.h trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2013-02-17 15:05:54 UTC (rev 1534) @@ -18,13 +18,18 @@ #include "AbstractVstEditor.h" #include "../common/StringFixer.h" #include "MIDIMacros.h" +#include "VstPresets.h" #ifndef NO_VST +UINT CAbstractVstEditor::clipboardFormat = RegisterClipboardFormat("VST Preset Data"); + BEGIN_MESSAGE_MAP(CAbstractVstEditor, CDialog) ON_WM_CLOSE() ON_WM_INITMENU() ON_WM_MENUSELECT() + ON_COMMAND(ID_EDIT_COPY, OnCopyParameters) + ON_COMMAND(ID_EDIT_PASTE, OnPasteParameters) ON_COMMAND(ID_PRESET_LOAD, OnLoadPreset) ON_COMMAND(ID_PLUG_BYPASS, OnBypassPlug) ON_COMMAND(ID_PLUG_RECORDAUTOMATION,OnRecordAutomation) @@ -147,9 +152,72 @@ } -void CAbstractVstEditor::OnRandomizePreset() +void CAbstractVstEditor::OnCopyParameters() //----------------------------------------- { + if(m_pVstPlugin == nullptr || CMainFrame::GetMainFrame() == nullptr) return; + + BeginWaitCursor(); + std::ostringstream f; + if(VSTPresets::SaveFile(f, *m_pVstPlugin, false)) + { + const std::string data = f.str(); + + HGLOBAL hCpy; + if(CMainFrame::GetMainFrame()->OpenClipboard() && (hCpy = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, data.length())) != nullptr) + { + EmptyClipboard(); + LPSTR p = (LPSTR)GlobalLock(hCpy); + if(p) + { + memcpy(p, &data[0], data.length()); + } + GlobalUnlock(hCpy); + SetClipboardData(clipboardFormat, (HANDLE) hCpy); + CloseClipboard(); + } + } + EndWaitCursor(); +} + + +void CAbstractVstEditor::OnPasteParameters() +//------------------------------------------ +{ + if(m_pVstPlugin == nullptr || CMainFrame::GetMainFrame() == nullptr) return; + + BeginWaitCursor(); + if (CMainFrame::GetMainFrame()->OpenClipboard()) + { + HGLOBAL hCpy = ::GetClipboardData(clipboardFormat); + const char *p; + + if(hCpy != nullptr && (p = static_cast<const char *>(GlobalLock(hCpy))) != nullptr) + { + FileReader file(p, GlobalSize(hCpy)); + if(VSTPresets::LoadFile(file, *m_pVstPlugin) == VSTPresets::noError) + { + CSoundFile *pSndFile = m_pVstPlugin->m_pSndFile; + CModDoc *pModDoc; + if(pSndFile != nullptr && pSndFile->GetModSpecifications().supportsPlugins && (pModDoc = pSndFile->GetpModDoc()) != nullptr) + { + pModDoc->SetModified(); + } + } else + { + Reporting::Error("Error loading preset from clipboard. Are you sure it is for this plugin?"); + } + GlobalUnlock(hCpy); + } + CloseClipboard(); + } + EndWaitCursor(); +} + + +VOID CAbstractVstEditor::OnRandomizePreset() +//----------------------------------------- +{ if(m_pVstPlugin && Reporting::Confirm("Are you sure you want to randomize parameters?\nYou will lose current parameter values.", false, false, this) == cnfYes) { m_pVstPlugin->RandomizeParams(); Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.h =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.h 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.h 2013-02-17 15:05:54 UTC (rev 1534) @@ -36,6 +36,8 @@ afx_msg void OnLoadPreset(); afx_msg void OnSavePreset(); + afx_msg void OnCopyParameters(); + afx_msg void OnPasteParameters(); afx_msg void OnRandomizePreset(); afx_msg void OnSetPreset(UINT nID); afx_msg void OnBypassPlug(); @@ -70,6 +72,7 @@ CMenu *m_pOutputMenu; CMenu *m_pMacroMenu; CMenu *m_pOptionsMenu; + static UINT clipboardFormat; void FillPresetMenu(); void UpdatePresetMenu(bool force = false); Modified: trunk/OpenMPT/mptrack/VstPresets.cpp =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.cpp 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/VstPresets.cpp 2013-02-17 15:05:54 UTC (rev 1534) @@ -117,15 +117,9 @@ } -bool VSTPresets::SaveFile(const char *filename, CVstPlugin &plugin, bool bank) -//---------------------------------------------------------------------------- +bool VSTPresets::SaveFile(std::ostream &f, CVstPlugin &plugin, bool bank) +//----------------------------------------------------------------------- { - FILE *f = fopen(filename, "wb"); - if(f == nullptr) - { - return false; - } - if(!bank) { SaveProgram(f, plugin); @@ -151,12 +145,12 @@ if(writeChunk) { - void *chunk = nullptr; + char *chunk = nullptr; uint32 chunkSize = plugin.Dispatch(effGetChunk, 0, 0, &chunk, 0); if(chunkSize && chunk) { WriteBE(chunkSize, f); - fwrite(chunk, chunkSize, 1, f); + f.write(chunk, chunkSize); } } else { @@ -169,20 +163,19 @@ } // Now we know the correct chunk size. - off_t end = ftell(f); - header.byteSize = end - 8; + std::streamoff end = f.tellp(); + header.byteSize = static_cast<VstInt32>(end - 8); header.ConvertEndianness(); - fseek(f, 0, SEEK_SET); + f.seekp(0); Write(header, f); } - fclose(f); return true; } -void VSTPresets::SaveProgram(FILE *f, CVstPlugin &plugin) -//------------------------------------------------------- +void VSTPresets::SaveProgram(std::ostream &f, CVstPlugin &plugin) +//--------------------------------------------------------------- { const bool writeChunk = plugin.ProgramsAreChunks(); ChunkHeader header; @@ -193,7 +186,7 @@ header.fxVersion = plugin.GetVersion(); // Write unfinished header... We need to update the size once we're done writing. - off_t start = ftell(f); + std::streamoff start = f.tellp(); Write(header, f); const uint32 numParams = plugin.GetNumParameters(); @@ -201,16 +194,16 @@ char name[max(kVstMaxProgNameLen + 1, 256)]; plugin.Dispatch(effGetProgramName, 0, 0, name, 0); - fwrite(name, 28, 1, f); + f.write(name, 28); if(writeChunk) { - void *chunk = nullptr; + char *chunk = nullptr; uint32 chunkSize = plugin.Dispatch(effGetChunk, 1, 0, &chunk, 0); if(chunkSize && chunk) { WriteBE(chunkSize, f); - fwrite(chunk, chunkSize, 1, f); + f.write(chunk, chunkSize); } } else { @@ -221,25 +214,25 @@ } // Now we know the correct chunk size. - off_t end = ftell(f); - header.byteSize = end - start - 8; + std::streamoff end = f.tellp(); + header.byteSize = static_cast<VstInt32>(end - start - 8); header.ConvertEndianness(); - fseek(f, start, SEEK_SET); + f.seekp(start); Write(header, f); - fseek(f, end, SEEK_SET); + f.seekp(end); } -void VSTPresets::WriteBE(uint32 v, FILE *f) -//----------------------------------------- +void VSTPresets::WriteBE(uint32 v, std::ostream &f) +//------------------------------------------------- { SwapBytesBE(v); Write(v, f); } -void VSTPresets::WriteBE(float v, FILE *f) -//---------------------------------------- +void VSTPresets::WriteBE(float v, std::ostream &f) +//------------------------------------------------ { union { Modified: trunk/OpenMPT/mptrack/VstPresets.h =================================================================== --- trunk/OpenMPT/mptrack/VstPresets.h 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/VstPresets.h 2013-02-17 15:05:54 UTC (rev 1534) @@ -10,6 +10,8 @@ #pragma once +#include <ostream> + class VSTPresets { public: @@ -24,22 +26,22 @@ #ifndef NO_VST static ErrorCode LoadFile(FileReader &file, CVstPlugin &plugin); - static bool SaveFile(const char *filename, CVstPlugin &plugin, bool bank); + static bool SaveFile(std::ostream &, CVstPlugin &plugin, bool bank); protected: - static void SaveProgram(FILE *f, CVstPlugin &plugin); + static void SaveProgram(std::ostream &f, CVstPlugin &plugin); template<typename T> - static void Write(const T &v, FILE *f) + static void Write(const T &v, std::ostream &f) { - fwrite(&v, sizeof(T), 1, f); + f.write(reinterpret_cast<const char *>(&v), sizeof(T)); } - static void WriteBE(uint32 v, FILE *f); - static void WriteBE(float v, FILE *f); + static void WriteBE(uint32 v, std::ostream &f); + static void WriteBE(float v, std::ostream &f); #else static ErrorCode LoadFile(FileReader &, CVstPlugin &) { return invalidFile; } - static bool SaveFile(const char *, CVstPlugin &, bool) { return false; } + static bool SaveFile(std::ostream &, CVstPlugin &, bool) { return false; } #endif // NO_VST }; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-02-17 15:05:54 UTC (rev 1534) @@ -1658,7 +1658,10 @@ { char ext[_MAX_EXT]; _splitpath(filename, nullptr, nullptr, nullptr, ext); - return VSTPresets::SaveFile(filename, *this, !_strnicmp(ext, ".fxb", 4)); + + std::fstream f; + f.open(filename, std::ios::out | std::ios::trunc | std::ios::binary); + return f.good() && VSTPresets::SaveFile(f, *this, !_strnicmp(ext, ".fxb", 4)); } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-02-17 15:05:54 UTC (rev 1534) @@ -2756,9 +2756,11 @@ BEGIN POPUP "&File" BEGIN + MENUITEM "&Copy Parameters", ID_EDIT_COPY + MENUITEM "&Paste Parameters", ID_EDIT_PASTE MENUITEM "&Load Preset / Bank...", ID_PRESET_LOAD MENUITEM "&Save Preset / Bank...", ID_PRESET_SAVE - MENUITEM "Create instrument from plugin", ID_PLUGINTOINSTRUMENT + MENUITEM "&Create instrument from plugin", ID_PLUGINTOINSTRUMENT MENUITEM SEPARATOR MENUITEM "&Randomize Parameters", ID_PRESET_RANDOM END Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2013-02-16 20:11:58 UTC (rev 1533) +++ trunk/OpenMPT/mptrack/resource.h 2013-02-17 15:05:54 UTC (rev 1534) @@ -1083,10 +1083,6 @@ #define ID_REARRANGE_SAMPLES 33901 #define ID_CHANNEL_MANAGER 33905 #define ID_NEW_ITPROJECT 33906 -#define ID_FILE_OPEN32908 33908 -#define ID_FILE_SAVE32909 33909 -#define ID_FILE_SAVEPRESET 33912 -#define ID_FILE_OPENPRESET 33913 #define ID_FACTORYPRESET 33914 #define ID_FACTORYPRESET_DEFAULT 33915 #define ID_MODTREE_SETPATH 33916 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |