From: <sag...@us...> - 2009-09-13 13:44:34
|
Revision: 362 http://modplug.svn.sourceforge.net/modplug/?rev=362&view=rev Author: saga-games Date: 2009-09-13 13:44:24 +0000 (Sun, 13 Sep 2009) Log Message: ----------- [Fix] XM Compatibility: Portamento + New Note with no previous note (tentative fix), Offset beyond sample range [Fix] IT Compatibility: Offset beyond sample range [Ref] Replaced some NULLs and BOOL variables by nullptrs and bools Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Snd_flt.cpp 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/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -849,7 +849,7 @@ else if ((nsmp) && (nsmp < MAX_SAMPLES)) { //Or set sample MODSAMPLE *pSmp = &m_SndFile.Samples[nsmp]; pChn->pCurrentSample = pSmp->pSample; - pChn->pModInstrument = NULL; + pChn->pModInstrument = nullptr; pChn->pModSample = pSmp; pChn->pSample = pSmp->pSample; pChn->nFineTune = pSmp->nFineTune; @@ -864,13 +864,13 @@ pChn->nFadeOutVol = 0x10000; } - m_SndFile.NoteChange(nChn, note, FALSE, TRUE, TRUE); + m_SndFile.NoteChange(nChn, note, false, true, true); if (nVol >= 0) pChn->nVolume = nVol; // handle sample looping. // Fix: Bug report 1700. //if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) { - if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != 0)) + if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != nullptr)) { pChn->nPos = loopstart; pChn->nPosLo = 0; Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -142,7 +142,7 @@ // Removing all instrument headers for (UINT i1=0; i1<MAX_CHANNELS; i1++) { - m_SndFile.Chn[i1].pModInstrument = NULL; + m_SndFile.Chn[i1].pModInstrument = nullptr; } for (UINT i2=0; i2<m_SndFile.m_nInstruments; i2++) if (m_SndFile.Instruments[i2]) { Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -126,7 +126,7 @@ { if (Chn[i].pModInstrument == pIns) { - Chn[i].pModInstrument = NULL; + Chn[i].pModInstrument = nullptr; } } delete pIns; @@ -450,7 +450,7 @@ if (pSmp->pSample) { FreeSample(pSmp->pSample); - pSmp->pSample = NULL; + pSmp->pSample = nullptr; pSmp->nLength = 0; } pSmp->nLength = pdata->length / samplesize; @@ -1620,7 +1620,7 @@ if (pSmp->pSample) { FreeSample(pSmp->pSample); - pSmp->pSample = NULL; + pSmp->pSample = nullptr; pSmp->nLength = 0; } pSmp->nLength = dwSSNDLen / samplesize; Modified: trunk/OpenMPT/soundlib/Snd_flt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_flt.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/soundlib/Snd_flt.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -70,7 +70,7 @@ // Simple 2-poles resonant filter -void CSoundFile::SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier) const +void CSoundFile::SetupChannelFilter(MODCHANNEL *pChn, bool bReset, int flt_modifier) const //---------------------------------------------------------------------------------------- { float fs = (float)gdwMixingFreq; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -538,7 +538,7 @@ // Invalid sample ? if (!pSmp) { - pChn->pModSample = NULL; + pChn->pModSample = nullptr; pChn->nInsVol = 0; return; } @@ -612,7 +612,7 @@ } -void CSoundFile::NoteChange(UINT nChn, int note, BOOL bPorta, BOOL bResetEnv, BOOL bManual) +void CSoundFile::NoteChange(UINT nChn, int note, bool bPorta, bool bResetEnv, bool bManual) //----------------------------------------------------------------------------------------- { if (note < 1) return; @@ -677,6 +677,10 @@ // IT Compatibility: Update multisample instruments frequency even if instrument is not specified if(!bPorta && pSmp && IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nC5Speed = pSmp->nC5Speed; + // XM Compatibility: Ignore notes with portamento if there was no note + if(bPorta && (pChn->nPeriod == 0) && IsCompatibleMode(TRK_FASTTRACKER2)) + return; + if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose; note = CLAMP(note, 1, 132); pChn->nNote = note; @@ -723,7 +727,7 @@ if (pChn->nPos >= pChn->nLength) pChn->nPos = pChn->nLoopStart; } else - bPorta = FALSE; + bPorta = false; if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) @@ -804,12 +808,12 @@ pChn->nAutoVibPos = 0; } pChn->nLeftVol = pChn->nRightVol = 0; - BOOL bFlt = (m_dwSongFlags & SONG_MPTFILTERMODE) ? FALSE : TRUE; + bool bFlt = (m_dwSongFlags & SONG_MPTFILTERMODE) ? false : true; // Setup Initial Filter for this note if (pIns) { - if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = TRUE; } - if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = TRUE; } + if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = true; } + if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = true; } if (bFlt && (pIns->nFilterMode != FLTMODE_UNCHANGED)) { pChn->nFilterMode = pIns->nFilterMode; } @@ -819,7 +823,7 @@ pChn->nCutSwing = pChn->nResSwing = 0; } #ifndef NO_FILTER - if ((pChn->nCutOff < 0x7F) && (bFlt)) SetupChannelFilter(pChn, TRUE); + if ((pChn->nCutOff < 0x7F) && (bFlt)) SetupChannelFilter(pChn, true); #endif // NO_FILTER } // Special case for MPT @@ -913,7 +917,7 @@ note = pHeader->NoteMap[note-1]; if ((n) && (n < MAX_SAMPLES)) pSample = Samples[n].pSample; } - } else pSample = NULL; + } else pSample = nullptr; } MODCHANNEL *p = pChn; //if (!pIns) return; @@ -1337,7 +1341,7 @@ InstrumentChange(pChn, pChn->nNewIns, bPorta, FALSE, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? FALSE : TRUE); pChn->nNewIns = 0; } - NoteChange(nChn, note, bPorta, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? FALSE : TRUE); + NoteChange(nChn, note, bPorta, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? false : true); if ((bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) && (instr)) { pChn->dwFlags |= CHN_FASTVOLRAMP; @@ -2780,7 +2784,7 @@ if (oldcutoff < 0) oldcutoff = -oldcutoff; if ((pChn->nVolume > 0) || (oldcutoff < 0x10) || (!(pChn->dwFlags & CHN_FILTER)) || (!(pChn->nLeftVol|pChn->nRightVol))) - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true); #endif // NO_FILTER } break; @@ -2794,7 +2798,7 @@ } #ifndef NO_FILTER - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true); #endif // NO_FILTER break; @@ -2804,7 +2808,7 @@ { pChn->nFilterMode = (dwParam>>4); #ifndef NO_FILTER - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true); #endif // NO_FILTER } break; @@ -2916,7 +2920,7 @@ if (oldcutoff < 0) oldcutoff = -oldcutoff; if ((pChn->nVolume > 0) || (oldcutoff < 0x10) || (!(pChn->dwFlags & CHN_FILTER)) || (!(pChn->nLeftVol|pChn->nRightVol))) - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true); #endif // NO_FILTER } break; @@ -2935,7 +2939,7 @@ pChn->nResonance = (BYTE) (pChn->m_nPlugInitialParamValue + (m_nTickCount+1)*pChn->m_nPlugParamValueStep + 0.5); pChn->nRestoreResonanceOnNewNote = 0; #ifndef NO_FILTER - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true); #endif // NO_FILTER } @@ -2947,7 +2951,7 @@ { pChn->nFilterMode = (dwParam>>4); #ifndef NO_FILTER - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true); #endif // NO_FILTER } break; @@ -3044,13 +3048,22 @@ pChn->nPos += param; if (pChn->nPos >= pChn->nLength) { + // Offset beyond sample size if (!(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) { - pChn->nPos = pChn->nLoopStart; + if(IsCompatibleMode(TRK_IMPULSETRACKER)) + pChn->nPos = 0; // IT Compatibility: Reset to beginning of sample + else + pChn->nPos = pChn->nLoopStart; if ((m_dwSongFlags & SONG_ITOLDEFFECTS) && (pChn->nLength > 4)) { pChn->nPos = pChn->nLength - 2; } + } else if(IsCompatibleMode(TRK_FASTTRACKER2)) + { + // XM Compatibility: Don't play note + pChn->dwFlags |= CHN_FASTVOLRAMP; + pChn->nVolume = pChn->nPeriod = 0; } } } else @@ -3139,7 +3152,7 @@ if ((pChn->nRowInstr) && (param < 0x100)) { InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE); bResetEnv = TRUE; } if (param < 0x100) bResetEnv = TRUE; } - NoteChange(nChn, nNote, FALSE, bResetEnv); + NoteChange(nChn, nNote, false, bResetEnv); if (m_nInstruments) { ProcessMidiOut(nChn, pChn); //Send retrig to Midi } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -806,7 +806,7 @@ if (pSmp->pSample) { FreeSample(pSmp->pSample); - pSmp->pSample = NULL; + pSmp->pSample = nullptr; } } for (i=0; i<MAX_INSTRUMENTS; i++) @@ -1449,8 +1449,8 @@ if(resetMask & 2) { Chn[i].nNote = Chn[i].nNewNote = Chn[i].nNewIns = 0; - Chn[i].pModSample = NULL; - Chn[i].pModInstrument = NULL; + Chn[i].pModSample = nullptr; + Chn[i].pModInstrument = nullptr; Chn[i].nPortamentoDest = 0; Chn[i].nCommand = 0; Chn[i].nPatternLoopCount = 0; @@ -1473,9 +1473,9 @@ Chn[i].nLoopStart = 0; Chn[i].nLoopEnd = 0; Chn[i].nROfs = Chn[i].nLOfs = 0; - Chn[i].pSample = NULL; - Chn[i].pModSample = NULL; - Chn[i].pModInstrument = NULL; + Chn[i].pSample = nullptr; + Chn[i].pModSample = nullptr; + Chn[i].pModInstrument = nullptr; Chn[i].nCutOff = 0x7F; Chn[i].nResonance = 0; Chn[i].nFilterMode = 0; @@ -2001,7 +2001,7 @@ { pSmp->nLength = 0; FreeSample(pSmp->pSample); - pSmp->pSample = NULL; + pSmp->pSample = nullptr; MessageBox(0, str_SampleAllocationError, str_Error, MB_ICONERROR); return 0; } @@ -2438,7 +2438,7 @@ { pSmp->nLength = 0; FreeSample(pSmp->pSample); - pSmp->pSample = NULL; + pSmp->pSample = nullptr; } return 0; } @@ -2766,7 +2766,7 @@ if (!Samples[nSample].pSample) return TRUE; MODSAMPLE *pSmp = &Samples[nSample]; LPSTR pSample = pSmp->pSample; - pSmp->pSample = NULL; + pSmp->pSample = nullptr; pSmp->nLength = 0; pSmp->uFlags &= ~(CHN_16BIT); for (UINT i=0; i<MAX_CHANNELS; i++) Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-13 13:44:24 UTC (rev 362) @@ -796,7 +796,7 @@ BOOL ProcessEffects(); UINT GetNNAChannel(UINT nChn) const; void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut); - void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE, BOOL bManual=FALSE); + void NoteChange(UINT nChn, int note, bool bPorta = false, bool bResetEnv = true, bool bManual = false); void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE); // Channel Effects @@ -834,7 +834,7 @@ void ExtendedChannelEffect(MODCHANNEL *, UINT param); void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); void ProcessSmoothMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); //rewbs.smoothVST - void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const; + void SetupChannelFilter(MODCHANNEL *pChn, bool bReset, int flt_modifier = 256) const; // Low-Level effect processing void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide); void GlobalVolSlide(UINT param, UINT * nOldGlobalVolSlide); Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-11 19:32:52 UTC (rev 361) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-13 13:44:24 UTC (rev 362) @@ -698,9 +698,9 @@ Chn[i].dwFlags = ChnSettings[i].dwFlags; Chn[i].nLoopStart = 0; Chn[i].nLoopEnd = 0; - Chn[i].pModInstrument = NULL; - Chn[i].pSample = NULL; - Chn[i].pModSample = NULL; + Chn[i].pModInstrument = nullptr; + Chn[i].pSample = nullptr; + Chn[i].pModSample = nullptr; } } } @@ -1302,7 +1302,7 @@ if (pIns->dwFlags & ENV_FILTER) { #ifndef NO_FILTER - SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE, envpitch); + SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true, envpitch); #endif // NO_FILTER } else // Pitch Envelope This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |