GoatTracker v2.72 readme (summary)
The manual of goattracker 2 by lasse-oorni — "a tracker-like C64 music editor running on Win32 or Linux platforms" with reSID emulation (Dag Lem; distortion model by Antti Lankila) or HardSID hardware, distributed under the GPL. It assumes familiarity with trackers, hex and the sid and points to the C64 Programmer's Reference Guide for the chip. Sections: warnings and v1 compatibility, command-line options, keys per editing mode, song data (orderlist, patterns, instruments, the four tables), playback details tick by tick, tips, multispeed tips, utilities, packer/relocator and playroutine options, file formats, version history.
Key claims#
- Model: 32 subtunes; single-channel patterns of up to 128 rows, 208 patterns; up to 63 instruments; a pattern row is note+octave · instrument (
$01–$3F,$00no change) · command$0–$F· databyte. Highest noteG#7(A-7…B-7 only via transpose). Special notes:...rest,---key off,+++key on; the real gate bit is the key mask AND the wavetable's gate bit, so+++cannot re-open a gate the wavetable cleared. - Orderlist per channel: pattern numbers, TRANSPOSE (
+0..14,-1..15, reset only at song start), REPEATR1–R16(R0= 16), then aRSTendmark with restart position; max 254 entries. TRANSPOSE must precede REPEAT and the entry before RST must be a pattern, otherwise the editor halts playback (orderlist). - Pattern commands:
1XY/2XYportamento up/down and3XYtone portamento (300= tie note) all take a speedtable index;4XYvibrato (speedtable);5XY/6XYset AD/SR registers;7XYwaveform register;8XY/9XY/AXYset wave/pulse/filter table pointer ($00stops);BXYfilter control (X resonance, Y channel bitmask;B00= filter off);CXYcutoff;DXYmaster volume (or timing mark if X ≠ 0);EXYfunktempo (speedtable);FXYtempo ($03–$7Fall channels,$83–$FFthis channel,$00/$01recall funktempo). There is no "00= repeat last value". One-shot commands5–Fleave a running1–4or instrument vibrato intact; command0stops it. - Instrument = 9 parameters: AD, SR, wave/pulse/filter table start positions, vibrato speedtable index, vibrato delay (
$00= off), HR/Gate timer (ticks before the next note at which note fetch, gate-off and hard restart happen; at most tempo−1; bit$80disables hard restart,$40disables gate-off) and 1stFrame Wave ("usually$09(gate + testbit)";$00leave waveform and gate unchanged,$FEleave waveform + gate off,$FFleave + gate on). All-zero ADSR gives "just a very short click". Examples:09/00full volume then automatic fade;00/8Ainstant to sustain 8, release A;CC/AFslow swell. Instrument legato: timer bit$40+ 1stFrame$00= no restart, no gate-off, gate untouched, but tables and ADSR re-initialised. - Hard restart in the editor: the ADSR value written during the gate-off ticks is global (
-Aoption orSHIFT+F7), default0F00; "0000 is probably too hard to be useful, except perhaps with gateoff timer value 1. 0F00 (default) is a lot softer, and 0F01 adds also a little bit of release to the gateoff phase for even softer sound. 000F makes the note start very pronounced." AttackFselects an alternative playroutine that writes the waveform before ADSR — more reliable triggering for releases 0 and 1, but it can change decay/release character. Since v2.68 the SID write order was tweaked for badline stability, so notes with attack 0 & release 1 may ADSR-bug — again try attackF(hard-restart). - Tables (shared; instruments and commands point into them; never jump onto a
FFjump row):- Wavetable left byte:
00leave waveform,01–0Fdelay 1–15 frames,10–DFwaveform/control,E0–EFthe inaudible values$00–$0F(E9= test+gate),F0–FEexecute pattern command0–Ewith the right byte as parameter (not0,8,E),FFjump (right byte = row,00stop). Right byte:00–5Frelative semitones up,60–7Fdown,80keep frequency,81–DFabsoluteC#0–B-7. Delay or "no change" in an instrument's first wavetable row is unsupported (missing notes). Waveform bits:01gate,02sync,04ring,08test ("silences sound and resets the oscillator"),10triangle,20saw,40pulse,80noise; everything but noise can be combined, differently on 6581 and 8580. Sync/ring source: channel 3 modulates 1, 1 modulates 2, 2 modulates 3. - Pulsetable:
01–7Fmodulation step (left = time, right = signed speed),8X xxset width$Xxx,FFjump. Filtertable:00 xxset cutoff,01–7Fmodulation step,80–F0set passband ($90lowpass,$A0bandpass,$C0highpass) with right byte = resonance/channel mask,FFjump; a set-parameters row followed by a set-cutoff row executes in one frame. Speedtable (no jumps): vibratoXX YY= time until direction change / pitch added per tick; portamento = 16-bit pitch step; funktempo = two tempos; high bit inXX= realtime note-independent calculation withYYas divisor (v2.62).SHIFT+RETURNconverts old-style parameters into speedtable entries;SHIFT+Hprecalculates "hifi" note-independent speeds;SHIFT+Lconverts limit-based pulse/filter steps to time-based ones.
- Wavetable left byte:
- Playback tick schedule (tempo 6, gate-off timer 2): tick 0 initialises new notes (inaudible), advances the orderlist, runs pulse (unless the orderlist advanced), wave and one-shot commands; tick 1 the note becomes audible; tick 4 fetches the next note and performs gate-off and hard restart "2 ticks before first frame"; pulse is skipped on that tick. Filtertable runs every tick; the wavetable is never skipped, "so arpeggios/drumsounds should always play OK". Pulse skipping (
-O0) and realtime-command skipping on tick 0 (-R0) can be disabled at a rastertime cost. - Multispeed: multiply tempos and gate-off timers (2 → 4 at 2×), multiply vibrato speed and divide depth, divide portamento and pulse/filter speeds; attack 0 can make the first wavetable row nearly silent — raise the attack or prepend
E9 00rows. - Warnings: save
.SNG(F11) — packed PRG/BIN/SID cannot be reloaded; "the reSID emulation is in some cases quite far from the output of a real SID. Especially if filters are in use" — test on a C64 or HardSID, "every SID tends to sound different"; ADSR bugs after packing with unbuffered writes: make note-init take more cycles (nonzero pulse start position, 1stFrame$09→$0B), use buffered writes, or attackF. - Packer (F9): PRG/BIN/SID with start and zeropage addresses; removes unused patterns, instruments, table entries, duplicate table parts and unneeded player code; a pattern packs to ≤ 256 bytes (0–4 bytes per row), so >64-row patterns may fail. Calls:
LDA #subtune / JSR startto init,JSR start+3per frame; options: buffered SID writes, sound-effect engine (start+6, priority by address), volume routine, author info + timing marks (DXYwith$10–$FFcopied tostart+$3F), zeropage ghost registers (copy loopLDX #$18 … DEX BPL; with the attack-Fplayer copy wave, frequency, pulse, ADSR last), disable optimisations "if you encounter … ADSR bugs caused by unpredictable timing variation" (sid-player-routine). - Utilities: INS2SND2 (instrument → sound-effect source/binary), SNGSPLI2 (split patterns), MOD2SNG (4-channel MOD → SNG minus one channel), BETACONV.
- Keys: F1–F3 play (from start / position / one pattern), F4 stop, F5 pattern, F6 song, F7 instrument/table, F8 songname, F9 pack, F10 load, F11 save, F12 help,
SHIFT+F8toggles 6581/8580,SHIFT+F5/F6speed multiplier; Protracker (two-row) or DMC (one-row) note entry;SHIFT+Q/A/W/Stranspose,SHIFT+O/Pshrink/expand,SHIFT+J/Kjoin/split patterns; table editorSHIFT+Nnegate,SHIFT+Ooptimise,SHIFT+Rabsolute↔relative note.
Practical takeaways#
The readme is the best single description of the tick-level mechanics behind hard restart and of a table system where instruments are just pointers. Its wavetable examples are ready-made recipes (flute, koto, snare, hi-hat-then-pulse, looping arpeggios, waveform alternation with vibrato underneath) and its tips answer the everyday questions: how to stop an unused pulse program, how to get tempo 2, how to keep vibrato depth constant across octaves.
Notable quotes#
"Wavetable is never skipped, so arpeggios/drumsounds should always play OK."
"Using filters has always been complicated because every SID tends to sound different."
Pages touched#
goattracker · lasse-oorni · hard-restart · adsr-envelope · sid · wavetable-programming · pulse-width-modulation · filter-programming · instrument-tables · chord-arpeggio · vibrato · pitch-slide-and-portamento · multispeed · sid-player-routine · shuffle-funktempo · orderlist · instrument-design · ring-modulation-and-sync · vice · sid-wizard · sidechain-pump · song-init-and-looping · semitone-math · chord-inversions · melody-writing · diatonic-chords