Chiptune Tracker

A four-voice chip synth with a step grid in front of it: two pulse channels whose tone you can change (the duty), a triangle for bass, and a noise channel for drums. Write a pattern, chain the patterns into a song, and export the result.

Nothing here makes a sound until you ask it to. No audio starts before you press Enable audio, and headphones can still be loud, so start quiet.

Rendered when the site was built, by the same core the browser runs: the demo song Overworld, written out as the tracker grid that produces it. A browser cannot make a sound without JavaScript, so there is no audio on this page. The music is here as the grid, and chiptune-cli render song.json --out song.wav turns that same grid into the same bytes on your own machine.

Song
Overworld
Summary
2 patterns · 4 chain slots · 64 rows · 120 BPM · 176256 samples at 22050 Hz · 7.993 s
Pattern chain
00 00 01 00
Render
176256 samples at 22050 Hz, 16-bit mono
How to read a cell
FieldExampleWhat it means
NoteC-4The note struck here, from C-0 up to B-7. Three dashes means this cell starts no new note and whatever was playing carries on.
VolumecOne base-16 digit, 0 to f, so sixteen levels fit in one column. A dot means the cell says nothing about loudness; a 0 is the note off.
EffectA47An arpeggio: the pitch cycles through the note, four semitones above it and seven above it, once per tick, six ticks to a row. Three dots means no effect.
EffectS+3A slide: the pitch bends up three parts in 1024 on every tick, and keeps bending into the rows that follow until a new note lands. S-3 bends down.
ROW  PULSE 1    PULSE 2    TRIANGLE   NOISE    
00  C-5 c ... C-4 8 A47 C-2 d ... F#2 b ...
01  --- . ... --- . ... --- . ... --- . ...
02  E-5 c ... --- . ... G-2 a ... F#4 5 ...
03  --- . ... --- . ... --- . ... --- . ...
04  G-5 c ... F-4 8 A47 F-2 d ... F#3 9 ...
05  --- . ... --- . ... --- . ... --- . ...
06  E-5 b ... --- . ... C-3 a ... F#4 5 ...
07  --- . ... --- . ... --- . ... --- . ...
08  F-5 c ... G-4 8 A47 G-2 d ... F#2 b ...
09  --- . ... --- . ... --- . ... --- . ...
10  E-5 b ... --- . ... D-3 a ... F#4 5 ...
11  --- . ... --- . ... --- . ... --- . ...
12  C-5 c ... C-4 8 A47 C-2 d ... F#3 9 ...
13  --- . ... --- . ... --- . ... --- . ...
14  --- 0 ... --- . ... G-2 a ... F#4 6 ...
15  --- . ... --- . ... --- . ... --- . ...
ROW  PULSE 1    PULSE 2    TRIANGLE   NOISE    
00  G-5 c ... G-4 8 A47 C-2 d ... F#2 b ...
01  --- . ... --- . ... --- . ... --- . ...
02  F-5 c ... --- . ... G-2 a ... F#4 5 ...
03  --- . ... --- . ... --- . ... --- . ...
04  E-5 c ... F-4 8 A37 F-2 d ... F#3 9 ...
05  --- . ... --- . ... --- . ... --- . ...
06  D-5 b ... --- . ... C-3 a ... F#4 5 ...
07  --- . ... --- . ... --- . ... --- . ...
08  C-5 c ... D-4 8 A37 G-2 d ... F#2 b ...
09  --- . ... --- . ... --- . ... --- . ...
10  --- . ... --- . ... D-3 a ... F#4 5 ...
11  B-4 b ... --- . ... --- . ... --- . ...
12  C-5 d ... C-4 9 A47 C-2 d ... F#3 9 ...
13  --- . ... --- . ... --- . ... --- . ...
14  --- . ... --- . ... G-2 a ... F#4 6 ...
15  --- 0 ... --- . ... --- . ... --- . ...
About this toy2 paragraphs

The synth uses whole numbers only, so a song renders the same bytes here, in the test suite and from chiptune-cli on your own machine, and the WAV you export is exactly those bytes. What your speakers play is that buffer resampled by your browser to whatever rate your device runs at, which we make no promise about.

The audio path, in order: the level ramps in when you enable it, the song is rendered at a quarter of full scale, and a limiter sits between that and the speakers.

Use it locally This toy has a native command line twin. Build chiptune-cli from the site's source with:
cargo build --release --bin chiptune-cli
Source and licence terms