diff --git a/packages/wolf_3d_data/lib/src/wl_parser.dart b/packages/wolf_3d_data/lib/src/wl_parser.dart index e1c36ad..bffca4d 100644 --- a/packages/wolf_3d_data/lib/src/wl_parser.dart +++ b/packages/wolf_3d_data/lib/src/wl_parser.dart @@ -323,10 +323,11 @@ abstract class WLParser { } } - // --- THE FIX: Accurate Historical Chunk Indices --- - // WL1 (Shareware) has exactly 234 sound effects before the music. - // WL6 (Retail) has exactly 261 sound effects before the music. - int musicStartIndex = (version == GameVersion.shareware) ? 234 : 261; + // In Wolf3D v1.4 (Shareware and Retail), Music ALWAYS starts at chunk 261. + // Chunks 0-86: PC Sounds + // Chunks 87-173: AdLib Sounds + // Chunks 174-260: Digitized Sounds + int musicStartIndex = 261; List adLib = allAudioChunks .take(musicStartIndex) diff --git a/packages/wolf_3d_synth/lib/src/opl2_emulator.dart b/packages/wolf_3d_synth/lib/src/opl2_emulator.dart index 2291954..b638cf5 100644 --- a/packages/wolf_3d_synth/lib/src/opl2_emulator.dart +++ b/packages/wolf_3d_synth/lib/src/opl2_emulator.dart @@ -56,6 +56,9 @@ class Opl2Emulator { int channelIdx = reg - 0xB0; Opl2Channel channel = channels[channelIdx]; + // Track the previous key state to prevent constant phase resetting + bool wasKeyOn = channel.keyOn; + // Extract the bits using bitwise masks channel.keyOn = (data & 0x20) != 0; // Bit 5 channel.block = (data & 0x1C) >> 2; // Bits 2-4 @@ -65,8 +68,8 @@ class Opl2Emulator { channel.fNum = (channel.fNum & 0xFF) | fNumHigh; channel.updateFrequency(); - // When a new note is struck, we reset the phase counter to 0 - if (channel.keyOn) { + // ONLY reset the phase if the note was just struck + if (!wasKeyOn && channel.keyOn) { channel.phase = 0.0; } }