From: <sag...@us...> - 2009-08-25 01:18:28
|
Revision: 342 http://modplug.svn.sourceforge.net/modplug/?rev=342&view=rev Author: saga-games Date: 2009-08-25 01:18:21 +0000 (Tue, 25 Aug 2009) Log Message: ----------- [Fix] IT Compatibility: Don't reset Tremolo on new note, don't ignore tremolo if note volume is 0 [Fix] IT Compatibility: Fixed Tremolo, Vibrato and Panbrello tables [Fix] IT Compatibility: Ignore S[345]x with x > 3 [Imp] XM Loader: detect a very old MPT version Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/soundlib/Tables.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -2742,6 +2742,11 @@ case 0x30: // vibrato waveform case 0x40: // tremolo waveform case 0x50: // panbrello waveform + if(((param & 0x0F) > 0x03) && m_SndFile.IsCompatibleMode(TRK_IMPULSETRACKER)) + { + strcpy(s, "ignore"); + break; + } switch(param & 0x0F) { case 0x00: case 0x04: case 0x08: case 0x0C: strcpy(s, "sine wave"); break; Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -186,18 +186,10 @@ if(subChunkSize != 6) break; { - int version; - for(DWORD i = 0; i < subChunkSize; i++) - { - if(lpStream[dwChunkPos + i] >= '0' && lpStream[dwChunkPos + i] <= '9') - { - version = (version * 10) + (lpStream[dwChunkPos + i] - '0'); - } else - { - version = 0; - break; - } - } + CHAR cversion[7]; + memcpy(cversion, lpStream + dwChunkPos, 6); + cversion[6] = 0; + int version = atoi(cversion); // Sinaria song dates if(version == 800211 || version == 940902 || version == 940903 || version == 940906 || version == 940914 || version == 941213) Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -108,9 +108,6 @@ for(int i = 0; i < 20; i++) if(lpStream[17 + i] == 0) bProbablyMadeWithModPlug = true; - if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug) bMadeWithModPlug = true; - if (!memcmp((LPCSTR)lpStream + 0x26, "OpenMPT ", 8)) bMadeWithModPlug = true; - dwHdrSize = LittleEndian(*((DWORD *)(lpStream+60))); norders = LittleEndianW(*((WORD *)(lpStream+64))); if ((!norders) || (norders > MAX_ORDERS)) return false; @@ -121,6 +118,23 @@ // if ((!channels) || (channels > 64)) return false; if ((!channels) || (channels > MAX_BASECHANNELS)) return false; // -! BEHAVIOUR_CHANGE#0006 + + if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug) bMadeWithModPlug = true; + if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v 2.00 ", 20)) + { + bMadeWithModPlug = true; + m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, 00); + } + + if (!memcmp((LPCSTR)lpStream + 0x26, "OpenMPT ", 8)) + { + //bMadeWithModPlug = true; // Don't set it - it's also used by compatibility export + CHAR sVersion[13]; + memcpy(sVersion, lpStream + 0x26 + 8, 12); + sVersion[12] = 0; + m_dwLastSavedWithVersion = MptVersion::ToNum(sVersion); + } + m_nType = MOD_TYPE_XM; m_nMinPeriod = 27; m_nMaxPeriod = 54784; @@ -637,7 +651,7 @@ if(bMadeWithModPlug) { SetModFlag(MSF_COMPATIBLE_PLAY, false); - m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); + if(!m_dwLastSavedWithVersion) m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 16, 00, 00); } // -> CODE#0027 Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -718,7 +718,7 @@ pChn->nPos = 0; pChn->nPosLo = 0; if (pChn->nVibratoType < 4) pChn->nVibratoPos = ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS))) ? 0x10 : 0; - if (pChn->nTremoloType < 4) pChn->nTremoloPos = 0; + if(!IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->nTremoloType < 4) pChn->nTremoloPos = 0; } if (pChn->nPos >= pChn->nLength) pChn->nPos = pChn->nLoopStart; } @@ -2541,11 +2541,11 @@ if (pChn->nPeriod) pChn->nPeriod = GetPeriodFromNote(pChn->nNote, pChn->nFineTune, pChn->nC5Speed); break; // S3x: Set Vibrato WaveForm - case 0x30: pChn->nVibratoType = param & 0x07; break; + case 0x30: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nVibratoType = param & 0x07; break; // S4x: Set Tremolo WaveForm - case 0x40: pChn->nTremoloType = param & 0x07; break; + case 0x40: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nTremoloType = param & 0x07; break; // S5x: Set Panbrello WaveForm - case 0x50: pChn->nPanbrelloType = param & 0x07; break; + case 0x50: if(((param & 0x0F) < 0x04) || !IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPanbrelloType = param & 0x07; break; // S6x: Pattern Delay for x frames case 0x60: m_nFrameDelay = param; break; // S7x: Envelope Control Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -1190,6 +1190,7 @@ Chn[j].nCommand = 0; Chn[j].nPatternLoopCount = 0; Chn[j].nPatternLoop = 0; + Chn[j].nVibratoPos = Chn[j].nTremoloPos = Chn[j].nPanbrelloPos = 0; //IT compatibility 15. Retrigger if(IsCompatibleMode(TRK_IMPULSETRACKER)) { @@ -1482,6 +1483,7 @@ Chn[i].nNewLeftVol = Chn[i].nNewRightVol = 0; Chn[i].nLeftRamp = Chn[i].nRightRamp = 0; Chn[i].nVolume = 256; + Chn[i].nVibratoPos = Chn[i].nTremoloPos = Chn[i].nPanbrelloPos = 0; //-->Custom tuning related Chn[i].m_ReCalculateFreqOnFirstTick = false; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -68,6 +68,9 @@ extern short int ModRampDownTable[64]; extern short int ModSquareTable[64]; extern short int ModRandomTable[64]; +extern short int ITSinusTable[64]; +extern short int ITRampDownTable[64]; +extern short int ITSquareTable[64]; extern DWORD LinearSlideUpTable[256]; extern DWORD LinearSlideDownTable[256]; extern DWORD FineLinearSlideUpTable[16]; @@ -983,16 +986,16 @@ if (pChn->dwFlags & CHN_TREMOLO) { UINT trempos = pChn->nTremoloPos & 0x3F; - if (vol > 0) + if (vol > 0 || IsCompatibleMode(TRK_IMPULSETRACKER)) { int tremattn = (m_nType & MOD_TYPE_XM) ? 5 : 6; switch (pChn->nTremoloType & 0x03) { case 1: - vol += (ModRampDownTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; + vol += ((IsCompatibleMode(TRK_IMPULSETRACKER) ? ITRampDownTable[trempos] : ModRampDownTable[trempos]) * (int)pChn->nTremoloDepth) >> tremattn; break; case 2: - vol += (ModSquareTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; + vol += ((IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSquareTable[trempos] : ModSquareTable[trempos]) * (int)pChn->nTremoloDepth) >> tremattn; break; case 3: //IT compatibility 19. Use random values @@ -1002,12 +1005,12 @@ vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; break; default: - vol += (ModSinusTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; + vol += ((IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSinusTable[trempos] : ModSinusTable[trempos]) * (int)pChn->nTremoloDepth) >> tremattn; } } if ((m_nTickCount) || ((m_nType & (MOD_TYPE_STM|MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS)))) { - pChn->nTremoloPos = (trempos + pChn->nTremoloSpeed) & 0x3F; + pChn->nTremoloPos = (pChn->nTremoloPos + pChn->nTremoloSpeed) & 0x3F; } } @@ -1337,13 +1340,10 @@ switch (pChn->nVibratoType & 0x03) { case 1: - if(IsCompatibleMode(TRK_ALLTRACKERS)) - vdelta = -ModRampDownTable[(vibpos+16) % 64]; - else - vdelta = ModRampDownTable[vibpos]; + vdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITRampDownTable[(vibpos + 48) % 64] : ModRampDownTable[vibpos]; break; case 2: - vdelta = ModSquareTable[vibpos]; + vdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSquareTable[(vibpos + 48) % 64] : ModSquareTable[vibpos]; break; case 3: //IT compatibility 19. Use random values @@ -1353,7 +1353,7 @@ vdelta = ModRandomTable[vibpos]; break; default: - vdelta = ModSinusTable[vibpos]; + vdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSinusTable[(vibpos + 48) % 64] : ModSinusTable[vibpos]; } if(m_nType == MOD_TYPE_MPT && pChn->pModInstrument && pChn->pModInstrument->pTuning) @@ -1385,11 +1385,14 @@ if (l & 0x03) vdelta += _muldiv(period, FineLinearSlideUpTable[l & 0x03], 0x10000) - period; } } - period += vdelta; + if(IsCompatibleMode(TRK_ALLTRACKERS)) + period -= vdelta; + else + period += vdelta; } if ((m_nTickCount) || ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS)))) { - pChn->nVibratoPos = (vibpos + pChn->nVibratoSpeed) & 0x3F; + pChn->nVibratoPos = (pChn->nVibratoPos + pChn->nVibratoSpeed) & 0x3F; } } // Panbrello @@ -1400,10 +1403,10 @@ switch (pChn->nPanbrelloType & 0x03) { case 1: - pdelta = ModRampDownTable[panpos]; + pdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITRampDownTable[panpos] : ModRampDownTable[panpos]; break; case 2: - pdelta = ModSquareTable[panpos]; + pdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSquareTable[panpos] : ModSquareTable[panpos]; break; case 3: //IT compatibility 19. Use random values @@ -1413,10 +1416,10 @@ pdelta = ModRandomTable[panpos]; break; default: - pdelta = ModSinusTable[panpos]; + pdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSinusTable[panpos] : ModSinusTable[panpos]; } pChn->nPanbrelloPos += pChn->nPanbrelloSpeed; - pdelta = ((pdelta * (int)pChn->nPanbrelloDepth) + 2) >> 3; + pdelta = ((pdelta * (int)pChn->nPanbrelloDepth) + 2) >> (IsCompatibleMode(TRK_IMPULSETRACKER) ? 4 : 3); pdelta += pChn->nRealPan; pChn->nRealPan = CLAMP(pdelta, 0, 256); Modified: trunk/OpenMPT/soundlib/Tables.cpp =================================================================== --- trunk/OpenMPT/soundlib/Tables.cpp 2009-08-24 20:57:36 UTC (rev 341) +++ trunk/OpenMPT/soundlib/Tables.cpp 2009-08-25 01:18:21 UTC (rev 342) @@ -154,7 +154,35 @@ 42,-34,89,-4,-51,-72,21,-29,112,123,84,-101,-92,98,-54,-95 }; +// Impulse Tracker tables +// Sinus table +short int ITSinusTable[64] = +{ + 0,12,25,37,49,60,71,81,90,98,106,112,117,122,125,126, + 127,126,125,122,117,112,106,98,90,81,71,60,49,37,25,12, + 0,-12,-25,-37,-49,-60,-71,-81,-90,-98,-106,-112,-117,-122,-125,-126, + -127,-126,-125,-122,-117,-112,-106,-98,-90,-81,-71,-60,-49,-37,-25,-12 +}; + +// Triangle wave table (ramp down) +short int ITRampDownTable[64] = +{ + 127,123,119,115,111,107,103,99,95,91,87,83,79,75,71,67, + 63,59,55,51,47,43,39,35,31,27,23,19,15,11,7,3, + 0,-4,-8,-12,-16,-20,-24,-28,-32,-36,-40,-44,-48,-52,-56,-60, + -64,-68,-72,-76,-80,-84,-88,-92,-96,-100,-104,-108,-112,-116,-120,-124 +}; + +// Square wave table +short int ITSquareTable[64] = +{ + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + // volume fade tables for Retrig Note: signed char retrigTable1[16] = { 0, 0, 0, 0, 0, 0, 10, 8, 0, 0, 0, 0, 0, 0, 24, 32 }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |