DUETweb player no song [ — ]
order --pattern --row -- speed -tempo -time 0:00 chips 0render 0%
-/-
the gallery ↑↓ pick · Enter play · Esc close
VU BARSSPECTRUMSCOPE PLASMACOPPER ←/→ mode · ↑/↓ bar style · V strip / grid · click a column header to mute it · ? help
HELP: the DUET web player

WHAT THIS IS

The DUET engine, in your browser. DUET is an Impulse Tracker–compatible tracker whose SID channels are real 6581/8580 chips (reSID), and this page is that same engine — libduet, compiled to WebAssembly — with a player built around it. Whatever the tracker plays, this plays: Impulse Tracker modules, SID-Wizard modules, and DUET's own projects.

NOTHING YOU OPEN IS UPLOADED

There is no server here. The page loads one WebAssembly module and reads your files inside the browser — a song you drop never leaves your computer, and closing the tab is all it takes to be rid of it.

THE ENGINE RUNS ON THE AUDIO THREAD

The module lives in an AudioWorklet: it renders every 128-frame block the sound card asks for, so what you hear is the same bytes duet --render would write to a file. The note rows you see are stamped in the audio clock too — a row appears the moment it is heard, not the moment it was computed.

THE LINE AT THE TOP

The header says which build is running and how big it is (libduet 0.1.0-alpha · ReleaseSmall 2.3 MB), then the song's own title and author. On the right, what kind of song it is: [IT] an Impulse Tracker module, [SWM] a SID-Wizard module, [DUET] a project, [CO] a co-play — an .it and a SID-Wizard module running on one clock.

DRAG AND DROP — THE SHORT WAY

Drop a song anywhere on this page and it plays. One file, several files, or a whole folder — the page walks a dropped folder itself, keeps every song it finds, and opens the first one.

A DUET project (.zon) is not one file: it names the song file it plays. Drop the project together with its .it / .swm, or simply drop the folder they both live in, and they arrive together.

THE THREE BUTTONS

[OPEN FILES…]Pick one file, or several at once — a project and its song file in the same pick.
[OPEN FOLDER…]Pick a whole folder. Every song in it is listed; a folder holding just one song plays it straight away. In Chrome and Edge the folder is remembered — next visit it is one click away, and the browser asks your permission once. Firefox and Safari have no such handle, so pick it again each visit.
[FILES]  or  FThe list: your folder at the top, then the gallery. ↑ ↓ move, Enter plays, Esc closes, and typing filters. It is also what the page shows when nothing is loaded.

WHAT A ROW TELLS YOU

The kind of file, its name, what it calls itself (read out of the song's own header), who made it, and — for a project — whether the song files it names were found. If they were not, the row says which is missing in red, and so does the status line when you try to open it.

THE GALLERY

Ninety songs ship with the page: DUET's own demos, every SID-Wizard example module, and Impulse Tracker modules by other musicians. Every one of them carries its author, its licence and where it came from — see ABOUT, or songs/MANIFEST.md.

A LINK STRAIGHT TO A SONG

?song=swm/congabeat.swm on the page's address opens that gallery song at once — any file under songs/ works, and a project fetches its song files beside it.

THE TRANSPORT

▶ PLAY  (Enter)Play from the top of the song.
‖ PAUSE  (Space)Freeze where it stands — silent, and nothing moves; the time halts with it. Press it again to carry on from exactly there. After a STOP it carries on from where you stopped.
■ STOP  (Esc)Silence, and the time back to 0:00. Every voice goes, and so does the mixer: a reverb or delay send is emptied with them, so nothing rings on. The position is kept — PAUSE carries on from where you stopped.
⏮ REWINDStop, and go back to the top of the song.
LOOP ∞ / once  (L)Play forever, or play once and stop at the end. The status line says when a song ends.

THE SONG

subtune ‹ 1/3 ›A SID-Wizard module can hold several tunes in one file. Greyed out when there is only one.

THE CHIPS

6581 / 8580The SID model, for every chip in the song. The 6581 is the old one — fatter, with the famous unpredictable filter; the 8580 is cleaner. It changes under your fingers, while the song plays.
fast / interpolate / resampleHow reSID samples the chip. fast is cheapest, interpolate is the default and sounds right for almost everything, resample is the most accurate and the most expensive — watch render in the line above when you turn it on.

THE PAGE

volThis page's own output level. It is not the song's volume and it changes nothing about the render — the numbers and the meters are the same wherever you put it.
VIEW STRIP / GRID  (V)On the top row, beside the song's type: which view the song plays in — the note strip, or the pattern grid. Click it or press V. Both are drawn from the same events at the same instant, so switching never loses your place.
[FILES]  [HELP]The file list, and this.

THE NUMBERS

order · pattern · rowWhere the song is, in hex, exactly as the tracker shows it: which entry of the order list, which pattern that entry names, and which row inside it.
speed · tempoTicks per row, and beats per minute — the two knobs every tracker has.
timeHow long this song has been playing. PAUSE halts it; PLAY, STOP and REWIND put it back to 0:00. It is not the engine's render clock, which keeps counting through a stop because the note events are stamped in it.
chipsHow many SID chips the song asks for: 0 for a plain Impulse Tracker module, 1 to 4 otherwise.
renderHow much of the audio budget the engine is using. 9% is a light song; near 100% your browser cannot keep up — try interpolate or fast. It also counts dropped events if any ever are.

THE NOTE STRIP

One column per channel or voice that sounds — columns appear as the song uses them. Each row is a row of the song, newest at the bottom, fading as it scrolls away, and each cell is the tracker's own spelling: the note, the instrument, and the effect.

The colours say which dialect a column speaks: blue an Impulse Tracker channel, amber a SID one, green a DUST synth slot, violet a DUSK slot. The Impulse Tracker columns share one clock; a SID-Wizard track has its own row count and scrolls at its own pace beside them, which is what a co-play looks like from inside.

click a column headerMutes that channel, voice or slot; the header turns red and says MUTE. Click it again to bring it back.

THE PATTERN GRID

The other view (V, or the VIEW button): the song's pattern as a tracker draws it, the playing row on the bar near the middle, the rows below it dim because they have not sounded yet. Row numbers are hex, and each cell is spelled exactly as DUET spells it — the same characters the tracker puts on screen, because the same library writes them.

An Impulse Tracker column shows note, instrument, volume and effect; a SID column shows the SID-Wizard face instead — no volume column, and a two-byte effect. A SID-Wizard track stands where its transport stands, on its own pattern and its own row. Columns appear as the song uses them, exactly as in the strip, and when there are more than fit the view follows the ones that are sounding. Clicking a header mutes here too.

THE VISUALISER

Five ways to watch the master mix, all drawn the way DUET draws them in a terminal — a glow buffer under everything, scanlines over it.

VU BARSLeft and right, with peak caps that hold and fall, then a bar per sounding column in its own colour.
SPECTRUMThirty logarithmic bands, with peak caps.
SCOPEThe waveform, triggered on a rising zero crossing so a steady tone stands still.
PLASMA · COPPERDemoscene furniture, driven by the level and the beat.
← →  and  ↑ ↓The mode, and the bar style (solid, scanlines, gapped).

THE WINDOW

A bigger window shows the same rows and the same effects, larger — the whole page is one design scaled to fit, never more rows in a smaller font. ?scale=1 pins it if you want the raw size.

EVERYWHERE

Enterplay from the top
Spacepause · carry on
Escstop — or close this help, or the file list, first
Lloop forever · loop once
Fthe file list
Vthe note strip · the pattern grid
?  or  F1this help
← →the visualiser's mode
↑ ↓the visualiser's bar style

IN THE FILE LIST

↑ ↓move the pick
Enteropen and play what is picked
typingfilter by name, title or author
Escclose the list

IN THIS HELP

← →the page you are reading
↑ ↓  PgUp PgDnscroll · Home and End jump
?  Esc  F1close

WITH THE MOUSE

drop a file or folderanywhere on the page — it opens and plays
a column headermute · unmute that column — in the strip and in the grid
[VIEW …] on the top rowthe note strip · the pattern grid
a visualiser nameswitch to it

IMPULSE TRACKER — .it

The tracker format DUET is built on and the only module format it reads: samples, instruments, envelopes, NNAs, the resonant filter, the lot. Everything is played by DUET's own engine, judged against openmpt123 song by song.

SID-WIZARD — .swm .sws .swt .swq

Hermit's C64 tracker, ported here from its 6502 driver — the four extensions are one, two, three and four SID chips. The chips are real reSID emulations, and the register stream DUET produces is compared against the original driver's, row by row.

A DUET PROJECT — .zon

A project is a plain-text file that carries everything a song needs around its notes: which song file to play, the chips and their model, the DUST and DUSK synth patches, the mixer with its sends, the chord table, the markers. The notes stay in a real .it (or a SID-Wizard module) beside it — DUET has no private format, so every file it saves can be opened by other trackers too.

That is why a project needs its song file with it, and why the file list tells you when one is missing.

THE TWO SYNTHS

DUST is DUET's own SID synth — a chip per slot, its own tables, four slots. DUSK is a wavetable synth over the .it sample bank, eight slots, with a filter of its own. Both live in a project, and both show up in the note strip as their own columns.

"THIS PAGE CANNOT RUN FROM A FILE:// ADDRESS"

You opened index.html straight from the disk. A browser gives such a page no origin and refuses its scripts, the audio worklet and the module. Serve the directory instead and open it over http: zig build serve, or python3 -m http.server in the folder, then http://localhost:8000/.

NO SOUND

Click once anywhere on the page. A browser will not start audio until you have interacted with it — dropping a file or pressing a key counts too.

“THIS IS A DEBUG MODULE”

In red, on the status line: the build being served is the slow one and it cannot keep up with a heavy song. Whoever serves this page should run zig build wasm and reload. The header line always says which build you have.

IT STUTTERS

Watch render in the number line. Near 100% the engine is using the whole audio budget: turn resample down to interpolate or fast, or try a lighter song. Two chips at resample is the heaviest thing here.

“THIS PROJECT NAMES x.it — NOT IN THE FOLDER YOU OPENED”

A project needs the song file it names. Open the whole folder, or drop the project and its song file together.

THE SONG ENDED, OR NOTHING APPEARS

The status line says when a song ends — press Enter to start it again, or turn LOOP ∞ on. If the strip stays empty while the time runs, the song is playing something the strip has no column for yet; the visualiser will still show it.

A FOLDER WAS NOT REMEMBERED

Only Chrome and Edge can hand a page a folder it may open again. Elsewhere the folder is a one-visit snapshot — pick it again, or drop it.

DUET

An Impulse Tracker–compatible tracker with real SID channels, written in Zig: a terminal build, a window build, and this — the same engine three ways. The tracker edits; this page only plays.

THE LICENCES

The module and this page are GPL-2.0-or-later: DUET carries reSID by Dag Lem, which is GPL, so anything that links the engine is too. The font is JetBrains Mono under the SIL Open Font License. The full texts are in LICENSES/.

THE MUSIC

The SID-Wizard example modules are Hermit's (Mihaly Horvath) and his friends', under the WTF licence — DUET's whole SID-Wizard side is a port of his 6502 driver, and each module is credited by the name inside it. The Impulse Tracker modules were taken only where their author attached a licence that allows passing them on — Public Domain, CC0 or CC BY — and each one names its author, its licence and the page it came from in songs/MANIFEST.md. DUET's own demos are m64's and Claude's.

If you wrote one of these and would rather it were not here, say so and it goes — no argument, no delay.

THE ENGINE IN A PAGE OF YOUR OWN

Three files are the engine: duet-web.js (one class, DuetEngine), duet-worklet.js and duet.wasm. Put them beside your page, import the class, and a demo or a game plays any of these formats and syncs to the rows, the notes and the markers — embed.html is the whole of it in thirty lines. This player is that class with a page around it.

THE SOURCE, AND HOSTING IT

Everything here is in the DUET repository at github.com/M64GitHub/duetracker; the build stamp in the footer names the exact files. To host the player yourself, unzip duet-web-<version>.zip (or copy this directory) onto any static web server, under any path, and open it over https:// or from localhost — a page with an audio worklet needs a secure context, and nothing else: no special headers, no server-side code. The README in the directory says the same.

WHAT IS NOT HERE YET

A keyboard to play the instruments, a shared .zip you can drop, and a few things m64 has not thought of yet.

← → page · ↑ ↓ scroll · ? or Esc closes