VOGONS


First post, by matze79

User metadata
Rank l33t
Rank
l33t
The attachment photo_2026-08-26_21-11-03.jpg is no longer available
The attachment photo_2026-09-13_15-15-06.jpg is no longer available
The attachment 17909315098956916973003348772134.jpg is no longer available
The attachment 17909315342647621642938380874815.jpg is no longer available

SB BugStomper – a firewall for your wavetable

Many Sound Blaster 16 and Vibra cards have a notorious flaw: while digital sound effects are playing, the DSP sometimes repeats the last MIDI byte it sent. Your wavetable module reads these stray bytes as new notes – notes that never receive a Note Off and drone on forever.

The SB BugStomper sits between the Sound Blaster and the wavetable module and inspects every MIDI byte that passes through. It recognizes the corrupted data and drops it before it reaches your synth, so the hanging note is never played in the first place. Everything else passes through untouched. For the rare cases the filter can't catch, an optional timeout mode serves as a fallback.

Fallback mode: For the rare cases the filter can't catch, the BugStomper can also watch every sounding note and end any note held longer than a pitch-dependent timeout. Because some games deliberately hold notes for many seconds, this fallback is optional: it can be switched off entirely, leaving the filter to do the work on its own.

Settings are made with DIP switches or the BSCFG tool for DOS, including per-game profiles. A bypass switch turns the BugStomper into a plain passthrough at any time. An MT-32 to General MIDI instrument remap is built in as well.

The attachment bscfg_001_en.png is no longer available
Last edited by matze79 on 2026-10-04, 08:26. Edited 4 times in total.

Reply 1 of 18, by aitotat

User metadata
Rank Member
Rank
Member

Nice idea! That would make those Vibra (pro) CT2502 based cards, like SB16 CT2940, real nice since you can't replace DSP on those.

Edit:
Sorry, I can't resist this. Two days ago I finished modding wavetable header for AWE64 CT4500 (it will be on my next video). That board to fix hanging notes would make a bit nicer lookin mod but more importantly possible to mod CT3600, another great CT2502 based card. I wouldn't even consider modding that one because of the MPU bugs but that board would change things. CT3600 would be like CT4500 but with real Yamaha OPL3 (but that requires a mod as well).

The attachment CT4500modReady.jpg is no longer available
Last edited by aitotat on 2026-08-28, 18:11. Edited 1 time in total.

My youtube channel

Reply 4 of 18, by Angus.Young

User metadata
Rank Newbie
Rank
Newbie

Love this... hope it makes it to production i'd grab a couple.

Reply 5 of 18, by Ozzuneoj

User metadata
Rank l33t
Rank
l33t
matze79 wrote on 2026-08-27, 15:05:
The SB Bug Stomper is the answer to buggy Sound Blaster cards that suffer from hanging notes. Placed between the wavetable modu […]
Show full quote
The attachment photo_2026-08-26_21-11-03.jpg is no longer available
The attachment photo_2026-08-26_21-02-37.jpg is no longer available

The SB Bug Stomper is the answer to buggy Sound Blaster cards that suffer from hanging notes.
Placed between the wavetable module and the Sound Blaster, it tracks all MIDI note events, including Note On and Note Off messages.
If it detects something out of the ordinary, it steps in and stops the stuck note — putting an end to those horrible, never-ending tones.

Prototype Test soon 😀

That's so cool!

Just curious... since it is interacting with Note On\Off messages via the waveblaster header, does it work on other cards? MediaVision Pro Audio Spectrum 16 cards are praised for their output quality compared to SB16 but apparently suffer from hanging note bugs as well. I haven't experienced it personally, but if there is any chance that this mitigates those as well that would be awesome.

Now for some blitting from the back buffer.

Reply 6 of 18, by NeoG_

User metadata
Rank Oldbie
Rank
Oldbie

It looks like you'd need to solder this to the wavetable card? I feel like if you are going to modify a card it should be the SB since that's where the bug is 🤔

98/DOS Rig: BabyAT AladdinV, K6-2+/550, V3 2000, 128MB PC100, 20GB HDD, 128GB SD2IDE, SB Live!, SB16-SCSI, PicoGUS, WP32 McCake, iNFRA CD, ZIP100
XP Rig: Lian Li PC-10 ATX, Gigabyte X38-DQ6, Core2Duo E6850, ATi HD5870, 2GB DDR2, 2TB HDD, X-Fi XtremeGamer

Reply 7 of 18, by 640K!enough

User metadata
Rank Oldbie
Rank
Oldbie
NeoG_ wrote on 2026-08-30, 22:37:

It looks like you'd need to solder this to the wavetable card? I feel like if you are going to modify a card it should be the SB since that's where the bug is 🤔

It looks to me like there will be two headers on the finished board. I would expect this to effectively be "sandwiched" between the buggy host card and the daughterboard, where it will transparently analyse MIDI messages and act as necessary.

Reply 8 of 18, by Shponglefan

User metadata
Rank l33t
Rank
l33t

I assume there would be a header socket on the finished board.

The main consideration would be the physical offset of connecting a wavetable header. I imagine it will block an adjacent slot, unless in a shared ISA/PCI slot.

That said, this seems brilliant and may finally make my Sound Blaster wavetable headers useful. 😁

Pentium 4 Multi-OS Build
486 DX4-100 with 6 sound cards
486 DX-33 with 5 sound cards

Reply 9 of 18, by Shiftyy

User metadata
Rank Newbie
Rank
Newbie

I'm interested. How fast can it detect an anomaly? E.g. Is there any delay before the fix kicks in? Basically I'm wondering if playback would be 100% the same when compared to a sound card without the bug.

Reply 10 of 18, by matze79

User metadata
Rank l33t
Rank
l33t

Hi,

i awaiting prototypes 😀
then we will see.

The attachment stomper.jpg is no longer available

You put the Stomper on your SB card, then connect your Wavetable to the Stomper.

It simply intercepts the communication and tries to identify stuck notes. It tracks all notes and looks for “high-pitch” stuck notes and other anomalies.
It adds miniscule non audible delay of around ~2ms to Midi. The MCU is pretty fast.

@Dreamblaster’s new Wavetable also implements this idea.

On my buggy SB Vibra 16, it actually works. 😀

Reply 11 of 18, by zuldan

User metadata
Rank Oldbie
Rank
Oldbie

Great little project. Have the prototypes arrived?

Reply 12 of 18, by matze79

User metadata
Rank l33t
Rank
l33t

Yeah 😀

The attachment pasted-from-clipboard.webp is no longer available
The attachment pasted-from-clipboard1.webp is no longer available

Reply 13 of 18, by zuldan

User metadata
Rank Oldbie
Rank
Oldbie

Very exciting! Found any issues with the prototype yet?

Reply 14 of 18, by matze79

User metadata
Rank l33t
Rank
l33t

It works as expected.

What works so far:

  1. Automatically detects hanging notes — in two ways: A note that plays for an unusually long time is automatically turned off. The timeout depends on the pitch, since the bug usually affects higher notes: ~1 second for very high notes, ~3 seconds in the mid range, and ~10 seconds for low notes, where legitimately long notes such as bass notes or pads are normal. If the same note is triggered twice in a row without being properly released in between, it intervenes immediately without waiting for the timeout.
  2. Recognizes reset messages from General MIDI, Roland GS/MT-32, and Yamaha XG, and clears its internal state so that nothing remains stuck from the previous game.
  3. MT-32 instrument remapping from GM → MT-32.
    Note: SAM-based wavetable modules such as the Dreamblaster S2 can already handle this themselves.


Yet untested / Experimental

  1. Effect: Delay Notes / Echo Mode
  2. Effect: Add Reverb

Test setup: McFly (MT-32 mapping + SoftMPU)

The attachment pasted-from-clipboard.jpg is no longer available

Reply 15 of 18, by gerwin

User metadata
Rank l33t
Rank
l33t

It is a cool idea. And the logo is even better

I noted back then that a game's sound driver can fix-up SB16 midi bugs like this:
Doom 'MBF' for DOS, Maintenance release 2.04

A technical note on the possible lockup with the Sound Blaster 16 cards, when using digital effects together with the build in MPU-401 Midi interface.
This is a problem also found in other games. As discussed earlier the patch SBMPU401.EXE (inside waveptch.exe) offered by Creative prevents such lockup.
Basically, what "SBMPU401 /E" does is is write 0Bh to undocumented mixer register 83h. "SBMPU401 /D" reverses this by writing 0Fh to the same register. My tests indicate that the /E register tweak prevents unexpected interrupts on the SB IRQ; these are ones that contain the MPU tag (100b). Digital sound interrupts keep coming, as they are necessary. The distinction of interrupt types can be made because SB16 introduced mixer register 82h, which informs on the type of interrupt that was given. But AFAIK the MPU should not send interrupts in UART mode to begin with. MBF now filters out and acknowledges any interrupts not tagged 'digital effect 8/16bit' and that works well. SBMPU401 is no longer needed for this game.

Alleg30B\src\djgpp\sb.c

   // GB 2017 This is an attempt to fix the situation when using a SB-16 together with its buggy MPU-401 interface.
// See also "mpu_output" in mpu.c.
if (sb_hw_dsp_ver >= 0x400) { // DSP 4.xx only
outportb(_sb_port+4, 0x82); // SB mixer interrupt status register (82h)
if ((inportb(_sb_port+5) & 3) == 0) { // Not a 8- or 16-bit DSP interrupt, but maybe mpu-401 instead?
_eoi(_sb_irq);
return -1; // This interrupt was either bugged/false or not for this handler, exit now.
}
}// End of fix.

And:

   // GB 2017, on SB16: increase buffer size -> minimize DMA interrupts -> less MPU interrupt problems.
if (sb_hw_dsp_ver >= 0x400) while (sb_dma_size < 2048) { sb_dma_mix_size *= 2; sb_dma_size *= 2; }
// GB 2017, DSP 4.11, 4.12 or 4.13 are affected by hanging notes after digitalsound interrupt.
if ((sb_hw_dsp_ver >= 0x40B) && (sb_hw_dsp_ver <= 0x40D))
{ sb_dma_mix_size *= 2; sb_dma_size *= 2; } // 4096 buffer, problems gone :)

Alleg30B\src\djgpp\mpu.c

// mpu_output: Writes a byte to the MPU-401 midi interface. Modified GB 24-8-2017
static void mpu_output(unsigned char data)
{
int timeout;

if (wait_for_mpu(0x40, _mpu_port+1))
if (_sb_irq>0) // If timed out: Digital section active?
{
_enable_irq(_sb_irq); // GB 2017, to prevent crash on older models of SB16, like CT1740 and CT2290.
for (timeout=0; timeout<99; timeout++); // Allow SB16 digital section to service interrupt if necessary
}
outportb(_mpu_port, data);
}
static END_OF_FUNCTION(mpu_output);

But I switched to Crystal CS4232 based soundcards later, so it has been a while since I actually used a SB16/AWE cards.

--> ISA Soundcard Overview // Doom MBF 2.04 // SetMul

Reply 16 of 18, by terrorinstinct

User metadata
Rank Newbie
Rank
Newbie

Neat, though I dread the idea of people paying actual money for Vibra cards thanks to this. What are you using to monitor the MIDI stream? If there's room a nice bonus feature would be reverse stereo, for people with Audician 32s etc who don't want to have to cut traces for proper wavetable sound.

Reply 17 of 18, by matze79

User metadata
Rank l33t
Rank
l33t
terrorinstinct wrote on 2026-09-29, 04:17:

Neat, though I dread the idea of people paying actual money for Vibra cards thanks to this. What are you using to monitor the MIDI stream? If there's room a nice bonus feature would be reverse stereo, for people with Audician 32s etc who don't want to have to cut traces for proper wavetable sound.

Is it miswired L/R, or is it an issue with the MPU interface?
It might be possible to fix it by using the MIDI Pan controller:
10 Pan (MSB) 0–127 Controls the left and right balance, generally for mono patches. A value of 64 equals the center.

But for now, I'm still working on the firmware.

I'm capturing the MIDI data from the Vibra and comparing it with the original MIDI data.
That should also help me come up with a better filter.

The stream is captured by using python3-serial and ftdi adapter.

The attachment photo_2026-09-29_09-00-43.jpg is no longer available

Reply 18 of 18, by matze79

User metadata
Rank l33t
Rank
l33t

I checked the options for this, and it would be best to have jumpers for channel switching.
This would require a new PCB to support it.

---

Note tracking and sending Note Off messages are now only a fallback option if filtering does not work.

Sound Blaster CT2960 Vibra (HP) with DreamBlaster S2 only:
https://rumble.com/v7gbhba-soundblaster-vibra … ug-stomper.html
(One channel was not recorded because the cable is flaky, but you can hear the bug 😀

Sound Blaster CT2960 Vibra (HP) with Bug Stomper and DreamBlaster S2:
https://rumble.com/v7gbhey-soundblaster-vibra … blaster-s2.html

Updated Entry #1.