From: <sag...@us...> - 2009-11-07 21:40:15
|
Revision: 415 http://modplug.svn.sourceforge.net/modplug/?rev=415&view=rev Author: saga-games Date: 2009-11-07 21:40:01 +0000 (Sat, 07 Nov 2009) Log Message: ----------- [Mod] Envelope editor: Middle line is also shown for volume envelope. [Ref] Envelope flags (enabled/loop/sustain/carry/filter) are now stored in the INSTRUMENTENVELOPE struct for ease of use. I did some tests, but I still hope this didn't break anything... [Ref] A lot of code cleanup and optimization due to the change above. Modified Paths: -------------- trunk/OpenMPT/mptrack/Childfrm.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Childfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/Childfrm.h 2009-11-07 21:40:01 UTC (rev 415) @@ -48,7 +48,7 @@ typedef struct INSTRUMENTVIEWSTATE { DWORD cbStruct; - DWORD nEnv; + enmEnvelopeTypes nEnv; bool bGrid; } INSTRUMENTVIEWSTATE; Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -862,21 +862,13 @@ pSndFile->Instruments[i]->nFadeOut = 256; pSndFile->Instruments[i]->nGlobalVol = 64; pSndFile->Instruments[i]->nPan = 128; - pSndFile->Instruments[i]->dwFlags &= ~ENV_SETPANNING; + pSndFile->Instruments[i]->dwFlags &= ~INS_SETPANNING; pSndFile->Instruments[i]->nMixPlug = 0; pSndFile->Instruments[i]->nVolSwing = 0; pSndFile->Instruments[i]->nPanSwing = 0; pSndFile->Instruments[i]->nCutSwing = 0; pSndFile->Instruments[i]->nResSwing = 0; - - //might be a good idea to leave those enabled... - /* - pSndFile->Instruments[i]->dwFlags &= ~ENV_VOLUME; - pSndFile->Instruments[i]->dwFlags &= ~ENV_PANNING; - pSndFile->Instruments[i]->dwFlags &= ~ENV_PITCH; - pSndFile->Instruments[i]->dwFlags &= ~ENV_FILTER; - */ } // reset samples Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -1101,7 +1101,7 @@ SetDlgItemInt(IDC_EDIT8, pIns->nGlobalVol); // Panning SetDlgItemInt(IDC_EDIT9, pIns->nPan); - m_CheckPanning.SetCheck((pIns->dwFlags & ENV_SETPANNING) ? TRUE : FALSE); + m_CheckPanning.SetCheck((pIns->dwFlags & INS_SETPANNING) ? TRUE : FALSE); // Midi if (pIns->nMidiProgram>0 && pIns->nMidiProgram<=128) SetDlgItemInt(IDC_EDIT10, pIns->nMidiProgram); @@ -1774,8 +1774,8 @@ { const BOOL b = m_CheckPanning.GetCheck(); - if (b) pIns->dwFlags |= ENV_SETPANNING; - else pIns->dwFlags &= ~ENV_SETPANNING; + if (b) pIns->dwFlags |= INS_SETPANNING; + else pIns->dwFlags &= ~INS_SETPANNING; if(b && m_pSndFile->GetType() & MOD_TYPE_IT|MOD_TYPE_MPT) { Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -1189,8 +1189,8 @@ //-------------------------------------------------------------- { if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false; - if (bMute) m_SndFile.Instruments[nInstr]->dwFlags |= ENV_MUTE; - else m_SndFile.Instruments[nInstr]->dwFlags &= ~ENV_MUTE; + if (bMute) m_SndFile.Instruments[nInstr]->dwFlags |= INS_MUTE; + else m_SndFile.Instruments[nInstr]->dwFlags &= ~INS_MUTE; return true; } @@ -1267,7 +1267,7 @@ //----------------------------------------------------------- { if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false; - return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? true : false; + return (m_SndFile.Instruments[nInstr]->dwFlags & INS_MUTE) ? true : false; } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -283,7 +283,10 @@ pIns->PanEnv.nSustainEnd = pIns->PanEnv.nSustainStart; bBrokenSustainLoop = true; } - pIns->dwFlags &= ~(ENV_SETPANNING|ENV_VOLCARRY|ENV_PANCARRY|ENV_PITCHCARRY|ENV_FILTER|ENV_PITCH); + pIns->VolEnv.dwFlags &= ~ENV_CARRY; + pIns->PanEnv.dwFlags &= ~ENV_CARRY; + pIns->PitchEnv.dwFlags &= ~(ENV_CARRY|ENV_ENABLED|ENV_FILTER); + pIns->dwFlags &= ~INS_SETPANNING; pIns->nIFC &= 0x7F; pIns->nIFR &= 0x7F; } @@ -1402,7 +1405,6 @@ CHAR s[4096]; MODINSTRUMENT *pIns; DWORD dwMemSize; - UINT bSus, bLoop, bCarry; if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return FALSE; BeginWaitCursor(); @@ -1414,27 +1416,17 @@ { case ENV_PANNING: pEnv = &pIns->PanEnv; - bLoop = (pIns->dwFlags & ENV_PANLOOP) ? 1 : 0; - bSus = (pIns->dwFlags & ENV_PANSUSTAIN) ? 1 : 0; - bCarry = (pIns->dwFlags & ENV_PANCARRY) ? 1 : 0; break; - case ENV_PITCH: pEnv = &pIns->PitchEnv; - bLoop = (pIns->dwFlags & ENV_PITCHLOOP) ? 1 : 0; - bSus = (pIns->dwFlags & ENV_PITCHSUSTAIN) ? 1 : 0; - bCarry = (pIns->dwFlags & ENV_PITCHCARRY) ? 1 : 0; break; - default: pEnv = &pIns->VolEnv; - bLoop = (pIns->dwFlags & ENV_VOLLOOP) ? 1 : 0; - bSus = (pIns->dwFlags & ENV_VOLSUSTAIN) ? 1 : 0; - bCarry = (pIns->dwFlags & ENV_VOLCARRY) ? 1 : 0; break; } + strcpy(s, pszEnvHdr); - wsprintf(s + strlen(s), pszEnvFmt, pEnv->nNodes, pEnv->nSustainStart, pEnv->nSustainEnd, pEnv->nLoopStart, pEnv->nLoopEnd, bSus, bLoop, bCarry); + wsprintf(s + strlen(s), pszEnvFmt, pEnv->nNodes, pEnv->nSustainStart, pEnv->nSustainEnd, pEnv->nLoopStart, pEnv->nLoopEnd, (pEnv->dwFlags & ENV_SUSTAIN) ? 1 : 0, (pEnv->dwFlags & ENV_LOOP) ? 1 : 0, (pEnv->dwFlags & ENV_CARRY) ? 1 : 0); for (UINT i = 0; i < pEnv->nNodes; i++) { if (strlen(s) >= sizeof(s)-32) break; @@ -1511,26 +1503,12 @@ { case ENV_PANNING: pEnv = &pIns->PanEnv; - pIns->dwFlags &= ~(ENV_PANLOOP|ENV_PANSUSTAIN|ENV_PANCARRY); - if (bLoop) pIns->dwFlags |= ENV_PANLOOP; - if (bSus) pIns->dwFlags |= ENV_PANSUSTAIN; - if (bCarry) pIns->dwFlags |= ENV_PANCARRY; break; - case ENV_PITCH: pEnv = &pIns->PitchEnv; - pIns->dwFlags &= ~(ENV_PITCHLOOP|ENV_PITCHSUSTAIN|ENV_PITCHCARRY); - if (bLoop) pIns->dwFlags |= ENV_PITCHLOOP; - if (bSus) pIns->dwFlags |= ENV_PITCHSUSTAIN; - if (bCarry) pIns->dwFlags |= ENV_PITCHCARRY; break; - default: pEnv = &pIns->VolEnv; - pIns->dwFlags &= ~(ENV_VOLLOOP|ENV_VOLSUSTAIN|ENV_VOLCARRY); - if (bLoop) pIns->dwFlags |= ENV_VOLLOOP; - if (bSus) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (bCarry) pIns->dwFlags |= ENV_VOLCARRY; break; } pEnv->nNodes = nPoints; @@ -1539,6 +1517,7 @@ pEnv->nLoopStart = loopBegin; pEnv->nLoopEnd = loopEnd; pEnv->nReleaseNode = releaseNode; + pEnv->dwFlags = (bLoop ? ENV_LOOP : 0) | (bSus ? ENV_SUSTAIN : 0) | (bCarry ? ENV_CARRY: 0); int oldn = 0; for (UINT i=0; i<nPoints; i++) Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -152,8 +152,8 @@ } -BOOL CViewInstrument::SetCurrentInstrument(INSTRUMENTINDEX nIns, UINT nEnv) -//------------------------------------------------------------------------- +BOOL CViewInstrument::SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes nEnv) +//------------------------------------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); DWORD dwNotify; @@ -244,27 +244,9 @@ UINT CViewInstrument::EnvGetValue(int nPoint) const //------------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if ((pIns) && (nPoint >= 0)) - { - switch(m_nEnv) - { - case ENV_VOLUME: - if (nPoint < (int)pIns->VolEnv.nNodes) return pIns->VolEnv.Values[nPoint]; - break; - case ENV_PANNING: - if (nPoint < (int)pIns->PanEnv.nNodes) return pIns->PanEnv.Values[nPoint]; - break; - case ENV_PITCH: - if (nPoint < (int)pIns->PitchEnv.nNodes) return pIns->PitchEnv.Values[nPoint]; - break; - } - } - } + INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); + if(envelope == nullptr) return 0; + if(nPoint < (int)envelope->nNodes) return envelope->Values[nPoint]; return 0; } @@ -272,54 +254,39 @@ bool CViewInstrument::EnvSetValue(int nPoint, int nTick, int nValue) //------------------------------------------------------------------ { - bool bOk = false; - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if ((pIns) && (nPoint >= 0)) - { - LPWORD pPoints = NULL; - LPBYTE pData = NULL; - UINT maxpoints = 0; + if(nPoint < 0) return false; - INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); - if(envelope == nullptr) return false; + INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); + if(envelope == nullptr) return false; - maxpoints = envelope->nNodes; - pPoints = envelope->Ticks; - pData = envelope->Values; - - if (!nPoint) nTick = 0; - if ((nPoint < (int)maxpoints) && (pPoints) && (pData)) + bool bOK = false; + if (!nPoint) nTick = 0; + if (nPoint < (int)envelope->nNodes) + { + if (nTick >= 0) + { + int mintick = (nPoint) ? envelope->Ticks[nPoint-1] : 0; + int maxtick = envelope->Ticks[nPoint+1]; + if (nPoint + 1 == (int)envelope->nNodes) maxtick = 16383; + if (nTick < mintick) nTick = mintick; + if (nTick > maxtick) nTick = maxtick; + if (nTick != envelope->Ticks[nPoint]) { - if (nTick >= 0) - { - int mintick = (nPoint) ? pPoints[nPoint-1] : 0; - int maxtick = pPoints[nPoint+1]; - if (nPoint+1 == (int)maxpoints) maxtick = 16383; - if (nTick < mintick) nTick = mintick; - if (nTick > maxtick) nTick = maxtick; - if (nTick != pPoints[nPoint]) - { - pPoints[nPoint] = (WORD)nTick; - bOk = true; - } - } - if (nValue >= 0) - { - if (nValue > 64) nValue = 64; - if (nValue != pData[nPoint]) - { - pData[nPoint] = (BYTE)nValue; - bOk = true; - } - } + envelope->Ticks[nPoint] = (WORD)nTick; + bOK = true; } } + if (nValue >= 0) + { + if (nValue > 64) nValue = 64; + if (nValue != envelope->Values[nPoint]) + { + envelope->Values[nPoint] = (BYTE)nValue; + bOK = true; + } + } } - return bOk; + return bOK; } @@ -341,90 +308,16 @@ } -bool CViewInstrument::EnvGetLoop() const -//-------------------------------------- +// Return if an envelope flag is set. +bool CViewInstrument::EnvGetFlag(const DWORD dwFlag) const +//-------------------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - switch(m_nEnv) - { - case ENV_VOLUME: - if (pIns->dwFlags & ENV_VOLLOOP) return true; - break; - case ENV_PANNING: - if (pIns->dwFlags & ENV_PANLOOP) return true; - break; - case ENV_PITCH: - if (pIns->dwFlags & ENV_PITCHLOOP) return true; - break; - } - } - } + INSTRUMENTENVELOPE *pEnv = GetEnvelopePtr(); + if(pEnv != nullptr && pEnv->dwFlags & dwFlag) return true; return false; } -bool CViewInstrument::EnvGetSustain() const -//----------------------------------------- -{ - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - switch(m_nEnv) - { - case ENV_VOLUME: - if (pIns->dwFlags & ENV_VOLSUSTAIN) return true; - break; - case ENV_PANNING: - if (pIns->dwFlags & ENV_PANSUSTAIN) return true; - break; - case ENV_PITCH: - if (pIns->dwFlags & ENV_PITCHSUSTAIN) return true; - break; - } - } - } - return false; -} - - -bool CViewInstrument::EnvGetCarry() const -//--------------------------------------- -{ - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - switch(m_nEnv) - { - case ENV_VOLUME: - if (pIns->dwFlags & ENV_VOLCARRY) return true; - break; - case ENV_PANNING: - if (pIns->dwFlags & ENV_PANCARRY) return true; - break; - case ENV_PITCH: - if (pIns->dwFlags & ENV_PITCHCARRY) return true; - break; - } - } - } - return false; -} - - UINT CViewInstrument::EnvGetLoopStart() const //------------------------------------------- { @@ -469,7 +362,7 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return (pIns->dwFlags & ENV_VOLUME) ? true : false; + if (pIns) return (pIns->VolEnv.dwFlags & ENV_ENABLED) ? true : false; } return false; } @@ -483,7 +376,7 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return (pIns->dwFlags & ENV_PANNING) ? true : false; + if (pIns) return (pIns->PanEnv.dwFlags & ENV_ENABLED) ? true : false; } return false; } @@ -497,7 +390,7 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == ENV_PITCH) ? true : false; + if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == ENV_ENABLED) ? true : false; } return false; } @@ -511,7 +404,7 @@ { CSoundFile *pSndFile = pModDoc->GetSoundFile(); MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return ((pIns->dwFlags & (ENV_PITCH|ENV_FILTER)) == (ENV_PITCH|ENV_FILTER)) ? true : false; + if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == (ENV_ENABLED|ENV_FILTER)) ? true : false; } return false; } @@ -599,120 +492,57 @@ } -bool CViewInstrument::EnvSetLoop(bool bLoop) -//------------------------------------------ +// Enable or disable a flag of the current envelope +bool CViewInstrument::EnvSetFlag(const DWORD dwFlag, const bool bEnable) const +//---------------------------------------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) + INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); + if(envelope == nullptr) return false; + if(bEnable) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) + if(!(envelope->dwFlags & dwFlag)) { - DWORD dwMask = 0; - switch(m_nEnv) - { - case ENV_VOLUME: dwMask = ENV_VOLLOOP; break; - case ENV_PANNING: dwMask = ENV_PANLOOP; break; - case ENV_PITCH: dwMask = ENV_PITCHLOOP; break; - } - if (!dwMask) return false; - if (bLoop) - { - if (!(pIns->dwFlags & dwMask)) - { - pIns->dwFlags |= dwMask; - return true; - } - } else - { - if (pIns->dwFlags & dwMask) - { - pIns->dwFlags &= ~dwMask; - return true; - } - } + envelope->dwFlags |= dwFlag; + return true; } + } else + { + if(envelope->dwFlags & dwFlag) + { + envelope->dwFlags &= ~dwFlag; + return true; + } } return false; } -bool CViewInstrument::EnvSetSustain(bool bSustain) -//------------------------------------------------ +bool CViewInstrument::EnvToggleEnv(INSTRUMENTENVELOPE *pEnv, CSoundFile *pSndFile, MODINSTRUMENT *pIns, bool bEnable, BYTE cDefaultValue, DWORD dwChanFlag, DWORD dwExtraFlags) +//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) + if(pEnv == nullptr) return false; + + if (bEnable) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) + pEnv->dwFlags |= (ENV_ENABLED|dwExtraFlags); + if (!pEnv->nNodes) { - DWORD dwMask = 0; - switch(m_nEnv) - { - case ENV_VOLUME: dwMask = ENV_VOLSUSTAIN; break; - case ENV_PANNING: dwMask = ENV_PANSUSTAIN; break; - case ENV_PITCH: dwMask = ENV_PITCHSUSTAIN; break; - } - if (!dwMask) return false; - if (bSustain) - { - if (!(pIns->dwFlags & dwMask)) - { - pIns->dwFlags |= dwMask; - return true; - } - } else - { - if (pIns->dwFlags & dwMask) - { - pIns->dwFlags &= ~dwMask; - return true; - } - } + pEnv->Values[0] = pEnv->Values[1] = cDefaultValue; + pEnv->Ticks[0] = 0; + pEnv->Ticks[1] = 10; + pEnv->nNodes = 2; + InvalidateRect(NULL, FALSE); } - } - return false; -} - - -bool CViewInstrument::EnvSetCarry(bool bCarry) -//-------------------------------------------- -{ - CModDoc *pModDoc = GetDocument(); - if (pModDoc) + } else { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) + pEnv->dwFlags &= ~(ENV_ENABLED|dwExtraFlags); + for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++) { - DWORD dwMask = 0; - switch(m_nEnv) - { - case ENV_VOLUME: dwMask = ENV_VOLCARRY; break; - case ENV_PANNING: dwMask = ENV_PANCARRY; break; - case ENV_PITCH: dwMask = ENV_PITCHCARRY; break; - } - if (!dwMask) return false; - if (bCarry) - { - if (!(pIns->dwFlags & dwMask)) - { - pIns->dwFlags |= dwMask; - return true; - } - } else - { - if (pIns->dwFlags & dwMask) - { - pIns->dwFlags &= ~dwMask; - return true; - } - } + if(pSndFile->Chn[nChn].pModInstrument == pIns) + pSndFile->Chn[nChn].dwFlags &= ~dwChanFlag; } } - return false; + return true; } @@ -720,37 +550,13 @@ //---------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - if (bEnable) - { - pIns->dwFlags |= ENV_VOLUME; - if (!pIns->VolEnv.nNodes) - { - pIns->VolEnv.Values[0] = 64; - pIns->VolEnv.Values[1] = 64; - pIns->VolEnv.Ticks[0] = 0; - pIns->VolEnv.Ticks[1] = 10; - pIns->VolEnv.nNodes = 2; - InvalidateRect(NULL, FALSE); - } - } else - { - pIns->dwFlags &= ~ENV_VOLUME; - for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++) - { - if(pSndFile->Chn[nChn].pModInstrument == pIns) - pSndFile->Chn[nChn].dwFlags &= ~CHN_VOLENV; - } - } - return true; - } - } - return false; + if(pModDoc == nullptr) return false; + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return false; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if(pIns == nullptr) return false; + + return EnvToggleEnv(&pIns->VolEnv, pSndFile, pIns, bEnable, 64, CHN_VOLENV); } @@ -758,37 +564,13 @@ //---------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - if (bEnable) - { - pIns->dwFlags |= ENV_PANNING; - if (!pIns->PanEnv.nNodes) - { - pIns->PanEnv.Values[0] = 32; - pIns->PanEnv.Values[1] = 32; - pIns->PanEnv.Ticks[0] = 0; - pIns->PanEnv.Ticks[1] = 10; - pIns->PanEnv.nNodes = 2; - InvalidateRect(NULL, FALSE); - } - } else - { - pIns->dwFlags &= ~ENV_PANNING; - for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++) - { - if(pSndFile->Chn[nChn].pModInstrument == pIns) - pSndFile->Chn[nChn].dwFlags &= ~CHN_PANENV; - } - } - return true; - } - } - return false; + if(pModDoc == nullptr) return false; + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return false; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if(pIns == nullptr) return false; + + return EnvToggleEnv(&pIns->PanEnv, pSndFile, pIns, bEnable, 32, CHN_PANENV); } @@ -796,38 +578,14 @@ //------------------------------------------------ { CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - if ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) - { - pIns->dwFlags |= ENV_PITCH; - pIns->dwFlags &= ~ENV_FILTER; - if (!pIns->PitchEnv.nNodes) - { - pIns->PitchEnv.Values[0] = 32; - pIns->PitchEnv.Values[1] = 32; - pIns->PitchEnv.Ticks[0] = 0; - pIns->PitchEnv.Ticks[1] = 10; - pIns->PitchEnv.nNodes = 2; - InvalidateRect(NULL, FALSE); - } - } else - { - pIns->dwFlags &= ~(ENV_PITCH|ENV_FILTER); - for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++) - { - if(pSndFile->Chn[nChn].pModInstrument == pIns) - pSndFile->Chn[nChn].dwFlags &= ~CHN_PITCHENV; - } - } - return true; - } - } - return false; + if(pModDoc == nullptr) return false; + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return false; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if(pIns == nullptr) return false; + + pIns->PitchEnv.dwFlags &= ~ENV_FILTER; + return EnvToggleEnv(&pIns->PitchEnv, pSndFile, pIns, bEnable, 32, CHN_PITCHENV); } @@ -835,38 +593,14 @@ //------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) - { - if ((bEnable) && (pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) - { - pIns->dwFlags |= (ENV_PITCH|ENV_FILTER); - if (!pIns->PitchEnv.nNodes) - { - pIns->PitchEnv.Values[0] = 64; - pIns->PitchEnv.Values[1] = 64; - pIns->PitchEnv.Ticks[0] = 0; - pIns->PitchEnv.Ticks[1] = 10; - pIns->PitchEnv.nNodes = 2; - InvalidateRect(NULL, FALSE); - } - } else - { - pIns->dwFlags &= ~(ENV_PITCH|ENV_FILTER); - // prevent filter envelop from turning into a pitch envelope :) - for(CHANNELINDEX nChn = 0; nChn < MAX_CHANNELS; nChn++) - { - if(pSndFile->Chn[nChn].pModInstrument == pIns) - pSndFile->Chn[nChn].dwFlags &= ~CHN_PITCHENV; - } - } - return true; - } - } - return false; + if(pModDoc == nullptr) return false; + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return false; + MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + if(pIns == nullptr) return false; + + pIns->PitchEnv.dwFlags &= ~ENV_FILTER; + return EnvToggleEnv(&pIns->PitchEnv, pSndFile, pIns, bEnable, 64, CHN_PITCHENV, ENV_FILTER); } @@ -1123,11 +857,11 @@ { DrawGrid(&m_dcMemMain, pSndFile->m_nMusicSpeed); } - if (m_nEnv != ENV_VOLUME) - { - m_dcMemMain.MoveTo(0, ymed); - m_dcMemMain.LineTo(m_rcClient.right, ymed); - } + + // Middle line (half volume or pitch / panning center) + m_dcMemMain.MoveTo(0, ymed); + m_dcMemMain.LineTo(m_rcClient.right, ymed); + m_dcMemMain.SelectObject(CMainFrame::penDarkGray); // Drawing Loop Start/End if (EnvGetLoop()) @@ -1226,7 +960,7 @@ } bool CViewInstrument::EnvRemovePoint() -//-------------------------------------- +//------------------------------------ { CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (m_nDragItem) && (m_nDragItem-1 <= EnvGetLastPoint())) @@ -1292,7 +1026,7 @@ cDefaultValue = 32; break; case ENV_PITCH: - cDefaultValue = (pIns->dwFlags & ENV_FILTER) ? 64 : 32; + cDefaultValue = (pIns->PitchEnv.dwFlags & ENV_FILTER) ? 64 : 32; break; default: return false; @@ -1659,7 +1393,7 @@ if (nVal > 64) nVal = 64; if (nTick < 0) nTick = 0; if (nTick <= EnvGetReleaseNodeTick() + 1 || EnvGetReleaseNode() == ENV_RELEASE_NODE_UNSET) { - int displayVal = (m_nEnv != ENV_VOLUME && !(m_nEnv == ENV_PITCH && (pIns->dwFlags & ENV_FILTER))) ? nVal - 32 : nVal; + int displayVal = (m_nEnv != ENV_VOLUME && !(m_nEnv == ENV_PITCH && (pIns->PitchEnv.dwFlags & ENV_FILTER))) ? nVal - 32 : nVal; wsprintf(s, "Tick %d, [%d]", nTick, displayVal); } else { int displayVal = (nVal - EnvGetReleaseNodeValue()) * 2; @@ -2468,10 +2202,11 @@ } + +// Get a pointer to the currently selected envelope. INSTRUMENTENVELOPE *CViewInstrument::GetEnvelopePtr() const //--------------------------------------------------------- { - // Get a pointer to the currently selected envelope. // First do some standard checks... CModDoc *pModDoc = GetDocument(); if(pModDoc == nullptr) return nullptr; Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/View_ins.h 2009-11-07 21:40:01 UTC (rev 415) @@ -18,7 +18,8 @@ RECT m_rcClient; bool m_baPlayingNote[128]; //rewbs.instViewNNA INSTRUMENTINDEX m_nInstrument; - UINT m_nEnv, m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel; + enmEnvelopeTypes m_nEnv; + UINT m_nDragItem, m_nBtnMouseOver, m_nPlayingChannel; DWORD m_dwStatus; DWORD m_NcButtonState[ENV_LEFTBAR_BUTTONS]; DWORD m_dwNotifyPos[MAX_CHANNELS]; @@ -39,37 +40,64 @@ CViewInstrument(); DECLARE_SERIAL(CViewInstrument) -public: - void UpdateScrollSize(); - BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, UINT m_nEnv=0); - INSTRUMENTENVELOPE *GetEnvelopePtr() const; +protected: + //////////////////////// + // Envelope get stuff + + // Flags + bool EnvGetFlag(const DWORD dwFlag) const; + bool EnvGetLoop() const {return EnvGetFlag(ENV_LOOP);}; + bool EnvGetSustain() const {return EnvGetFlag(ENV_SUSTAIN);}; + bool EnvGetCarry() const {return EnvGetFlag(ENV_CARRY);}; + + // Misc. UINT EnvGetTick(int nPoint) const; UINT EnvGetValue(int nPoint) const; UINT EnvGetLastPoint() const; UINT EnvGetNumPoints() const; + + // Get loop points UINT EnvGetLoopStart() const; UINT EnvGetLoopEnd() const; UINT EnvGetSustainStart() const; UINT EnvGetSustainEnd() const; - bool EnvGetLoop() const; - bool EnvGetSustain() const; - bool EnvGetCarry() const; + + // Get envelope status bool EnvGetVolEnv() const; bool EnvGetPanEnv() const; bool EnvGetPitchEnv() const; bool EnvGetFilterEnv() const; + + //////////////////////// + // Envelope set stuff + + // Flags + bool EnvSetFlag(const DWORD dwFlag, const bool bEnable) const; + bool EnvSetLoop(bool bEnable) const {return EnvSetFlag(ENV_LOOP, bEnable);}; + bool EnvSetSustain(bool bEnable) const {return EnvSetFlag(ENV_SUSTAIN, bEnable);}; + bool EnvSetCarry(bool bEnable) const {return EnvSetFlag(ENV_CARRY, bEnable);}; + + // Misc. bool EnvSetValue(int nPoint, int nTick=-1, int nValue=-1); + + // Set loop points bool EnvSetLoopStart(int nPoint); bool EnvSetLoopEnd(int nPoint); bool EnvSetSustainStart(int nPoint); bool EnvSetSustainEnd(int nPoint); - bool EnvSetLoop(bool bLoop); - bool EnvSetSustain(bool bSustain); - bool EnvSetCarry(bool bCarry); + + // Set envelope status + bool EnvToggleEnv(INSTRUMENTENVELOPE *pEnv, CSoundFile *pSndFile, MODINSTRUMENT *pIns, bool bEnable, BYTE cDefaultValue, DWORD dwChanFlag, DWORD dwExtraFlags = 0); bool EnvSetVolEnv(bool bEnable); bool EnvSetPanEnv(bool bEnable); bool EnvSetPitchEnv(bool bEnable); bool EnvSetFilterEnv(bool bEnable); + + //////////////////////// + // Misc stuff + void UpdateScrollSize(); + BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes m_nEnv = ENV_VOLUME); + INSTRUMENTENVELOPE *GetEnvelopePtr() const; UINT EnvInsertPoint(); bool EnvRemovePoint(); int TickToScreen(int nTick) const; Modified: trunk/OpenMPT/mptrack/view_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/mptrack/view_com.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -383,9 +383,9 @@ case INSLIST_ENVELOPES: if (pIns) { - if (pIns->dwFlags & ENV_VOLUME) strcat(s, "Vol"); - if (pIns->dwFlags & ENV_PANNING) { if (s[0]) strcat(s, ", "); strcat(s, "Pan"); } - if (pIns->dwFlags & ENV_PITCH) { if (s[0]) strcat(s, ", "); strcat(s, (pIns->dwFlags & ENV_FILTER) ? "Filter" : "Pitch"); } + if (pIns->VolEnv.dwFlags & ENV_ENABLED) strcat(s, "Vol"); + if (pIns->PanEnv.dwFlags & ENV_ENABLED) { if (s[0]) strcat(s, ", "); strcat(s, "Pan"); } + if (pIns->PitchEnv.dwFlags & ENV_ENABLED) { if (s[0]) strcat(s, ", "); strcat(s, (pIns->PitchEnv.dwFlags & ENV_FILTER) ? "Filter" : "Pitch"); } } break; case INSLIST_FILENAME: Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -1772,7 +1772,7 @@ // Volume Envelope if ((part->wVolAttack) || (part->wVolDecay < 20*50) || (part->nVolSustainLevel) || (part->wVolRelease < 20*50)) { - pIns->dwFlags |= ENV_VOLUME; + pIns->VolEnv.dwFlags |= ENV_ENABLED; // Delay section // -> DLS level 2 // Attack section @@ -1830,10 +1830,10 @@ nPoint++; } } - pIns->dwFlags |= ENV_VOLSUSTAIN; + pIns->VolEnv.dwFlags |= ENV_SUSTAIN; } else { - pIns->dwFlags |= ENV_VOLSUSTAIN; + pIns->VolEnv.dwFlags |= ENV_SUSTAIN; pIns->VolEnv.Ticks[nPoint] = (WORD)(pIns->VolEnv.Ticks[nPoint-1]+1); pIns->VolEnv.Values[nPoint] = pIns->VolEnv.Values[nPoint-1]; nPoint++; @@ -1884,10 +1884,10 @@ if (pDlsIns->ulBank & F_INSTRUMENT_DRUMS) { // Create a default envelope for drums - pIns->dwFlags &= ~ENV_VOLSUSTAIN; - if (!(pIns->dwFlags & ENV_VOLUME)) + pIns->VolEnv.dwFlags &= ~ENV_SUSTAIN; + if (!(pIns->VolEnv.dwFlags & ENV_ENABLED)) { - pIns->dwFlags |= ENV_VOLUME; + pIns->VolEnv.dwFlags |= ENV_ENABLED; pIns->VolEnv.Ticks[0] = 0; pIns->VolEnv.Values[0] = 64; pIns->VolEnv.Ticks[1] = 5; Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-11-07 21:40:01 UTC (rev 415) @@ -166,7 +166,7 @@ pIns->nGlobalVol = 64; pIns->nPan = BigEndianW(pih->panning); if ((pIns->nPan) && (pIns->nPan < 256)) - pIns->dwFlags = ENV_SETPANNING; + pIns->dwFlags = INS_SETPANNING; else pIns->nPan = 128; pIns->nPPC = 5*12; @@ -218,9 +218,9 @@ { MODINSTRUMENT *pIns = Instruments[nins]; - if (peh->flags & 1) pIns->dwFlags |= ENV_VOLUME; - if (peh->flags & 2) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (peh->flags & 4) pIns->dwFlags |= ENV_VOLLOOP; + if (peh->flags & 1) pIns->VolEnv.dwFlags |= ENV_ENABLED; + if (peh->flags & 2) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; + if (peh->flags & 4) pIns->VolEnv.dwFlags |= ENV_LOOP; pIns->VolEnv.nNodes = peh->numpoints + 1; if (pIns->VolEnv.nNodes > MAX_ENVPOINTS) pIns->VolEnv.nNodes = MAX_ENVPOINTS; pIns->VolEnv.nLoopStart = peh->loopbegin; Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -401,9 +401,9 @@ } pIns->nFadeOut = (((lpStream[dwMemPos+2] & 0x0F) << 8) | (lpStream[dwMemPos+1])) << 3; UINT envflags = lpStream[dwMemPos+3]; - if (envflags & 0x01) pIns->dwFlags |= ENV_VOLLOOP; - if (envflags & 0x02) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (envflags & 0x04) pIns->dwFlags |= ENV_VOLUME; + if (envflags & 0x01) pIns->VolEnv.dwFlags |= ENV_LOOP; + if (envflags & 0x02) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; + if (envflags & 0x04) pIns->VolEnv.dwFlags |= ENV_ENABLED; dwMemPos += 5; // Read Samples for (UINT ismp=0; ismp<pSmp->samples; ismp++) Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -135,6 +135,7 @@ }; static void import_imf_effect(MODCOMMAND *note) +//--------------------------------------------- { BYTE n; // fix some of them @@ -224,17 +225,13 @@ } } -static unsigned int envflags[3][3] = { - {ENV_VOLUME, ENV_VOLSUSTAIN, ENV_VOLLOOP}, - {ENV_PANNING, ENV_PANSUSTAIN, ENV_PANLOOP}, - {ENV_PITCH | ENV_FILTER, ENV_PITCHSUSTAIN, ENV_PITCHLOOP}, -}; - -static void load_imf_envelope(MODINSTRUMENT *ins, INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e) +static void load_imf_envelope(INSTRUMENTENVELOPE *env, IMFINSTRUMENT *imfins, int e) +//---------------------------------------------------------------------------------- { UINT min = 0; // minimum tick value for next node int shift = (e == IMF_ENV_VOL) ? 0 : 2; + env->dwFlags = ((imfins->env[e].flags & 1) ? ENV_ENABLED : 0) | ((imfins->env[e].flags & 2) ? ENV_SUSTAIN : 0) | ((imfins->env[e].flags & 4) ? ENV_LOOP : 0); env->nNodes = CLAMP(imfins->env[e].points, 2, 25); env->nLoopStart = imfins->env[e].loop_start; env->nLoopEnd = imfins->env[e].loop_end; @@ -249,16 +246,10 @@ env->Values[n] = (BYTE)min(nValue, 64); min = nTick + 1; } - // this would be less retarded if the envelopes all had their own flags... - if (imfins->env[e].flags & 1) - ins->dwFlags |= envflags[e][0]; - if (imfins->env[e].flags & 2) - ins->dwFlags |= envflags[e][1]; - if (imfins->env[e].flags & 4) - ins->dwFlags |= envflags[e][2]; } bool CSoundFile::ReadIMF(const LPCBYTE lpStream, const DWORD dwMemLength) +//----------------------------------------------------------------------- { #define ASSERT_CAN_READ(x) \ if( dwMemPos > dwMemLength || x > dwMemLength - dwMemPos ) return false; @@ -487,12 +478,13 @@ pIns->nFadeOut = imfins.fadeout; pIns->nGlobalVol = 128; - load_imf_envelope(pIns, &pIns->VolEnv, &imfins, IMF_ENV_VOL); - load_imf_envelope(pIns, &pIns->PanEnv, &imfins, IMF_ENV_PAN); - load_imf_envelope(pIns, &pIns->PitchEnv, &imfins, IMF_ENV_FILTER); + load_imf_envelope(&pIns->VolEnv, &imfins, IMF_ENV_VOL); + load_imf_envelope(&pIns->PanEnv, &imfins, IMF_ENV_PAN); + load_imf_envelope(&pIns->PitchEnv, &imfins, IMF_ENV_FILTER); + if((pIns->PitchEnv.dwFlags & ENV_ENABLED) != 0) pIns->PitchEnv.dwFlags |= ENV_FILTER; // hack to get === to stop notes (from modplug's xm loader) - if (!(pIns->dwFlags & ENV_VOLUME) && !pIns->nFadeOut) + if (!(pIns->VolEnv.dwFlags & ENV_ENABLED) && !pIns->nFadeOut) pIns->nFadeOut = 8192; // read this instrument's samples Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -216,10 +216,37 @@ 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) +//---------------------------------------------------------------------------------------- +{ + if(mptEnv->dwFlags & ENV_ENABLED) itEnv->flags |= 1; + if(mptEnv->dwFlags & ENV_LOOP) itEnv->flags |= 2; + if(mptEnv->dwFlags & ENV_SUSTAIN) itEnv->flags |= 4; + if(mptEnv->dwFlags & ENV_CARRY) itEnv->flags |= 8; + itEnv->num = (BYTE)min(mptEnv->nNodes, 25); + itEnv->lpb = (BYTE)mptEnv->nLoopStart; + itEnv->lpe = (BYTE)mptEnv->nLoopEnd; + 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++) + { + 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; + } +} + // 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) //----------------------------------------------------------------------------------------------------------- { + if(itEnv->flags & 1) mptEnv->dwFlags |= ENV_ENABLED; + if(itEnv->flags & 2) mptEnv->dwFlags |= ENV_LOOP; + if(itEnv->flags & 4) mptEnv->dwFlags |= ENV_SUSTAIN; + if(itEnv->flags & 8) mptEnv->dwFlags |= ENV_CARRY; mptEnv->nNodes = min(itEnv->num, iEnvMax); mptEnv->nLoopStart = itEnv->lpb; mptEnv->nLoopEnd = itEnv->lpe; @@ -262,9 +289,9 @@ if (note < 128) pIns->NoteMap[j] = note+1; else if (note >= 0xFE) pIns->NoteMap[j] = note; } - if (pis->flags & 0x01) pIns->dwFlags |= ENV_VOLUME; - if (pis->flags & 0x02) pIns->dwFlags |= ENV_VOLLOOP; - if (pis->flags & 0x04) pIns->dwFlags |= ENV_VOLSUSTAIN; + if (pis->flags & 0x01) pIns->VolEnv.dwFlags |= ENV_ENABLED; + if (pis->flags & 0x02) pIns->VolEnv.dwFlags |= ENV_LOOP; + if (pis->flags & 0x04) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; pIns->VolEnv.nLoopStart = pis->vls; pIns->VolEnv.nLoopEnd = pis->vle; pIns->VolEnv.nSustainStart = pis->sls; @@ -373,24 +400,12 @@ // Volume Envelope - if (pis->volenv.flags & 1) pIns->dwFlags |= ENV_VOLUME; - 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; 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; 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; ITEnvToMPT(&pis->pitchenv, &pIns->PitchEnv, 32, iEnvMax); + if (pis->pitchenv.flags & 0x80) pIns->PitchEnv.dwFlags |= ENV_FILTER; pIns->nNNA = pis->nna; pIns->nDCT = pis->dct; @@ -406,11 +421,11 @@ pIns->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL; pIns->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; if (pIns->nPan > 256) pIns->nPan = 128; - if (pis->dfp < 0x80) pIns->dwFlags |= ENV_SETPANNING; + if (pis->dfp < 0x80) pIns->dwFlags |= INS_SETPANNING; } - 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; + if ((pIns->VolEnv.nLoopStart >= iEnvMax) || (pIns->VolEnv.nLoopEnd >= iEnvMax)) pIns->VolEnv.dwFlags &= ~ENV_LOOP; + if ((pIns->VolEnv.nSustainStart >= iEnvMax) || (pIns->VolEnv.nSustainEnd >= iEnvMax)) pIns->VolEnv.dwFlags &= ~ENV_SUSTAIN; return returnVal; //return offset } @@ -1995,7 +2010,7 @@ iti.ppc = pIns->nPPC; iti.gbv = (BYTE)(pIns->nGlobalVol << 1); iti.dfp = (BYTE)pIns->nPan >> 2; - if (!(pIns->dwFlags & ENV_SETPANNING)) iti.dfp |= 0x80; + if (!(pIns->dwFlags & INS_SETPANNING)) iti.dfp |= 0x80; iti.rv = pIns->nVolSwing; iti.rp = pIns->nPanSwing; iti.ifc = pIns->nIFC; @@ -2015,49 +2030,12 @@ keyboardex[i] = (smp>>8); } else keyboardex[i] = 0; // Writing Volume envelope - if (pIns->dwFlags & ENV_VOLUME) iti.volenv.flags |= 0x01; - if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02; - if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04; - if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08; - iti.volenv.num = (BYTE)pIns->VolEnv.nNodes; - iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart; - iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd; - iti.volenv.slb = pIns->VolEnv.nSustainStart; - iti.volenv.sle = pIns->VolEnv.nSustainEnd; + MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0); // Writing Panning envelope - if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01; - if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02; - if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04; - if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08; - iti.panenv.num = (BYTE)pIns->PanEnv.nNodes; - iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart; - iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd; - iti.panenv.slb = pIns->PanEnv.nSustainStart; - iti.panenv.sle = pIns->PanEnv.nSustainEnd; + MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32); // Writing Pitch Envelope - if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01; - if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02; - if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04; - if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08; - if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; - iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes; - iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart; - iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd; - iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart; - iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd; - // Writing Envelopes data - for (UINT ev=0; ev<25; ev++) - { - iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev]; - iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF; - iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8; - iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32; - iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF; - iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8; - iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32; - iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF; - iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8; - } + MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32); + if (pIns->PitchEnv.dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; } else // Save Empty Instrument { @@ -2636,7 +2614,7 @@ iti.ppc = pIns->nPPC; iti.gbv = (BYTE)(pIns->nGlobalVol << 1); iti.dfp = (BYTE)pIns->nPan >> 2; - if (!(pIns->dwFlags & ENV_SETPANNING)) iti.dfp |= 0x80; + if (!(pIns->dwFlags & INS_SETPANNING)) iti.dfp |= 0x80; iti.rv = pIns->nVolSwing; iti.rp = pIns->nPanSwing; iti.ifc = pIns->nIFC; @@ -2656,49 +2634,12 @@ keyboardex[i] = (smp>>8); } else keyboardex[i] = 0; // Writing Volume envelope - if (pIns->dwFlags & ENV_VOLUME) iti.volenv.flags |= 0x01; - if (pIns->dwFlags & ENV_VOLLOOP) iti.volenv.flags |= 0x02; - if (pIns->dwFlags & ENV_VOLSUSTAIN) iti.volenv.flags |= 0x04; - if (pIns->dwFlags & ENV_VOLCARRY) iti.volenv.flags |= 0x08; - iti.volenv.num = (BYTE)pIns->VolEnv.nNodes; - iti.volenv.lpb = (BYTE)pIns->VolEnv.nLoopStart; - iti.volenv.lpe = (BYTE)pIns->VolEnv.nLoopEnd; - iti.volenv.slb = pIns->VolEnv.nSustainStart; - iti.volenv.sle = pIns->VolEnv.nSustainEnd; + MPTEnvToIT(&pIns->VolEnv, &iti.volenv, 0); // Writing Panning envelope - if (pIns->dwFlags & ENV_PANNING) iti.panenv.flags |= 0x01; - if (pIns->dwFlags & ENV_PANLOOP) iti.panenv.flags |= 0x02; - if (pIns->dwFlags & ENV_PANSUSTAIN) iti.panenv.flags |= 0x04; - if (pIns->dwFlags & ENV_PANCARRY) iti.panenv.flags |= 0x08; - iti.panenv.num = (BYTE)pIns->PanEnv.nNodes; - iti.panenv.lpb = (BYTE)pIns->PanEnv.nLoopStart; - iti.panenv.lpe = (BYTE)pIns->PanEnv.nLoopEnd; - iti.panenv.slb = pIns->PanEnv.nSustainStart; - iti.panenv.sle = pIns->PanEnv.nSustainEnd; + MPTEnvToIT(&pIns->PanEnv, &iti.panenv, 32); // Writing Pitch Envelope - if (pIns->dwFlags & ENV_PITCH) iti.pitchenv.flags |= 0x01; - if (pIns->dwFlags & ENV_PITCHLOOP) iti.pitchenv.flags |= 0x02; - if (pIns->dwFlags & ENV_PITCHSUSTAIN) iti.pitchenv.flags |= 0x04; - if (pIns->dwFlags & ENV_PITCHCARRY) iti.pitchenv.flags |= 0x08; - if (pIns->dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; - iti.pitchenv.num = (BYTE)pIns->PitchEnv.nNodes; - iti.pitchenv.lpb = (BYTE)pIns->PitchEnv.nLoopStart; - iti.pitchenv.lpe = (BYTE)pIns->PitchEnv.nLoopEnd; - iti.pitchenv.slb = (BYTE)pIns->PitchEnv.nSustainStart; - iti.pitchenv.sle = (BYTE)pIns->PitchEnv.nSustainEnd; - // Writing Envelopes data - for (UINT ev=0; ev<25; ev++) - { - iti.volenv.data[ev*3] = pIns->VolEnv.Values[ev]; - iti.volenv.data[ev*3+1] = pIns->VolEnv.Ticks[ev] & 0xFF; - iti.volenv.data[ev*3+2] = pIns->VolEnv.Ticks[ev] >> 8; - iti.panenv.data[ev*3] = pIns->PanEnv.Values[ev] - 32; - iti.panenv.data[ev*3+1] = pIns->PanEnv.Ticks[ev] & 0xFF; - iti.panenv.data[ev*3+2] = pIns->PanEnv.Ticks[ev] >> 8; - iti.pitchenv.data[ev*3] = pIns->PitchEnv.Values[ev] - 32; - iti.pitchenv.data[ev*3+1] = pIns->PitchEnv.Ticks[ev] & 0xFF; - iti.pitchenv.data[ev*3+2] = pIns->PitchEnv.Ticks[ev] >> 8; - } + MPTEnvToIT(&pIns->PitchEnv, &iti.pitchenv, 32); + if (pIns->PitchEnv.dwFlags & ENV_FILTER) iti.pitchenv.flags |= 0x80; } else // Save Empty Instrument { Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -95,6 +95,30 @@ } +// Convert MDL envelope data (env points and flags) +void ConvertMDLEnvelope(const unsigned char *pMDLEnv, INSTRUMENTENVELOPE *pMPTEnv) +//-------------------------------------------------------------------------------- +{ + WORD nCurTick = 1; + pMPTEnv->nNodes = 15; + for (UINT nTick = 0; nTick < 15; nTick++) + { + if (nTick) nCurTick += pMDLEnv[nTick * 2 + 1]; + pMPTEnv->Ticks[nTick] = nCurTick; + pMPTEnv->Values[nTick] = pMDLEnv[nTick * 2 + 2]; + if (!pMDLEnv[nTick * 2 + 1]) // last point reached + { + pMPTEnv->nNodes = nTick + 1; + break; + } + } + pMPTEnv->nSustainStart = pMPTEnv->nSustainEnd = pMDLEnv[31] & 0x0F; + pMPTEnv->dwFlags |= ((pMDLEnv[31] & 0x10) ? ENV_SUSTAIN : 0) | ((pMDLEnv[31] & 0x20) ? ENV_LOOP : 0); + pMPTEnv->nLoopStart = pMDLEnv[32] & 0x0F; + pMPTEnv->nLoopEnd = pMDLEnv[32] >> 4; +} + + void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, const BYTE *lpTracks) //------------------------------------------------------------------------------------------------- { @@ -359,13 +383,13 @@ // Use volume envelope ? if (ps[3] & 0x80) { - pIns->dwFlags |= ENV_VOLUME; + pIns->VolEnv.dwFlags |= ENV_ENABLED; insvolenv[nins] = (ps[3] & 0x3F) + 1; } // Use panning envelope ? if (ps[5] & 0x80) { - pIns->dwFlags |= ENV_PANNING; + pIns->PanEnv.dwFlags |= ENV_ENABLED; inspanenv[nins] = (ps[5] & 0x3F) + 1; } } @@ -495,56 +519,24 @@ // Set up envelopes for (UINT iIns=1; iIns<=m_nInstruments; iIns++) if (Instruments[iIns]) { - MODINSTRUMENT *pIns = Instruments[iIns]; // Setup volume envelope if ((nvolenv) && (pvolenv) && (insvolenv[iIns])) { LPCBYTE pve = pvolenv; - for (UINT nve=0; nve<nvolenv; nve++, pve+=33) if (pve[0]+1 == insvolenv[iIns]) + for (UINT nve = 0; nve < nvolenv; nve++, pve += 33) { - WORD vtick = 1; - pIns->VolEnv.nNodes = 15; - for (UINT iv=0; iv<15; iv++) - { - if (iv) vtick += pve[iv*2+1]; - pIns->VolEnv.Ticks[iv] = vtick; - pIns->VolEnv.Values[iv] = pve[iv*2+2]; - if (!pve[iv*2+1]) - { - pIns->VolEnv.nNodes = iv+1; - break; - } - } - pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = pve[31] & 0x0F; - if (pve[31] & 0x10) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (pve[31] & 0x20) pIns->dwFlags |= ENV_VOLLOOP; - pIns->VolEnv.nLoopStart = pve[32] & 0x0F; - pIns->VolEnv.nLoopEnd = pve[32] >> 4; + if (pve[0] + 1 == insvolenv[iIns]) + ConvertMDLEnvelope(pve, &Instruments[iIns]->VolEnv); } } // Setup panning envelope if ((npanenv) && (ppanenv) && (inspanenv[iIns])) { LPCBYTE ppe = ppanenv; - for (UINT npe=0; npe<npanenv; npe++, ppe+=33) if (ppe[0]+1 == inspanenv[iIns]) + for (UINT npe = 0; npe < npanenv; npe++, ppe += 33) { - WORD vtick = 1; - pIns->PanEnv.nNodes = 15; - for (UINT iv=0; iv<15; iv++) - { - if (iv) vtick += ppe[iv*2+1]; - pIns->PanEnv.Ticks[iv] = vtick; - pIns->PanEnv.Values[iv] = ppe[iv*2+2]; - if (!ppe[iv*2+1]) - { - pIns->PanEnv.nNodes = iv+1; - break; - } - } - if (ppe[31] & 0x10) pIns->dwFlags |= ENV_PANSUSTAIN; - if (ppe[31] & 0x20) pIns->dwFlags |= ENV_PANLOOP; - pIns->PanEnv.nLoopStart = ppe[32] & 0x0F; - pIns->PanEnv.nLoopEnd = ppe[32] >> 4; + if (ppe[0] + 1 == inspanenv[iIns]) + ConvertMDLEnvelope(ppe, &Instruments[iIns]->PanEnv); } } } Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -439,8 +439,8 @@ pIns->Keyboard[j] = m_nSamples; pIns->NoteMap[j] = (BYTE)mapnote; } - pIns->dwFlags |= ENV_VOLUME; - if (nChannel != MIDI_DRUMCHANNEL) pIns->dwFlags |= ENV_VOLSUSTAIN; + pIns->VolEnv.dwFlags |= ENV_ENABLED; + if (nChannel != MIDI_DRUMCHANNEL) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; pIns->VolEnv.nNodes = 4; pIns->VolEnv.Ticks[0] = 0; pIns->VolEnv.Values[0] = 64; Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -270,7 +270,7 @@ } // Load Patterns dwMemPos = dwExtraDataPos + nExtraDataLen; - for (UINT iPat=0; iPat<pfh->wPatterns; iPat++) if (dwMemPos < dwMemLength-6) + for (PATTERNINDEX iPat=0; iPat < pfh->wPatterns; iPat++) if (dwMemPos < dwMemLength - 6) { MT2PATTERN *pmp = (MT2PATTERN *)(lpStream+dwMemPos); UINT wDataLen = (pmp->wDataLen + 1) & ~1; @@ -411,7 +411,7 @@ SpaceToNullStringFixed(pIns->name, 32); pIns->nGlobalVol = 64; pIns->nPan = 128; - for (UINT i=0; i<NOTE_MAX; i++) + for (BYTE i = 0; i < NOTE_MAX; i++) { pIns->NoteMap[i] = i+1; } @@ -461,59 +461,40 @@ for (UINT iEnv=0; iEnv<4; iEnv++) if (pehdr[iEnv]) { MT2ENVELOPE *pme = pehdr[iEnv]; - WORD *pEnvPoints = NULL; - BYTE *pEnvData = NULL; + INSTRUMENTENVELOPE *pEnv; #ifdef MT2DEBUG Log(" Env %d.%d @%04X: %d points\n", iIns, iEnv, (UINT)(((BYTE *)pme)-lpStream), pme->nPoints); #endif + switch(iEnv) - { - // Volume Envelope - case 0: - if (pme->nFlags & 1) pIns->dwFlags |= ENV_VOLUME; - if (pme->nFlags & 2) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (pme->nFlags & 4) pIns->dwFlags |= ENV_VOLLOOP; - pIns->VolEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints; - pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = pme->nSustainPos; - pIns->VolEnv.nLoopStart = pme->nLoopStart; - pIns->VolEnv.nLoopEnd = pme->nLoopEnd; - pEnvPoints = pIns->VolEnv.Ticks; - pEnvData = pIns->VolEnv.Values; + { + case 0: // Volume Envelope + pEnv = &pIns->VolEnv; break; - - // Panning Envelope - case 1: - if (pme->nFlags & 1) pIns->dwFlags |= ENV_PANNING; - if (pme->nFlags & 2) pIns->dwFlags |= ENV_PANSUSTAIN; - if (pme->nFlags & 4) pIns->dwFlags |= ENV_PANLOOP; - pIns->PanEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints; - pIns->PanEnv.nSustainStart = pIns->PanEnv.nSustainEnd = pme->nSustainPos; - pIns->PanEnv.nLoopStart = pme->nLoopStart; - pIns->PanEnv.nLoopEnd = pme->nLoopEnd; - pEnvPoints = pIns->PanEnv.Ticks; - pEnvData = pIns->PanEnv.Values; + case 1: // Panning Envelope + pEnv = &pIns->PanEnv; break; - - // Pitch/Filter envelope - default: - if (pme->nFlags & 1) pIns->dwFlags |= (iEnv==3) ? (ENV_PITCH|ENV_FILTER) : ENV_PITCH; - if (pme->nFlags & 2) pIns->dwFlags |= ENV_PITCHSUSTAIN; - if (pme->nFlags & 4) pIns->dwFlags |= ENV_PITCHLOOP; - pIns->PitchEnv.nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints; - pIns->PitchEnv.nSustainStart = pIns->PitchEnv.nSustainEnd = pme->nSustainPos; - pIns->PitchEnv.nLoopStart = pme->nLoopStart; - pIns->PitchEnv.nLoopEnd = pme->nLoopEnd; - pEnvPoints = pIns->PitchEnv.Ticks; - pEnvData = pIns->PitchEnv.Values; + default: // Pitch/Filter envelope + pEnv = &pIns->PitchEnv; + if ((pme->nFlags & 1) && (iEnv == 3)) pIns->PitchEnv.dwFlags |= ENV_FILTER; } + + if (pme->nFlags & 1) pEnv->dwFlags |= ENV_ENABLED; + if (pme->nFlags & 2) pEnv->dwFlags |= ENV_SUSTAIN; + if (pme->nFlags & 4) pEnv->dwFlags |= ENV_LOOP; + pEnv->nNodes = (pme->nPoints > 16) ? 16 : pme->nPoints; + pEnv->nSustainStart = pEnv->nSustainEnd = pme->nSustainPos; + pEnv->nLoopStart = pme->nLoopStart; + pEnv->nLoopEnd = pme->nLoopEnd; + // Envelope data - if ((pEnvPoints) && (pEnvData) && (pedata[iEnv])) + if (pedata[iEnv]) { WORD *psrc = pedata[iEnv]; for (UINT i=0; i<16; i++) { - pEnvPoints[i] = psrc[i*2]; - pEnvData[i] = (BYTE)psrc[i*2+1]; + pEnv->Ticks[i] = psrc[i*2]; + pEnv->Values[i] = (BYTE)psrc[i*2+1]; } } } Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -440,30 +440,30 @@ SetDefaultInstrumentValues(pIns); pIns->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL; pIns->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; - if (xmsh.vtype & 1) pIns->dwFlags |= ENV_VOLUME; - if (xmsh.vtype & 2) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (xmsh.vtype & 4) pIns->dwFlags |= ENV_VOLLOOP; - if (xmsh.ptype & 1) pIns->dwFlags |= ENV_PANNING; - if (xmsh.ptype & 2) pIns->dwFlags |= ENV_PANSUSTAIN; - if (xmsh.ptype & 4) pIns->dwFlags |= ENV_PANLOOP; + if (xmsh.vtype & 1) pIns->VolEnv.dwFlags |= ENV_ENABLED; + if (xmsh.vtype & 2) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; + if (xmsh.vtype & 4) pIns->VolEnv.dwFlags |= ENV_LOOP; + if (xmsh.ptype & 1) pIns->PanEnv.dwFlags |= ENV_ENABLED; + if (xmsh.ptype & 2) pIns->PanEnv.dwFlags |= ENV_SUSTAIN; + if (xmsh.ptype & 4) pIns->PanEnv.dwFlags |= ENV_LOOP; if (xmsh.vnum > 12) xmsh.vnum = 12; if (xmsh.pnum > 12) xmsh.pnum = 12; pIns->VolEnv.nNodes = xmsh.vnum; - if (!xmsh.vnum) pIns->dwFlags &= ~ENV_VOLUME; - if (!xmsh.pnum) pIns->dwFlags &= ~ENV_PANNING; + if (!xmsh.vnum) pIns->VolEnv.dwFlags &= ~ENV_ENABLED; + if (!xmsh.pnum) pIns->PanEnv.dwFlags &= ~ENV_ENABLED; pIns->PanEnv.nNodes = xmsh.pnum; pIns->VolEnv.nSustainStart = pIns->VolEnv.nSustainEnd = xmsh.vsustain; - if (xmsh.vsustain >= 12) pIns->dwFlags &= ~ENV_VOLSUSTAIN; + if (xmsh.vsustain >= 12) pIns->VolEnv.dwFlags &= ~ENV_SUSTAIN; pIns->VolEnv.nLoopStart = xmsh.vloops; pIns->VolEnv.nLoopEnd = xmsh.vloope; if (pIns->VolEnv.nLoopEnd >= 12) pIns->VolEnv.nLoopEnd = 0; - if (pIns->VolEnv.nLoopStart >= pIns->VolEnv.nLoopEnd) pIns->dwFlags &= ~ENV_VOLLOOP; + if (pIns->VolEnv.nLoopStart >= pIns->VolEnv.nLoopEnd) pIns->VolEnv.dwFlags &= ~ENV_LOOP; pIns->PanEnv.nSustainStart = pIns->PanEnv.nSustainEnd = xmsh.psustain; - if (xmsh.psustain >= 12) pIns->dwFlags &= ~ENV_PANSUSTAIN; + if (xmsh.psustain >= 12) pIns->PanEnv.dwFlags &= ~ENV_SUSTAIN; pIns->PanEnv.nLoopStart = xmsh.ploops; pIns->PanEnv.nLoopEnd = xmsh.ploope; if (pIns->PanEnv.nLoopEnd >= 12) pIns->PanEnv.nLoopEnd = 0; - if (pIns->PanEnv.nLoopStart >= pIns->PanEnv.nLoopEnd) pIns->dwFlags &= ~ENV_PANLOOP; + if (pIns->PanEnv.nLoopStart >= pIns->PanEnv.nLoopEnd) pIns->PanEnv.dwFlags &= ~ENV_LOOP; pIns->nGlobalVol = 64; for (UINT ienv=0; ienv<12; ienv++) { @@ -918,12 +918,12 @@ xmsh.penv[ienv*2] = LittleEndianW(pIns->PanEnv.Ticks[ienv]); xmsh.penv[ienv*2+1] = LittleEndianW(pIns->PanEnv.Values[ienv]); } - if (pIns->dwFlags & ENV_VOLUME) xmsh.vtype |= 1; - if (pIns->dwFlags & ENV_VOLSUSTAIN) xmsh.vtype |= 2; - if (pIns->dwFlags & ENV_VOLLOOP) xmsh.vtype |= 4; - if (pIns->dwFlags & ENV_PANNING) xmsh.ptype |= 1; - if (pIns->dwFlags & ENV_PANSUSTAIN) xmsh.ptype |= 2; - if (pIns->dwFlags & ENV_PANLOOP) xmsh.ptype |= 4; + if (pIns->VolEnv.dwFlags & ENV_ENABLED) xmsh.vtype |= 1; + if (pIns->VolEnv.dwFlags & ENV_SUSTAIN) xmsh.vtype |= 2; + if (pIns->VolEnv.dwFlags & ENV_LOOP) xmsh.vtype |= 4; + if (pIns->PanEnv.dwFlags & ENV_ENABLED) xmsh.ptype |= 1; + if (pIns->PanEnv.dwFlags & ENV_SUSTAIN) xmsh.ptype |= 2; + if (pIns->PanEnv.dwFlags & ENV_LOOP) xmsh.ptype |= 4; xmsh.vsustain = (BYTE)pIns->VolEnv.nSustainStart; xmsh.vloops = (BYTE)pIns->VolEnv.nLoopStart; xmsh.vloope = (BYTE)pIns->VolEnv.nLoopEnd; Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-11-07 15:47:35 UTC (rev 414) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-11-07 21:40:01 UTC (rev 415) @@ -1165,32 +1165,32 @@ if (n < nsamples) pIns->Keyboard[k+12] = samplemap[n]; } pIns->nFadeOut = pih->volfade; - if (pih->vtype & 1) pIns->dwFlags |= ENV_VOLUME; - if (pih->vtype & 2) pIns->dwFlags |= ENV_VOLSUSTAIN; - if (pih->vtype & 4) pIns->dwFlags |= ENV_VOLLOOP; - if (pih->ptype & 1) pIns->dwFlags |= ENV_PANNING; - if (pih->ptype & 2) pIns->dwFlags |= ENV_PANSUSTAIN; - if (pih->ptype & 4) pIns->dwFlags |= ENV_PANLOOP; + if (pih->vtype & 1) pIns->VolEnv.dwFlags |= ENV_ENABLED; + if (pih->vtype & 2) pIns->VolEnv.dwFlags |= ENV_SUSTAIN; + if (pih->vtype & 4) pIns->VolEnv.dwFlags |= ENV_LOOP; + if (pih->ptype & 1) pIns->PanEnv.dwFlags |= ENV_ENABLED; + if (pih->ptype & 2) pIns->PanEnv.dwFlags |= ENV_SUSTAIN; + if (pih->ptype & 4) pIns->PanEnv.dwFlags |= ENV_LOOP; pIns->VolEnv.nNodes = pih->vnum; pIns->PanEnv.nNodes = pih->pnum; if (pIns->VolEnv.nNodes > 12) pIns->VolEnv.nNodes = 12; if (pIns->PanEnv.nNodes > 12) pIns->PanEnv.nNodes = 12; - if (!pIns->VolEnv.nNodes) pIns->dwFlags &= ~ENV_VOLUME; - if (!pIns->PanEnv.nNodes) pIns->dwFlags &= ~ENV_PANNING; + if (!pIns->VolEnv.nNodes) pIns->VolEnv.dwFlags &= ~ENV_ENABLED; + if (!pIns->PanEnv.nNodes) pIns->PanEnv.dwFlags &= ~ENV_ENABLED; pIns->VolEnv.nSustainStart = pih->vsustain; pIns->VolEnv.nSustainEnd = pih->vsustain; - if (pih->vsustain ... [truncated message content] |