From: <sag...@us...> - 2009-09-09 23:14:33
|
Revision: 358 http://modplug.svn.sourceforge.net/modplug/?rev=358&view=rev Author: saga-games Date: 2009-09-09 23:14:18 +0000 (Wed, 09 Sep 2009) Log Message: ----------- [Imp] Mod Conversion: Trim instrument envelopes if they're too long for the new format. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-09 22:43:27 UTC (rev 357) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-09 23:14:18 UTC (rev 358) @@ -296,6 +296,10 @@ virtual void SetModifiedFlag(BOOL bModified=TRUE); //}}AFX_VIRTUAL + // for mod conversion + bool UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv); + + // Implementation public: virtual ~CModDoc(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-09 22:43:27 UTC (rev 357) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-09 23:14:18 UTC (rev 358) @@ -654,7 +654,7 @@ // Convert MOD/XM to S3M/IT/MPT if (oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT) { - for (UINT i=1; i<=m_SndFile.m_nSamples; i++) + for (SAMPLEINDEX i=1; i<=m_SndFile.m_nSamples; i++) { m_SndFile.Samples[i].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[i].RelativeTone, m_SndFile.Samples[i].nFineTune); m_SndFile.Samples[i].RelativeTone = 0; @@ -666,13 +666,13 @@ // Convert S3M/IT/MPT to XM if (oldTypeIsS3M_IT_MPT && newTypeIsXM) { - for (UINT i=1; i<=m_SndFile.m_nSamples; i++) + for (SAMPLEINDEX i=1; i<=m_SndFile.m_nSamples; i++) { CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[i]); if (!(m_SndFile.Samples[i].uFlags & CHN_PANNING)) m_SndFile.Samples[i].nPan = 128; } bool bBrokenNoteMap = false, bBrokenSustainLoop = false; - for (UINT j = 1; j <= m_SndFile.m_nInstruments; j++) + for (INSTRUMENTINDEX j = 1; j <= m_SndFile.m_nInstruments; j++) { MODINSTRUMENT *pIns = m_SndFile.Instruments[j]; if (pIns) @@ -747,6 +747,16 @@ m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax); m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax); + bool bTrimmedEnvelopes = false; + for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++) + { + bTrimmedEnvelopes |= UpdateEnvelopes(&m_SndFile.Instruments[i]->VolEnv); + bTrimmedEnvelopes |= UpdateEnvelopes(&m_SndFile.Instruments[i]->PanEnv); + bTrimmedEnvelopes |= UpdateEnvelopes(&m_SndFile.Instruments[i]->PitchEnv); + } + if(bTrimmedEnvelopes == true) + AddToLog("WARNING: Instrument envelopes have been shortened.\n"); + SetModified(); ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL); @@ -754,11 +764,32 @@ return TRUE; } +bool CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv) +//------------------------------------------------------- +{ + // shorten instrument envelope if necessary (for mod conversion) + const int iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax; + bool bResult = false; + #define TRIMENV(i) if(i > iEnvMax) {i = iEnvMax; bResult = true;} + TRIMENV(mptEnv->nNodes); + TRIMENV(mptEnv->nLoopStart); + TRIMENV(mptEnv->nLoopEnd); + TRIMENV(mptEnv->nSustainStart); + TRIMENV(mptEnv->nSustainEnd); + TRIMENV(mptEnv->nReleaseNode); + #undef TRIMENV + return bResult; +} + + + + + // Change the number of channels BOOL CModDoc::ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg) //------------------------------------------------ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |