A four-track cassette multitracker for the phone: record with the built-in mic, overdub, punch in, bounce, ride the master pitch, mix down. A static site with no build step and no server code.
Use it now: https://jonobail.github.io/quadtrack/ on the phone. Share → Add to Home Screen makes it a full-screen app and protects saved tapes from Safari's clearing of unused site data. Tapes stay on the device and are never uploaded.
The mic needs HTTPS. Any static host works. localhost also counts for desktop testing.
systemd-run --user --unit=quadtrack --working-directory=$PWD --property=Restart=always /usr/bin/python3 -m http.server 8097 --bind 127.0.0.1
tailscale serve --bg --https=10000 http://127.0.0.1:8097
The unit lasts until a reboot or logout. Then open https://<machine>.<tailnet>.ts.net:10000/ on the phone.
Plain http://<ip> can't open the mic on an iPhone, so this runs HTTPS with a self-signed certificate:
systemd-run --user --unit=quadtrack-lan --property=Restart=always /usr/bin/python3 $PWD/tools/serve-lan.py 8444
If ufw is on, also run sudo ufw allow from <your-subnet>/24 to any port 8444 proto tcp. The certificate is tied to the IP and is remade if the IP changes, so a phone that trusted the old one has to install the new one.
- Press REC. It picks the first empty track and asks for the mic, then records.
- Press STOP. The tape returns to where the take began, so PLAY hears it.
- Press REC again to add a part on the next track. Headphones stop the first part bleeding in.
Tap a track's number first to choose which track records. Before your first overdub, go to MORE → MIC → MEASURE so new parts land in time.
The live mic is never played back, so it can't feed back. The mic only reaches the speaker by way of the tape.
| Control | Does |
|---|---|
| Track number | Gets that track ready to record |
| Waveform | Tap to edit it, drag to move through the tape |
| LEVEL | That track's volume |
| MASTER PITCH | ±12 % true varispeed on the whole tape, record and playback. Double tap to centre |
| TAPES | Saved tapes, saving audio, backups |
| MORE | Mic gain and EQ, overdub timing, pan, EQ, effects, bounce, tape speed, noise reduction, memory points, repeat, auto punch |
Drag to select, pinch to zoom, drag the strip underneath to move around. Tap to place the playhead. Edits happen in place, and nothing slides along, so the track stays in time with the others. CUT leaves silence and keeps the audio for PASTE, which also works across tracks and overwrites from the playhead.
js/processors.js is the tape machine on the audio thread. js/engine.js is the mixer graph, js/app.js the panel, js/editor.js the waveform editor, js/peaks.js the waveform drawing, js/store.js the saved tapes.
Eurostile is a commercial typeface and can't be redistributed here, so the wordmark uses Michroma (SIL OFL, fonts/OFL.txt), its closest free match. To use a licensed Eurostile, put its woff2 in fonts/ and point the src of the @font-face at the top of style.css at it.