From: <sag...@us...> - 2011-05-26 18:35:39
|
Revision: 882 http://modplug.svn.sourceforge.net/modplug/?rev=882&view=rev Author: saga-games Date: 2011-05-26 18:35:33 +0000 (Thu, 26 May 2011) Log Message: ----------- [Ref] Rewrote envelope reset code + minor stuff Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-05-26 18:25:41 UTC (rev 881) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-05-26 18:35:33 UTC (rev 882) @@ -914,7 +914,7 @@ if (nins) // Set instrument { - m_SndFile.resetEnvelopes(pChn); + m_SndFile.ResetChannelEnvelopes(pChn); m_SndFile.InstrumentChange(pChn, nins); } else if ((nsmp) && (nsmp < MAX_SAMPLES)) // Or set sample Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2011-05-26 18:25:41 UTC (rev 881) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2011-05-26 18:35:33 UTC (rev 882) @@ -348,7 +348,6 @@ #define SNDMIX_NOBACKWARDJUMPS 0x40000 // stop when jumping back in the order (currently unused as it seems) #define SNDMIX_MAXDEFAULTPAN 0x80000 // Used by the MOD loader (currently unused) #define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels -#define SNDMIX_SMARTRAMP 0x200000 // Don't apply ramping to sample beginning, but only when it ends #define MAX_GLOBAL_VOLUME 256 @@ -364,14 +363,6 @@ NUM_SRC_MODES }; -// Envelope reset choices -enum enmResetEnv -{ - ENV_RESET_ALL, - ENV_RESET_VOL, - ENV_RESET_PAN, - ENV_RESET_PITCH, -}; // Release node defines #define ENV_RELEASE_NODE_UNSET 0xFF #define NOT_YET_RELEASED (-1) @@ -416,10 +407,14 @@ #define MACRO_INTERNALEX 0x31463046 // internal extended macro (F0F1), controls higher 8 bits (high plugin params) // Vibrato Types -#define VIB_SINE 0 -#define VIB_SQUARE 1 -#define VIB_RAMP_UP 2 -#define VIB_RAMP_DOWN 3 -#define VIB_RANDOM 4 +enum VibratoType +{ + VIB_SINE = 0, + VIB_SQUARE, + VIB_RAMP_UP, + VIB_RAMP_DOWN, + VIB_RANDOM +}; + #endif Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-05-26 18:25:41 UTC (rev 881) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-05-26 18:35:33 UTC (rev 882) @@ -620,12 +620,12 @@ pChn->dwFlags |= CHN_FASTVOLRAMP; if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!bInstrumentChanged) && (pIns) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) { - if (!(pIns->VolEnv.dwFlags & ENV_CARRY)) resetEnvelopes(pChn, ENV_RESET_VOL); - if (!(pIns->PanEnv.dwFlags & ENV_CARRY)) resetEnvelopes(pChn, ENV_RESET_PAN); - if (!(pIns->PitchEnv.dwFlags & ENV_CARRY)) resetEnvelopes(pChn, ENV_RESET_PITCH); + if (!(pIns->VolEnv.dwFlags & ENV_CARRY)) ResetChannelEnvelope(pChn->VolEnv); + if (!(pIns->PanEnv.dwFlags & ENV_CARRY)) ResetChannelEnvelope(pChn->PanEnv); + if (!(pIns->PitchEnv.dwFlags & ENV_CARRY)) ResetChannelEnvelope(pChn->PitchEnv); } else { - resetEnvelopes(pChn); + ResetChannelEnvelopes(pChn); } // IT Compatibility: Autovibrato reset if(!IsCompatibleMode(TRK_IMPULSETRACKER)) @@ -635,7 +635,13 @@ } } else if ((pIns) && (!(pIns->VolEnv.dwFlags & ENV_ENABLED))) { - resetEnvelopes(pChn, IsCompatibleMode(TRK_IMPULSETRACKER) ? ENV_RESET_VOL : ENV_RESET_ALL); + if(IsCompatibleMode(TRK_IMPULSETRACKER)) + { + ResetChannelEnvelope(pChn->VolEnv); + } else + { + ResetChannelEnvelopes(pChn); + } } } // Invalid sample ? @@ -882,7 +888,7 @@ { if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) { - resetEnvelopes(pChn); + ResetChannelEnvelopes(pChn); // IT Compatibility: Autovibrato reset if(!IsCompatibleMode(TRK_IMPULSETRACKER)) { @@ -1362,7 +1368,7 @@ { //:xy --> note delay until tick x, note cut at tick x+y nStartTick = (param & 0xF0) >> 4; - int cutAtTick = nStartTick + (param & 0x0F); + const UINT cutAtTick = nStartTick + (param & 0x0F); NoteCut(nChn, cutAtTick); } else if ((cmd == CMD_MODCMDEX) || (cmd == CMD_S3MCMDEX)) @@ -1493,7 +1499,7 @@ if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) { pChn->dwFlags |= CHN_FASTVOLRAMP; - resetEnvelopes(pChn); + ResetChannelEnvelopes(pChn); // IT Compatibility: Autovibrato reset if(!IsCompatibleMode(TRK_IMPULSETRACKER)) { @@ -1574,7 +1580,7 @@ if ((bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) && (instr)) { pChn->dwFlags |= CHN_FASTVOLRAMP; - resetEnvelopes(pChn); + ResetChannelEnvelopes(pChn); // IT Compatibility: Autovibrato reset if(!IsCompatibleMode(TRK_IMPULSETRACKER)) { @@ -2172,35 +2178,23 @@ } -void CSoundFile::resetEnvelopes(MODCHANNEL* pChn, enmResetEnv envToReset) -//----------------------------------------------------------------------- +void CSoundFile::ResetChannelEnvelopes(MODCHANNEL* pChn) +//------------------------------------------------------ { - switch (envToReset) - { - case ENV_RESET_ALL: - pChn->VolEnv.nEnvPosition = 0; - pChn->PanEnv.nEnvPosition = 0; - pChn->PitchEnv.nEnvPosition = 0; - pChn->VolEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED; - pChn->PitchEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED; - pChn->PanEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED; - break; - case ENV_RESET_VOL: - pChn->VolEnv.nEnvPosition = 0; - pChn->VolEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED; - break; - case ENV_RESET_PAN: - pChn->PanEnv.nEnvPosition = 0; - pChn->PanEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED; - break; - case ENV_RESET_PITCH: - pChn->PitchEnv.nEnvPosition = 0; - pChn->PitchEnv.nEnvValueAtReleaseJump = NOT_YET_RELEASED; - break; - } + ResetChannelEnvelope(pChn->VolEnv); + ResetChannelEnvelope(pChn->PanEnv); + ResetChannelEnvelope(pChn->PitchEnv); } +void CSoundFile::ResetChannelEnvelope(MODCHANNEL_ENVINFO &env) +//------------------------------------------------------------ +{ + env.nEnvPosition = 0; + env.nEnvValueAtReleaseJump = NOT_YET_RELEASED; +} + + //////////////////////////////////////////////////////////// // Channels effects @@ -3620,7 +3614,7 @@ if (pIns->VolEnv.nReleaseNode != ENV_RELEASE_NODE_UNSET) { - pChn->VolEnv.nEnvValueAtReleaseJump = getVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns); + pChn->VolEnv.nEnvValueAtReleaseJump = GetVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns); pChn->VolEnv.nEnvPosition= pIns->VolEnv.Ticks[pIns->VolEnv.nReleaseNode]; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-05-26 18:25:41 UTC (rev 881) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-05-26 18:35:33 UTC (rev 882) @@ -1047,8 +1047,9 @@ UINT GetRawSongMessage(LPSTR s, UINT cbsize, UINT linesize=32); public: - int getVolEnvValueFromPosition(int position, MODINSTRUMENT* pIns); - void resetEnvelopes(MODCHANNEL* pChn, enmResetEnv envToReset = ENV_RESET_ALL); + int GetVolEnvValueFromPosition(int position, MODINSTRUMENT* pIns) const; + void ResetChannelEnvelopes(MODCHANNEL *pChn); + void ResetChannelEnvelope(MODCHANNEL_ENVINFO &env); void SetDefaultInstrumentValues(MODINSTRUMENT *pIns); private: UINT __cdecl GetChannelPlugin(UINT nChan, bool respectMutes) const; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2011-05-26 18:25:41 UTC (rev 881) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2011-05-26 18:35:33 UTC (rev 882) @@ -986,8 +986,6 @@ { skipchn: - MODINSTRUMENT *pIns = pChn->pModInstrument; - // XM Compatibility: Prevent notes to be stopped after a fadeout. This way, a portamento effect can pick up a faded instrument which is long enough. // This occours for example in the bassline (channel 11) of jt_burn.xm. I hope this won't break anything else... // I also suppose this could decrease mixing performance a bit, but hey, which CPU can't handle 32 muted channels these days... :-) @@ -1003,6 +1001,7 @@ #ifdef ENABLE_STEREOVU pChn->nLeftVU = pChn->nRightVU = 0; #endif + nChn++; pChn++; if (nChn >= m_nChannels) @@ -1021,7 +1020,7 @@ pChn->nInc = 0; pChn->nRealVolume = 0; - if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) || GetModFlag(MSF_OLDVOLSWING)) + if(GetModFlag(MSF_OLDVOLSWING)) { pChn->nRealPan = pChn->nPan + pChn->nPanSwing; } @@ -1040,8 +1039,8 @@ CTuning::RATIOTYPE vibratoFactor = 1; CTuning::NOTEINDEXTYPE arpeggioSteps = 0; - // Calc Frequency - if ((pChn->nPeriod) && (pChn->nLength)) + MODINSTRUMENT *pIns = pChn->pModInstrument; + { int vol = pChn->nVolume; @@ -1146,15 +1145,14 @@ vol = CLAMP(vol, 0, 256) << 6; // Process Envelopes - if (pChn->pModInstrument) + if (pIns) { - MODINSTRUMENT *pIns = pChn->pModInstrument; // Volume Envelope // IT Compatibility: S77 does not disable the volume envelope, it just pauses the counter // Problem: This pauses on the wrong tick at the moment... if (((pChn->dwFlags & CHN_VOLENV) || ((pIns->VolEnv.dwFlags & ENV_ENABLED) && IsCompatibleMode(TRK_IMPULSETRACKER))) && (pIns->VolEnv.nNodes)) { - int envvol = getVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns); + int envvol = GetVolEnvValueFromPosition(pChn->VolEnv.nEnvPosition, pIns); // if we are in the release portion of the envelope, // rescale envelope factor so that it is proportional to the release point @@ -2153,7 +2151,7 @@ // Get instrument info and plugin reference MODINSTRUMENT *pIns = pChn->pModInstrument; - IMixPlugin *pPlugin = NULL; + IMixPlugin *pPlugin = nullptr; if ((instr) && (instr < MAX_INSTRUMENTS)) pIns = Instruments[instr]; @@ -2224,18 +2222,19 @@ case PLUGIN_VOLUMEHANDLING_DRYWET: if(hasVolCommand) pPlugin->SetDryRatio(2*vol); else pPlugin->SetDryRatio(2*defaultVolume); - break; + break; case PLUGIN_VOLUMEHANDLING_MIDI: if(hasVolCommand) pPlugin->MidiCC(pIns->nMidiChannel, MIDICC_Volume_Coarse, min(127, 2*vol), nChn); else pPlugin->MidiCC(pIns->nMidiChannel, MIDICC_Volume_Coarse, min(127, 2*defaultVolume), nChn); - break; + break; + } } } -int CSoundFile::getVolEnvValueFromPosition(int position, MODINSTRUMENT* pIns) -//--------------------------------------------------------------------------- +int CSoundFile::GetVolEnvValueFromPosition(int position, MODINSTRUMENT* pIns) const +//--------------------------------------------------------------------------------- { UINT pt = pIns->VolEnv.nNodes - 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |