From: <sv...@op...> - 2024-11-16 00:39:13
|
Author: sagamusix Date: Sat Nov 16 01:39:06 2024 New Revision: 22199 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22199 Log: [Fix] MED: Another attempt at getting volume commands right. If MED Soundstudio for Windows behaviour is to be believed, 7-bit volume should only be applied if the pattern has valid block info. Otherwise it multiplies volume command parameters by 2. Fixes drain from hyperland! (d.f.h).med (https://www.un4seen.com/forum/?topic=15448.msg144105#msg144105) Modified: trunk/OpenMPT/soundlib/Load_med.cpp Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Sat Nov 16 00:40:57 2024 (r22198) +++ trunk/OpenMPT/soundlib/Load_med.cpp Sat Nov 16 01:39:06 2024 (r22199) @@ -429,6 +429,7 @@ const bool softwareMixing : 1; const bool bpmMode : 1; const bool volHex : 1; + const bool vol7bit : 1; }; @@ -449,7 +450,7 @@ case 0x0C: // Set Volume (note: parameters >= 0x80 (only in hex mode?) should set the default instrument volume, which we don't support) if(!ctx.volHex && param < 0x99) m.SetEffectCommand(CMD_VOLUME, static_cast<ModCommand::PARAM>((param >> 4) * 10 + (param & 0x0F))); - else if(ctx.volHex && ctx.version < 3) + else if(ctx.volHex && !ctx.vol7bit) m.SetEffectCommand(CMD_VOLUME, static_cast<ModCommand::PARAM>(std::min(param & 0x7F, 64))); else if(ctx.volHex) m.SetEffectCommand(CMD_VOLUME, static_cast<ModCommand::PARAM>(((param & 0x7F) + 1) / 2)); @@ -1579,6 +1580,7 @@ int16 transpose = NOTE_MIN + 47 + songHeader.playTranspose; uint16 numPages = 0; FileReader cmdExt, commandPages; + bool vol7bit = false; if(version < 1) { @@ -1596,6 +1598,7 @@ numRows = patHeader.numRows + 1; if(patHeader.blockInfoOffset) { + vol7bit = true; auto offset = file.GetPosition(); file.Seek(patHeader.blockInfoOffset); MMDBlockInfo blockInfo; @@ -1634,7 +1637,7 @@ pattern.SetName(patName); LimitMax(numTracks, GetNumChannels()); - TranslateMEDPatternContext context{transpose, numTracks, version, rowsPerBeat, is8Ch, softwareMixing, bpmMode, volHex}; + TranslateMEDPatternContext context{transpose, numTracks, version, rowsPerBeat, is8Ch, softwareMixing, bpmMode, volHex, vol7bit}; needInstruments |= TranslateMEDPattern(file, cmdExt, pattern, context, false); for(uint16 page = 0; page < numPages; page++) |