Skip to content

Latest commit

 

History

188 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Microtone.js

Microtone screenshot

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's AudioAdapter.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 TSVM taut.js is the behavioural reference).

Try it

Simply visit microtone.cc and start tracking; no strings attached.

Running locally

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)

Testing

Requires Node ≥ 22.

node --test        # discovers test/node/*.test.js

Engine 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

Layout

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

Provenance

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.

About

A music tracker for the notes a piano cannot play. Any tuning on a 4096-step pitch grid, sources placed anywhere on the sphere, ambisonic B-format and stereo export.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages