From: <sag...@us...> - 2010-03-09 18:43:02
|
Revision: 521 http://modplug.svn.sourceforge.net/modplug/?rev=521&view=rev Author: saga-games Date: 2010-03-09 18:42:49 +0000 (Tue, 09 Mar 2010) Log Message: ----------- [Mod] Installer: Changed project URL again, now that there's at least a nice "in progress" site at openmpt.com [Ref] Some more explanations for the compatibility fixes Modified Paths: -------------- trunk/OpenMPT/installer/install.iss trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/installer/install.iss =================================================================== --- trunk/OpenMPT/installer/install.iss 2010-03-08 17:44:16 UTC (rev 520) +++ trunk/OpenMPT/installer/install.iss 2010-03-09 18:42:49 UTC (rev 521) @@ -9,9 +9,9 @@ AppVersion=1.18.00.00 AppName=OpenMPT AppPublisher=OpenMPT Devs / Olivier Lapicque -AppPublisherURL=http://www.modplug.com/ -AppSupportURL=http://www.modplug.com/ -AppUpdatesURL=http://www.modplug.com/ +AppPublisherURL=http://www.openmpt.com/ +AppSupportURL=http://www.openmpt.com/ +AppUpdatesURL=http://www.openmpt.com/ DefaultDirName={pf}\OpenMPT DefaultGroupName=OpenMPT AllowNoIcons=yes @@ -142,3 +142,4 @@ #include "vst_scan.iss" + Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-03-08 17:44:16 UTC (rev 520) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-03-09 18:42:49 UTC (rev 521) @@ -301,7 +301,7 @@ } // -> CODE#0010 // -> DESC="add extended parameter mechanism to pattern effects" - if(IsCompatibleMode(TRK_ALLTRACKERS)) + if(IsCompatibleMode(TRK_ALLTRACKERS)) // clamp tempo correctly in compatible mode nMusicTempo = CLAMP(nMusicTempo, 32, 255); else nMusicTempo = CLAMP(nMusicTempo, GetModSpecifications().tempoMin, GetModSpecifications().tempoMax); @@ -321,6 +321,7 @@ } break; case CMD_XFINEPORTAUPDOWN: + // ignore high offset in compatible mode if (((param & 0xF0) == 0xA0) && !IsCompatibleMode(TRK_FASTTRACKER2)) pChn->nOldHiOffset = param & 0x0F; break; } @@ -474,7 +475,7 @@ MODSAMPLE *pSmp = &Samples[instr]; UINT note = pChn->nNewNote; - if(note == 0 && IsCompatibleMode(TRK_IMPULSETRACKER)) return; + if(note == NOTE_NONE && IsCompatibleMode(TRK_IMPULSETRACKER)) return; if ((pIns) && (note) && (note <= 128)) { @@ -768,11 +769,13 @@ // Handle "retrigger" waveform type if (pChn->nVibratoType < 4) { + // IT Compatibilty: Slightly different waveform offsets (why does MPT have two different offsets here with IT old effects enabled and disabled?) if(!IsCompatibleMode(TRK_IMPULSETRACKER) && (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS))) pChn->nVibratoPos = 0x10; else pChn->nVibratoPos = 0; } + // IT Compatibility: No "retrigger" waveform here if(!IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->nTremoloType < 4) { pChn->nTremoloPos = 0; @@ -812,9 +815,10 @@ pChn->nLeftVU = pChn->nRightVU = 0xFF; pChn->dwFlags &= ~CHN_FILTER; pChn->dwFlags |= CHN_FASTVOLRAMP; + //IT compatibility 15. Retrigger will not be reset (Tremor doesn't store anything here, so we just don't reset this as well) if(!IsCompatibleMode(TRK_IMPULSETRACKER)) { - //IT compatibility 15. Retrigger will not be reset (Tremor doesn't store anything here, so we just don't reset this as well) + // XM compatibility: FT2 also doesn't reset retrigger if(!IsCompatibleMode(TRK_FASTTRACKER2)) pChn->nRetrigCount = 0; pChn->nTremorCount = 0; } @@ -824,6 +828,7 @@ pChn->nResSwing = pChn->nCutSwing = 0; if (pIns) { + // IT compatibility tentative fix: Reset NNA action on every new note, even without instrument number next to note (fixes spx-farspacedance.it, but is this actually 100% correct?) if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nNNA = pIns->nNNA; if (!(pIns->VolEnv.dwFlags & ENV_CARRY)) pChn->nVolEnvPosition = 0; if (!(pIns->PanEnv.dwFlags & ENV_CARRY)) pChn->nPanEnvPosition = 0; @@ -833,6 +838,7 @@ // Volume Swing if (pIns->nVolSwing) { + // IT compatibility: MPT has a weird vol swing algorithm.... if(IsCompatibleMode(TRK_IMPULSETRACKER)) { double d = 2 * (((double) rand()) / RAND_MAX) - 1; @@ -846,6 +852,7 @@ // Pan Swing if (pIns->nPanSwing) { + // IT compatibility: MPT has a weird pan swing algorithm.... if(IsCompatibleMode(TRK_IMPULSETRACKER)) { double d = 2 * (((double) rand()) / RAND_MAX) - 1; @@ -883,7 +890,8 @@ { if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = true; } if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = true; } - if (bFlt && (pIns->nFilterMode != FLTMODE_UNCHANGED)) { + if (bFlt && (pIns->nFilterMode != FLTMODE_UNCHANGED)) + { pChn->nFilterMode = pIns->nFilterMode; } } else @@ -999,22 +1007,22 @@ applyDNAtoPlug = false; //rewbs.VSTiNNA if (((p->nMasterChn == nChn+1) || (p == pChn)) && (p->pModInstrument)) { - BOOL bOk = FALSE; + bool bOk = false; // Duplicate Check Type switch(p->pModInstrument->nDCT) { // Note case DCT_NOTE: - if ((note) && (p->nNote == note) && (pHeader == p->pModInstrument)) bOk = TRUE; + if ((note) && (p->nNote == note) && (pHeader == p->pModInstrument)) bOk = true; if (pHeader && pHeader->nMixPlug) applyDNAtoPlug = true; //rewbs.VSTiNNA break; // Sample case DCT_SAMPLE: - if ((pSample) && (pSample == p->pSample)) bOk = TRUE; + if ((pSample) && (pSample == p->pSample)) bOk = true; break; // Instrument case DCT_INSTRUMENT: - if (pHeader == p->pModInstrument) bOk = TRUE; + if (pHeader == p->pModInstrument) bOk = true; //rewbs.VSTiNNA if (pHeader && pHeader->nMixPlug) applyDNAtoPlug = true; break; @@ -1023,7 +1031,7 @@ if (pHeader && (pHeader->nMixPlug) && (pHeader->nMixPlug == p->pModInstrument->nMixPlug)) { applyDNAtoPlug = true; - bOk = TRUE; + bOk = true; } //end rewbs.VSTiNNA break; @@ -1504,6 +1512,7 @@ break; case VOLCMD_VIBRATOSPEED: + // FT2 does not automatically enable vibrato with the "set vibrato speed" command if(IsCompatibleMode(TRK_FASTTRACKER2)) pChn->nVibratoSpeed = vol & 0x0F; else @@ -1523,7 +1532,7 @@ break; case VOLCMD_PORTAUP: - //IT compatibility (one of the first - link effect memory) + //IT compatibility (one of the first testcases - link effect memory) if(IsCompatibleMode(TRK_IMPULSETRACKER)) PortamentoUp(pChn, vol << 2, true); else @@ -1531,7 +1540,7 @@ break; case VOLCMD_PORTADOWN: - //IT compatibility (one of the first - link effect memory) + //IT compatibility (one of the first testcases - link effect memory) if(IsCompatibleMode(TRK_IMPULSETRACKER)) PortamentoDown(pChn, vol << 2, true); else @@ -1646,7 +1655,7 @@ // Arpeggio case CMD_ARPEGGIO: - // IT compatibility 01. Don't ignore Arpeggio if no note is playing + // IT compatibility 01. Don't ignore Arpeggio if no note is playing (also valid for ST3) if ((m_nTickCount) || (((!pChn->nPeriod) || !pChn->nNote) && !IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER))) break; if ((!param) && (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)))) break; pChn->nCommand = CMD_ARPEGGIO; @@ -1661,9 +1670,9 @@ if (!(param & 0x0F)) param |= pChn->nRetrigParam & 0x0F; param |= 0x100; // increment retrig count on first row } + // IT compatibility 15. Retrigger if(IsCompatibleMode(TRK_IMPULSETRACKER)) { - // IT compatibility 15. Retrigger if (param) pChn->nRetrigParam = (BYTE)(param & 0xFF); @@ -1694,17 +1703,16 @@ case CMD_TREMOR: if (!(m_dwSongFlags & SONG_FIRSTTICK)) break; + // IT compatibility 12. / 13. Tremor (using modified DUMB's Tremor logic here because of old effects - http://dumb.sf.net/) if(IsCompatibleMode(TRK_IMPULSETRACKER)) { - // IT compatibility 12. / 13. Tremor (using modified DUMB's Tremor logic here because of old effects - http://dumb.sf.net/) - - if (param && !(m_dwSongFlags & SONG_ITOLDEFFECTS)) { + if (param && !(m_dwSongFlags & SONG_ITOLDEFFECTS)) + { // Old effects have different length interpretation (+1 for both on and off) if (param & 0xf0) param -= 0x10; if (param & 0x0f) param -= 0x01; } pChn->nTremorCount |= 128; // set on/off flag - } else { @@ -1721,9 +1729,9 @@ if (!(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)) { - //IT compatibility 16. Both FT2 and IT ignore out-of-range values if (param <= 128) m_nGlobalVolume = param << 1; } @@ -1795,9 +1803,9 @@ // Key Off case CMD_KEYOFF: + // This is how Key Off is supposed to sound... (in FT2 at least) if(IsCompatibleMode(TRK_FASTTRACKER2)) { - // This is how it's supposed to sound... (in FT2) if (m_nTickCount == param) { // XM: Key-Off + Sample == Note Cut @@ -1816,9 +1824,9 @@ KeyOff(nChn); } } + // This is how it's NOT supposed to sound... else { - // This is how it's NOT supposed to sound... if(m_dwSongFlags & SONG_FIRSTTICK) KeyOff(nChn); } @@ -1830,7 +1838,7 @@ { case 0x10: ExtraFinePortamentoUp(pChn, param & 0x0F); break; case 0x20: ExtraFinePortamentoDown(pChn, param & 0x0F); break; - // Modplug XM Extensions + // Modplug XM Extensions (ignore in compatible mode) case 0x50: case 0x60: case 0x70: @@ -1866,9 +1874,9 @@ { pChn->nVolEnvPosition = param; + // XM compatibility: FT2 only sets the position of the Volume envelope if(!IsCompatibleMode(TRK_FASTTRACKER2)) { - // FT2 only sets the position of the Volume envelope pChn->nPanEnvPosition = param; pChn->nPitchEnvPosition = param; if (pChn->pModInstrument) @@ -2000,9 +2008,11 @@ //end rewbs.fix && ((nPosJump != (int)m_nCurrentPattern) || (nBreakRow != (int)m_nRow))) { + // IT compatibility: don't reset loop count on pattern break if (nPosJump != (int)m_nCurrentPattern && !IsCompatibleMode(TRK_IMPULSETRACKER)) { - for (UINT i=0; i<m_nChannels; i++) Chn[i].nPatternLoopCount = 0; + for (CHANNELINDEX i = 0; i < m_nChannels; i++) + Chn[i].nPatternLoopCount = 0; } m_nNextPattern = nPosJump; m_nNextRow = (UINT)nBreakRow; @@ -2478,6 +2488,7 @@ { if (param & 0x0F) nPanSlide = -(int)((param & 0x0F) << 2); else nPanSlide = (int)((param & 0xF0) >> 2); + // XM compatibility: FT2's panning slide is not as deep if(IsCompatibleMode(TRK_FASTTRACKER2)) nPanSlide >>= 2; } @@ -2644,6 +2655,7 @@ pChn->nVibratoType = param & 0x03; } else { + // IT compatibility: Ignore waveform types > 3 if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nVibratoType = (param < 0x04) ? param : 0; else @@ -2656,6 +2668,7 @@ pChn->nTremoloType = param & 0x03; } else { + // IT compatibility: Ignore waveform types > 3 if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nTremoloType = (param < 0x04) ? param : 0; else @@ -2663,7 +2676,9 @@ } break; // S5x: Set Panbrello Waveform - case 0x50: if(IsCompatibleMode(TRK_IMPULSETRACKER)) + case 0x50: + // IT compatibility: Ignore waveform types > 3 + if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPanbrelloType = (param < 0x04) ? param : 0; else pChn->nPanbrelloType = param & 0x07; @@ -2727,6 +2742,7 @@ // S8x: Set 4-bit Panning case 0x80: if(m_dwSongFlags & SONG_FIRSTTICK) { + // IT Compatibility (and other trackers as well): panning disables surround (unless panning in rear channels is enabled, which is not supported by the original trackers anyway) if(IsCompatibleMode(TRK_ALLTRACKERS)) { if (!(m_dwSongFlags & SONG_SURROUNDPAN)) pChn->dwFlags &= ~CHN_SURROUND; @@ -3215,15 +3231,19 @@ { // IT Compatibility: Offset if(IsCompatibleMode(TRK_IMPULSETRACKER)) + { if(m_dwSongFlags & SONG_ITOLDEFFECTS) pChn->nPos = pChn->nLength; // Old FX: Clip to end of sample else pChn->nPos = 0; // Reset to beginning of sample + } else + { pChn->nPos = pChn->nLoopStart; - if ((m_dwSongFlags & SONG_ITOLDEFFECTS) && (pChn->nLength > 4)) - { - pChn->nPos = pChn->nLength - 2; + if ((m_dwSongFlags & SONG_ITOLDEFFECTS) && (pChn->nLength > 4)) + { + pChn->nPos = pChn->nLength - 2; + } } } else if(IsCompatibleMode(TRK_FASTTRACKER2)) { @@ -3251,9 +3271,9 @@ int nRetrigCount = pChn->nRetrigCount; bool bDoRetrig = false; + //IT compatibility 15. Retrigger if(IsCompatibleMode(TRK_IMPULSETRACKER)) { - //IT compatibility 15. Retrigger if ((m_dwSongFlags & SONG_FIRSTTICK) && pChn->nRowNote) { pChn->nRetrigCount = param & 0xf; @@ -3264,10 +3284,9 @@ bDoRetrig = true; } } + // buggy-like-hell FT2 Rxy retrig! else if(IsCompatibleMode(TRK_FASTTRACKER2) && (param & 0x100)) { - // buggy-like-hell FT2 Rxy retrig! - if(m_dwSongFlags & SONG_FIRSTTICK) { // here are some really stupid things FT2 does @@ -3344,12 +3363,14 @@ } if (param < 0x100) bResetEnv = true; } + // IT compatibility: Really weird combination of envelopes and retrigger (see Storlek's q.it testcase) NoteChange(nChn, nNote, IsCompatibleMode(TRK_IMPULSETRACKER) ? true : false, bResetEnv); if (m_nInstruments) { ProcessMidiOut(nChn, pChn); //Send retrig to Midi } if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!pChn->nRowNote) && (nOldPeriod)) pChn->nPeriod = nOldPeriod; if (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) nRetrigCount = 0; + // IT compatibility: see previous IT compatibility comment =) if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPos = pChn->nPosLo = 0; if (offset) //rewbs.volOffset: apply offset on retrig @@ -3363,6 +3384,7 @@ // buggy-like-hell FT2 Rxy retrig! if(IsCompatibleMode(TRK_FASTTRACKER2) && (param & 0x100)) nRetrigCount++; + // Now we can also store the retrig value for IT... if(!IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nRetrigCount = (BYTE)nRetrigCount; } @@ -3548,7 +3570,7 @@ // -> CODE#0016 // -> DESC="default tempo update" - if(IsCompatibleMode(TRK_ALLTRACKERS)) + if(IsCompatibleMode(TRK_ALLTRACKERS)) // clamp tempo correctly in compatible mode m_nMusicTempo = CLAMP(m_nMusicTempo, 32, 255); else m_nMusicTempo = CLAMP(m_nMusicTempo, specs.tempoMin, specs.tempoMax); Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-03-08 17:44:16 UTC (rev 520) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-03-09 18:42:49 UTC (rev 521) @@ -988,15 +988,19 @@ if (pChn->dwFlags & CHN_TREMOLO) { UINT trempos = pChn->nTremoloPos; + // IT compatibility: Why would want to not execute tremolo at volume 0? if (vol > 0 || IsCompatibleMode(TRK_IMPULSETRACKER)) { + // IT compatibility: We don't need a different attenuation here because of the different tables we're going to use const int tremattn = (m_nType & MOD_TYPE_XM || IsCompatibleMode(TRK_IMPULSETRACKER)) ? 5 : 6; switch (pChn->nTremoloType & 0x03) { case 1: + // IT compatibility: IT has its own, more precise tables vol += ((IsCompatibleMode(TRK_IMPULSETRACKER) ? ITRampDownTable[trempos] : ModRampDownTable[trempos]) * (int)pChn->nTremoloDepth) >> tremattn; break; case 2: + // IT compatibility: IT has its own, more precise tables vol += ((IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSquareTable[trempos] : ModSquareTable[trempos]) * (int)pChn->nTremoloDepth) >> tremattn; break; case 3: @@ -1007,11 +1011,13 @@ vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; break; default: + // IT compatibility: IT has its own, more precise tables 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)))) { + // IT compatibility: IT has its own, more precise tables if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nTremoloPos = (pChn->nTremoloPos + 4 * pChn->nTremoloSpeed) & 0xFF; else @@ -1022,10 +1028,9 @@ // Tremor if(pChn->nCommand == CMD_TREMOR) { + // IT compatibility 12. / 13.: Tremor if(IsCompatibleMode(TRK_IMPULSETRACKER)) { - // IT compatibility 12. / 13.: Tremor - if ((pChn->nTremorCount & 128) && pChn->nLength) { if (pChn->nTremorCount == 128) pChn->nTremorCount = (pChn->nTremorParam >> 4) | 192; @@ -1157,6 +1162,7 @@ { // PPS value is 1/512, i.e. PPS=1 will adjust by 8/512 = 1/64 for each 8 semitones // with PPS = 32 / PPC = C-5, E-6 will pan hard right (and D#6 will not) + // IT compatibility: IT has a wider pan range here int pandelta = (int)pChn->nRealPan + (int)((int)(pChn->nNote - pIns->nPPC - 1) * (int)pIns->nPPS) / (int)(IsCompatibleMode(TRK_IMPULSETRACKER) ? 4 : 8); pChn->nRealPan = CLAMP(pandelta, 0, 256); } @@ -1227,7 +1233,8 @@ } } } - else if(IsCompatibleMode(TRK_FASTTRACKER2)) // FastTracker 2 + // FastTracker 2: Swedish tracker logic (TM) arpeggio + else if(IsCompatibleMode(TRK_FASTTRACKER2)) { BYTE note = pChn->nNote; int arpPos = 0; @@ -1249,7 +1256,8 @@ period = GetPeriodFromNote(note, pChn->nFineTune, pChn->nC5Speed); } - else // Other trackers + // Other trackers + else { switch(m_nTickCount % 3) { @@ -1347,9 +1355,11 @@ switch (pChn->nVibratoType & 0x03) { case 1: + // IT compatibility: IT has its own, more precise tables vdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITRampDownTable[vibpos] : ModRampDownTable[vibpos]; break; case 2: + // IT compatibility: IT has its own, more precise tables vdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSquareTable[vibpos] : ModSquareTable[vibpos]; break; case 3: @@ -1360,6 +1370,7 @@ vdelta = ModRandomTable[vibpos]; break; default: + // IT compatibility: IT has its own, more precise tables vdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSinusTable[vibpos] : ModSinusTable[vibpos]; } @@ -1377,8 +1388,10 @@ else //Original behavior { UINT vdepth; + // IT compatibility: correct vibrato depth if(IsCompatibleMode(TRK_IMPULSETRACKER)) { + // Yes, vibrato goes backwards with old effects enabled! if(m_dwSongFlags & SONG_ITOLDEFFECTS) { vdepth = 5; @@ -1411,6 +1424,7 @@ } if ((m_nTickCount) || ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS)))) { + // IT compatibility: IT has its own, more precise tables if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nVibratoPos = (vibpos + 4 * pChn->nVibratoSpeed) & 0xFF; else @@ -1421,6 +1435,7 @@ if (pChn->dwFlags & CHN_PANBRELLO) { UINT panpos; + // IT compatibility: IT has its own, more precise tables if(IsCompatibleMode(TRK_IMPULSETRACKER)) panpos = pChn->nPanbrelloPos & 0xFF; else @@ -1429,9 +1444,11 @@ switch (pChn->nPanbrelloType & 0x03) { case 1: + // IT compatibility: IT has its own, more precise tables pdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITRampDownTable[panpos] : ModRampDownTable[panpos]; break; case 2: + // IT compatibility: IT has its own, more precise tables pdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSquareTable[panpos] : ModSquareTable[panpos]; break; case 3: @@ -1442,6 +1459,7 @@ pdelta = ModRandomTable[panpos]; break; default: + // IT compatibility: IT has its own, more precise tables pdelta = IsCompatibleMode(TRK_IMPULSETRACKER) ? ITSinusTable[panpos] : ModSinusTable[panpos]; } pChn->nPanbrelloPos += pChn->nPanbrelloSpeed; @@ -1457,6 +1475,7 @@ { MODSAMPLE *pSmp = pChn->pModSample; + // IT compatibility: No vibrato sweep = No vibrato at all! if (pSmp->nVibSweep == 0 && !IsCompatibleMode(TRK_IMPULSETRACKER)) { pChn->nAutoVibDepth = pSmp->nVibDepth << 8; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |