From: <sv...@op...> - 2025-03-29 15:23:05
|
Author: sagamusix Date: Sat Mar 29 16:22:53 2025 New Revision: 23111 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23111 Log: Merged revision(s) 23110 from trunk/OpenMPT: [Fix] MED: Fix combination of IFFOCT instruments with sample transpose (https://www.un4seen.com/forum/?msg=144308). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/soundlib/Load_med.cpp Modified: branches/OpenMPT-1.32/soundlib/Load_med.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/Load_med.cpp Sat Mar 29 16:22:37 2025 (r23110) +++ branches/OpenMPT-1.32/soundlib/Load_med.cpp Sat Mar 29 16:22:53 2025 (r23111) @@ -1043,6 +1043,7 @@ MMD0Sample sampleHeader; sampleHeaderChunk.ReadStruct(sampleHeader); + int8 sampleTranspose = sampleHeader.sampleTranspose; uint8 numSamples = std::max(uint8(1), static_cast<uint8>(waveformOffsets.size())); static constexpr uint8 SamplesPerType[] = {1, 5, 3, 2, 4, 6, 7}; @@ -1077,14 +1078,16 @@ // TODO: Move octaves so that they align better (C-4 = lowest, we don't have access to the highest four octaves) if(!isSynth) { - for(int octave = 4; octave < 10; octave++) + for(int i = 0; i < static_cast<int>(instr.Keyboard.size()); i++) { - for(int note = 0, i = 12 * octave; note < 12; note++, i++) - { - instr.Keyboard[i] = smp + OctSampleMap[numSamples - 2][octave - 4]; - instr.NoteMap[i] = static_cast<uint8>(instr.NoteMap[i] + OctTransposeMap[numSamples - 2][octave - 4]); - } + int note = i + sampleTranspose; + if(note < 0) + note = -note % 12; + int octave = std::clamp(note / 12 - 4, 0, static_cast<int>(std::size(OctTransposeMap[0]) - 1)); + instr.Keyboard[i] = smp + OctSampleMap[numSamples - 2][octave]; + instr.NoteMap[i] = static_cast<uint8>(NOTE_MIN + note + OctTransposeMap[numSamples - 2][octave]); } + sampleTranspose = 0; } } else if(maskedType == MMDInstrHeader::EXTSAMPLE) { @@ -1126,7 +1129,7 @@ int offset = NOTE_MIDDLEC + (hardwareMixSamples ? 24 : 36); for(auto ¬e : instr.NoteMap) { - int realNote = note + sampleHeader.sampleTranspose; + int realNote = note + sampleTranspose; if(realNote >= offset) note -= static_cast<uint8>(mpt::align_down(realNote - offset + 12, 12)); } @@ -1137,7 +1140,7 @@ ModSample &mptSmp = Samples[smp + i]; mptSmp.Initialize(MOD_TYPE_MED); mptSmp.nVolume = 4u * std::min<uint8>(sampleHeader.sampleVolume, 64u); - mptSmp.RelativeTone = sampleHeader.sampleTranspose; + mptSmp.RelativeTone = sampleTranspose; } SampleIO sampleIO( |