From: <sag...@us...> - 2013-03-25 17:26:23
|
Revision: 1673 http://sourceforge.net/p/modplug/code/1673 Author: saga-games Date: 2013-03-25 17:26:16 +0000 (Mon, 25 Mar 2013) Log Message: ----------- [Imp] Instrument envelopes are now also evaluated if no sample, but a MIDI channel is assigned to the instrument - great for automating plugins using envelopes. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-03-25 16:48:14 UTC (rev 1672) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-03-25 17:26:16 UTC (rev 1673) @@ -1060,9 +1060,10 @@ { ModChannel *pChn = &m_pSndFile->Chn[k]; p->dwPos[k] = 0; - if ((nIns) && (nIns <= m_pSndFile->m_nInstruments) && (pChn->nLength) - && (pChn->pModInstrument) && (pChn->pModInstrument == m_pSndFile->Instruments[nIns]) - && ((!(pChn->dwFlags & CHN_NOTEFADE)) || (pChn->nFadeOutVol))) + if(nIns != 0 && nIns <= m_pSndFile->GetNumInstruments() // There is an instrument + && pChn->pModInstrument && pChn->pModInstrument == m_pSndFile->Instruments[nIns] // And it's the correct instrument + && (pChn->nLength || pChn->pModInstrument->HasValidMIDIChannel()) // And it's playing something (sample or instrument) + && (!pChn->dwFlags[CHN_NOTEFADE] || pChn->nFadeOutVol)) // And it hasn't completely faded out yet, so it's still playing { enmEnvelopeTypes notifyEnv = ENV_VOLUME; if (m_dwNotifyType & MPTNOTIFY_PITCHENV) @@ -1549,11 +1550,14 @@ // Avoid global volume ramping when trying samples in the treeview. m_WaveFile.m_pConfig->setGlobalVolumeAppliesToMaster(false); m_WaveFile.m_nDefaultGlobalVolume = m_WaveFile.m_nGlobalVolume = MAX_GLOBAL_VOLUME; + m_WaveFile.m_nSamplePreAmp = 48; m_WaveFile.m_nDefaultTempo = 125; m_WaveFile.m_nDefaultSpeed = 6; m_WaveFile.m_nType = MOD_TYPE_IT; m_WaveFile.m_nChannels = 4; m_WaveFile.m_nInstruments = 1; + m_WaveFile.m_nTempoMode = tempo_mode_classic; + m_WaveFile.m_nMixLevels = mixLevels_compatible; m_WaveFile.Order.resize(2); m_WaveFile.Order[0] = 0; m_WaveFile.Order[1] = 1; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-03-25 16:48:14 UTC (rev 1672) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-03-25 17:26:16 UTC (rev 1673) @@ -759,6 +759,9 @@ pChn->dwFlags.reset(CHN_SURROUND); } } + } else if(pIns && pIns->HasValidMIDIChannel()) + { + pChn->nInsVol = pIns->nGlobalVol; } @@ -829,7 +832,7 @@ } } // Invalid sample ? - if(!pSmp) + if(pSmp == nullptr && (pIns == nullptr || !pIns->HasValidMIDIChannel())) { pChn->pModSample = nullptr; pChn->nInsVol = 0; @@ -837,24 +840,23 @@ } // Tone-Portamento doesn't reset the pingpong direction flag - if(bPorta && pSmp == pChn->pModSample) + if(bPorta && pSmp == pChn->pModSample && pSmp != nullptr) { // If channel length is 0, we cut a previous sample using SCx. In that case, we have to update sample length, loop points, etc... if(GetType() & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT) && pChn->nLength != 0) return; pChn->dwFlags.reset(CHN_KEYOFF | CHN_NOTEFADE); - pChn->dwFlags = (pChn->dwFlags & (CHN_CHANNELFLAGS | CHN_PINGPONGFLAG)) | (pSmp->uFlags & CHN_SAMPLEFLAGS); - } else + pChn->dwFlags = (pChn->dwFlags & (CHN_CHANNELFLAGS | CHN_PINGPONGFLAG)); + } else //if(!instrumentChanged || pChn->rowCommand.instr != 0 || !IsCompatibleMode(TRK_FASTTRACKER2)) // SampleChange.xm? { pChn->dwFlags.reset(CHN_KEYOFF | CHN_NOTEFADE); // IT compatibility tentative fix: Don't change bidi loop direction when // no sample nor instrument is changed. if(IsCompatibleMode(TRK_ALLTRACKERS) && pSmp == pChn->pModSample && !instrumentChanged) - pChn->dwFlags = (pChn->dwFlags & (CHN_CHANNELFLAGS | CHN_PINGPONGFLAG)) | (pSmp->uFlags & CHN_SAMPLEFLAGS); + pChn->dwFlags = (pChn->dwFlags & (CHN_CHANNELFLAGS | CHN_PINGPONGFLAG)); else - pChn->dwFlags = (pChn->dwFlags & CHN_CHANNELFLAGS) | (pSmp->uFlags & CHN_SAMPLEFLAGS); + pChn->dwFlags = (pChn->dwFlags & CHN_CHANNELFLAGS); - if(pIns) { // Copy envelope flags (we actually only need the "enabled" and "pitch" flag) @@ -876,10 +878,16 @@ pChn->nResSwing = pChn->nCutSwing = 0; } + if(pSmp == nullptr) + { + return; + } + pChn->pModSample = pSmp; pChn->nLength = pSmp->nLength; pChn->nLoopStart = pSmp->nLoopStart; pChn->nLoopEnd = pSmp->nLoopEnd; + pChn->dwFlags |= (pSmp->uFlags & CHN_SAMPLEFLAGS); // IT Compatibility: Autovibrato reset if(IsCompatibleMode(TRK_IMPULSETRACKER)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |