From: <sag...@us...> - 2011-07-28 14:56:22
|
Revision: 930 http://modplug.svn.sourceforge.net/modplug/?rev=930&view=rev Author: saga-games Date: 2011-07-28 14:56:16 +0000 (Thu, 28 Jul 2011) Log Message: ----------- [Mod] Modern/Alternative tempo mode is not shown for XM/IT files anymore by default. [Fix] Mod Conversion: Sample panning is now properly reset / disabled for MOD/S3M/XM files. [Imp] Undo point is now also created when renaming a channel from the pattern view. [Ref] Small refactoring here and there Modified Paths: -------------- trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -174,18 +174,18 @@ // This is used for -> MOD/XM conversion vector<vector<MODCOMMAND::PARAM> > cEffectMemory; - cEffectMemory.resize(m_SndFile.GetNumChannels()); - for(size_t i = 0; i < m_SndFile.GetNumChannels(); i++) + cEffectMemory.resize(GetNumChannels()); + for(size_t i = 0; i < GetNumChannels(); i++) { cEffectMemory[i].resize(MAX_EFFECTS, 0); } bool addBreak = false; // When converting to XM, avoid the E60 bug. - CHANNELINDEX nChannel = m_SndFile.m_nChannels - 1; + CHANNELINDEX nChannel = GetNumChannels() - 1; for (UINT len = m_SndFile.Patterns[nPat].GetNumRows() * m_SndFile.m_nChannels; len; m++, len--) { - nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1 + nChannel = (nChannel + 1) % GetNumChannels(); // 0...Channels - 1 m_SndFile.ConvertCommand(m, nOldType, nNewType); @@ -301,11 +301,10 @@ m_SndFile.Samples[nSmp].nFineTune = 0; } - // Frequency to Transpose, panning (S3M/IT/MPT to MOD/XM) + // Frequency to Transpose (S3M/IT/MPT to MOD/XM) if(oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) { CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]); - if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128; // No relative note for MOD files // TODO: Pattern notes could be transposed based on the previous relative tone? if(newTypeIsMOD && m_SndFile.Samples[nSmp].RelativeTone != 0) @@ -315,6 +314,21 @@ } } + // All XM samples have default panning + if(newTypeIsXM) + { + if(!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) + { + m_SndFile.Samples[nSmp].uFlags |= CHN_PANNING; + m_SndFile.Samples[nSmp].nPan = 128; + } + } + // S3M / MOD samples don't have panning. + if(newTypeIsMOD || newTypeIsS3M) + { + m_SndFile.Samples[nSmp].uFlags &= ~CHN_PANNING; + } + if(oldTypeIsXM && newTypeIsIT_MPT) { // Autovibrato settings (XM to IT, where sweep 0 means "no vibrato") @@ -394,7 +408,7 @@ } // Fix channel settings (pan/vol) - for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++) + for(CHANNELINDEX nChn = 0; nChn < GetNumChannels(); nChn++) { if(newTypeIsMOD_XM || newTypeIsS3M) { @@ -405,7 +419,7 @@ CHANGEMODTYPE_WARNING(wChannelVolSurround); } } - if(newTypeIsXM && !oldTypeIsMOD_XM) + if(newTypeIsXM) { if(m_SndFile.ChnSettings[nChn].nPan != 128) { @@ -514,7 +528,7 @@ //rewbs.customKeys: update effect key commands CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler(); - if (newTypeIsMOD_XM) + if(newTypeIsMOD_XM) ih->SetXMEffects(); else ih->SetITEffects(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -156,6 +156,12 @@ return CHANNELINDEX_INVALID; } + if(m_SndFile.Patterns.Size() == 0) + { + // Nothing to do + 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; @@ -645,14 +651,17 @@ bool CModDoc::RemoveSample(SAMPLEINDEX nSmp) //------------------------------------------ { - if ((nSmp) && (nSmp <= m_SndFile.m_nSamples)) + if ((nSmp) && (nSmp <= m_SndFile.GetNumSamples())) { BEGIN_CRITICAL(); m_SndFile.DestroySample(nSmp); m_SndFile.m_szNames[nSmp][0] = 0; - while ((m_SndFile.m_nSamples > 1) - && (!m_SndFile.m_szNames[m_SndFile.m_nSamples][0]) - && (!m_SndFile.Samples[m_SndFile.m_nSamples].pSample)) m_SndFile.m_nSamples--; + while ((m_SndFile.GetNumSamples() > 1) + && (!m_SndFile.m_szNames[m_SndFile.GetNumSamples()][0]) + && (!m_SndFile.Samples[m_SndFile.GetNumSamples()].pSample)) + { + m_SndFile.m_nSamples--; + } END_CRITICAL(); SetModified(); return true; @@ -664,14 +673,14 @@ bool CModDoc::RemoveInstrument(INSTRUMENTINDEX nIns) //-------------------------------------------------- { - if ((nIns) && (nIns <= m_SndFile.m_nInstruments) && (m_SndFile.Instruments[nIns])) + if ((nIns) && (nIns <= m_SndFile.GetNumInstruments()) && (m_SndFile.Instruments[nIns])) { - BOOL bIns = FALSE; + bool instrumentsLeft = false; BEGIN_CRITICAL(); m_SndFile.DestroyInstrument(nIns); if (nIns == m_SndFile.m_nInstruments) m_SndFile.m_nInstruments--; - for (UINT i=1; i<MAX_INSTRUMENTS; i++) if (m_SndFile.Instruments[i]) bIns = TRUE; - if (!bIns) m_SndFile.m_nInstruments = 0; + for (UINT i=1; i<MAX_INSTRUMENTS; i++) if (m_SndFile.Instruments[i]) instrumentsLeft = true; + if (!instrumentsLeft) m_SndFile.m_nInstruments = 0; END_CRITICAL(); SetModified(); return true; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -766,9 +766,9 @@ if (!p) return; BeginWaitCursor(); - DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwBeginSel : m_dwEndSel; - DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwEndSel : m_dwBeginSel; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->Patterns[m_nPattern].GetNumRows()); + const DWORD startSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwBeginSel : m_dwEndSel; + const DWORD endSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwEndSel : m_dwBeginSel; + pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); int finalDest = GetRowFromCursor(startSel) + (GetRowFromCursor(endSel) - GetRowFromCursor(startSel))*2; for (int row = finalDest; row > (int)GetRowFromCursor(startSel); row -= 2) @@ -816,9 +816,9 @@ if (!p) return; BeginWaitCursor(); - DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwBeginSel : m_dwEndSel; - DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwEndSel : m_dwBeginSel; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->Patterns[m_nPattern].GetNumRows()); + const DWORD startSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwBeginSel : m_dwEndSel; + const DWORD endSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwEndSel : m_dwBeginSel; + pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); int finalDest = GetRowFromCursor(startSel) + (GetRowFromCursor(endSel) - GetRowFromCursor(startSel))/2; @@ -5613,6 +5613,9 @@ CChannelRenameDlg dlg(this, pSndFile->ChnSettings[nChn].szName, nChn + 1); if(dlg.DoModal() != IDOK || dlg.bChanged == false) return; + // Backup old name. + pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, 1, 1, false, true); + strcpy(pSndFile->ChnSettings[nChn].szName, dlg.m_sName); pModDoc->SetModified(); pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); @@ -5719,7 +5722,7 @@ for (UINT r=startRow; r<endRow+1; r++) { - p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + startChan; + p = pSndFile->Patterns[m_nPattern] + r * pSndFile->GetNumChannels() + startChan; for (UINT c = startChan; c < endChan + 1; c++, p++) { // If a note or an instr is present on the row, do the change, if required. Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -95,9 +95,14 @@ UpdateChannelCBox(); + // Don't show new tempo modes for XM/IT, unless they are currently used + const bool showNewTempoModes = (m_pSndFile->GetType() == MOD_TYPE_MPT || (m_pSndFile->m_dwSongFlags & SONG_ITPROJECT) != 0); + m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Classic"), tempo_mode_classic); - m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Alternative"), tempo_mode_alternative); - m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Modern (accurate)"), tempo_mode_modern); + if(showNewTempoModes || m_pSndFile->m_nTempoMode == tempo_mode_alternative) + m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Alternative"), tempo_mode_alternative); + if(showNewTempoModes || m_pSndFile->m_nTempoMode == tempo_mode_modern) + m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Modern (accurate)"), tempo_mode_modern); m_TempoModeBox.SetCurSel(0); for(int i = m_TempoModeBox.GetCount(); i > 0; i--) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |