From: <sag...@us...> - 2011-03-26 15:16:46
|
Revision: 831 http://modplug.svn.sourceforge.net/modplug/?rev=831&view=rev Author: saga-games Date: 2011-03-26 15:16:39 +0000 (Sat, 26 Mar 2011) Log Message: ----------- [Fix] S3M compatibility: Tempo 32 is not allowed anymore (not supported by ST3), default speed of 255 is also forbidden (not supported by ST3) [Fix] S3M compatibility: Global volume commands > V40 are now ignored. Global volume is processed on tick 1 to emulate ST3's behaviour (far from perfect). [Fix] S3M compatibility: Pattern breaks >= C40 are now ingnored. [Fix] Pattern Editor: Automatically generated selections were not clamped properly to the end of the pattern. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2011-03-26 13:07:43 UTC (rev 830) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2011-03-26 15:16:39 UTC (rev 831) @@ -92,16 +92,17 @@ // -> CODE#0016 // -> DESC="default tempo update" // m_SpinTempo.SetRange(32, 255); // 255 bpm max - // S3M HACK + if(m_pSndFile->GetType() & MOD_TYPE_S3M) { - m_SpinTempo.SetRange(33, 255); - m_SpinSpeed.SetRange(1, 255); + // S3M HACK: ST3 will ignore speed 255, even though it can be used with Axx. + m_SpinSpeed.SetRange(1, 254); } else { - m_SpinTempo.SetRange((short)specs.tempoMin, (short)specs.tempoMax); m_SpinSpeed.SetRange((short)specs.speedMin, (short)specs.speedMax); } + m_SpinTempo.SetRange((short)specs.tempoMin, (short)specs.tempoMax); + // -! BEHAVIOUR_CHANGE#0016 m_SpinGlobalVol.SetRange(0, 128); m_SpinSamplePA.SetRange(0, 2000); Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-03-26 13:07:43 UTC (rev 830) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-03-26 15:16:39 UTC (rev 831) @@ -1318,9 +1318,9 @@ if (pSndFile) { y1 = max(y1, 0); - y2 = min(y2, (int)pSndFile->Patterns[m_nPattern].GetNumRows()); + y2 = min(y2, (int)pSndFile->Patterns[m_nPattern].GetNumRows() - 1); x1 = max(x1, 0); - x2 = min(x2, pSndFile->GetNumChannels() * 8 - 4); + x2 = min(x2, pSndFile->GetNumChannels() * 8 - (8 - LAST_COLUMN)); } } // end rewbs.fix3417 Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-03-26 13:07:43 UTC (rev 830) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2011-03-26 15:16:39 UTC (rev 831) @@ -598,8 +598,8 @@ header[0x2E] = 'R'; header[0x2F] = 'M'; header[0x30] = m_nDefaultGlobalVolume >> 2; - header[0x31] = CLAMP(m_nDefaultSpeed, 1, 255); - header[0x32] = CLAMP(m_nDefaultTempo, 32, 255); + header[0x31] = CLAMP(m_nDefaultSpeed, 1, 254); + header[0x32] = CLAMP(m_nDefaultTempo, 33, 255); header[0x33] = CLAMP(m_nSamplePreAmp, 0x10, 0x7F) | 0x80; // Bit 8 = Stereo header[0x34] = 0x08; // 8 Channels for UltraClick removal (default) header[0x35] = 0xFC; // Write pan positions Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-03-26 13:07:43 UTC (rev 830) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-03-26 15:16:39 UTC (rev 831) @@ -227,6 +227,11 @@ break; // Pattern Break case CMD_PATTERNBREAK: + if(param >= 64 && (GetType() & MOD_TYPE_S3M)) + { + // ST3 ignores invalid pattern breaks. + break; + } patternBreakOnThisRow = true; //Try to check next row for XPARAM nextRow = nullptr; @@ -338,10 +343,16 @@ break; // Global Volume case CMD_GLOBALVOLUME: + // ST3 applies global volume on tick 1 and does other weird things, but we just emulate this part for now. + if((GetType() & MOD_TYPE_S3M) && nMusicSpeed <= 1) + { + break; + } + if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; - if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2)) + if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_SCREAMTRACKER)) { - //IT compatibility 16. Both FT2 and IT ignore out-of-range values + //IT compatibility 16. FT2, ST3 and IT ignore out-of-range values if (param <= 128) nGlbVol = param << 1; } @@ -1869,11 +1880,16 @@ // Set Global Volume case CMD_GLOBALVOLUME: - if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; + // ST3 applies global volume on tick 1 and does other weird things, but we just emulate this part for now. + if(((GetType() & MOD_TYPE_S3M) && m_nTickCount != 1) + || (!(GetType() & MOD_TYPE_S3M) && !(m_dwSongFlags & SONG_FIRSTTICK))) + { + break; + } - if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; - //IT compatibility 16. Both FT2 and IT ignore out-of-range values - if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2)) + if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; + //IT compatibility 16. FT2, ST3 and IT ignore out-of-range values + if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_SCREAMTRACKER)) { if (param <= 128) m_nGlobalVolume = param << 1; @@ -2056,6 +2072,11 @@ // Pattern Break case CMD_PATTERNBREAK: + if(param >= 64 && (GetType() & MOD_TYPE_S3M)) + { + // ST3 ignores invalid pattern breaks. + break; + } m_nNextPatStartRow = 0; // FT2 E60 bug m = NULL; if (m_nRow < Patterns[m_nPattern].GetNumRows()-1) @@ -3021,7 +3042,7 @@ //------------------------------------------------------------------------------------------ { MODCHANNEL *pChn = &Chn[nChn]; - DWORD dwMacro = (*((DWORD *)pszMidiMacro)) & MACRO_MASK; + DWORD dwMacro = LittleEndian(*((DWORD *)pszMidiMacro)) & MACRO_MASK; int nInternalCode; // Not Internal Device ? @@ -3775,57 +3796,6 @@ } -// This is how backward jumps should not be tested. :) (now unused) -BOOL CSoundFile::IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const -//---------------------------------------------------------------------------------------------------------- -{ - while ((nJumpOrder < Patterns.Size()) && (Order[nJumpOrder] == Order.GetIgnoreIndex())) nJumpOrder++; - if ((nStartOrder >= Patterns.Size()) || (nJumpOrder >= Patterns.Size())) return FALSE; - // Treat only case with jumps in the same pattern - if (nJumpOrder > nStartOrder) return TRUE; - - if ((nJumpOrder < nStartOrder) || (nJumpRow >= Patterns[nStartOrder].GetNumRows()) - || (!(Patterns[nStartOrder])) || (nStartRow >= MAX_PATTERN_ROWS) || (nJumpRow >= MAX_PATTERN_ROWS)) return FALSE; - - // See if the pattern is being played backward - BYTE row_hist[MAX_PATTERN_ROWS]; - - memset(row_hist, 0, sizeof(row_hist)); - UINT nRows = Patterns[nStartOrder].GetNumRows(), row = nJumpRow; - - if (nRows > MAX_PATTERN_ROWS) nRows = MAX_PATTERN_ROWS; - row_hist[nStartRow] = TRUE; - while ((row < MAX_PATTERN_ROWS) && (!row_hist[row])) - { - if (row >= nRows) return TRUE; - row_hist[row] = TRUE; - const MODCOMMAND* p = Patterns[nStartOrder].GetpModCommand(row, m_nChannels); - row++; - int breakrow = -1, posjump = 0; - for (UINT i=0; i<m_nChannels; i++, p++) - { - if (p->command == CMD_POSITIONJUMP) - { - if (p->param < nStartOrder) return FALSE; - if (p->param > nStartOrder) return TRUE; - posjump = TRUE; - } else - if (p->command == CMD_PATTERNBREAK) - { - breakrow = p->param; - } - } - if (breakrow >= 0) - { - if (!posjump) return TRUE; - row = breakrow; - } - if (row >= nRows) return TRUE; - } - return FALSE; -} - - ////////////////////////////////////////////////////// // Note/Period/Frequency functions Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-03-26 13:07:43 UTC (rev 830) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-03-26 15:16:39 UTC (rev 831) @@ -917,7 +917,6 @@ void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide); void GlobalVolSlide(UINT param, UINT * nOldGlobalVolSlide); DWORD IsSongFinished(UINT nOrder, UINT nRow) const; - BOOL IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const; void UpdateTimeSignature(); UINT GetNumTicksOnCurrentRow() { return m_nMusicSpeed * (m_nPatternDelay + 1) + m_nFrameDelay; }; Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2011-03-26 13:07:43 UTC (rev 830) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2011-03-26 15:16:39 UTC (rev 831) @@ -276,7 +276,7 @@ 255, // Order max. 1, // Channel min 32, // Channel max - 32, // Min tempo + 33, // Min tempo 255, // Max tempo 64, // Min pattern rows 64, // Max pattern rows @@ -316,7 +316,7 @@ 255, // Order max. 1, // Channel min 32, // Channel max - 32, // Min tempo + 33, // Min tempo 255, // Max tempo 64, // Min pattern rows 64, // Max pattern rows This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |