From: <sag...@us...> - 2010-04-20 21:57:45
|
Revision: 576 http://modplug.svn.sourceforge.net/modplug/?rev=576&view=rev Author: saga-games Date: 2010-04-20 21:57:38 +0000 (Tue, 20 Apr 2010) Log Message: ----------- [Fix] Cleanup: Because of an error in GetNumPatterns(), the last pattern was checked when looking for unused samples which sometimes resulted in deleted samples (although they were actually used). [Fix] Mod Conversion: When converting from MOD to S3M or IT, the Invert Loop effect was not removed. [Mod] Release notes: Typo [Ref] Rewrote some array-based code with vectors. [Ref] Moved IsInstrumentUsed() / IsSampleUsed() to Sndfile.cpp instead of sampleio.cpp, as that appears more logical to me. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/packageTemplate/OMPT_1.18_ReleaseNotes.html trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-04-20 20:35:55 UTC (rev 575) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-04-20 21:57:38 UTC (rev 576) @@ -574,7 +574,7 @@ } } EndWaitCursor(); - if (nExt && !((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_dwSongFlags & SONG_ITPROJECT))) + if (nExt && !((pSndFile->GetType() == MOD_TYPE_IT) && (pSndFile->m_dwSongFlags & SONG_ITPROJECT))) { //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?", nExt, (nExt == 1) ? "" : "s"); @@ -730,7 +730,7 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); if(pSndFile == nullptr) return false; - INSTRUMENTINDEX usedmap[MAX_INSTRUMENTS]; + vector<bool> usedmap; INSTRUMENTINDEX swapmap[MAX_INSTRUMENTS]; INSTRUMENTINDEX swapdest[MAX_INSTRUMENTS]; CHAR s[512]; @@ -741,18 +741,21 @@ if (!pSndFile->m_nInstruments) return false; char removeSamples = -1; - if ( !((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_dwSongFlags&SONG_ITPROJECT))) { //never remove an instrument's samples in ITP. - if(::MessageBox(NULL, "Remove samples associated with an instrument if they are unused?", "Removing unused instruments", MB_YESNO | MB_ICONQUESTION) == IDYES) { + if ( !((pSndFile->GetType() == MOD_TYPE_IT) && (pSndFile->m_dwSongFlags & SONG_ITPROJECT))) //never remove an instrument's samples in ITP. + { + if(::MessageBox(NULL, "Remove samples associated with an instrument if they are unused?", "Removing unused instruments", MB_YESNO | MB_ICONQUESTION) == IDYES) + { removeSamples = 1; } - } else { + } else + { ::MessageBox(NULL, "This is an IT project file, so no samples associated with a used instrument will be removed.", "Removing unused instruments", MB_OK | MB_ICONINFORMATION); } BeginWaitCursor(); - memset(usedmap, 0, sizeof(usedmap)); + usedmap.resize(pSndFile->GetNumInstruments() + 1, false); - for(INSTRUMENTINDEX i = pSndFile->m_nInstruments; i >= 1; i--) + for(INSTRUMENTINDEX i = pSndFile->GetNumInstruments(); i >= 1; i--) { if (!pSndFile->IsInstrumentUsed(i)) { @@ -762,12 +765,15 @@ // pSndFile->DestroyInstrument(i); pSndFile->DestroyInstrument(i, removeSamples); // -! BEHAVIOUR_CHANGE#0003 - if ((i == pSndFile->m_nInstruments) && (i>1)) pSndFile->m_nInstruments--; else bReorg = true; + if ((i == pSndFile->GetNumInstruments()) && (i>1)) + pSndFile->m_nInstruments--; + else + bReorg = true; END_CRITICAL(); nRemoved++; } else { - usedmap[i] = 1; + usedmap[i] = true; } } EndWaitCursor(); @@ -790,8 +796,8 @@ swapdest[nSwap] = nIndex; pSndFile->Instruments[nIndex] = pSndFile->Instruments[nIns]; pSndFile->Instruments[nIns] = nullptr; - usedmap[nIndex] = 1; - usedmap[nIns] = 0; + usedmap[nIndex] = true; + usedmap[nIns] = false; nSwap++; nIndex++; break; @@ -814,7 +820,7 @@ { for (UINT k=0; k<nSwap; k++) { - if (p->instr == swapmap[k]) p->instr = (BYTE)swapdest[k]; + if (p->instr == swapmap[k]) p->instr = (MODCOMMAND::INSTR)swapdest[k]; } } p++; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-04-20 20:35:55 UTC (rev 575) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-04-20 21:57:38 UTC (rev 576) @@ -1985,28 +1985,29 @@ #define MOD_TYPE_XMIT (MOD_TYPE_XM|MOD_TYPE_IT) #define MOD_TYPE_XMITMPT (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT) #define MOD_TYPE_ITMPT (MOD_TYPE_IT|MOD_TYPE_MPT) +#define MOD_TYPE_ALL 0xFFFFFFFF #define MAX_FXINFO 70 const MPTEFFECTINFO gFXInfo[MAX_FXINFO] = { - {CMD_ARPEGGIO, 0,0, 0, 0xFFFFFFFF, "Arpeggio"}, - {CMD_PORTAMENTOUP, 0,0, 0, 0xFFFFFFFF, "Portamento Up"}, - {CMD_PORTAMENTODOWN,0,0, 0, 0xFFFFFFFF, "Portamento Down"}, - {CMD_TONEPORTAMENTO,0,0, 0, 0xFFFFFFFF, "Tone portamento"}, - {CMD_VIBRATO, 0,0, 0, 0xFFFFFFFF, "Vibrato"}, - {CMD_TONEPORTAVOL, 0,0, 0, 0xFFFFFFFF, "Volslide+Toneporta"}, - {CMD_VIBRATOVOL, 0,0, 0, 0xFFFFFFFF, "VolSlide+Vibrato"}, - {CMD_TREMOLO, 0,0, 0, 0xFFFFFFFF, "Tremolo"}, - {CMD_PANNING8, 0,0, 0, 0xFFFFFFFF, "Set Panning"}, - {CMD_OFFSET, 0,0, 0, 0xFFFFFFFF, "Set Offset"}, - {CMD_VOLUMESLIDE, 0,0, 0, 0xFFFFFFFF, "Volume Slide"}, - {CMD_POSITIONJUMP, 0,0, 0, 0xFFFFFFFF, "Position Jump"}, + {CMD_ARPEGGIO, 0,0, 0, MOD_TYPE_ALL, "Arpeggio"}, + {CMD_PORTAMENTOUP, 0,0, 0, MOD_TYPE_ALL, "Portamento Up"}, + {CMD_PORTAMENTODOWN,0,0, 0, MOD_TYPE_ALL, "Portamento Down"}, + {CMD_TONEPORTAMENTO,0,0, 0, MOD_TYPE_ALL, "Tone portamento"}, + {CMD_VIBRATO, 0,0, 0, MOD_TYPE_ALL, "Vibrato"}, + {CMD_TONEPORTAVOL, 0,0, 0, MOD_TYPE_ALL, "Volslide+Toneporta"}, + {CMD_VIBRATOVOL, 0,0, 0, MOD_TYPE_ALL, "VolSlide+Vibrato"}, + {CMD_TREMOLO, 0,0, 0, MOD_TYPE_ALL, "Tremolo"}, + {CMD_PANNING8, 0,0, 0, MOD_TYPE_ALL, "Set Panning"}, + {CMD_OFFSET, 0,0, 0, MOD_TYPE_ALL, "Set Offset"}, + {CMD_VOLUMESLIDE, 0,0, 0, MOD_TYPE_ALL, "Volume Slide"}, + {CMD_POSITIONJUMP, 0,0, 0, MOD_TYPE_ALL, "Position Jump"}, {CMD_VOLUME, 0,0, 0, MOD_TYPE_MODXM, "Set Volume"}, - {CMD_PATTERNBREAK, 0,0, 0, 0xFFFFFFFF, "Pattern Break"}, + {CMD_PATTERNBREAK, 0,0, 0, MOD_TYPE_ALL, "Pattern Break"}, {CMD_RETRIG, 0,0, 0, MOD_TYPE_NOMOD, "Retrigger Note"}, - {CMD_SPEED, 0,0, 0, 0xFFFFFFFF, "Set Speed"}, - {CMD_TEMPO, 0,0, 0, 0xFFFFFFFF, "Set Tempo"}, + {CMD_SPEED, 0,0, 0, MOD_TYPE_ALL, "Set Speed"}, + {CMD_TEMPO, 0,0, 0, MOD_TYPE_ALL, "Set Tempo"}, {CMD_TREMOR, 0,0, 0, MOD_TYPE_NOMOD, "Tremor"}, {CMD_CHANNELVOLUME, 0,0, 0, MOD_TYPE_S3MITMPT, "Set channel volume"}, {CMD_CHANNELVOLSLIDE,0,0, 0, MOD_TYPE_S3MITMPT, "Channel volslide"}, @@ -2065,8 +2066,8 @@ // -> DESC="add extended parameter mechanism to pattern effects" {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMITMPT, "X param"}, // -! NEW_FEATURE#0010 - {CMD_NOTESLIDEUP, 0x00,0x00, 0, 0, "Note Slide Up"}, // .IMF effect - {CMD_NOTESLIDEDOWN, 0x00,0x00, 0, 0, "Note Slide Down"}, // .IMF effect + {CMD_NOTESLIDEUP, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Up"}, // .IMF effect + {CMD_NOTESLIDEDOWN, 0x00,0x00, 0, MOD_TYPE_NONE, "Note Slide Down"}, // .IMF effect }; Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2010-04-20 20:35:55 UTC (rev 575) +++ trunk/OpenMPT/mptrack/Mptrack.h 2010-04-20 21:57:38 UTC (rev 576) @@ -439,7 +439,7 @@ STATIC_ASSERT(ARRAYELEMCOUNT(szSpecialNoteShortDesc) == ARRAYELEMCOUNT(szSpecialNoteNames)); const LPCSTR szHexChar = "0123456789ABCDEF"; -const LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#??"; //rewbs.smoothVST: added last \ (written as \\); +const LPCSTR gszModCommands = " 0123456789ABCDRFFTE???GHK?YXPLZ\\?#??"; //rewbs.smoothVST: added last \ (written as \\); const LPCSTR gszS3mCommands = " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#??"; //rewbs.smoothVST: added last \ (written as \\); const LPCSTR gszVolCommands = " vpcdabuhlrgfe:o"; const TCHAR gszEmpty[] = TEXT(""); Modified: trunk/OpenMPT/packageTemplate/OMPT_1.18_ReleaseNotes.html =================================================================== --- trunk/OpenMPT/packageTemplate/OMPT_1.18_ReleaseNotes.html 2010-04-20 20:35:55 UTC (rev 575) +++ trunk/OpenMPT/packageTemplate/OMPT_1.18_ReleaseNotes.html 2010-04-20 21:57:38 UTC (rev 576) @@ -110,7 +110,7 @@ The pattern event stores all necessary information and can thus be moved around easily in the pattern. The format for those events is: PC(s) XX YYY ZZZ. A PC "note" equals a Zxx effect, a PCs "note" behaves like \xx. The instrument column (XX) contains the VST number (can be obtained from the VST list or through the context menu). - The volume column (YYY) stores the parameter that is going to be automatic, ranging from 0 to 999 (decimal). + The volume column (YYY) stores the parameter that is going to be automated, ranging from 0 to 999 (decimal). The effect column (ZZZ) stores the parameter value, also ranging from 0 to 999 (decimal).</li> <li><strong>Note Fade</strong> is a new note type in IT / MPTM modules, based on an unfinished feature in Impulse Tracker. As the name suggests, this note fades out the instrument depending on its fadeout value (without releasing any envelopes). Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2010-04-20 20:35:55 UTC (rev 575) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2010-04-20 21:57:38 UTC (rev 576) @@ -133,79 +133,34 @@ } -bool CSoundFile::IsSampleUsed(SAMPLEINDEX nSample) -//------------------------------------------------ -{ - if ((!nSample) || (nSample > m_nSamples)) return false; - if (m_nInstruments) - { - for (UINT i=1; i<=m_nInstruments; i++) if (Instruments[i]) - { - MODINSTRUMENT *pIns = Instruments[i]; - for (UINT j=0; j<128; j++) - { - if (pIns->Keyboard[j] == nSample) return true; - } - } - } else - { - for (UINT i=0; i<Patterns.Size(); i++) if (Patterns[i]) - { - MODCOMMAND *m = Patterns[i]; - for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--) - { - if (m->instr == nSample) return true; - } - } - } - return false; -} - - -bool CSoundFile::IsInstrumentUsed(INSTRUMENTINDEX nInstr) -//------------------------------------------------------- -{ - if ((!nInstr) || (nInstr > m_nInstruments) || (!Instruments[nInstr])) return false; - for (UINT i=0; i<Patterns.Size(); i++) if (Patterns[i]) - { - MODCOMMAND *m = Patterns[i]; - for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--) - { - if (m->instr == nInstr) return true; - } - } - return false; -} - - // Removing all unused samples bool CSoundFile::RemoveInstrumentSamples(INSTRUMENTINDEX nInstr) //-------------------------------------------------------------- { - BYTE sampleused[MAX_SAMPLES/8]; - - memset(sampleused, 0, sizeof(sampleused)); + vector<bool> sampleused; + sampleused.resize(GetNumSamples() + 1, false); + if (Instruments[nInstr]) { MODINSTRUMENT *p = Instruments[nInstr]; for (UINT r=0; r<128; r++) { UINT n = p->Keyboard[r]; - if (n < MAX_SAMPLES) sampleused[n>>3] |= (1<<(n&7)); + if (n <= GetNumSamples()) sampleused[n] = true; } - for (SAMPLEINDEX nSmp=1; nSmp<MAX_INSTRUMENTS; nSmp++) if ((Instruments[nSmp]) && (nSmp != nInstr)) + for (INSTRUMENTINDEX nIns = 1; nIns < MAX_INSTRUMENTS; nIns++) if ((Instruments[nIns]) && (nIns != nInstr)) { - p = Instruments[nSmp]; + p = Instruments[nIns]; for (UINT r=0; r<128; r++) { UINT n = p->Keyboard[r]; - if (n < MAX_SAMPLES) sampleused[n>>3] &= ~(1<<(n&7)); + if (n <= GetNumSamples()) sampleused[n] = false; } } - for (SAMPLEINDEX d = 1; d <= m_nSamples; d++) if (sampleused[d>>3] & (1<<(d&7))) + for (SAMPLEINDEX nSmp = 1; nSmp <= GetNumSamples(); nSmp++) if (sampleused[nSmp]) { - DestroySample(d); - m_szNames[d][0] = 0; + DestroySample(nSmp); + m_szNames[nSmp][0] = 0; } return true; } @@ -226,7 +181,7 @@ // -> CODE#0003 // -> DESC="remove instrument's samples" // RemoveInstrumentSamples(nInstr); - DestroyInstrument(nInstr,1); + DestroyInstrument(nInstr, 1); // -! BEHAVIOUR_CHANGE#0003 if (!Instruments[nInstr]) Instruments[nInstr] = new MODINSTRUMENT; MODINSTRUMENT *pIns = Instruments[nInstr]; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-04-20 20:35:55 UTC (rev 575) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-04-20 21:57:38 UTC (rev 576) @@ -1102,7 +1102,7 @@ for(PATTERNINDEX i = 0; i < Patterns.Size(); i++) { if(Patterns.IsValidPat(i)) - max = i; + max = i + 1; } return max; } @@ -2717,6 +2717,51 @@ #ifndef FASTSOUNDLIB +bool CSoundFile::IsSampleUsed(SAMPLEINDEX nSample) +//------------------------------------------------ +{ + if ((!nSample) || (nSample > m_nSamples)) return false; + if (m_nInstruments) + { + for (UINT i=1; i<=m_nInstruments; i++) if (Instruments[i]) + { + MODINSTRUMENT *pIns = Instruments[i]; + for (UINT j=0; j<128; j++) + { + if (pIns->Keyboard[j] == nSample) return true; + } + } + } else + { + for (UINT i=0; i<Patterns.Size(); i++) if (Patterns[i]) + { + MODCOMMAND *m = Patterns[i]; + for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--) + { + if (m->instr == nSample && !m->IsPcNote()) return true; + } + } + } + return false; +} + + +bool CSoundFile::IsInstrumentUsed(INSTRUMENTINDEX nInstr) +//------------------------------------------------------- +{ + if ((!nInstr) || (nInstr > m_nInstruments) || (!Instruments[nInstr])) return false; + for (UINT i=0; i<Patterns.Size(); i++) if (Patterns[i]) + { + MODCOMMAND *m = Patterns[i]; + for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--) + { + if (m->instr == nInstr && !m->IsPcNote()) return true; + } + } + return false; +} + + UINT CSoundFile::DetectUnusedSamples(BYTE *pbIns) //----------------------------------------------- { @@ -3542,6 +3587,7 @@ break; case CMD_MODCMDEX: // This would turn into "Set Active Macro", so let's better remove it + case CMD_S3MCMDEX: if((m->param & 0xF0) == 0xF0) m->command = CMD_NONE; break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |