From: <sag...@us...> - 2013-04-28 00:55:46
|
Revision: 1990 http://sourceforge.net/p/modplug/code/1990 Author: saga-games Date: 2013-04-28 00:55:38 +0000 (Sun, 28 Apr 2013) Log Message: ----------- [Mod] Added a few more mod type checks in Snd_fx.cpp (helpful for libopenmpt) Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-27 23:45:18 UTC (rev 1989) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2013-04-28 00:55:38 UTC (rev 1990) @@ -395,12 +395,17 @@ case MOD_TYPE_MTM: m_SndFile.ChangeModTypeTo(MOD_TYPE_S3M); break; + case MOD_TYPE_AMS: + case MOD_TYPE_AMS2: + case MOD_TYPE_DMF: + case MOD_TYPE_DBM: case MOD_TYPE_IMF: case MOD_TYPE_PSM: case MOD_TYPE_J2B: case MOD_TYPE_ULT: case MOD_TYPE_OKT: case MOD_TYPE_MT2: + case MOD_TYPE_MDL: default: m_SndFile.ChangeModTypeTo(MOD_TYPE_IT); } Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-27 23:45:18 UTC (rev 1989) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2013-04-28 00:55:38 UTC (rev 1990) @@ -199,7 +199,7 @@ CMD_VOLUMESLIDE, // down CMD_VIBRATO, // sustained (?) CMD_NONE, // actually slide-to-volume - CMD_PANNING8, + CMD_S3MCMDEX, // panning CMD_S3MCMDEX, // note offset => note delay? CMD_NONE, // fine tempo down CMD_NONE, // fine tempo up @@ -269,15 +269,17 @@ break; case 0x06: // Vibrato speed case 0x07: // Volume slide up - case 0x0B: // Panning m.param *= 8; break; case 0x0A: // Volume-portamento (what!) m.volcmd = VOLCMD_VOLUME; m.vol = (m.param << 2) + 4; break; + case 0x0B: // Panning + m.param |= 0x80; + break; case 0x0C: // Note offset - m.param = 6 / (1 + (m.param & 0x0F)) + 1; + m.param = 6 / (1 + m.param) + 1; m.param |= 0x0D; } m.command = farEffects[data[3] >> 4]; Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-27 23:45:18 UTC (rev 1989) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2013-04-28 00:55:38 UTC (rev 1990) @@ -327,14 +327,14 @@ case CMD_SPEED: if (!param) break; // Allow high speed values here for VBlank MODs. (Maybe it would be better to have a "VBlank MOD" flag somewhere? Is it worth the effort?) - if ((param <= GetModSpecifications().speedMax) || (m_nType & MOD_TYPE_MOD)) + if ((param <= GetModSpecifications().speedMax) || GetType() == MOD_TYPE_MOD) { memory.musicSpeed = param; } break; // Set Tempo case CMD_TEMPO: - if ((adjustMode & eAdjust) && (m_nType & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT))) + if ((adjustMode & eAdjust) && (GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT))) { if (param) pChn->nOldTempo = (BYTE)param; else param = pChn->nOldTempo; } @@ -447,7 +447,7 @@ // break; // } - if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) param <<= 1; + if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; // IT compatibility 16. FT2, ST3 and IT ignore out-of-range values if(param <= 128) { @@ -467,25 +467,25 @@ if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { param >>= 4; - if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; + if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; memory.glbVol += param << 1; } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { param = (param & 0x0F) << 1; - if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; + if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; memory.glbVol -= param; } else if (param & 0xF0) { param >>= 4; param <<= 1; - if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; + if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; memory.glbVol += param * memory.musicSpeed; } else { param = (param & 0x0F) << 1; - if (!(GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT))) param <<= 1; + if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param <<= 1; memory.glbVol -= param * memory.musicSpeed; } memory.glbVol = CLAMP(memory.glbVol, 0, 256); @@ -2241,7 +2241,7 @@ case CMD_ARPEGGIO: // 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) && (!(GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)))) break; + if ((!param) && (!(GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)))) break; // Only important when editing MOD/XM files pChn->nCommand = CMD_ARPEGGIO; if (param) pChn->nArpeggio = param; break; @@ -2322,7 +2322,7 @@ break; } - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) param *= 2; + if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) param *= 2; // IT compatibility 16. FT2, ST3 and IT ignore out-of-range values. // Test case: globalvol-invalid.it @@ -2353,18 +2353,21 @@ { pChn->dwFlags.reset(CHN_SURROUND); } - if (GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM | MOD_TYPE_MOD | MOD_TYPE_MT2)) + if(!(GetType() & (MOD_TYPE_S3M | MOD_TYPE_PTM | MOD_TYPE_DSM | MOD_TYPE_AMF | MOD_TYPE_MTM))) { + // Real 8-bit panning pChn->nPan = param; } else - if (param <= 0x80) { - pChn->nPan = param << 1; - } else - if (param == 0xA4) - { - pChn->dwFlags.set(CHN_SURROUND); - pChn->nPan = 0x80; + // 7-bit panning + surround + if(param <= 0x80) + { + pChn->nPan = param << 1; + } else if(param == 0xA4) + { + pChn->dwFlags.set(CHN_SURROUND); + pChn->nPan = 0x80; + } } pChn->dwFlags.set(CHN_FASTVOLRAMP); pChn->nRestorePanOnNewNote = 0; @@ -2652,7 +2655,7 @@ else param = pChn->nOldPortaUpDown; - const bool doFineSlides = !doFinePortamentoAsRegular && (GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_STM)); + const bool doFineSlides = !doFinePortamentoAsRegular && !(GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM | MOD_TYPE_MT2 | MOD_TYPE_MED | MOD_TYPE_AMF0 | MOD_TYPE_DIGI)); // Process MIDI pitch bend for instrument plugins MidiPortamento(nChn, param, doFineSlides); @@ -2700,7 +2703,7 @@ else param = pChn->nOldPortaUpDown; - const bool doFineSlides = !doFinePortamentoAsRegular && (GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_STM)); + const bool doFineSlides = !doFinePortamentoAsRegular && !(GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM | MOD_TYPE_MT2 | MOD_TYPE_MED | MOD_TYPE_AMF0 | MOD_TYPE_DIGI)); // Process MIDI pitch bend for instrument plugins MidiPortamento(nChn, -static_cast<int>(param), doFineSlides); @@ -2964,7 +2967,7 @@ pChn->nOldPortaUpDown = param; } - if(m_nType == MOD_TYPE_MPT && pChn->pModInstrument && pChn->pModInstrument->pTuning) + if(GetType() == MOD_TYPE_MPT && pChn->pModInstrument && pChn->pModInstrument->pTuning) { //Behavior: Param tells number of finesteps(or 'fullsteps'(notes) with glissando) //to slide per row(not per tick). @@ -3089,7 +3092,7 @@ else param = pChn->nOldVolumeSlide; - if((GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM | MOD_TYPE_MT2))) + if((GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM | MOD_TYPE_MT2 | MOD_TYPE_MED | MOD_TYPE_DIGI | MOD_TYPE_DBM))) { // MOD / XM nibble priority if((param & 0xF0) != 0) @@ -3102,7 +3105,7 @@ } int newvolume = pChn->nVolume; - if (GetType() & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_STM|MOD_TYPE_AMF)) + if(!(GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM | MOD_TYPE_AMF0 | MOD_TYPE_DIGI | MOD_TYPE_MED))) { if ((param & 0x0F) == 0x0F) //Fine upslide or slide -15 { @@ -3145,7 +3148,7 @@ { newvolume += (int)((param & 0xF0) >> 2); } - if (m_nType == MOD_TYPE_MOD) pChn->dwFlags.set(CHN_FASTVOLRAMP); + if (GetType() == MOD_TYPE_MOD) pChn->dwFlags.set(CHN_FASTVOLRAMP); } newvolume = Clamp(newvolume, 0, 256); @@ -3180,7 +3183,7 @@ int32 nPanSlide = 0; - if (GetType() & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_STM)) + if(!(GetType() & (MOD_TYPE_XM | MOD_TYPE_MT2))) { if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { @@ -3315,7 +3318,7 @@ { if (param & 0x0F) { - if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (param & 0xF0) == 0) + if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_J2B | MOD_TYPE_DBM)) || (param & 0xF0) == 0) nChnSlide = -(int)(param & 0x0F); } else { @@ -3342,9 +3345,9 @@ { // E0x: Set Filter // E1x: Fine Portamento Up - case 0x10: if ((param) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) FinePortamentoUp(pChn, param); break; + case 0x10: if ((param) || (GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))) FinePortamentoUp(pChn, param); break; // E2x: Fine Portamento Down - case 0x20: if ((param) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) FinePortamentoDown(pChn, param); break; + case 0x20: if ((param) || (GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))) FinePortamentoDown(pChn, param); break; // E3x: Set Glissando Control case 0x30: pChn->dwFlags.set(CHN_GLISSANDO, param != 0); break; // E4x: Set Vibrato WaveForm @@ -3354,7 +3357,7 @@ { break; } - if(GetType() == MOD_TYPE_MOD) + if(GetType() & (MOD_TYPE_MOD | MOD_TYPE_DIGI | MOD_TYPE_AMF0 | MOD_TYPE_MED)) { pChn->nFineTune = MOD2XMFineTune(param); if(pChn->nPeriod && pChn->rowCommand.IsNote()) pChn->nPeriod = GetPeriodFromNote(pChn->nNote, pChn->nFineTune, pChn->nC5Speed); @@ -3384,9 +3387,9 @@ // E9x: Retrig case 0x90: RetrigNote(nChn, param); break; // EAx: Fine Volume Up - case 0xA0: if ((param) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) FineVolumeUp(pChn, param, false); break; + case 0xA0: if ((param) || (GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))) FineVolumeUp(pChn, param, false); break; // EBx: Fine Volume Down - case 0xB0: if ((param) || (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2))) FineVolumeDown(pChn, param, false); break; + case 0xB0: if ((param) || (GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2))) FineVolumeDown(pChn, param, false); break; // ECx: Note Cut case 0xC0: NoteCut(nChn, param); break; // EDx: Note Delay @@ -4054,7 +4057,7 @@ } // -! NEW_FEATURE#0010 - if ((pChn->rowCommand.note >= NOTE_MIN) && (pChn->rowCommand.note <= NOTE_MAX)) + if(pChn->rowCommand.IsNote()) { pChn->nPos = param; pChn->nPosLo = 0; @@ -4515,7 +4518,7 @@ if (param & 0xF0) { // IT compatibility: Ignore slide commands with both nibbles set. - if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) || (param & 0x0F) == 0) + if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM)) || (param & 0x0F) == 0) nGlbSlide = (int)((param & 0xF0) >> 4) * 2; } else { @@ -4525,7 +4528,7 @@ } if (nGlbSlide) { - if (!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT))) nGlbSlide *= 2; + if(!(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_IMF | MOD_TYPE_J2B | MOD_TYPE_MID | MOD_TYPE_AMS | MOD_TYPE_AMS2 | MOD_TYPE_DBM))) nGlbSlide *= 2; nGlbSlide += m_nGlobalVolume; Limit(nGlbSlide, 0, 256); m_nGlobalVolume = nGlbSlide; @@ -4577,7 +4580,7 @@ //--------------------------------------------------- { if (!period) return 0; - if (m_nType & (MOD_TYPE_MED|MOD_TYPE_MOD|MOD_TYPE_DIGI|MOD_TYPE_MTM|MOD_TYPE_669|MOD_TYPE_OKT|MOD_TYPE_AMF0)) + if (GetType() & (MOD_TYPE_MED|MOD_TYPE_MOD|MOD_TYPE_DIGI|MOD_TYPE_MTM|MOD_TYPE_669|MOD_TYPE_OKT|MOD_TYPE_AMF0)) { period >>= 2; for (UINT i=0; i<6*12; i++) @@ -4612,7 +4615,7 @@ { if ((!note) || (note >= NOTE_MIN_SPECIAL)) return 0; if (GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT|MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_MDL|MOD_TYPE_ULT|MOD_TYPE_WAV - |MOD_TYPE_FAR|MOD_TYPE_DMF|MOD_TYPE_PTM|MOD_TYPE_AMS|MOD_TYPE_AMS2|MOD_TYPE_DIGI|MOD_TYPE_DBM|MOD_TYPE_AMF|MOD_TYPE_PSM|MOD_TYPE_J2B|MOD_TYPE_IMF)) + |MOD_TYPE_FAR|MOD_TYPE_DMF|MOD_TYPE_PTM|MOD_TYPE_AMS|MOD_TYPE_AMS2|MOD_TYPE_DBM|MOD_TYPE_AMF|MOD_TYPE_PSM|MOD_TYPE_J2B|MOD_TYPE_IMF)) { note--; if(m_SongFlags[SONG_LINEARSLIDES]) @@ -4674,11 +4677,11 @@ //----------------------------------------------------------------------------------- { if (!period) return 0; - if (GetType() & (MOD_TYPE_MED|MOD_TYPE_MOD|MOD_TYPE_DIGI|MOD_TYPE_MTM|MOD_TYPE_669|MOD_TYPE_OKT|MOD_TYPE_AMF0)) + if (GetType() & (MOD_TYPE_MED|MOD_TYPE_MOD|MOD_TYPE_DIGI|MOD_TYPE_MTM|MOD_TYPE_669|MOD_TYPE_AMF0)) { return (3546895L*4) / period; } else - if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) + if (GetType() & (MOD_TYPE_XM|MOD_TYPE_MT2)) { if(m_SongFlags[SONG_LINEARSLIDES]) return XMLinearTable[period % 768] >> (period / 768); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |