From: <sag...@us...> - 2009-07-23 13:05:39
|
Revision: 300 http://modplug.svn.sourceforge.net/modplug/?rev=300&view=rev Author: saga-games Date: 2009-07-23 13:05:32 +0000 (Thu, 23 Jul 2009) Log Message: ----------- Commit 300! \o/ [Imp] Mod conversion: Somewhat decent conversion of Kxx (Key Off) from XM to S3M/IT [Imp] Pattern editor: Solo/Unmute context menu has a bit more dynamical transition menu points (experimental) [Imp] Pattern editor: Returned to old pattern looping behaviour when a Bxx effect occours (experimental) [Fix] FT2 compatibility: More compatible handling of Kxx effect [Fix] IT compatibility: Random waveforms (vibrato, tremolo, panbrello) (test #19) [Fix] IT compatibility: Fixed handling of very short pitch / filter envelopes (test #24) Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -206,6 +206,16 @@ case 0xA0: m->command = CMD_S3MCMDEX; break; } break; + case CMD_KEYOFF: + if(m->note == 0) + { + m->note = (newTypeIsS3M) ? NOTE_NOTECUT : NOTE_KEYOFF; + m->command = CMD_S3MCMDEX; + if(m->param == 0) + m->instr = 0; + m->param = 0xD0 | (m->param & 0x0F); + } + break; } } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -4583,19 +4583,25 @@ AppendMenu(hMenu, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_PATTERN_MUTE, "Mute Channel\t" + ih->GetKeyTextFromCommand(kcChannelMute)); - BOOL b, bAll; - b = FALSE; - bAll = FALSE; - for (UINT i=0; i<pSndFile->m_nChannels; i++) { - if (i != nChn) { - if (!(pSndFile->ChnSettings[i].dwFlags & CHN_MUTE)) b = TRUE; - } else { - if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) b = TRUE; + BOOL bSolo = false, bUnmuteAll = false; + BOOL bSoloPending = false, bUnmuteAllPending = false; // doesn't work perfectly yet + + for (CHANNELINDEX i = 0; i < pSndFile->m_nChannels; i++) { + if (i != nChn) + { + if (!(pSndFile->ChnSettings[i].dwFlags & CHN_MUTE)) bSolo = bSoloPending = true; + if (!((~pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) && pSndFile->m_bChannelMuteTogglePending[i])) bSoloPending = true; } - if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) bAll = TRUE; + else + { + if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) bSolo = bSoloPending = true; + if ((~pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) && pSndFile->m_bChannelMuteTogglePending[i]) bSoloPending = true; + } + if (pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) bUnmuteAll = bUnmuteAllPending = true; + if ((~pSndFile->ChnSettings[i].dwFlags & CHN_MUTE) && pSndFile->m_bChannelMuteTogglePending[i]) bUnmuteAllPending = true; } - if (b) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); - if (bAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); + if (bSolo) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo)); + if (bUnmuteAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll)); AppendMenu(hMenu, pSndFile->m_bChannelMuteTogglePending[nChn] ? @@ -4605,8 +4611,8 @@ "On transition: Unmute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) : "On transition: Mute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition)); - AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); - AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); + if (bUnmuteAllPending) AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition)); + if (bSoloPending) AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition)); AppendMenu(hMenu, MF_STRING, ID_PATTERN_CHNRESET, "Reset Channel\t" + ih->GetKeyTextFromCommand(kcChannelReset)); Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -1109,7 +1109,7 @@ m_MixPlugins[plug-1].pMixPlugin->SetParameter(plugparam, value); } - // Process continuous parameter pontrol note. + // Process continuous parameter control note. // Row data is cleared after first tick so on following // ticks using channels m_nPlugParamValueStep to identify // the need for parameter control. The condition cmd == 0 @@ -1216,9 +1216,15 @@ { UINT note = pChn->nRowNote; if (instr) pChn->nNewIns = instr; - // XM: Key-Off + Sample == Note Cut if (m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM|MOD_TYPE_MT2)) { + // XM: FT2 ignores a note next to a K00 effect, and a fade-out seems to be done when no volume envelope is present (not exactly the Kxx behaviour) + if(cmd == CMD_KEYOFF && param == 0 && GetModFlag(MSF_COMPATIBLE_PLAY)) + { + note = instr = 0; + } + + // XM: Key-Off + Sample == Note Cut if ((note == NOTE_KEYOFF) && ((!pChn->pHeader) || (!(pChn->pHeader->dwFlags & ENV_VOLUME)))) { pChn->dwFlags |= CHN_FASTVOLRAMP; @@ -1357,7 +1363,17 @@ // Volume Column Effect (except volume & panning) - if ((volcmd > VOLCMD_PANNING) && (m_nTickCount >= nStartTick)) + /* A few notes, paraphrased from ITTECH.TXT by Storlek (creator of schismtracker): + Ex/Fx/Gx are shared with Exx/Fxx/Gxx; Ex/Fx are 4x the 'normal' slide value + Gx is linked with Ex/Fx if Compat Gxx is off, just like Gxx is with Exx/Fxx + Gx values: 1, 4, 8, 16, 32, 64, 96, 128, 255 + Ax/Bx/Cx/Dx values are used directly (i.e. D9 == D09), and are NOT shared with Dxx + (value is stored into nOldVolParam and used by A0/B0/C0/D0) + Hx uses the same value as Hxx and Uxx, and affects the *depth* + so... hxx = (hx | (oldhxx & 0xf0)) ??? + TODO is this done correctly? + */ + if ((volcmd > VOLCMD_PANNING) && (m_nTickCount >= nStartTick)) { if (volcmd == VOLCMD_TONEPORTAMENTO) { @@ -1663,8 +1679,15 @@ // XM: Key-Off + Sample == Note Cut if ((!pChn->pHeader) || (!(pChn->pHeader->dwFlags & ENV_VOLUME))) { - pChn->dwFlags |= CHN_FASTVOLRAMP; - pChn->nVolume = 0; + if(param == 0) // FT2 is weird.... + { + pChn->dwFlags |= CHN_NOTEFADE; + } + else + { + pChn->dwFlags |= CHN_FASTVOLRAMP; + pChn->nVolume = 0; + } } KeyOff(nChn); } @@ -1738,12 +1761,14 @@ // Position Jump case CMD_POSITIONJUMP: nPosJump = param; + /* commented this out (http://lpchip.com/modplug/viewtopic.php?t=1808) - I hope it doesn't break anything else. if((m_dwSongFlags & SONG_PATTERNLOOP && m_nSeqOverride == 0)) { m_nSeqOverride = param+1; //Releasing pattern loop after position jump could cause //instant jumps - modifying behavior so that now position jumps //occurs also when pattern loop is enabled. } + */ // see http://lpchip.com/modplug/viewtopic.php?t=2769 - FastTracker resets Dxx if Bxx is called _after_ Dxx if(GetType() == MOD_TYPE_XM) nBreakRow = 0; break; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-21 21:33:40 UTC (rev 299) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-07-23 13:05:32 UTC (rev 300) @@ -973,7 +973,11 @@ vol += (ModSquareTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; break; case 3: - vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; + //IT compatibility 19. Use random values + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + vol += (((rand() & 0xFF) - 0x7F) * (int)pChn->nTremoloDepth) >> tremattn; + else + vol += (ModRandomTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; break; default: vol += (ModSinusTable[trempos] * (int)pChn->nTremoloDepth) >> tremattn; @@ -1321,7 +1325,11 @@ vdelta = ModSquareTable[vibpos]; break; case 3: - vdelta = ModRandomTable[vibpos]; + //IT compatibility 19. Use random values + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + vdelta = (rand() & 0xFF) - 0x7F; + else + vdelta = ModRandomTable[vibpos]; break; default: vdelta = ModSinusTable[vibpos]; @@ -1377,7 +1385,11 @@ pdelta = ModSquareTable[panpos]; break; case 3: - pdelta = ModRandomTable[panpos]; + //IT compatibility 19. Use random values + if((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && GetModFlag(MSF_COMPATIBLE_PLAY)) + pdelta = (rand() & 0xFF) - 0x7F; + else + pdelta = ModRandomTable[panpos]; break; default: pdelta = ModSinusTable[panpos]; @@ -1605,7 +1617,10 @@ // Pitch Loop ? if (penv->dwFlags & ENV_PITCHLOOP) { - if (pChn->nPitchEnvPosition >= penv->PitchPoints[penv->nPitchLoopEnd]) + UINT pitchloopend = penv->PitchPoints[penv->nPitchLoopEnd]; + //IT compatibility 24. Short envelope loops + if (m_nType != MOD_TYPE_XM && GetModFlag(MSF_COMPATIBLE_PLAY)) pitchloopend++; + if (pChn->nPitchEnvPosition == pitchloopend) pChn->nPitchEnvPosition = penv->PitchPoints[penv->nPitchLoopStart]; } // Pitch Sustain ? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |