Examples
Complete, runnable .deck songs — one per idea. On the docs site every block here has a Play
button; in a checkout, drop any of them in a .deck file.
The grammar reference shows syntax (note <midi> <startBeat> …); this page shows songs.
Every block on this page plays. The player carries the whole voice catalogue, so nothing here is substituted for a plain oscillator — the chip examples sound the same in a browser as they do on a GBA, and the rest sound like themselves.
Press play and the code follows along: the step under the playhead is lit in each lane, and the lines of every track sounding on that step are tinted.
Two voices are the exception. ttsVocal and meSpeakVocal reach outside the audio graph for
speech, so they need something from the host and do not appear in an offline render — see
Speech.
Steps
The step grid is one bar of sixteenths. x is a hit, . is a rest, and step_pitch sets what a hit
plays when the channel has no note lines.
deck 1
bpm 120
track Kick id kick gen gbaDirectSound
gen waveform triangle pitch_drop -14
adsr a 0 d 0.08 s 0 r 0
step_pitch 36
steps x . . . x . . . x . . . x . . .
track Hat id hat gen gameBoyDmg
gen type noise vol 6
step_pitch 72
steps . . x . . . x . . . x . . . x .Step locks
A bare steps line resets the locks; the lanes after it restore only the steps that differ.
step_vel is 1–127, step_prob is a 0–1 chance, step_ratchet fills a step with sub-hits.
deck 1
bpm 128
track Snare id snare gen gbaDirectSound
gen waveform square
adsr a 0 d 0.12 s 0 r 0
step_pitch 40
steps . . . . x . . . . . . . x . . x
step_vel . . . . 127 . . . . . . . 100 . . 70
step_ratchet . . . . 1 . . . . . . . 1 . . 3
step_prob . . . . 1 . . . . . . . 1 . . 0.6Notes
Notes are placed by beat, not by step, so they can sit anywhere including off the grid. Beats are quarter notes: one bar is 4 beats.
deck 1
bpm 116
track Lead id lead gen gameBoyDmg
gen type pulse duty 25 vol 12
note 72 0 0.5 v 110
note 74 0.5 0.25 v 90
note 76 0.75 0.75 v 105
note 79 1.5 0.5 v 100
note 76 2 1 v 95
note 72 3 1 v 110
track Bass id bass gen gameBoyDmg
gen type wave wave_shape saw vol 15
note 36 0 2 v 120
note 43 2 2 v 110Bar selectors
* N declares an N-bar pattern. A note with bar <selector> starts inside its own bar and repeats
on every bar the selector matches — even, 1, 0,2, -n+2.
deck 1
bpm 124
track Bass id bass gen gameBoyDmg * 4
gen type wave wave_shape saw vol 14
note 36 0 1 v 120 bar even
note 41 0 1 v 115 bar 1
note 43 0 1 v 115 bar 3
note 48 2 0.5 v 90
track Kick id kick gen gbaDirectSound * 4
gen waveform triangle pitch_drop -12
adsr a 0 d 0.09 s 0 r 0
step_pitch 36
steps x . . . x . . . x . . . x . . .Euclidean fills
steps euclid <hits> <len> spreads N hits as evenly as possible over the pattern — the Bjorklund
fill. It expands to an ordinary step grid, so the lock lanes still apply.
deck 1
bpm 132
track Perc id perc gen gameBoyDmg
gen type noise noise_mode short vol 7
step_pitch 65
steps euclid 7 16
track Kick id kick gen gbaDirectSound
gen waveform triangle pitch_drop -14
adsr a 0 d 0.08 s 0 r 0
step_pitch 36
steps euclid 4 16Voice: chords and arpeggios
voice transforms every trigger on the channel — one note becomes a stack, and arp ripples that
stack across the note instead of playing it together.
deck 1
bpm 108
track Chords id chords gen gameBoyDmg
gen type pulse duty 50 vol 9
voice chord minor arp up arprate 1/16
note 60 0 2 v 100
note 65 2 2 v 100
track Sub id sub gen gameBoyDmg
gen type wave wave_shape triangle vol 15
note 36 0 2 v 110
note 41 2 2 v 110Swing and scale
swing delays every off-beat sixteenth; scale snaps every pitch onto a key, so a wrong note
becomes the nearest right one.
deck 1
bpm 96
swing 0.4
scale C minor
track Keys id keys gen gameBoyDmg
gen type pulse duty 12.5 vol 10
note 60 0 0.25 v 100
note 61 0.25 0.25 v 85
note 63 0.5 0.25 v 95
note 66 0.75 0.25 v 90
note 67 1 0.5 v 105
note 63 1.5 0.5 v 90
note 60 2 2 v 110
track Kick id kick gen gbaDirectSound
gen waveform triangle pitch_drop -12
adsr a 0 d 0.1 s 0 r 0
step_pitch 36
steps x . . . . . . . x . . . . . . .Wavetables
wave names a 32-sample, 4-bit table — one cycle of a waveform, in Game Boy wave RAM order — and a
type wave track plays it by name. There are four ways to say one: harmonics <a1> … for the
amplitudes, levels <n0> … <n31> for the samples in decimal, shape <name> for a classic waveform,
and the bare 32 hex digits. All four resolve in the parser, so they cost the same and sound the same.
Reach for harmonics. The hex is what the table is — it is never how you should have to say it.
These are the same table, so the two bars below are the same sound:
deck 1
bpm 100
wave literal 8beffecbbbbaa9888776554444310014
wave additive harmonics 1 0.5 0.33 0.2
track Written id lit gen gameBoyDmg * 2
gen type wave wave_shape literal vol 14 env_mode adsr
adsr a 0.02 d 0.06 s 15 r 0.2
note 48 0 1.5 v 105
note 55 1.5 1.5 v 100
note 60 3 1 v 110
track Summed id add gen gameBoyDmg * 2
gen type wave wave_shape additive vol 14 env_mode adsr
adsr a 0.02 d 0.06 s 15 r 0.2
note 48 4 1.5 v 105
note 55 5.5 1.5 v 100
note 60 7 1 v 110a1 is the fundamental, a2 the octave above it, a3 the twelfth, and so on. Only the ratios
matter — the table is normalized to fill the 4-bit range either way — so 1 0.5 and 2 1 are the
same wave.
Spelling a table you cannot sum
harmonics reaches any timbre you would design as a stack of partials, but not every table is one.
A curve tuned a nibble at a time — a bell with a slight ring in the second half of the cycle, say —
has no additive recipe, and that is what levels is for: the same wave RAM the hex form carries,
written in decimal. Anything hex can hold, levels can hold.
shape covers the other end, where the table is a plain waveform and naming it beats spelling it.
deck 1
bpm 92
wave clang levels 8 13 15 15 13 12 11 10 9 8 8 7 7 6 4 5 8 10 11 9 8 8 7 7 6 5 4 3 2 0 0 2
track Bell id b1 gen gameBoyDmg * 2
gen type wave wave_shape clang vol 13 env_mode adsr
adsr a 0.005 d 0.6 s 2 r 0.6
note 72 0 1 v 108
note 67 1 1 v 96
note 72 2 2 v 112
track Reed id b2 gen gameBoyDmg * 2
gen type pulse duty 12 vol 10 env_mode adsr
adsr a 0.02 d 0.1 s 9 r 0.2
note 48 4 1.5 v 100
note 55 5.5 1.5 v 96
note 60 7 1 v 104Every level is a whole number 0..15, and there must be exactly 32 of them — a level is a wave RAM
nibble, so there is nothing to round on your behalf.
shape takes sine, square, saw, triangle or pulse, with duty as a percent; square is
pulse duty 50. A narrow pulse on the wave channel is a reed the two pulse channels cannot make,
because their duty is fixed to four settings and this one is not:
deck 1
bpm 104
wave thin shape pulse duty 12.5
track Reed id r1 gen gameBoyDmg * 2
gen type wave wave_shape thin vol 12 env_mode adsr
adsr a 0.03 d 0.12 s 10 r 0.2
note 55 0 1 v 100
note 60 1 1 v 96
note 62 2 2 v 104
track Bass id r2 gen gameBoyDmg * 2
gen type pulse duty 50 vol 11 env_mode adsr
adsr a 0.01 d 0.05 s 12 r 0.15
note 36 0 2 v 104
note 43 2 2 v 100Designing a timbre
Timbre is harmonic content, which is what makes harmonics easier to aim than 32 digits. The same
phrase, four times, on four tables:
deck 1
bpm 88
wave pure harmonics 1
wave hollow harmonics 1 0 0.4 0 0.2
wave bright harmonics 1 0.5 0.33 0.25 0.2 0.16
wave clang harmonics 1 0 0 0.7 0 0 0.45
track Pure id t1 gen gameBoyDmg * 4
gen type wave wave_shape pure vol 13 env_mode adsr
adsr a 0.01 d 0.08 s 12 r 0.3
note 60 0 0.75 v 100
note 64 1 0.75 v 96
note 67 2 1.5 v 104
track Hollow id t2 gen gameBoyDmg * 4
gen type wave wave_shape hollow vol 13 env_mode adsr
adsr a 0.01 d 0.08 s 12 r 0.3
note 60 4 0.75 v 100
note 64 5 0.75 v 96
note 67 6 1.5 v 104
track Bright id t3 gen gameBoyDmg * 4
gen type wave wave_shape bright vol 12 env_mode adsr
adsr a 0.01 d 0.08 s 12 r 0.3
note 60 8 0.75 v 100
note 64 9 0.75 v 96
note 67 10 1.5 v 104
track Clang id t4 gen gameBoyDmg * 4
gen type wave wave_shape clang vol 12 env_mode adsr
adsr a 0.005 d 0.5 s 3 r 0.5
note 60 12 0.75 v 100
note 64 13 0.75 v 96
note 67 14 1.5 v 104Even harmonics left at zero (hollow) reads reedy, like a clarinet or a stopped organ pipe. A long
tail at roughly 1/n (bright) is heading toward a sawtooth, where bowed strings and brass start.
Sparse high harmonics with gaps between them (clang) ring like a bell — especially with a plucked
envelope under them, which is the other half of the job.
Instrument voices
A wavetable sets the timbre; the envelope decides what is playing it. env_mode adsr swaps the
DMG's hardware envelope — which can only decay toward silence — for a real attack and sustain, and
vib_rate / vib_amt add the vibrato a player's hand does, in cents.
Slow attack, held sustain, gentle vibrato — a string section:
deck 1
bpm 72
wave strings harmonics 1 0.5 0.33 0.25 0.2 0.166 0.142 0.125
track Violin id vln gen gameBoyDmg * 4
gen type wave wave_shape strings vol 11 env_mode adsr vib_rate 5.5 vib_amt 24
adsr a 0.35 d 0.25 s 12 r 0.6
mix gain 0.75 pan 0.3
fx reverb_send 0.4 cutoff 3600
note 65 0 3.8 v 88
note 65 4 3.8 v 96
note 65 8 3.8 v 100
note 64 12 3.8 v 84
track Cello id vc gen gameBoyDmg * 4
gen type pulse duty 12.5 vol 9 env_mode adsr
adsr a 0.3 d 0.3 s 11 r 0.7
mix gain 0.7 pan -0.3
fx reverb_send 0.3 cutoff 1400
note 50 0 3.8 v 84
note 50 4 3.8 v 90
note 48 8 3.8 v 94
note 48 12 3.8 v 80Instant attack and a long decay instead, and the same synth is a plucked string:
deck 1
bpm 92
wave nylon harmonics 1 0 0.4 0 0.2 0 0.1
track Guitar id gtr gen gameBoyDmg * 2
gen type wave wave_shape nylon vol 12 env_mode adsr
adsr a 0.004 d 0.9 s 3 r 0.5
voice chord minor strum 22
fx reverb_send 0.3 cutoff 4200
note 57 0 3.5 v 84
note 52 4 3.5 v 88
track Bass id bass gen gameBoyDmg * 2
gen type pulse duty 50 vol 10 env_mode adsr
adsr a 0.01 d 0.3 s 7 r 0.2
fx cutoff 900
note 45 0 1 v 100
note 45 2 1 v 84
note 40 4 1 v 100
note 40 6 1 v 84voice chord minor strum 22 turns each single note into a chord rolled over 22 ms — a strum rather
than a block.
Beyond the chips
gameBoyDmg and gbaDirectSound are hardware emulations, and everything above is bound by what a
Game Boy could do. basicOsc is not: it is a plain oscillator with an envelope in seconds, for when
you want the language without the console.
deck 1
bpm 76
track Pad id pad gen basicOsc * 2
gen waveform sawtooth
adsr a 0.6 d 0.4 s 0.55 r 1.2
mix gain 0.5 pan -0.2
fx cutoff 900 res 6 reverb_send 0.55
voice chord min7
note 48 0 4 v 80
note 46 4 4 v 80
track Bell id bell gen basicOsc * 2
gen waveform sine
adsr a 0.002 d 1.4 s 0 r 0.8
mix gain 0.4 pan 0.35
fx reverb_send 0.6
note 84 0 1 v 70
note 79 1.5 1 v 60
note 87 4 1 v 70
note 82 5.5 1 v 60The channel strip — mix, and fx's filter, drive and reverb send — is host-side and applies to
every generator, so it works the same on a chip voice as it does here.
basicOsc is the plainest of thirty-three. The rest of the catalog is in
Instruments; the examples below are one from each family.
Hard sync
A sync voice runs two oscillators and lets the first reset the second's phase. slave_base is how
far above the note the slave starts, in semitones, and sweep_amt is how far it sweeps down — that
sweep is the sound, so it wants tens of semitones rather than a couple.
deck 1
bpm 124
track Lead id lead gen syncLead * 2
gen slave_base 19 sweep_amt 30 sweep_decay 0.25 cutoff 4200 resonance 3
adsr a 0.02 d 0.2 s 13 r 0.3
mix gain 0.5 pan -0.15
fx reverb_send 0.25
note 69 0 1.5 v 104
note 76 1.5 0.5 v 92
note 74 2 2 v 100
note 72 4 1.5 v 98
note 69 5.5 0.5 v 88
note 64 6 2 v 94
track Choir id choir gen syncChoir * 2
gen vowel_shift 12 morph_rate 0.8 morph_amt 6 ensemble_detune 6 vib_rate 6.5 vib_amt 14 highpass 400
adsr a 0.3 d 0.5 s 12 r 0.8
mix gain 0.3 pan 0.1
fx reverb_send 0.5
note 57 0 3.8 v 74
note 55 4 3.8 v 76The analog rack
A 303's character is env_mod — a filter envelope in Hz, not a 0–1 amount, so it runs in the
thousands. The 808's punch is also Hz, and its drive is 0–1.
deck 1
bpm 128
song_seed 303
track Acid id acid gen acid303 * 2
gen waveform sawtooth cutoff 480 resonance 20 env_mod 5000 decay 0.25
mix gain 0.4 pan 0.15
note 40 0 0.25 v 118
note 52 0.75 0.25 v 110
note 40 1.5 0.25 v 92
note 47 2.25 0.25 v 104
note 38 4 0.25 v 118
note 50 4.75 0.25 v 108
note 45 5.5 0.25 v 96
note 38 6.5 1 v 100
track Sub id sub gen sub808 * 2
gen punch 48 decay 2 drive 0.15 glide 0.08
mix gain 0.5
note 40 0 2 v 120
note 38 4 2.5 v 112
track Kick id kick gen drumSynth * 1
gen tone sine pitch_env 30 pitch_decay 0.035 decay 0.3 noise 0.05 drive 0.2
mix gain 0.55
step_pitch 36
steps x . . . | x . . . | x . . . | x . . .
track Clap id clap gen clap * 1
gen hands 2 spread 0.2 size 0.3 tone 0.6 claps 1 gap 0.2 tail 0.25 body 0.15
mix gain 0.3 pan 0.2
step_pitch 60
steps . . . . | x . . . | . . . . | x . . .Atmospheric
Long attacks, and nothing competing for the same register.
deck 1
bpm 76
track Pad id pad gen pad * 4
gen wave1 triangle wave2 sine detune 14 cutoff 1200
adsr a 0.6 d 0.8 s 11 r 2
mix gain 0.26 pan -0.3
fx reverb_send 0.5
note 52 0 7.6 v 72
note 50 8 7.6 v 74
track Halo id halo gen halo * 4
gen temper 0.5 ring 0.35 mallet 0.6 bloom 1.2 lows 0.3
adsr a 0.02 d 2.5 s 2 r 1.6
mix gain 0.26 pan 0.3
fx reverb_send 0.6 cutoff 6000
note 79 0 2 v 76
note 84 4 2 v 72
note 81 8 2 v 78
note 88 12 3 v 82
track Bell id bell gen bell * 4
gen partial 3.4 highpass 900 decay 2.6
mix gain 0.3 pan -0.3
fx reverb_send 0.65
note 91 6 2 v 62
note 86 14 2 v 58Other consoles
The Game Boy is one of six chip emulations. These are five others, in one bar each.
deck 1
bpm 140
track NES id nes gen nes2a03 * 2
gen type pulse duty 25 vol 12 env_mode adsr vib_rate 5.5 vib_amt 22
adsr a 0.002 d 0.12 s 8 r 0.1
mix gain 0.5 pan -0.3
note 76 0 0.5 v 104
note 79 0.5 0.5 v 92
note 83 1 1 v 100
note 76 2 2 v 96
track SID id sid gen c64sid * 2
gen waveform pulse pulse_width 0.28 filter_type lowpass cutoff 2400 resonance 8
adsr a 0.004 d 0.2 s 7 r 0.15
mix gain 0.45 pan 0.3
note 52 0 1 v 96
note 57 2 2 v 100
note 50 4 1 v 94
note 55 6 2 v 98
track FM id fm gen ym2612 * 2
gen algorithm 4 feedback 5 op1_mul 1 op1_tl 22 op2_mul 3 op2_tl 30 op3_mul 2 op3_tl 26 op4_mul 1 op4_tl 12
mix gain 0.4
note 40 0 2 v 106
note 45 4 2 v 100
track SNES id snes gen spc700 * 2
gen waveform triangle echo_enable 1 echo_delay 0.16 echo_feedback 0.3
adsr a 0.01 d 0.4 s 6 r 0.3
mix gain 0.35 pan -0.15
note 64 2 1 v 82
note 67 6 2 v 86
track PSG id psg gen sn76489 * 1
gen type noise noise_mode white noise_freq 3 vol 8
adsr a 0 d 0.05 s 0 r 0.02
mix gain 0.25 pan 0.15
steps x . . x | . . x . | x . . x | . x . .Acoustic models
voice on arco names an instrument — violin, cello, fiddle, bass — rather than taking a
number.
deck 1
bpm 88
track Cello id vc gen arco * 4
gen voice cello pressure 0.6 bow 0.5 vibrato 0.5 rosin 0.2 body 0.75
adsr a 0.35 d 0.3 s 12 r 0.7
mix gain 0.32
fx cutoff 1600 reverb_send 0.35
note 50 0 3.8 v 88
note 46 4 3.8 v 84
note 53 8 3.8 v 86
note 48 12 3.8 v 82
track Rhodes id tine gen tine * 4
gen bark 0.5 tine 0.65 tremolo 0.3 decay 1.1 drive 0.2
adsr a 0.003 d 0.9 s 3 r 0.5
mix gain 0.26 pan 0.3
fx reverb_send 0.35 cutoff 4600
note 62 1.5 1.2 v 74
note 65 1.5 1.2 v 70
note 58 5.5 1.2 v 74
note 62 5.5 1.2 v 70
note 65 9.5 1.2 v 74
note 69 9.5 1.2 v 70
note 60 13.5 1.2 v 74
note 64 13.5 1.2 v 70
track Nylon id gtr gen guitar * 4
gen tone 0.6 decay 1.4 damping 0.35 drive 0.15 body 0.7 mute 0
mix gain 0.3 pan -0.2
fx reverb_send 0.3
note 69 0 1 v 86
note 74 1 0.75 v 80
note 77 4 1.5 v 88
note 72 8 1 v 84
note 77 10 1.5 v 90
note 76 12 1.5 v 86
note 74 14 1.8 v 82An operator graph
matrixFm is the one voice whose patch does not fit on a gen line, so it takes a gen_block:
operators, the modulation between them, a filter, and how they route to the output. This is the
factory Supersaw Stack — three detuned saws cross-modulated into a wide lowpass.
deck 1
bpm 128
track Saws id saw gen matrixFm * 2
gen_block matrix_fm
op 1 wave saw ratio 1
op 2 wave saw ratio 1.008
op 3 wave saw ratio 2
env op 1 a 0.006 d 0.22 s 0.72 r 0.32
env op 2 a 0.006 d 0.22 s 0.72 r 0.32
env op 3 a 0.006 d 0.22 s 0.68 r 0.32
mod fm 2 1 0.45
mod fm 3 1 0.28
filter 1 type lp24 cutoff 6800 res 0.32
route op 1 filter 1 0.38
route op 2 filter 1 0.36
route op 3 filter 1 0.34
route filter 1 out 1
end gen_block
mix gain 0.34 pan -0.1
fx reverb_send 0.3
note 65 0.5 0.4 v 104
note 68 0.5 0.4 v 98
note 72 0.5 0.4 v 96
note 65 1.5 0.4 v 96
note 68 1.5 0.4 v 90
note 61 4.5 0.4 v 104
note 65 4.5 0.4 v 98
note 68 4.5 0.4 v 96
track Bass id bass gen reeseBass * 2
gen voices 2 detune 15 cutoff 800 wobble 0 decay 1.2
mix gain 0.4
note 41 0 1.5 v 112
note 39 4 1.5 v 108Noise and metal
noiseBurst is filtered noise with an envelope — a hat, a shaker, a rim. cymbal's tune is the
frequency of its inharmonic bank in Hz, not a note, so it sits in the hundreds.
deck 1
bpm 132
track Hat id hat gen noiseBurst * 1
gen attack 0.002 decay 0.07 tone 0.45 pitch_follow 0.25
mix gain 0.3 pan 0.1
step_pitch 70
steps x . x . | x . x . | x . x . | x . x x
track Crash id crash gen cymbal * 4
gen tune 320 metallic 0.85 decay 1.6 highpass 6000
mix gain 0.22 pan -0.2
fx reverb_send 0.4
note 72 0 2 v 96
track Ride id ride gen cymbal * 1
gen tune 480 metallic 0.6 decay 0.35 highpass 9000
mix gain 0.16 pan 0.25
step_pitch 76
steps x . . x | . . x . | x . . x | . . x .
track Kick id kick gen drumSynth * 1
gen tone sine pitch_env 30 pitch_decay 0.035 decay 0.3 drive 0.2
mix gain 0.5
step_pitch 36
steps x . . . | x . . . | x . . . | x . x .Two-operator FM
fmTone is one modulator on one carrier. ratio is the modulator's frequency relative to the note
and mod_index is how hard it pushes — low ratios and a low index give warmth, high ones give
bells and clangs.
deck 1
bpm 96
track Keys id keys gen fmTone * 4
gen ratio 2 mod_index 3 carrier_wave sine mod_wave sine
adsr a 0.005 d 0.5 s 5 r 0.4
mix gain 0.32 pan -0.15
fx reverb_send 0.3
note 60 0 1 v 88
note 64 0 1 v 82
note 67 0 1 v 80
note 58 4 1 v 88
note 62 4 1 v 82
note 65 4 1 v 80
track Clang id clang gen fmTone * 4
gen ratio 7.03 mod_index 8 carrier_wave sine mod_wave triangle
adsr a 0.002 d 1.6 s 1 r 1.2
mix gain 0.2 pan 0.3
fx reverb_send 0.55 cutoff 7000
note 84 2 2 v 70
note 79 10 2 v 66Drift
aether glides between whatever it is given and swells rather than striking. Long notes and a slow
tempo are the point.
deck 1
bpm 64
track Air id air gen aether * 4
gen glide 0.4 waver 0.5 tone 0.3 swell 0.45 air 0.25
mix gain 0.34 pan -0.2
fx reverb_send 0.6
note 64 0 6 v 74
note 67 6 6 v 70
note 71 12 4 v 76
track Low id low gen aether * 4
gen glide 0.7 waver 0.3 tone 0.15 swell 0.6 air 0.1
mix gain 0.3 pan 0.2
fx reverb_send 0.5 cutoff 2200
note 45 0 8 v 66
note 43 8 8 v 68Vowels
formantVocal shapes a voice with the three formants of a vowel, and takes the vowel from the
note's lyric — l A for father, l I for see, l U for who. Thirteen are defined: I, IH,
EY, E, AE, A, O, OH, OO, U, UH, ER, UX.
deck 1
bpm 84
track Voice id vox gen formantVocal * 4
gen glide 0.1 vib_depth 0.02 vib_rate 5 humanize 0.5 release 0.2
mix gain 0.36
fx reverb_send 0.4
note 64 0 1.5 v 88 l A
note 67 1.5 1.5 v 84 l EY
note 69 3 1 v 86 l I
note 67 4 2 v 82 l OH
note 62 6 2 v 80 l U
note 64 8 3 v 86 l A
note 60 12 4 v 78 l ER
track Under id und gen pad * 4
gen wave1 triangle wave2 sine detune 10 cutoff 900
adsr a 0.8 d 0.6 s 10 r 1.6
mix gain 0.2 pan -0.25
fx reverb_send 0.45
note 45 0 7.6 v 64
note 43 8 7.6 v 66One chip, generically
chiptune is the console-agnostic chip voice: a pulse with adjustable width, optional PWM, an
optional arpeggio, and bitcrush and lowpass for grit. Use it when you want the character without
committing to a particular machine's quirks.
deck 1
bpm 150
track Lead id lead gen chiptune * 2
gen waveform pulse pulse_width 0.25 pwm_speed 1.5 bitcrush 0 lowpass 0
adsr a 0.005 d 0.25 s 7 r 0.08
mix gain 0.4 pan -0.2
note 72 0 0.5 v 100
note 76 0.5 0.5 v 94
note 79 1 1 v 98
note 77 2 0.5 v 92
note 74 2.5 1.5 v 96
note 72 4 2 v 100
note 67 6 2 v 92
track Arp id arp gen chiptune * 2
gen waveform pulse pulse_width 0.5 arp_rate 16 arp_semis 12 bitcrush 6
adsr a 0.002 d 0.1 s 6 r 0.05
mix gain 0.26 pan 0.25
note 48 0 4 v 84
note 46 4 4 v 84The rest of the sync family
syncLead sweeps once per note. obSync sweeps continuously at sweep_rate for a slow pulsing
pad, and laserSync drops instead of sweeping — drop_amt semitones at drop_rate.
deck 1
bpm 118
track Sweep id ob gen obSync * 4
gen detune 15 sweep_rate 0.5 sweep_amt 24 cutoff 1200 resonance 2 filter_env 2400 filter_decay 0.8
adsr a 0.1 d 0.4 s 10 r 0.5
mix gain 0.32 pan -0.2
fx reverb_send 0.35
note 52 0 7.6 v 84
note 50 8 7.6 v 86
track Zap id zap gen laserSync * 2
gen drop_rate 0.8 drop_amt 36 slave_base 18
adsr a 0.01 d 0.3 s 2 r 0.2
mix gain 0.3 pan 0.3
note 84 1 0.5 v 104
note 84 5 0.5 v 100
note 88 9 0.5 v 106
note 81 13 0.5 v 98Building a voice out of parts
patch has no fixed architecture. Its gen_block names oscillators, noise, filters, shapers and
gains, wires them with conn, and drives any parameter with a breakpoint env. It is how you write
a voice the catalog does not have.
deck 1
bpm 110
track Pluck id pl gen patch * 2
gen_block patch
osc o1 sawtooth note
osc o2 sawtooth note detune 9
filter f1 lowpass q 6 freq 2400
gain a1 0
conn o1 f1 0.6
conn o2 f1 0.5
conn f1 a1 1
conn a1 out 1
env a1.gain set 0 0 lin 0.004 0.9 exp 0.35 0.001
env f1.frequency set 0 3800 exp 0.3 700
end gen_block
mix gain 0.36 pan -0.1
fx reverb_send 0.3
note 57 0 0.5 v 100
note 64 0.5 0.5 v 92
note 69 1 0.5 v 96
note 64 1.5 0.5 v 88
note 55 4 0.5 v 100
note 62 4.5 0.5 v 92
note 67 5 1 v 96
track Hat id ph gen patch * 1
gen_block patch
noise n
filter f highpass freq 8000
gain a 0
conn n f 1
conn f a 1
conn a out 1
env a.gain set 0 0.25 exp 0.05 0.001
end gen_block
mix gain 0.22 pan 0.2
step_pitch 70
steps x . x . | x . x . | x . x . | x . x xSpeech
Two voices sing words rather than vowels, and both need something from the host that the other thirty-one do not.
ttsVocaldrives the browser's own speech synthesiser through the Web Speech API. It needs a live browser with a voice installed.meSpeakVocaluses the meSpeak engine and needs its worker and voice data served by the host.
Because both reach outside the audio graph, neither appears in an offline render — the command-line
renderer in Rendering to audio will produce silence for them. They are written the
same way as formantVocal, with the lyric carrying a word instead of a vowel:
deck 1
bpm 90
track Words id w gen ttsVocal * 4
gen glide 0.1
mix gain 0.4
note 60 0 1 v 90 l hello
note 64 1 1 v 88 l there
note 62 2 2 v 86 l friendmeSpeakVocal takes the same shape, and adds a voice naming the meSpeak voice the host has
loaded:
deck 1
bpm 90
track Chant id ms gen meSpeakVocal * 4
gen voice en pitch 50 speed 160
mix gain 0.4
fx reverb_send 0.3
note 57 0 1.5 v 92 l one
note 60 1.5 1.5 v 88 l two
note 64 3 2 v 90 l threeMixing and effects
mix places a track and sets its level; fx shapes it. Cutoff and resonance are a filter sweep's
worth of character on their own, and reverb_send is what puts several tracks in one room.
deck 1
bpm 104
track Wide id wide gen gameBoyDmg * 2
gen type pulse duty 25 vol 12
mix gain 0.8 pan -0.6 eq_hi 3
fx cutoff 2600 res 4 reverb_send 0.25
note 72 0 0.5 v 100
note 76 1 0.5 v 92
note 79 2 0.5 v 100
note 76 3 0.5 v 88
track Narrow id narrow gen gameBoyDmg * 2
gen type pulse duty 50 vol 9
mix gain 0.6 pan 0.6 eq_lo -4
fx cutoff 1500 drive 0.4 reverb_send 0.5
note 60 4 0.5 v 90
note 64 5 0.5 v 84
note 67 6 0.5 v 90
note 64 7 0.5 v 80
track Kick id kick gen gbaDirectSound * 2
gen waveform triangle pitch_drop -14
adsr a 0 d 0.08 s 0 r 0
mix gain 0.9
step_pitch 36
steps x . . . x . . . x . . . x . . .A whole song
Three voices, four bars, with the DMG's two pulse channels carrying the melody and harmony over the wave-channel bass.
deck 1
bpm 140
track Lead id lead gen gameBoyDmg * 4
gen type pulse duty 25 vol 11
note 76 0 0.5 v 112
note 79 0.5 0.5 v 100
note 83 1 1 v 118
note 79 2 0.5 v 95
note 76 2.5 0.5 v 100
note 74 3 1 v 105
track Harm id harm gen gameBoyDmg * 4
gen type pulse duty 50 vol 7
note 67 0 1 v 80 bar even
note 71 1 1 v 78 bar even
note 69 0 1 v 80 bar 1
note 72 1 1 v 78 bar 1
track Bass id bass gen gameBoyDmg * 4
gen type wave wave_shape saw vol 15
note 40 0 1 v 120
note 40 1 1 v 100
note 47 2 1 v 115
note 45 3 1 v 105
track Kick id kick gen gbaDirectSound * 4
gen waveform triangle pitch_drop -14
adsr a 0 d 0.07 s 0 r 0
step_pitch 36
steps x . . . x . . x x . . . x . x .