From: <sag...@us...> - 2009-09-29 22:30:25
|
Revision: 382 http://modplug.svn.sourceforge.net/modplug/?rev=382&view=rev Author: saga-games Date: 2009-09-29 22:30:10 +0000 (Tue, 29 Sep 2009) Log Message: ----------- [Imp] Mod Conversion: Detect and fix patterns with Bxx effect properly when merging sequences [Fix] Pattern Editor: Entering Note Fade notes didn't work the "old style" way. [Ref] Some minor code cleanup Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/patternContainer.cpp trunk/OpenMPT/soundlib/patternContainer.h Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-29 22:30:10 UTC (rev 382) @@ -104,11 +104,22 @@ // Merge multiple sequences m_SndFile.Order.SetSequence(0); m_SndFile.Order.resize(m_SndFile.Order.GetLengthTailTrimmed()); - SEQUENCEINDEX removedSequences = 0; + SEQUENCEINDEX removedSequences = 0; // sequence count + vector <SEQUENCEINDEX> patternsFixed; // pattern fixed by other sequence already? + patternsFixed.resize(m_SndFile.Patterns.Size(), SEQUENCEINDEX_INVALID); + // Set up vector + for(ORDERINDEX nOrd = 0; nOrd < m_SndFile.Order.GetLengthTailTrimmed(); nOrd++) + { + PATTERNINDEX nPat = m_SndFile.Order[nOrd]; + if(!m_SndFile.Patterns.IsValidPat(nPat)) continue; + patternsFixed[nPat] = 0; + } + while(m_SndFile.Order.GetNumSequences() > 1) { removedSequences++; - if(m_SndFile.Order.GetLengthTailTrimmed() + 1 + m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed() > m_SndFile.GetModSpecifications(nNewType).ordersMax) + const ORDERINDEX nFirstOrder = m_SndFile.Order.GetLengthTailTrimmed() + 1; // +1 for separator item + if(nFirstOrder + m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed() > m_SndFile.GetModSpecifications(nNewType).ordersMax) { wsprintf(s, "WARNING: Cannot merge Sequence %d (too long!)\n", removedSequences); AddToLog(s); @@ -118,7 +129,43 @@ m_SndFile.Order.Append(m_SndFile.Order.GetInvalidPatIndex()); // Separator item for(ORDERINDEX nOrd = 0; nOrd < m_SndFile.Order.GetSequence(1).GetLengthTailTrimmed(); nOrd++) { - m_SndFile.Order.Append(m_SndFile.Order.GetSequence(1)[nOrd]); + PATTERNINDEX nPat = m_SndFile.Order.GetSequence(1)[nOrd]; + m_SndFile.Order.Append(nPat); + + // Try to fix patterns (Bxx commands) + if(!m_SndFile.Patterns.IsValidPat(nPat)) continue; + + MODCOMMAND *m = m_SndFile.Patterns[nPat]; + for (UINT len = 0; len < m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels; m++, len++) + { + if(m->command == CMD_POSITIONJUMP) + { + if(patternsFixed[nPat] != SEQUENCEINDEX_INVALID && patternsFixed[nPat] != removedSequences) + { + // Oops, some other sequence uses this pattern already. + const PATTERNINDEX nNewPat = m_SndFile.Patterns.Insert(m_SndFile.PatternSize[nPat]); + if(nNewPat != SEQUENCEINDEX_INVALID) + { + // could create new pattern - copy data over and continue from here. + m_SndFile.Order[nFirstOrder + nOrd] = nNewPat; + MODCOMMAND *pSrc = m_SndFile.Patterns[nPat]; + MODCOMMAND *pDest = m_SndFile.Patterns[nNewPat]; + memcpy(pDest, pSrc, m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels * sizeof(MODCOMMAND)); + m = pDest + len; + patternsFixed.resize(max(nNewPat + 1, patternsFixed.size()), SEQUENCEINDEX_INVALID); + nPat = nNewPat; + } else + { + // cannot create new pattern: notify the user + wsprintf(s, "CONFLICT: Pattern break commands in Pattern %d might be broken since it has been used in several sequences!", nPat); + AddToLog(s); + } + } + m->param += nFirstOrder; + patternsFixed[nPat] = removedSequences; + } + } + } m_SndFile.Order.RemoveSequence(1); } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-29 22:30:10 UTC (rev 382) @@ -4180,7 +4180,7 @@ } // -- old style note cut/off: erase instrument number - if (oldStyle && ((p->note==NOTE_NOTECUT) || (p->note==NOTE_KEYOFF))) { + if (oldStyle && ((p->note == NOTE_NOTECUT) || (p->note == NOTE_KEYOFF) || (p->note == NOTE_FADE))) { p->instr=0; } Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-09-29 22:30:10 UTC (rev 382) @@ -96,7 +96,7 @@ // read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist m_nChannels = 32; - for(int i = 0; i < 32; i++) + for(CHANNELINDEX i = 0; i < 32; i++) { if(pHeader->PanMap[i] < 16) { Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-29 22:30:10 UTC (rev 382) @@ -847,7 +847,7 @@ DWORD length; // in bytes DWORD loopStart; // in samples? DWORD loopEnd; // in samples? - CHAR finetune; // 0 ... 15 (useless?) + CHAR finetune; // 0 ... 15 (useless? also, why is this almost always 70?) BYTE volume; // default volume WORD c2freq; }; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-29 22:30:10 UTC (rev 382) @@ -1045,10 +1045,10 @@ } -UINT CSoundFile::GetNumPatterns() const +ORDERINDEX CSoundFile::GetNumPatterns() const //------------------------------------- { - UINT i = 0; + ORDERINDEX i = 0; while ((i < Order.size()) && (Order[i] < Order.GetInvalidPatIndex())) i++; return i; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-29 22:30:10 UTC (rev 382) @@ -623,9 +623,9 @@ BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); UINT GetMasterVolume() const { return m_nMasterVolume; } - UINT GetNumPatterns() const; - UINT GetNumInstruments() const {return m_nInstruments;} - UINT GetNumSamples() const { return m_nSamples; } + ORDERINDEX GetNumPatterns() const; + INSTRUMENTINDEX GetNumInstruments() const {return m_nInstruments;} + SAMPLEINDEX GetNumSamples() const { return m_nSamples; } UINT GetCurrentPos() const; UINT GetCurrentPattern() const { return m_nPattern; } ORDERINDEX GetCurrentOrder() const { return static_cast<ORDERINDEX>(m_nCurrentPattern); } Modified: trunk/OpenMPT/soundlib/patternContainer.cpp =================================================================== --- trunk/OpenMPT/soundlib/patternContainer.cpp 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/soundlib/patternContainer.cpp 2009-09-29 22:30:10 UTC (rev 382) @@ -5,14 +5,14 @@ #include "../mptrack/serialization_utils.h" #include "../mptrack/version.h" -int CPatternContainer::Insert(const ROWINDEX rows) +PATTERNINDEX CPatternContainer::Insert(const ROWINDEX rows) //--------------------------------------------- { PATTERNINDEX i = 0; for(i = 0; i<m_Patterns.size(); i++) if(!m_Patterns[i]) break; if(Insert(i, rows)) - return -1; + return PATTERNINDEX_INVALID; else return i; } Modified: trunk/OpenMPT/soundlib/patternContainer.h =================================================================== --- trunk/OpenMPT/soundlib/patternContainer.h 2009-09-29 12:43:52 UTC (rev 381) +++ trunk/OpenMPT/soundlib/patternContainer.h 2009-09-29 22:30:10 UTC (rev 382) @@ -38,9 +38,9 @@ //ignoring request. bool Insert(const PATTERNINDEX index, const ROWINDEX rows); - //Insert pattern to position with the lowest index, and return that index, -1 + //Insert pattern to position with the lowest index, and return that index, PATTERNINDEX_INVALID //on failure. - int Insert(const ROWINDEX rows); + PATTERNINDEX Insert(const ROWINDEX rows); //Remove pattern from given position. Currently it actually makes the pattern //'invisible' - the pattern data is cleared but the actual pattern object won't get removed. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |