From: <sag...@us...> - 2013-03-09 21:26:40
|
Revision: 1553 http://sourceforge.net/p/modplug/code/1553 Author: saga-games Date: 2013-03-09 21:26:30 +0000 (Sat, 09 Mar 2013) Log Message: ----------- [Imp] MOD Playback: Vibrato is not applied on first tick in PT1.x mode. [Imp] M15 loader: Added support for CIA timing. [Imp] S3M loader: Added support for SAx panning (as found in PANIC.S3M) Modified Paths: -------------- trunk/OpenMPT/common/FlagSet.h trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/common/FlagSet.h =================================================================== --- trunk/OpenMPT/common/FlagSet.h 2013-03-09 21:24:30 UTC (rev 1552) +++ trunk/OpenMPT/common/FlagSet.h 2013-03-09 21:26:30 UTC (rev 1553) @@ -110,6 +110,12 @@ return (flags & static_cast<store_t>(flag)) > 0; } + // Test if all specified flags are set. + bool test_all(enum_t flag) const + { + return (flags & static_cast<store_t>(flag)) == static_cast<store_t>(flag); + } + // Test if any flag is set. bool any() const { Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2013-03-09 21:24:30 UTC (rev 1552) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2013-03-09 21:26:30 UTC (rev 1553) @@ -799,7 +799,7 @@ MODFileHeader fileHeader; file.Read(fileHeader); - // Sanity check: No more than 128 positions. We won't check the restart pos since I've encountered so many invalid values (0x6A, 0x72, 0x78, ...) that it doesn't make sense to check for them all. + // Sanity check: No more than 128 positions. if(fileHeader.numOrders > 128) { return false; @@ -828,17 +828,19 @@ m_nChannels = 4; m_nInstruments = 0; m_nDefaultSpeed = 6; - if(fileHeader.restartPos <= 0x40) + if(fileHeader.restartPos <= 0x20) { m_nDefaultTempo = 125; m_nRestartPos = (fileHeader.restartPos < fileHeader.numOrders ? fileHeader.restartPos : 0); } else { - // Sample 7 in echoing.mod won't "loop" correctly if we don't convert the tempo. + // Sample 7 in echoing.mod won't "loop" correctly if we don't convert the VBlank tempo. m_nDefaultTempo = fileHeader.restartPos * 25 / 24; m_nRestartPos = 0; if(fileHeader.restartPos != 0x78) { + // Convert to CIA timing + m_nDefaultTempo = static_cast<TEMPO>(((709378.92f / 50.0f) * 125.0f) / ((240.0f - static_cast<float>(fileHeader.restartPos)) * 122.0f)); if(minVersion > UST1_80) { // D.O.C. SoundTracker IX re-introduced the variable tempo after some other versions dropped it. Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-03-09 21:24:30 UTC (rev 1552) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-03-09 21:26:30 UTC (rev 1553) @@ -698,8 +698,12 @@ S3MConvert(m, false); } - if(m.command == CMD_MIDI) + if(m.command == CMD_S3MCMDEX && (m.param & 0xF0) == 0xA0 && fileHeader.cwtv < S3MFileHeader::trkST3_20) { + // Convert old SAx panning to S8x (should only be found in PANIC.S3M by Purple Motion) + m.param = 0x80 | ((m.param & 0x0F) ^ 8); + } else if(m.command == CMD_MIDI) + { // PixPlay panning test if(m.param > 0x0F) { Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-03-09 21:24:30 UTC (rev 1552) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-03-09 21:26:30 UTC (rev 1553) @@ -1578,12 +1578,6 @@ UINT vibpos = chn.nVibratoPos; int vdelta = GetVibratoDelta(chn.nVibratoType, vibpos); - if((GetType() & MOD_TYPE_XM) && (chn.nVibratoType & 0x03) == 1) - { - // FT2 compatibility: Vibrato ramp down table is upside down. - // Test case: VibratoWaveforms.xm - vdelta = -vdelta; - } if(GetType() == MOD_TYPE_MPT && chn.pModInstrument && chn.pModInstrument->pTuning) { @@ -1599,6 +1593,17 @@ { // Original behaviour + if(m_SongFlags.test_all(SONG_FIRSTTICK | SONG_PT1XMODE)) + { + // ProTracker doesn't apply vibrato nor advance on the first tick. + return; + } else if((GetType() & MOD_TYPE_XM) && (chn.nVibratoType & 0x03) == 1) + { + // FT2 compatibility: Vibrato ramp down table is upside down. + // Test case: VibratoWaveforms.xm + vdelta = -vdelta; + } + UINT vdepth; // IT compatibility: correct vibrato depth if(IsCompatibleMode(TRK_IMPULSETRACKER)) @@ -1653,8 +1658,8 @@ } } - // Advance vibrato position - if(m_nTickCount || ((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && !(m_SongFlags[SONG_ITOLDEFFECTS]))) + // Advance vibrato position - IT updates on every tick, unless "old effects" are enabled (in this case it only updates on non-first ticks like other trackers) + if(!m_SongFlags[SONG_FIRSTTICK] || ((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && !(m_SongFlags[SONG_ITOLDEFFECTS]))) { // IT compatibility: IT has its own, more precise tables if(IsCompatibleMode(TRK_IMPULSETRACKER)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |