From: <sag...@us...> - 2009-11-28 20:25:43
|
Revision: 429 http://modplug.svn.sourceforge.net/modplug/?rev=429&view=rev Author: saga-games Date: 2009-11-28 20:25:33 +0000 (Sat, 28 Nov 2009) Log Message: ----------- [Imp] Sample editor: When creating a new sample using "resize", sample loop is activated automatically [Fix] ST3 compatibility: Only allow waveforms 0 to 3 for S3x / S4x / S5x. [Imp] Pattern editor: Hopefully correct limitation and explanation of "Set * waveform" parameters... [Imp] Mod Conversion: Better conversion of MOD/XM E4x / E7x command [Imp] Mod Conversion: Better conversion of note off commands when converting to .mod Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/modsmp_ctrl.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-28 18:11:44 UTC (rev 428) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-11-28 20:25:33 UTC (rev 429) @@ -2304,6 +2304,15 @@ case CMD_GLOBALVOLUME: nmax = (nType & MOD_TYPE_IT | MOD_TYPE_MPT) ? 128 : 64; break; + + case CMD_MODCMDEX: + // adjust waveform types for XM/MOD + if(gFXInfo[ndx].dwParamValue == 0x40 || gFXInfo[ndx].dwParamValue == 0x70) nmax = gFXInfo[ndx].dwParamValue | 0x07; + break; + case CMD_S3MCMDEX: + // adjust waveform types for IT/S3M + if(gFXInfo[ndx].dwParamValue >= 0x30 && gFXInfo[ndx].dwParamValue <= 0x50) nmax = gFXInfo[ndx].dwParamValue | (m_SndFile.IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER) ? 0x03 : 0x07); + break; } *prangeMin = nmin; *prangeMax = nmax; @@ -2659,17 +2668,22 @@ case 0x30: // vibrato waveform case 0x40: // tremolo waveform case 0x50: // panbrello waveform - if(((param & 0x0F) > 0x03) && m_SndFile.IsCompatibleMode(TRK_IMPULSETRACKER)) + if(((param & 0x0F) > 0x03) && m_SndFile.IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER)) { strcpy(s, "ignore"); break; } switch(param & 0x0F) { - case 0x00: case 0x04: case 0x08: case 0x0C: strcpy(s, "sine wave"); break; - case 0x01: case 0x05: case 0x09: case 0x0D: strcpy(s, "ramp down"); break; - case 0x02: case 0x06: case 0x0A: case 0x0E: strcpy(s, "square wave"); break; - case 0x03: case 0x07: case 0x0B: case 0x0F: strcpy(s, "random"); break; + case 0x00: strcpy(s, "sine wave"); break; + case 0x01: strcpy(s, "ramp down"); break; + case 0x02: strcpy(s, "square wave"); break; + case 0x03: strcpy(s, "random"); break; + case 0x04: strcpy(s, "sine wave (continue)"); break; + case 0x05: strcpy(s, "ramp down (continue)"); break; + case 0x06: strcpy(s, "square wave (continue)"); break; + case 0x07: strcpy(s, "random (continue)"); break; + default: strcpy(s, "ignore"); break; } break; @@ -2717,12 +2731,17 @@ break; case 0x40: // vibrato waveform case 0x70: // tremolo waveform - //todo: find proper values for XM/MOD (it's not as trivial as described here, i think) switch(param & 0x0F) { - case 0x00: case 0x03: case 0x06: case 0x0A: case 0x0D: strcpy(s, "sine wave"); break; - case 0x01: case 0x04: case 0x07: case 0x0B: case 0x0E: strcpy(s, "ramp down"); break; - case 0x02: case 0x05: case 0x08: case 0x0C: case 0x0F: strcpy(s, "square wave"); break; + case 0x00: case 0x08: strcpy(s, "sine wave"); break; + case 0x01: case 0x09: strcpy(s, "ramp down"); break; + case 0x02: case 0x0A: strcpy(s, "square wave"); break; + case 0x03: case 0x0B: strcpy(s, "square wave"); break; + + case 0x04: case 0x0C: strcpy(s, "sine wave (continue)"); break; + case 0x05: case 0x0D: strcpy(s, "ramp down (continue)"); break; + case 0x06: case 0x0E: strcpy(s, "square wave (continue)"); break; + case 0x07: case 0x0F: strcpy(s, "square wave (continue)"); break; } break; case 0x60: // pattern loop Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-28 18:11:44 UTC (rev 428) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-28 20:25:33 UTC (rev 429) @@ -727,8 +727,9 @@ } pChn->nPos = 0; pChn->nPosLo = 0; - if (pChn->nVibratoType < 4) pChn->nVibratoPos = ((!IsCompatibleMode(TRK_IMPULSETRACKER)) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS))) ? 0x10 : 0; - if(!IsCompatibleMode(TRK_IMPULSETRACKER) && pChn->nTremoloType < 4) pChn->nTremoloPos = 0; + // Handle "retrigger" waveform type + if (pChn->nVibratoType < 4) pChn->nVibratoPos = ((!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER)) && (m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!(m_dwSongFlags & SONG_ITOLDEFFECTS))) ? 0x10 : 0; + if(!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_SCREAMTRACKER) && pChn->nTremoloType < 4) pChn->nTremoloPos = 0; } if (pChn->nPos >= pChn->nLength) pChn->nPos = pChn->nLoopStart; } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-28 18:11:44 UTC (rev 428) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-28 20:25:33 UTC (rev 429) @@ -3236,10 +3236,10 @@ case 0x10: m->command = CMD_PORTAMENTOUP; m->param |= 0xF0; break; case 0x20: m->command = CMD_PORTAMENTODOWN; m->param |= 0xF0; break; case 0x30: m->param = (m->param & 0x0F) | 0x10; break; - case 0x40: m->param = (m->param & 0x0F) | 0x30; break; + case 0x40: m->param = (m->param & 0x03) | 0x30; break; case 0x50: m->param = (m->param & 0x0F) | 0x20; break; case 0x60: m->param = (m->param & 0x0F) | 0xB0; break; - case 0x70: m->param = (m->param & 0x0F) | 0x40; break; + case 0x70: m->param = (m->param & 0x03) | 0x40; break; case 0x90: m->command = CMD_RETRIG; m->param = 0x80 | (m->param & 0x0F); break; case 0xA0: if (m->param & 0x0F) { m->command = CMD_VOLUMESLIDE; m->param = (m->param << 4) | 0x0F; } else m->command = 0; break; case 0xB0: if (m->param & 0x0F) { m->command = CMD_VOLUMESLIDE; m->param |= 0xF0; } else m->command = 0; break; @@ -3389,6 +3389,7 @@ // Convert S3M / IT / MPTM to MOD / XM else if(oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) { + // convert note cut/off/fade if(m->note == NOTE_NOTECUT || m->note == NOTE_FADE) m->note = NOTE_KEYOFF; @@ -3522,6 +3523,22 @@ // Convert anything to MOD - remove volume column, remove Set Macro if (newTypeIsMOD) { + // convert note off events + if(m->note >= NOTE_MIN_SPECIAL) + { + m->note = NOTE_NONE; + // no effect present, so just convert note off to volume 0 + if(m->command == CMD_NONE) + { + m->command = CMD_VOLUME; + m->param = 0; + // EDx effect present, so convert it to ECx + } else if((m->command == CMD_MODCMDEX) && ((m->param & 0xF0) == 0xD0)) + { + m->param = 0xC0 | (m->param & 0x0F); + } + } + if(m->command) switch(m->command) { case CMD_RETRIG: // MOD only has E9x Modified: trunk/OpenMPT/soundlib/modsmp_ctrl.cpp =================================================================== --- trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-11-28 18:11:44 UTC (rev 428) +++ trunk/OpenMPT/soundlib/modsmp_ctrl.cpp 2009-11-28 20:25:33 UTC (rev 429) @@ -73,8 +73,17 @@ AfxMessageBox(TEXT("Unsupported start position in InsertSilence.")); } - if(smp.nLoopStart >= nStartFrom) smp.nLoopStart += nSilenceLength; - if(smp.nLoopEnd >= nStartFrom) smp.nLoopEnd += nSilenceLength; + // Set loop points automatically + if(nOldBytes == 0) + { + smp.nLoopStart = 0; + smp.nLoopEnd = nNewLength; + smp.uFlags |= CHN_LOOP; + } else + { + if(smp.nLoopStart >= nStartFrom) smp.nLoopStart += nSilenceLength; + if(smp.nLoopEnd >= nStartFrom) smp.nLoopEnd += nSilenceLength; + } ReplaceSample(smp, pNewSmp, nNewLength, pSndFile); AdjustEndOfSample(smp, pSndFile); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |