|
From: <sag...@us...> - 2012-09-20 23:43:59
|
Revision: 1354
http://modplug.svn.sourceforge.net/modplug/?rev=1354&view=rev
Author: saga-games
Date: 2012-09-20 23:43:52 +0000 (Thu, 20 Sep 2012)
Log Message:
-----------
[Fix] FT2 Compatibility: All fine slide commands (E1x, E2x, EAx, EBx, X1x, X2x) are supposed to have their own memory. Test cases: Porta-LinkMem.xm, FineVol-LinkMem.xm
Modified Paths:
--------------
trunk/OpenMPT/soundlib/ModChannel.h
trunk/OpenMPT/soundlib/Snd_fx.cpp
Modified: trunk/OpenMPT/soundlib/ModChannel.h
===================================================================
--- trunk/OpenMPT/soundlib/ModChannel.h 2012-09-19 08:44:17 UTC (rev 1353)
+++ trunk/OpenMPT/soundlib/ModChannel.h 2012-09-20 23:43:52 UTC (rev 1354)
@@ -86,7 +86,7 @@
uint8 nLastNote; // Last note, ignoring note offs and cuts - for MIDI macros
uint8 nNewNote, nNewIns, nCommand, nArpeggio;
uint8 nOldVolumeSlide, nOldFineVolUpDown;
- uint8 nOldPortaUpDown, nOldFinePortaUpDown;
+ uint8 nOldPortaUpDown, nOldFinePortaUpDown, nOldExtraFinePortaUpDown;
uint8 nOldPanSlide, nOldChnVolSlide;
uint8 nVibratoType, nVibratoSpeed, nVibratoDepth;
uint8 nTremoloType, nTremoloSpeed, nTremoloDepth;
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2012-09-19 08:44:17 UTC (rev 1353)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2012-09-20 23:43:52 UTC (rev 1354)
@@ -2710,10 +2710,16 @@
void CSoundFile::FinePortamentoUp(ModChannel *pChn, UINT param)
//-------------------------------------------------------------
{
- if(GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))
+ if(GetType() == MOD_TYPE_XM)
{
- if (param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
+ // FT2 compatibility: E1x / E2x / X1x / X2x memory is not linked
+ // Test case: Porta-LinkMem.xm
+ if(param) pChn->nOldFinePortaUpDown = (pChn->nOldFinePortaUpDown & 0x0F) | (param << 4); else param = (pChn->nOldFinePortaUpDown >> 4);
+ } else if(GetType() == MOD_TYPE_MT2)
+ {
+ if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
+
if(m_SongFlags[SONG_FIRSTTICK])
{
if ((pChn->nPeriod) && (param))
@@ -2739,10 +2745,16 @@
void CSoundFile::FinePortamentoDown(ModChannel *pChn, UINT param)
//---------------------------------------------------------------
{
- if(GetType() & (MOD_TYPE_XM | MOD_TYPE_MT2))
+ if(GetType() == MOD_TYPE_XM)
{
- if (param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
+ // FT2 compatibility: E1x / E2x / X1x / X2x memory is not linked
+ // Test case: Porta-LinkMem.xm
+ if(param) pChn->nOldFinePortaUpDown = (pChn->nOldFinePortaUpDown & 0xF0) | (param & 0x0F); else param = (pChn->nOldFinePortaUpDown & 0x0F);
+ } else if(GetType() == MOD_TYPE_MT2)
+ {
+ if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
+
if(m_SongFlags[SONG_FIRSTTICK])
{
if ((pChn->nPeriod) && (param))
@@ -2768,10 +2780,16 @@
void CSoundFile::ExtraFinePortamentoUp(ModChannel *pChn, UINT param)
//------------------------------------------------------------------
{
- if(GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))
+ if(GetType() == MOD_TYPE_XM)
{
- if (param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
+ // FT2 compatibility: E1x / E2x / X1x / X2x memory is not linked
+ // Test case: Porta-LinkMem.xm
+ if(param) pChn->nOldExtraFinePortaUpDown = (pChn->nOldExtraFinePortaUpDown & 0x0F) | (param << 4); else param = (pChn->nOldExtraFinePortaUpDown >> 4);
+ } else if(GetType() == MOD_TYPE_MT2)
+ {
+ if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
+
if(m_SongFlags[SONG_FIRSTTICK])
{
if ((pChn->nPeriod) && (param))
@@ -2797,10 +2815,16 @@
void CSoundFile::ExtraFinePortamentoDown(ModChannel *pChn, UINT param)
//--------------------------------------------------------------------
{
- if(GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))
+ if(GetType() == MOD_TYPE_XM)
{
- if (param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
+ // FT2 compatibility: E1x / E2x / X1x / X2x memory is not linked
+ // Test case: Porta-LinkMem.xm
+ if(param) pChn->nOldExtraFinePortaUpDown = (pChn->nOldExtraFinePortaUpDown & 0xF0) | (param & 0x0F); else param = (pChn->nOldExtraFinePortaUpDown & 0x0F);
+ } else if(GetType() == MOD_TYPE_MT2)
+ {
+ if(param) pChn->nOldFinePortaUpDown = param; else param = pChn->nOldFinePortaUpDown;
}
+
if(m_SongFlags[SONG_FIRSTTICK])
{
if ((pChn->nPeriod) && (param))
@@ -3133,7 +3157,16 @@
void CSoundFile::FineVolumeUp(ModChannel *pChn, UINT param)
//---------------------------------------------------------
{
- if(param) pChn->nOldFineVolUpDown = param; else param = pChn->nOldFineVolUpDown;
+ if(GetType() == MOD_TYPE_XM)
+ {
+ // FT2 compatibility: EAx / EBx memory is not linked
+ // Test case: FineVol-LinkMem.xm
+ if(param) pChn->nOldFineVolUpDown = (param << 4) | (pChn->nOldFineVolUpDown & 0x0F); else param = (pChn->nOldFineVolUpDown >> 4);
+ } else
+ {
+ if(param) pChn->nOldFineVolUpDown = param; else param = pChn->nOldFineVolUpDown;
+ }
+
if(m_SongFlags[SONG_FIRSTTICK])
{
pChn->nVolume += param * 4;
@@ -3146,7 +3179,16 @@
void CSoundFile::FineVolumeDown(ModChannel *pChn, UINT param)
//-----------------------------------------------------------
{
- if(param) pChn->nOldFineVolUpDown = param; else param = pChn->nOldFineVolUpDown;
+ if(GetType() == MOD_TYPE_XM)
+ {
+ // FT2 compatibility: EAx / EBx memory is not linked
+ // Test case: FineVol-LinkMem.xm
+ if(param) pChn->nOldFineVolUpDown = param | (pChn->nOldFineVolUpDown & 0xF0); else param = (pChn->nOldFineVolUpDown & 0x0F);
+ } else
+ {
+ if(param) pChn->nOldFineVolUpDown = param; else param = pChn->nOldFineVolUpDown;
+ }
+
if(m_SongFlags[SONG_FIRSTTICK])
{
pChn->nVolume -= param * 4;
@@ -4626,7 +4668,7 @@
PLUGINDEX plug = 0;
if(Chn[nChn].pModInstrument != nullptr)
{
- if (respectMutes == RespectMutes && Chn[nChn].pModSample && Chn[nChn].pModSample->uFlags[CHN_MUTE])
+ if(respectMutes == RespectMutes && Chn[nChn].pModSample && Chn[nChn].pModSample->uFlags[CHN_MUTE])
{
plug = 0;
} else
@@ -4665,8 +4707,9 @@
}
+// Get the MIDI channel currently associated with a given tracker channel
uint8 CSoundFile::GetBestMidiChannel(CHANNELINDEX nChn) const
-//----------------------------------------------------------
+//-----------------------------------------------------------
{
if(nChn == CHANNELINDEX_INVALID)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|