Skip to content
modbox

tracker music · webassembly · demoscene

The music of the demoscene, back in your browser.

modbox plays classic MOD, S3M, XM, and IT modules with a FastTracker-style visualizer — scrolling patterns, per-channel oscilloscopes, VU meters. Written entirely in Go, compiled to WebAssembly. Drag a module in and press play.

modbox — Crush [XM]
ORD 03/48  ROW 12  BPM 120  SPD 2  ▶ PLAYING

10  ... .. ...  E-4 01 ...  ... .. ...
11  A-3 02 ...  ... .. ...  D-5 07 v40
12  C-4 01 ...  G-4 03 ...  ... .. ...
13  ... .. ...  ... .. ...  A-5 07 ...
14  E-3 02 ...  C-5 01 vFF  ... .. ...

CH1 ▁▂▅▇▅▂▁  CH2 ▂▄▆▄▂▁▁  CH3 ▅▃▁▁▃▅▇

what you get

A tracker player that shows its work.

Four classic formats

ProTracker MOD, Scream Tracker S3M, FastTracker XM, and Impulse Tracker IT — auto-detected. Drag any module onto the page.

Live oscilloscopes

One scope per channel, drawn from the mixer's own per-channel buffers — aligned to what's audible, not what's rendered.

Pattern scroller

The full pattern grid scrolls under a highlight bar that flips exactly when you hear the row — FastTracker style.

VU meters

Per-channel level bars with fast attack, slow decay, and amber peak-hold ticks — the way hardware did it.

100% Go → WASM

Playback engine, mixer, UI, and audio bridge are one Go codebase (Ebitengine + gotracker/playback). No JavaScript frameworks.

Demo songs included

Starts with public-domain chiptunes by Drozerix, credited in the app. Deep-link one with ?demo=0.

under the hood

How it works.

The gotracker/playback engine renders the module about 20 ms at a time. Each chunk carries per-channel amplitude buffers and the machine's exact order/row position — so the scopes, VU meters, and pattern scroller come straight from the mixer, keyed by sample position. A backpressured ring buffer feeds Ebitengine's browser audio (an AudioWorklet under the hood), and the UI reads state at the audible playhead, so picture never leads sound.

# play it now
open https://richardwooding.github.io/modbox/play/

# keys
space  pause / resume
← →    seek one order
+ -    volume
d      debug overlay
# hack on it
git clone https://github.com/richardwooding/modbox
go run .          # native window
go test ./...     # headless engine tests
GOOS=js GOARCH=wasm go build .