|
From: <sag...@us...> - 2013-12-23 22:12:02
|
Revision: 3520
http://sourceforge.net/p/modplug/code/3520
Author: saga-games
Date: 2013-12-23 22:11:54 +0000 (Mon, 23 Dec 2013)
Log Message:
-----------
[Fix] IT compatibility: If there's a note delay, slide commands in the volume column next to it should not start before the delay has finished. Test case: SlideDelay.it
Modified Paths:
--------------
trunk/OpenMPT/soundlib/ModChannel.cpp
trunk/OpenMPT/soundlib/ModChannel.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/ModChannel.cpp
===================================================================
--- trunk/OpenMPT/soundlib/ModChannel.cpp 2013-12-23 20:08:14 UTC (rev 3519)
+++ trunk/OpenMPT/soundlib/ModChannel.cpp 2013-12-23 22:11:54 UTC (rev 3520)
@@ -35,6 +35,7 @@
}
nTremorCount = 0;
nEFxSpeed = 0;
+ isFirstTick = false;
}
if(resetMask & resetSetPosAdvanced)
Modified: trunk/OpenMPT/soundlib/ModChannel.h
===================================================================
--- trunk/OpenMPT/soundlib/ModChannel.h 2013-12-23 20:08:14 UTC (rev 3519)
+++ trunk/OpenMPT/soundlib/ModChannel.h 2013-12-23 22:11:54 UTC (rev 3520)
@@ -102,6 +102,7 @@
uint8 nActiveMacro, nFilterMode;
uint8 nEFxSpeed, nEFxDelay; // memory for Invert Loop (EFx, .MOD only)
uint8 nNoteSlideCounter, nNoteSlideSpeed, nNoteSlideStep; // IMF / PTM Note Slide
+ bool isFirstTick;
ModCommand rowCommand;
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-12-23 20:08:14 UTC (rev 3519)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-12-23 22:11:54 UTC (rev 3520)
@@ -1610,6 +1610,7 @@
bool bPorta = (cmd == CMD_TONEPORTAMENTO) || (cmd == CMD_TONEPORTAVOL) || (volcmd == VOLCMD_TONEPORTAMENTO);
UINT nStartTick = 0;
+ pChn->isFirstTick = (m_nTickCount == 0);
pChn->dwFlags.reset(CHN_FASTVOLRAMP);
@@ -1785,6 +1786,13 @@
triggerNote = true;
}
+ // IT compatibility: Tick-0 vs non-tick-0 effect distinction is always based on tick delay.
+ // Test case: SlideDelay.it
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ {
+ pChn->isFirstTick = triggerNote;
+ }
+
// Handles note/instrument/volume changes
if(triggerNote)
{
@@ -2156,7 +2164,7 @@
case VOLCMD_FINEVOLUP:
// IT Compatibility: Fine volume slides in the volume column are only executed on the first tick, not on multiples of the first tick in case of pattern delay
// Test case: FineVolColSlide.it
- if(m_nTickCount == 0 || !IsCompatibleMode(TRK_IMPULSETRACKER))
+ if(m_nTickCount == nStartTick || !IsCompatibleMode(TRK_IMPULSETRACKER))
{
// IT Compatibility: Volume column volume slides have their own memory
// Test case: VolColMemory.it
@@ -2167,7 +2175,7 @@
case VOLCMD_FINEVOLDOWN:
// IT Compatibility: Fine volume slides in the volume column are only executed on the first tick, not on multiples of the first tick in case of pattern delay
// Test case: FineVolColSlide.it
- if(m_nTickCount == 0 || !IsCompatibleMode(TRK_IMPULSETRACKER))
+ if(m_nTickCount == nStartTick || !IsCompatibleMode(TRK_IMPULSETRACKER))
{
// IT Compatibility: Volume column volume slides have their own memory
// Test case: VolColMemory.it
@@ -2775,7 +2783,7 @@
}
}
// Regular Slide
- if(!m_SongFlags[SONG_FIRSTTICK])
+ if(!pChn->isFirstTick)
{
DoFreqSlide(pChn, -int(param) * 4);
}
@@ -2827,7 +2835,7 @@
}
}
- if(!m_SongFlags[SONG_FIRSTTICK])
+ if(!pChn->isFirstTick)
{
DoFreqSlide(pChn, int(param) * 4);
}
@@ -2849,7 +2857,7 @@
if(doFineSlides && actualParam >= 0xE0 && !GetModFlag(MSF_OLD_MIDI_PITCHBENDS))
{
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(Chn[nChn].isFirstTick)
{
// Extra fine slide...
pitchBend = (actualParam & 0x0F) * sgn(param);
@@ -2859,7 +2867,7 @@
pitchBend *= 4;
}
}
- } else if(!m_SongFlags[SONG_FIRSTTICK] || GetModFlag(MSF_OLD_MIDI_PITCHBENDS))
+ } else if(!Chn[nChn].isFirstTick || GetModFlag(MSF_OLD_MIDI_PITCHBENDS))
{
// Regular slide
pitchBend = param * 4;
@@ -2894,7 +2902,7 @@
if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->isFirstTick)
{
if ((pChn->nPeriod) && (param))
{
@@ -2929,7 +2937,7 @@
if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->isFirstTick)
{
if ((pChn->nPeriod) && (param))
{
@@ -2964,7 +2972,7 @@
if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->isFirstTick)
{
if ((pChn->nPeriod) && (param))
{
@@ -2999,7 +3007,7 @@
if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->isFirstTick)
{
if ((pChn->nPeriod) && (param))
{
@@ -3112,7 +3120,7 @@
} //End candidate MPT behavior.
if(param) pChn->nPortamentoSlide = param * 4;
- if(pChn->nPeriod && pChn->nPortamentoDest && !m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->nPeriod && pChn->nPortamentoDest && !pChn->isFirstTick)
{
if (pChn->nPeriod < pChn->nPortamentoDest)
{
@@ -3213,7 +3221,7 @@
return;
} else //Slide -15
{
- if(m_SongFlags[SONG_FIRSTTICK] && !m_SongFlags[SONG_FASTVOLSLIDES])
+ if(pChn->isFirstTick && !m_SongFlags[SONG_FASTVOLSLIDES])
{
newvolume -= 0x0F * 4;
}
@@ -3227,14 +3235,14 @@
return;
} else //Slide +15
{
- if(m_SongFlags[SONG_FIRSTTICK] && !m_SongFlags[SONG_FASTVOLSLIDES])
+ if(pChn->isFirstTick && !m_SongFlags[SONG_FASTVOLSLIDES])
{
newvolume += 0x0F * 4;
}
}
}
}
- if(!m_SongFlags[SONG_FIRSTTICK] || m_SongFlags[SONG_FASTVOLSLIDES])
+ if(!pChn->isFirstTick || m_SongFlags[SONG_FASTVOLSLIDES])
{
// IT compatibility: Ignore slide commands with both nibbles set.
if (param & 0x0F)
@@ -3354,7 +3362,7 @@
if(param) pChn->nOldFineVolUpDown = param; else param = pChn->nOldFineVolUpDown;
}
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->isFirstTick)
{
pChn->nVolume += param * 4;
if(pChn->nVolume > 256) pChn->nVolume = 256;
@@ -3379,7 +3387,7 @@
if(param) pChn->nOldFineVolUpDown = param; else param = pChn->nOldFineVolUpDown;
}
- if(m_SongFlags[SONG_FIRSTTICK])
+ if(pChn->isFirstTick)
{
pChn->nVolume -= param * 4;
if(pChn->nVolume < 0) pChn->nVolume = 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|