A web build of the Microtone tracker and the Taud audio engine from TSVM. Two halves:
- Taud engine (
src/engine/) — a faithful JavaScript translation of the tracker engine in TSVM'sAudioAdapter.kt, running inside an AudioWorklet. Pure computation, no DOM/Web Audio imports, so the same code runs headlessly under Node for conformance testing against the JVM engine. - Microtone tracker (
src/ui/) — a native web rewrite of the tracker UI (the TSVMtaut.jsis the behavioural reference).
Simply visit microtone.cc and start tracking; no strings attached.
No build step. Serve the directory with any static file server:
npm run serve # python3 -m http.server 8737
# then open http://localhost:8737/ (tracker)
# http://localhost:8737/player.html (minimal player)Requires Node ≥ 22.
node --test # discovers test/node/*.test.jsEngine conformance is verified against PCM dumps rendered by the real JVM
engine (tsvm/devtests/webconf/) over the corpus in test/corpus/:
node tools/render-taud.js test/corpus/WHEN.taud out.pcm
node tools/compare-pcm.js out.pcm reference.pcm| Path | Contents |
|---|---|
src/engine/ |
Taud engine port (worklet- and Node-safe, no imports outside itself) |
src/format/ |
.taud/.tsii/.tpif parser + serialiser (gzip/zstd via vendor/) |
src/worklet/ |
AudioWorkletProcessor + message protocol |
src/audio/ |
main-thread audio system (context lifecycle, snapshots) |
src/doc/ |
canonical document model, invertible ops, undo, worklet sync |
src/ui/ |
tracker application (vanilla ES modules, canvas + DOM) |
src/storage/ |
OPFS virtual disk, import/export |
vendor/ |
vendored single-file ESM deps (see vendor/VENDOR-VERSIONS.md) |
test/corpus/ |
.taud conformance/demo corpus (from the TSVM repo) |
test/fixtures/ |
file formats built rather than committed (the .ims/.bnk pair) |
tools/ |
Node CLIs: render, compare, inspect, worklet-bundle |
Engine port keeps the Kotlin function/field names (applyTrackerRow,
triggerNote, resolveActiveEnvelopes, …) so future syncs against
tsvm/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt diff cleanly.
Format reference: tsvm/terranmon.txt §"Taud serialisation format";
effect semantics: tsvm/TAUD_NOTE_EFFECTS.md.
Two banks ship with the app so an import can sound without the user hunting for
one: assets/GeneralUser-GS.taud.sf2.gz (GeneralUser GS, for MIDI) and
assets/STANDARD.BNK.gz (the general AdLib instrument bank the Iyagi Music
Sound corpus resolves its patch names against, for .ims). Neither is used
unless an import asks for it.
