From: <sv...@op...> - 2024-10-26 11:56:21
|
Author: sagamusix Date: Sat Oct 26 13:56:09 2024 New Revision: 21927 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21927 Log: Merged revision(s) 21686 from trunk/OpenMPT: [Fix] PTM: Polytracker is another one of those trackers where offset command strength is halved by using 16-bit samples... fixes leveled.ptm (https://www.un4seen.com/forum/?topic=15448.msg143764#msg143764). ........ Modified: branches/OpenMPT-1.29/ (props changed) branches/OpenMPT-1.29/soundlib/Load_ptm.cpp branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.29/soundlib/Load_ptm.cpp ============================================================================== --- branches/OpenMPT-1.29/soundlib/Load_ptm.cpp Sat Oct 26 13:55:24 2024 (r21926) +++ branches/OpenMPT-1.29/soundlib/Load_ptm.cpp Sat Oct 26 13:56:09 2024 (r21927) @@ -274,6 +274,15 @@ case CMD_GLOBALVOLUME: m.param = std::min(m.param, uint8(0x40)) * 2u; break; +#ifdef MODPLUG_TRACKER + case CMD_OFFSET: + case CMD_REVERSEOFFSET: + if(m.instr && m.instr <= GetNumSamples() && Samples[m.instr].uFlags[CHN_16BIT]) + m.param /= 2; + break; +#endif // MODPLUG_TRACKER + default: + break; } } if(b & 0x80) Modified: branches/OpenMPT-1.29/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Sat Oct 26 13:55:24 2024 (r21926) +++ branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Sat Oct 26 13:56:09 2024 (r21927) @@ -5449,9 +5449,9 @@ param = (param - chn.nLoopStart) % (chn.nLoopEnd - chn.nLoopStart) + chn.nLoopStart; } - if(GetType() == MOD_TYPE_MDL && chn.dwFlags[CHN_16BIT]) + if((GetType() & (MOD_TYPE_MDL | MOD_TYPE_PTM)) && chn.dwFlags[CHN_16BIT]) { - // Digitrakker really uses byte offsets, not sample offsets. WTF! + // Digitrakker and Polytracker use byte offsets, not sample offsets. param /= 2u; } @@ -5525,7 +5525,10 @@ chn.dwFlags.set(CHN_PINGPONGFLAG); chn.dwFlags.reset(CHN_LOOP); chn.nLength = chn.pModSample->nLength; // If there was a loop, extend sample to whole length. - chn.position.Set((chn.nLength - 1) - std::min(SmpLength(param) << 8, chn.nLength - SmpLength(1)), 0); + SmpLength offset = param << 8; + if(GetType() == MOD_TYPE_PTM && chn.dwFlags[CHN_16BIT]) + offset /= 2; + chn.position.Set((chn.nLength - 1) - std::min(offset, chn.nLength - SmpLength(1)), 0); } } |