From: <rel...@us...> - 2009-06-15 20:34:09
|
Revision: 270 http://modplug.svn.sourceforge.net/modplug/?rev=270&view=rev Author: relabsoluness Date: 2009-06-15 20:04:15 +0000 (Mon, 15 Jun 2009) Log Message: ----------- (Patch from Jojo, merged slightly modified) + XM: Compatibility play-mode with a couple of related fixes. + XM: Detects compatibility mode automatically when loading XM-file. Modified Paths: -------------- trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -280,7 +280,9 @@ p->SetWindowText("1. Enable more IT compatible playback.\n" "2. Use old random variation behavior for instruments.\n" "3. Enable plugin volume command bug emulation."); - else if(XM) p->SetWindowText("1. Unused\n2. Unused\n3. Plugin volume command bug emulation"); + else if(XM) p->SetWindowText("1. Enable more XM compatible playback.\n" + "2. Unused\n" + "3. Plugin volume command bug"); } p = GetDlgItem(IDC_FLAGEDITTITLE); if(p) p->ShowWindow(XMorITorMPT); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -1490,7 +1490,7 @@ { SetModFlag(MSF_MIDICC_BUGEMULATION, false); SetModFlag(MSF_OLDVOLSWING, false); - SetModFlag(MSF_IT_COMPATIBLE_PLAY, true); + SetModFlag(MSF_COMPATIBLE_PLAY, true); } } return TRUE; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -95,6 +95,8 @@ BYTE samples_used[(MAX_SAMPLES+7)/8]; UINT unused_samples; + bool bMadeWithModPlug = false; + m_nChannels = 0; if ((!lpStream) || (dwMemLength < 0x200)) return FALSE; if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return FALSE; @@ -554,6 +556,7 @@ } dwMemPos += len; } + bMadeWithModPlug = true; } // Read midi config: "MIDI" if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4944494D)) @@ -566,6 +569,7 @@ m_dwSongFlags |= SONG_EMBEDMIDICFG; dwMemPos += len; //rewbs.fix36946 } + bMadeWithModPlug = true; } // Read pattern names: "PNAM" if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4d414e50)) @@ -582,6 +586,7 @@ } dwMemPos += len; } + bMadeWithModPlug = true; } // Read channel names: "CNAM" if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x4d414e43)) @@ -598,13 +603,18 @@ } dwMemPos += len; } + bMadeWithModPlug = true; } // Read mix plugins information if (dwMemPos + 8 < dwMemLength) { dwMemPos += LoadMixPlugins(lpStream+dwMemPos, dwMemLength-dwMemPos); + bMadeWithModPlug = true; } + if(bMadeWithModPlug == false) + SetModFlag(MSF_COMPATIBLE_PLAY, true); + // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -417,7 +417,7 @@ MODINSTRUMENT *psmp = &Ins[instr]; UINT note = pChn->nNewNote; - if(note == 0 && TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) return; + if(note == 0 && TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY)) return; if ((penv) && (note) && (note <= 128)) { @@ -498,7 +498,7 @@ if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) || (m_dwSongFlags & SONG_ITCOMPATMODE) || (!pChn->nLength) || ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol)) //IT compatibility tentative fix: Reset envelopes when instrument changes. - || (TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY) && bInstrumentChanged)) + || (TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY) && bInstrumentChanged)) { pChn->dwFlags |= CHN_FASTVOLRAMP; if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!bInstrumentChanged) && (penv) && (!(pChn->dwFlags & (CHN_KEYOFF|CHN_NOTEFADE)))) @@ -535,7 +535,7 @@ //IT compatibility tentative fix: Don't anymore change bidi loop direction when //no sample nor instrument is changed. - if(TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY) && psmp == pChn->pInstrument && !bInstrumentChanged) + if(TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY) && psmp == pChn->pInstrument && !bInstrumentChanged) pChn->dwFlags = (pChn->dwFlags & (0xFFFFFF00 | CHN_PINGPONGFLAG)) | (psmp->uFlags & 0xFF); else pChn->dwFlags = (pChn->dwFlags & 0xFFFFFF00) | (psmp->uFlags & 0xFF); @@ -622,7 +622,7 @@ } //IT compatibility tentative fix: Clear channel note memory. - if(TypeIsIT_MPT() && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(TypeIsIT_MPT() && GetModFlag(MSF_COMPATIBLE_PLAY)) { pChn->nNote = 0; pChn->nNewNote = 0; @@ -1085,7 +1085,7 @@ nStartTick = param & 0x0F; //IT compatibility 08. Handling of out-of-range delay command. - if(nStartTick >= m_nMusicSpeed && GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(nStartTick >= m_nMusicSpeed && GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(instr) { @@ -1137,7 +1137,7 @@ if ((!note) && (instr)) //Case: instrument with no note data. { //IT compatibility: Instrument with no note. - if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(m_nInstruments) { @@ -1316,14 +1316,14 @@ break; case VOLCMD_PORTAUP: - if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) PortamentoUp(pChn, vol << 2, true); else PortamentoUp(pChn, vol << 2, false); break; case VOLCMD_PORTADOWN: - if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) PortamentoDown(pChn, vol << 2, true); else PortamentoDown(pChn, vol << 2, false); @@ -1533,7 +1533,25 @@ // Key Off case CMD_KEYOFF: - if (!m_nTickCount) KeyOff(nChn); + if(GetModFlag(MSF_COMPATIBLE_PLAY) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) + { + // This is how it's supposed to sound... + if (m_nTickCount == param) + { + // XM: Key-Off + Sample == Note Cut + if ((!pChn->pHeader) || (!(pChn->pHeader->dwFlags & ENV_VOLUME))) + { + pChn->dwFlags |= CHN_FASTVOLRAMP; + pChn->nVolume = 0; + } + KeyOff(nChn); + } + } + else + { + // This is how it's NOT supposed to sound... + if (!m_nTickCount) KeyOff(nChn); + } break; // Extra-fine porta up/down @@ -1576,16 +1594,21 @@ if (!m_nTickCount) { pChn->nVolEnvPosition = param; - pChn->nPanEnvPosition = param; - pChn->nPitchEnvPosition = param; - if (pChn->pHeader) + + if(!GetModFlag(MSF_COMPATIBLE_PLAY) || !(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) { - INSTRUMENTHEADER *penv = pChn->pHeader; - if ((pChn->dwFlags & CHN_PANENV) && (penv->nPanEnv) && (param > penv->PanPoints[penv->nPanEnv-1])) + pChn->nPanEnvPosition = param; + pChn->nPitchEnvPosition = param; + if (pChn->pHeader) { - pChn->dwFlags &= ~CHN_PANENV; + INSTRUMENTHEADER *penv = pChn->pHeader; + if ((pChn->dwFlags & CHN_PANENV) && (penv->nPanEnv) && (param > penv->PanPoints[penv->nPanEnv-1])) + { + pChn->dwFlags &= ~CHN_PANENV; + } } } + } break; @@ -1944,7 +1967,7 @@ pChn->dwFlags |= CHN_PORTAMENTO; //IT compatibility 03 - if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(!(m_dwSongFlags & SONG_ITCOMPATMODE) && (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(param == 0) param = pChn->nOldPortaUpDown; pChn->nOldPortaUpDown = param; @@ -3061,7 +3084,7 @@ pChn->nPatternLoopCount--; if(!pChn->nPatternLoopCount) { - if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) pChn->nPatternLoop = m_nRow+1; return -1; @@ -3070,7 +3093,7 @@ { MODCHANNEL *p = Chn; - if(!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY))) + if(!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY))) { for (UINT i=0; i<m_nChannels; i++, p++) if (p != pChn) { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -2917,22 +2917,15 @@ uint16 CSoundFile::GetModFlagMask(const MODTYPE oldtype, const MODTYPE newtype) const //----------------------------------------------------------------------------------- { - if(oldtype == MOD_TYPE_IT) - { - if(newtype == MOD_TYPE_MPT) return 65535; - if(newtype == MOD_TYPE_XM) return (1 << MSF_MIDICC_BUGEMULATION); - return 0; - } + const MODTYPE combined = oldtype | newtype; - if(oldtype == MOD_TYPE_MPT) - { - if(newtype == MOD_TYPE_IT) return 65535; - if(newtype == MOD_TYPE_XM) return (1 << MSF_MIDICC_BUGEMULATION); - return 0; - } + // XM <-> IT/MPT conversion. + if(combined == (MOD_TYPE_IT|MOD_TYPE_XM) || combined == (MOD_TYPE_MPT|MOD_TYPE_XM)) + return (1 << MSF_COMPATIBLE_PLAY) + (1 << MSF_MIDICC_BUGEMULATION); - if(oldtype == MOD_TYPE_XM && (newtype == MOD_TYPE_IT || newtype == MOD_TYPE_MPT)) - return (1 << MSF_MIDICC_BUGEMULATION); + // IT <-> MPT conversion. + if(combined == (MOD_TYPE_IT|MOD_TYPE_MPT)) + return uint16_max; return 0; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-06-15 20:04:15 UTC (rev 270) @@ -828,7 +828,7 @@ //Note: These are bit indeces. MSF <-> Mod(Specific)Flag. //If changing these, ChangeModTypeTo() might need modification. -const BYTE MSF_IT_COMPATIBLE_PLAY = 0; //IT/MPT +const BYTE MSF_COMPATIBLE_PLAY = 0; //IT/MPT/XM const BYTE MSF_OLDVOLSWING = 1; //IT/MPT const BYTE MSF_MIDICC_BUGEMULATION = 2; //IT/MPT/XM Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-06-14 21:48:05 UTC (rev 269) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-06-15 20:04:15 UTC (rev 270) @@ -1164,7 +1164,7 @@ else { //IT playback compatibility 01 & 02 - if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_IT_COMPATIBLE_PLAY)) + if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && GetModFlag(MSF_COMPATIBLE_PLAY)) { if(pChn->nArpeggio >> 4 != 0 || (pChn->nArpeggio & 0x0F) != 0) { @@ -1276,7 +1276,7 @@ switch (pChn->nVibratoType & 0x03) { case 1: - if(GetModFlag(MSF_IT_COMPATIBLE_PLAY) == true) + if(GetModFlag(MSF_COMPATIBLE_PLAY) == true) vdelta = -ModRampDownTable[(vibpos+16) % 64]; else vdelta = ModRampDownTable[vibpos]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |