|
From: <sag...@us...> - 2011-03-25 18:36:30
|
Revision: 829
http://modplug.svn.sourceforge.net/modplug/?rev=829&view=rev
Author: saga-games
Date: 2011-03-25 18:36:23 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
[Fix] IT Saver: Non-existing envelopes are now replaced by a default (disabled) envelope, so that they can still be edited in Impulse Tracker.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2011-03-24 20:05:01 UTC (rev 828)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2011-03-25 18:36:23 UTC (rev 829)
@@ -237,9 +237,10 @@
return (value > 9) ? 9 : value;
}
+
// Convert MPT's internal nvelope format into an IT/MPTM envelope.
-void MPTEnvToIT(const INSTRUMENTENVELOPE *mptEnv, ITENVELOPE *itEnv, const BYTE envOffset)
-//----------------------------------------------------------------------------------------
+void MPTEnvToIT(const INSTRUMENTENVELOPE *mptEnv, ITENVELOPE *itEnv, const BYTE envOffset, const BYTE envDefault)
+//---------------------------------------------------------------------------------------------------------------
{
if(mptEnv->dwFlags & ENV_ENABLED) itEnv->flags |= 1;
if(mptEnv->dwFlags & ENV_LOOP) itEnv->flags |= 2;
@@ -251,15 +252,26 @@
itEnv->slb = (BYTE)mptEnv->nSustainStart;
itEnv->sle = (BYTE)mptEnv->nSustainEnd;
- // Attention: Full MPTM envelope is stored in extended instrument properties
- for (UINT ev = 0; ev < 25; ev++)
+ if(mptEnv->nNodes > 0)
{
- itEnv->data[ev * 3] = mptEnv->Values[ev] - envOffset;
- itEnv->data[ev * 3 + 1] = mptEnv->Ticks[ev] & 0xFF;
- itEnv->data[ev * 3 + 2] = mptEnv->Ticks[ev] >> 8;
+ // Attention: Full MPTM envelope is stored in extended instrument properties
+ for(size_t ev = 0; ev < 25; ev++)
+ {
+ itEnv->data[ev * 3] = mptEnv->Values[ev] - envOffset;
+ itEnv->data[ev * 3 + 1] = mptEnv->Ticks[ev] & 0xFF;
+ itEnv->data[ev * 3 + 2] = mptEnv->Ticks[ev] >> 8;
+ }
+ } else
+ {
+ // Fix non-existing envelopes so that they can still be edited in Impulse Tracker.
+ itEnv->num = 2;
+ MemsetZero(itEnv->data);
+ itEnv->data[0] = itEnv->data[3] = envDefault - envOffset;
+ itEnv->data[4] = 10;
}
}
+
// Convert IT/MPTM envelope data into MPT's internal envelope format - To be used by ITInstrToMPT()
void ITEnvToMPT(const ITENVELOPE *itEnv, INSTRUMENTENVELOPE *mptEnv, const BYTE envOffset, const int iEnvMax)
//-----------------------------------------------------------------------------------------------------------
@@ -282,6 +294,7 @@
}
}
+
//BOOL CSoundFile::ITInstrToMPT(const void *p, MODINSTRUMENT *pIns, UINT trkvers)
long CSoundFile::ITInstrToMPT(const void *p, MODINSTRUMENT *pIns, UINT trkvers) //rewbs.modularInstData
//-----------------------------------------------------------------------------
@@ -1569,11 +1582,11 @@
keyboardex[i] = (smp>>8);
} else keyboardex[i] = 0;
// Writing Volume envelope
- MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0);
+ MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0, 64);
// Writing Panning envelope
- MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32);
+ MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32, 32);
// Writing Pitch Envelope
- MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32);
+ MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32, 32);
if (pIns->PitchEnv.dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
} else
// Save Empty Instrument
@@ -2164,11 +2177,11 @@
keyboardex[i] = (smp>>8);
} else keyboardex[i] = 0;
// Writing Volume envelope
- MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0);
+ MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0, 64);
// Writing Panning envelope
- MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32);
+ MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32, 32);
// Writing Pitch Envelope
- MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32);
+ MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32, 32);
if (pIns->PitchEnv.dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80;
} else
// Save Empty Instrument
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|