|
From: <sag...@us...> - 2009-12-25 12:00:44
|
Revision: 450
http://modplug.svn.sourceforge.net/modplug/?rev=450&view=rev
Author: saga-games
Date: 2009-12-25 12:00:26 +0000 (Fri, 25 Dec 2009)
Log Message:
-----------
[Fix] FT2 compatibility: Almost perfect arpeggio emulation (only a few notes are still wrong)
[Fix] FT2 compatibility: Rogue note delays
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-12-23 19:56:16 UTC (rev 449)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-12-25 12:00:26 UTC (rev 450)
@@ -635,7 +635,7 @@
note = pIns->NoteMap[note-1];
}
// Key Off
- if (note >= 0x80)
+ if (note > NOTE_MAX)
{
// Key Off (+ Invalid Note for XM - TODO is this correct?)
if (note == NOTE_KEYOFF || !(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
@@ -664,7 +664,7 @@
if(bNewTuning)
{
- if(!bPorta || pChn->nNote == 0)
+ if(!bPorta || pChn->nNote == NOTE_NONE)
pChn->nPortamentoDest = 0;
else
{
@@ -1268,6 +1268,12 @@
pChn->nVolume = 0;
note = instr = 0;
}
+
+ // XM: Rogue note delays cause retrig
+ if ((note == NOTE_NONE) && IsCompatibleMode(TRK_FASTTRACKER2) && !(m_dwSongFlags & SONG_FIRSTTICK))
+ {
+ note = pChn->nNote - pChn->nTranspose;
+ }
}
if ((!note) && (instr)) //Case: instrument with no note data.
{
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-12-23 19:56:16 UTC (rev 449)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-12-25 12:00:26 UTC (rev 450)
@@ -1227,18 +1227,17 @@
}
else if(IsCompatibleMode(TRK_FASTTRACKER2)) // FastTracker 2
{
- // Using MilkyTracker's logic - still not perfect
BYTE note = pChn->nNote;
int arpPos = 0;
if (!(m_dwSongFlags & SONG_FIRSTTICK))
{
- arpPos = ((int)m_nTickCount - (int)m_nMusicSpeed) % 3;
- if(arpPos < 0) arpPos += 3;
+ arpPos = ((int)m_nMusicSpeed - (int)m_nTickCount) % 3;
+ if((m_nMusicSpeed > 18) && (m_nMusicSpeed - m_nTickCount > 16)) arpPos = 2; // swedish tracker logic, I love it
switch(arpPos)
{
- case 1: note += (pChn->nArpeggio & 0x0F); break; // x/y are swapped!
- case 2: note += (pChn->nArpeggio >> 4); break;
+ case 1: note += (pChn->nArpeggio >> 4); break;
+ case 2: note += (pChn->nArpeggio & 0x0F); break;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|