HN Debrief

How do you keep Web MIDI from crashing a 1983 synthesizer?

  • Hardware
  • Developer Tools
  • Programming

The post describes a very specific failure mode with old music hardware: a web app sends SysEx patch data over Web MIDI to a Yamaha DX7, the browser and USB MIDI path deliver bytes too smoothly, and the synth’s slow 8-bit internals fall behind badly enough to lock up. The fix in the post was simple throttling in JavaScript, spacing packets out with 100 millisecond pauses so the DX7 has time to write incoming data into SRAM instead of choking on a continuous stream.

If you are building browser-to-hardware tools, use the transport’s own scheduling primitives before inventing timer hacks in app code. And if your product exists mainly to preserve user-owned device data, make offline export and pricing that feels ownership-friendly obvious from day one.

Discussion mood

Interested in the technical problem, but negative on the product packaging. People saw the browser-based MIDI work as clever, then immediately balked at subscription pricing, fear-based marketing, and reliance on a hosted service for long-term patch backups.

Key insights

  1. 01

    Web MIDI already has precise send scheduling

    Using the API’s timestamped `send` call pushes timing onto the MIDI subsystem instead of trusting `setTimeout` on the main thread. That is a better fit for hardware messaging, because browser UI work and garbage collection stop mattering as much once messages are queued with `performance.now()` timestamps.

    If you ship anything timing-sensitive over Web MIDI, build around scheduled sends first and treat JavaScript timers as a fallback. You will get cleaner playback and fewer device-specific hacks.

      Attribution:
    • omneity #1
    • halfradaition #1
  2. 02

    The bottleneck is the synth CPU, not MIDI speed

    The useful correction here is that standard MIDI has no RTS or CTS hardware flow control, so there is no mechanism for a synth to ask the sender to pause. A fixed-rate serial link can still overwhelm a device once incoming SysEx forces an old 8-bit processor to copy buffers into SRAM fast enough to keep up.

    Do not assume spec-compliant transport guarantees safe delivery into old hardware. Test large transfers against the device’s actual firmware behavior, especially for dump and restore operations.

      Attribution:
    • theblazehen #1
    • dezgeg #1
    • halfradaition #1
  3. 03

    Offline-first matters more than web versus desktop

    People were not really asking for native code for its own sake. They wanted durability and local control. Zero install is attractive for occasional use, but only if the app can still behave like a self-contained local tool, whether that is a Tauri wrapper, a standalone bundle, or even one static HTML file that keeps working years later.

    For niche hardware utilities, make the continuity story explicit. Show how the tool works without your servers and how users keep using it after your company disappears.

      Attribution:
    • _def #1
    • halfradaition #1
    • nl #1
    • gbanfalvi #1
    • nine_k #1
    • pjmlp #1

Against the grain

  1. 01

    Zero install is a real feature

    For infrequently used synth tools, a browser app removes enough setup pain that some users prefer it to a desktop package. Avoiding driver and installer friction is not cosmetic here. It is part of the product value, especially when the task is a once-or-twice-a-year backup.

    Do not overreact to desktop-first criticism by throwing away the browser approach. Keep the low-friction entry point, but pair it with export and offline options.

      Attribution:
    • nl #1

In plain english

.syx
A file format commonly used to store MIDI SysEx data so it can be backed up and reloaded later.
DX7
The Yamaha DX7, a famous 1980s digital synthesizer that uses MIDI and stores programmable sound patches.
MIDI
Musical Instrument Digital Interface, a standard protocol for sending musical notes, timing, and device control data between instruments and computers.
performance.now()
A browser timing function that returns a high-resolution timestamp, useful for scheduling events more precisely than ordinary JavaScript timers.
setTimeout
A JavaScript function that schedules code to run later, but not with the precise timing needed for many real-time tasks.
SRAM
Static Random-Access Memory, a type of memory that old hardware often used for small, fast writable storage.
SysEx
System Exclusive, a type of MIDI message used for device-specific data such as patch backups, settings dumps, and firmware-related communication.
Tauri
A framework for packaging web technologies as desktop applications with local access and smaller runtime overhead than many alternatives.
USB MIDI
MIDI data carried over Universal Serial Bus connections instead of the older dedicated 5-pin MIDI cables.
Web MIDI
A browser API that lets web applications communicate with MIDI musical devices connected to the computer.

Reference links

Web MIDI documentation

Synth librarian and emulation tools

  • Dexed
    Cited as a free DX7 plugin that already includes librarian features, undercutting the original pricing.
  • Plogue chipsynth OPS7
    Cited as a paid DX7-style emulation that also includes a librarian and sets a competitive benchmark.
  • SoundPalette
    Shared as a hand-written MIDI SysEx project that may serve as a useful reference.

Background reading

  • A Brief History of MIDI
    Linked as protocol background and as a reminder of why abstraction layers matter with old hardware.