From: <sag...@us...> - 2009-09-09 22:43:42
|
Revision: 357 http://modplug.svn.sourceforge.net/modplug/?rev=357&view=rev Author: saga-games Date: 2009-09-09 22:43:27 +0000 (Wed, 09 Sep 2009) Log Message: ----------- [New] MPTM: Allow up to 240 envelope points (did not set it to 255 to have a safety margin). Write additional loop points to extended instrument properties. [Ref] Rewrote a bit of the IT loader to avoid C&P code, removed constants where they should not be used Modified Paths: -------------- trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-07 20:24:18 UTC (rev 356) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-09 22:43:27 UTC (rev 357) @@ -1256,9 +1256,6 @@ int nValue = ScreenToValue(m_ptMenu.y); if(nTick < 0) return false; - UINT maxpoints = (pSndFile->m_nType == MOD_TYPE_XM) ? 12 : 25; - //To check: Should there be MAX_ENVPOINTS? - nValue = CLAMP(nValue, 0, 64); INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); @@ -1280,7 +1277,7 @@ return false; } - if (envelope->nNodes < maxpoints) + if (envelope->nNodes < pSndFile->GetModSpecifications().envelopePointsMax) { if (!envelope->nNodes) { @@ -1973,8 +1970,6 @@ CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (node>0) && (node <= EnvGetLastPoint())) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); if(envelope == nullptr) return; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-07 20:24:18 UTC (rev 356) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-09 22:43:27 UTC (rev 357) @@ -216,11 +216,31 @@ return (value > 9) ? 9 : value; } +// 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) +//----------------------------------------------------------------------------------------------------------- +{ + mptEnv->nNodes = min(itEnv->num, iEnvMax); + mptEnv->nLoopStart = itEnv->lpb; + mptEnv->nLoopEnd = itEnv->lpe; + mptEnv->nSustainStart = itEnv->slb; + mptEnv->nSustainEnd = itEnv->sle; + // Attention: Full MPTM envelope is stored in extended instrument properties + for (UINT ev = 0; ev < 25; ev++) + { + mptEnv->Values[ev] = itEnv->data[ev * 3] + envOffset; + mptEnv->Ticks[ev] = (itEnv->data[ev * 3 + 2] << 8) | (itEnv->data[ev * 3 + 1]); + } +} + //BOOL CSoundFile::ITInstrToMPT(const void *p, MODINSTRUMENT *pIns, UINT trkvers) long CSoundFile::ITInstrToMPT(const void *p, MODINSTRUMENT *pIns, UINT trkvers) //rewbs.modularInstData //-------------------------------------------------------------------------------- { + // Envelope point count. Limited to 25 in IT format. + const int iEnvMax = (m_nType & MOD_TYPE_MPT) ? MAX_ENVPOINTS : 25; + long returnVal=0; pIns->pTuning = m_defaultInstrument.pTuning; pIns->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL; @@ -257,6 +277,7 @@ } pIns->VolEnv.Values[ev] = pis->nodes[ev*2+1]; } + pIns->nNNA = pis->nna; pIns->nDCT = pis->dnc; pIns->nPan = 0x80; @@ -283,7 +304,7 @@ pIns->nFadeOut = pis->fadeout << 5; // should be 6? pIns->nGlobalVol = pis->gbv >> 1; if (pIns->nGlobalVol > 64) pIns->nGlobalVol = 64; - for (UINT j=0; j<NOTE_MAX; j++) + for (UINT j = 0; j < 120; j++) { UINT note = pis->keyboard[j*2]; UINT ins = pis->keyboard[j*2+1]; @@ -295,7 +316,7 @@ if (*((int *)pis->dummy) == 'MPTX') { const ITINSTRUMENTEX *pisex = (const ITINSTRUMENTEX *)pis; - for (UINT k=0; k<NOTE_MAX; k++) + for (UINT k = 0; k < 120; k++) { pIns->Keyboard[k] |= ((UINT)pisex->keyboardhi[k] << 8); } @@ -352,45 +373,21 @@ if (pis->volenv.flags & 2) pIns->dwFlags |= ENV_VOLLOOP; if (pis->volenv.flags & 4) pIns->dwFlags |= ENV_VOLSUSTAIN; if (pis->volenv.flags & 8) pIns->dwFlags |= ENV_VOLCARRY; - pIns->VolEnv.nNodes = pis->volenv.num; - if (pIns->VolEnv.nNodes > 25) pIns->VolEnv.nNodes = 25; - pIns->VolEnv.nLoopStart = pis->volenv.lpb; - pIns->VolEnv.nLoopEnd = pis->volenv.lpe; - pIns->VolEnv.nSustainStart = pis->volenv.slb; - pIns->VolEnv.nSustainEnd = pis->volenv.sle; + ITEnvToMPT(&pis->volenv, &pIns->VolEnv, 0, iEnvMax); // Panning Envelope if (pis->panenv.flags & 1) pIns->dwFlags |= ENV_PANNING; if (pis->panenv.flags & 2) pIns->dwFlags |= ENV_PANLOOP; if (pis->panenv.flags & 4) pIns->dwFlags |= ENV_PANSUSTAIN; if (pis->panenv.flags & 8) pIns->dwFlags |= ENV_PANCARRY; - pIns->PanEnv.nNodes = pis->panenv.num; - if (pIns->PanEnv.nNodes > 25) pIns->PanEnv.nNodes = 25; - pIns->PanEnv.nLoopStart = pis->panenv.lpb; - pIns->PanEnv.nLoopEnd = pis->panenv.lpe; - pIns->PanEnv.nSustainStart = pis->panenv.slb; - pIns->PanEnv.nSustainEnd = pis->panenv.sle; + ITEnvToMPT(&pis->panenv, &pIns->PanEnv, 32, iEnvMax); // Pitch Envelope if (pis->pitchenv.flags & 1) pIns->dwFlags |= ENV_PITCH; if (pis->pitchenv.flags & 2) pIns->dwFlags |= ENV_PITCHLOOP; if (pis->pitchenv.flags & 4) pIns->dwFlags |= ENV_PITCHSUSTAIN; if (pis->pitchenv.flags & 8) pIns->dwFlags |= ENV_PITCHCARRY; if (pis->pitchenv.flags & 0x80) pIns->dwFlags |= ENV_FILTER; - pIns->PitchEnv.nNodes = pis->pitchenv.num; - if (pIns->PitchEnv.nNodes > 25) pIns->PitchEnv.nNodes = 25; - pIns->PitchEnv.nLoopStart = pis->pitchenv.lpb; - pIns->PitchEnv.nLoopEnd = pis->pitchenv.lpe; - pIns->PitchEnv.nSustainStart = pis->pitchenv.slb; - pIns->PitchEnv.nSustainEnd = pis->pitchenv.sle; - // Envelopes Data - for (UINT ev=0; ev<25; ev++) - { - pIns->VolEnv.Values[ev] = pis->volenv.data[ev*3]; - pIns->VolEnv.Ticks[ev] = (pis->volenv.data[ev*3+2] << 8) | (pis->volenv.data[ev*3+1]); - pIns->PanEnv.Values[ev] = pis->panenv.data[ev*3] + 32; - pIns->PanEnv.Ticks[ev] = (pis->panenv.data[ev*3+2] << 8) | (pis->panenv.data[ev*3+1]); - pIns->PitchEnv.Values[ev] = pis->pitchenv.data[ev*3] + 32; - pIns->PitchEnv.Ticks[ev] = (pis->pitchenv.data[ev*3+2] << 8) | (pis->pitchenv.data[ev*3+1]); - } + ITEnvToMPT(&pis->pitchenv, &pIns->PitchEnv, 32, iEnvMax); + pIns->nNNA = pis->nna; pIns->nDCT = pis->dct; pIns->nDNA = pis->dca; @@ -407,9 +404,10 @@ if (pIns->nPan > 256) pIns->nPan = 128; if (pis->dfp < 0x80) pIns->dwFlags |= ENV_SETPANNING; } - if ((pIns->VolEnv.nLoopStart >= 25) || (pIns->VolEnv.nLoopEnd >= 25)) pIns->dwFlags &= ~ENV_VOLLOOP; - if ((pIns->VolEnv.nSustainStart >= 25) || (pIns->VolEnv.nSustainEnd >= 25)) pIns->dwFlags &= ~ENV_VOLSUSTAIN; + if ((pIns->VolEnv.nLoopStart >= iEnvMax) || (pIns->VolEnv.nLoopEnd >= iEnvMax)) pIns->dwFlags &= ~ENV_VOLLOOP; + if ((pIns->VolEnv.nSustainStart >= iEnvMax) || (pIns->VolEnv.nSustainEnd >= iEnvMax)) pIns->dwFlags &= ~ENV_VOLSUSTAIN; + return returnVal; //return offset } @@ -3504,7 +3502,20 @@ WriteInstrumentPropertyForAllInstruments('PTTL', sizeof(m_defaultInstrument.wPitchToTempoLock), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('PVEH', sizeof(m_defaultInstrument.nPluginVelocityHandling), f, instruments, nInstruments); WriteInstrumentPropertyForAllInstruments('PVOH', sizeof(m_defaultInstrument.nPluginVolumeHandling), f, instruments, nInstruments); - + + if(m_nType & MOD_TYPE_MPT) + { + // write full envelope information for MPTM files (more env points) + WriteInstrumentPropertyForAllInstruments('VP[.', sizeof(m_defaultInstrument.VolEnv.Ticks ), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('VE[.', sizeof(m_defaultInstrument.VolEnv.Values), f, instruments, nInstruments); + + WriteInstrumentPropertyForAllInstruments('PP[.', sizeof(m_defaultInstrument.PanEnv.Ticks), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('PE[.', sizeof(m_defaultInstrument.PanEnv.Values), f, instruments, nInstruments); + + WriteInstrumentPropertyForAllInstruments('PiP[', sizeof(m_defaultInstrument.PitchEnv.Ticks), f, instruments, nInstruments); + WriteInstrumentPropertyForAllInstruments('PiE[', sizeof(m_defaultInstrument.PitchEnv.Values), f, instruments, nInstruments); + } + return; } Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-07 20:24:18 UTC (rev 356) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-09 22:43:27 UTC (rev 357) @@ -51,7 +51,7 @@ DWORD shsize; // size of XMSAMPLESTRUCT BYTE snum[96]; WORD venv[24]; - WORD pIns[24]; + WORD penv[24]; BYTE vnum, pnum; BYTE vsustain, vloops, vloope, psustain, ploops, ploope; BYTE vtype, ptype; @@ -354,7 +354,7 @@ for (int i = 0; i < 24; ++i) { xmsh.venv[i] = LittleEndianW(xmsh.venv[i]); - xmsh.pIns[i] = LittleEndianW(xmsh.pIns[i]); + xmsh.penv[i] = LittleEndianW(xmsh.penv[i]); } xmsh.volfade = LittleEndianW(xmsh.volfade); xmsh.res = LittleEndianW(xmsh.res); @@ -473,8 +473,8 @@ { pIns->VolEnv.Ticks[ienv] = (WORD)xmsh.venv[ienv*2]; pIns->VolEnv.Values[ienv] = (BYTE)xmsh.venv[ienv*2+1]; - pIns->PanEnv.Ticks[ienv] = (WORD)xmsh.pIns[ienv*2]; - pIns->PanEnv.Values[ienv] = (BYTE)xmsh.pIns[ienv*2+1]; + pIns->PanEnv.Ticks[ienv] = (WORD)xmsh.penv[ienv*2]; + pIns->PanEnv.Values[ienv] = (BYTE)xmsh.penv[ienv*2+1]; if (ienv) { if (pIns->VolEnv.Ticks[ienv] < pIns->VolEnv.Ticks[ienv-1]) @@ -871,8 +871,8 @@ { xmsh.venv[ienv*2] = pIns->VolEnv.Ticks[ienv]; xmsh.venv[ienv*2+1] = pIns->VolEnv.Values[ienv]; - xmsh.pIns[ienv*2] = pIns->PanEnv.Ticks[ienv]; - xmsh.pIns[ienv*2+1] = pIns->PanEnv.Values[ienv]; + xmsh.penv[ienv*2] = pIns->PanEnv.Ticks[ienv]; + xmsh.penv[ienv*2+1] = pIns->PanEnv.Values[ienv]; } if (pIns->dwFlags & ENV_VOLUME) xmsh.vtype |= 1; if (pIns->dwFlags & ENV_VOLSUSTAIN) xmsh.vtype |= 2; Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2009-09-07 20:24:18 UTC (rev 356) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2009-09-09 22:43:27 UTC (rev 357) @@ -71,7 +71,7 @@ #define MAX_BASECHANNELS 127 // Max pattern channels. //#endif // -! BEHAVIOUR_CHANGE#0006 -#define MAX_ENVPOINTS 32 +#define MAX_ENVPOINTS 240 #define MIN_PERIOD 0x0020 #define MAX_PERIOD 0xFFFF #define MAX_PATTERNNAME 32 Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-07 20:24:18 UTC (rev 356) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-09 22:43:27 UTC (rev 357) @@ -36,6 +36,7 @@ UINT speedMin; UINT speedMax; bool hasComments; + int envelopePointsMax; }; @@ -71,6 +72,7 @@ 1, //Min Speed 255, //Max Speed true, //Has song comments + 240, //Envelope point count }; @@ -101,6 +103,7 @@ 1, //Min Speed 31, //Max Speed false, //No song comments + 0, //Envelope point count }; // MOD with MPT extensions. @@ -129,6 +132,7 @@ 1, //Min Speed 31, //Max Speed false, //No song comments + 0, //Envelope point count }; const CModSpecifications xm = @@ -156,6 +160,7 @@ 1, //Min Speed 31, //Max Speed false, //No song comments + 12, //Envelope point count }; // XM with MPT extensions @@ -184,6 +189,7 @@ 1, //Min Speed 31, //Max Speed true, //Has song comments + 12, //Envelope point count }; const CModSpecifications s3m = @@ -210,6 +216,7 @@ 1, //Min Speed 255, //Max Speed false, //No song comments + 0, //Envelope point count }; // S3M with MPT extensions @@ -238,6 +245,7 @@ 1, //Min Speed 255, //Max Speed false, //No song comments + 0, //Envelope point count }; const CModSpecifications it = @@ -265,6 +273,7 @@ 1, //Min Speed 255, //Max Speed true, //Has song comments + 25, //Envelope point count }; const CModSpecifications itEx = @@ -292,6 +301,7 @@ 1, //Min Speed 255, //Max Speed true, //Has song comments + 25, //Envelope point count }; } //namespace ModSpecs This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |