GoatTracker cheat sheet
From GoatTracker · print · built 2026-08-31
Reference
Cheat sheet#
Keys#
| key | action |
|---|---|
F1 / F2 / F3 / F4 | play from start / from position / one pattern / stop (SHIFT+F1–F3 with follow play) |
F5 / F6 / F7 / F8 | pattern editor / song (orderlist) editor / instrument & table editor / songname |
F9 / F10 / F11 / F12 | pack & relocate & save PRG/BIN/SID / load / save .SNG or .INS / online help |
SHIFT+F4 | mute current channel |
SHIFT+F7 | edit the hard-restart ADSR parameter |
SHIFT+F8 | switch 6581 / 8580 |
TAB | cycle editing modes |
SPACE | jam / edit mode (pattern); play test note (instrument/table) |
RETURN | insert key-off; enter the table or instrument under the cursor |
SHIFT+RETURN | insert key-on; convert an old-style portamento/vibrato/funktempo value into a speedtable entry |
BACKSPACE | insert rest |
- + / / * / < > / backquote | instrument / octave / pattern (subtune in song mode) / channel or table |
SHIFT+Q/A, SHIFT+W/S | transpose halfstep / octave (in tables: portamento speed; pulse/filter speed ×2 ÷2) |
SHIFT+O/P | shrink / expand pattern (÷2 / ×2) |
SHIFT+J/K | join with next pattern / split at cursor |
SHIFT+X/C/V, SHIFT+E/R | cut/copy/paste; copy/paste commands only |
SHIFT+L | mark whole pattern/orderlist; in tables: convert limit-based step to time-based |
SHIFT+H | precalculate a "hifi" note-independent portamento/vibrato speedtable entry |
SHIFT+N | instrument name; in tables: negate speed / relative note |
SHIFT+O (table) / SHIFT+R (table) / SHIFT+U | optimise table / absolute↔relative note / unlock table scrolling |
SHIFT+INS (table) | insert rows without moving pointers to row 1 |
SHIFT+DEL (instrument) | delete instrument and its table data |
SHIFT+ESC / ESC | optimise or clear music data / exit |
Note entry (Protracker mode): lower octave Z X C V B N M , . (sharps S D G H K L), upper Q W E R T Y U I O P (sharps 2 3 5 6 7 9 0); octave with / and *.
Pattern commands#
| cmd | effect |
|---|---|
0XY | nothing (stops a running vibrato/portamento) |
1XY / 2XY | portamento up / down; XY = speedtable index of a 16-bit speed |
3XY | tone portamento to the note; 300 = tie note (instant) |
4XY | vibrato; speedtable index (left = speed, right = depth) |
5XY / 6XY | set attack/decay / sustain/release register |
7XY | set waveform register (ineffective while the wavetable changes waveforms) |
8XY / 9XY / AXY | set wave / pulse / filter table pointer (00 stops) |
BXY | filter control: X resonance, Y channel bitmask (B00 = filter off) |
CXY | filter cutoff |
DXY | master volume Y (X = 0); otherwise XY is a timing mark |
EXY | funktempo from speedtable (alternates two tempos row by row) |
FXY | tempo $03–$7F all channels, $83–$FF this channel, 00/01 recall funktempo |
No effect memory: a 00 databyte never means "repeat". One-shot commands 5–F leave a running 1–4 command or instrument vibrato intact.
Instrument parameters#
| parameter | meaning |
|---|---|
| Attack/Decay, Sustain/Release | 0 fastest / F slowest; sustain 0 silent … F loudest. All zero = "just a very short click" |
| Wavetable / Pulsetable / Filtertable pos | start rows (00 stops wave execution; 00 leaves pulse/filter untouched) |
| Vibrato param, Vibrato delay | speedtable index; ticks before it starts (00 = off) |
| HR/Gate timer | ticks before the next note for note fetch, gate-off and hard-restart; ≤ tempo−1; $80 disables HR, $40 disables gate-off |
| 1stFrame Wave | waveform on the note's first frame, "usually $09 (gate + testbit)"; $00/$FE/$FF = keep waveform and leave gate / gate off / gate on |
Instrument legato: timer bit $40 + 1stFrame $00. Examples from the readme: 09/00 full volume then fade; 00/8A instant to sustain 8; CC/AF slow swell.
Tables#
Wavetable — left: 00 keep waveform · 01–0F delay 1–15 frames · 10–DF waveform/control · E0–EF inaudible values $00–$0F (E9 = test + gate) · F0–FE run pattern command 0–E with the right byte (not 0, 8, E) · FF xx jump to xx (00 = stop). Right: 00–5F semitones up · 60–7F semitones down · 80 keep frequency · 81–DF absolute C#0–B-7. Never put a delay or "no change" in an instrument's first row; never jump onto a jump row.
Pulsetable — 01–7F xx modulate for that many ticks at signed speed xx · 8X xx set width $Xxx · FF xx jump. Example sweep: 80 10, 20 40, 40 E0, 40 20, FF 03.
Filtertable — 00 xx set cutoff · 01–7F xx modulate · 80–F0 xx set passband (90 low, A0 band, C0 high) + resonance/channel mask · FF xx jump. A set-parameters row directly followed by a set-cutoff row runs in one frame.
Speedtable — shared by vibrato (speed depth), portamento (16-bit step) and funktempo (tempoA tempoB); high bit in the left byte = realtime note-independent calculation, right byte = divisor. Examples: vibrato 03 40 (old $34), 05 04 "slow shallow vibrato, suitable for bass notes"; portamento 00 20 (old $08), 4F FF a "SEUCK-like space effect"; funktempo 09 06 (old $96), 24 18 for 4×.
Orderlist and song keys#
< > subtune · - + transpose down/up entry · SHIFT+R repeat · SPACE/BACKSPACE start/end position for F2 · SHIFT+1/2/3 swap channel orderlists.
Techniques
Chord arpeggio (the 0 3 7 trick) › GoatTracker #
GoatTracker 2 removed v1's arpeggio command: "Everything that this command does can also be done with wavetables". A looping arp is a wavetable whose right bytes are the semitone offsets and whose left bytes keep the waveform: 41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 02 (4-note pulse arpeggio, waveform unchanged in the loop); with delays in the left byte the arp slows — 21 00 / 02 03 / 02 07 / 02 00 / FF 02 is "a delayed minor chord arpeggio with sawtooth waveform. Each step takes 3 ticks". Because the wavetable "is never skipped", arps keep time at any tempo (source: s-goattracker-readme).
Filter programming on the SID › GoatTracker #
The filtertable: 00 xx set cutoff, 01–7F xx modulate for that many ticks at signed speed, 80–F0 xx set passband (left high nibble 9 low-pass, A band-pass, C high-pass) with the right byte = resonance nibble + channel bitmask (as in command BXY), FF xx jump. A set-parameters row directly followed by a set-cutoff row executes in the same frame. Examples: 90 F1 / 00 40 / FF 00 — low-pass, resonance F, channel 1 only, cutoff $40; A0 87 / 00 00 / 7F 01 / 7F 01 / 7F FF / 7F FF / FF 03 — band-pass on all channels sweeping up 254 ticks and back; C0 F2 / 00 F0 / 90 F2 / 00 50 — high-pass then low-pass on the next frame. From the pattern: AXY sets the filtertable pointer, BXY filter control (X resonance, Y bitmask; B00 = off and stop), CXY cutoff. "In most cases it makes sense to have a filter-controlling instrument only on one channel at a time"; the filtertable runs on every tick, and the test note plays filtered only on a channel selected in the filter parameters (source: s-goattracker-readme).
Hard restart › GoatTracker #
- Per instrument: HR/Gate timer = how many ticks before the next note the note fetch, gate-off and hard restart happen (at most tempo−1; with tempo 6 and timer 2 they happen on tick 4, "2 ticks before first frame"); bit
$80disables hard restart,$40disables gate-off. 1stFrame Wave is "usually$09(gate + testbit)". - Global: the HR ADSR value (
-Axx,SHIFT+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." AttackFenables an alternative playroutine that writes the waveform before ADSR, "more reliable note triggering, especially for very fast releases 0 & 1". - Legato without restart: timer bit
$40and 1stFrame$00(tables and ADSR still re-initialise). - Multispeed: multiply the timer with the speed (2 → 4 at 2×). If a packed tune still bugs: make note-init take more cycles (nonzero pulse start position, 1stFrame
$09→$0B), use buffered writes, or attackF; since v2.68 notes with attack 0 and release 1 are the sensitive case.
(source: s-goattracker-readme)
Instrument design beats note count › GoatTracker #
Nine parameters per instrument (ADSR, three table pointers, vibrato + delay, HR/gate timer, 1st-frame waveform) and everything else lives in the tables (goattracker). The readme's own recipes (source: s-goattracker-readme): ADSR 09/00 self-fading pluck, 00/8A organ-like sustain, CC/AF slow pad; wavetable "flute" 41 00 / 11 00, "koto" 41 01 / 40 00, a snare 81 D0 / 41 AA / 41 A4 / 80 D4 / 80 D1 ("use pulsewidth 800"), hi-hat-then-pulse 81 DF / 41 00; pulse sweep 80 10 / 20 40 / 40 E0 / 40 20 / FF 03; speedtable vibrato 05 04 "slow shallow vibrato, suitable for bass notes"; low-pass bass filter 90 F1 / 00 40. Stop an unused pulse program (80 00 / FF 00) under sawtooth instruments to save rastertime.
Multispeed (framespeed) › GoatTracker #
The speed multiplier is -Sxx on the command line or SHIFT+F5/F6 (0 = 25 Hz, 1 = 1×, 2 = 2× …). Because the whole player runs faster: multiply tempos and gate-off timers (timer 2 → 4 at 2×, also when importing v1 multispeed songs); to keep a vibrato the same, multiply its speed and divide its depth by the multiplier; divide portamento and pulse/filter modulation speeds; funktempo 24 18 is 09 06 at 4×. With attack 0 "the very silent first row of the wavetable" may vanish — raise the attack or add E9 00 (test + gate) rows at the start (source: s-goattracker-readme).
Octave bass › GoatTracker #
Type it, or put it in the instrument: a wavetable whose right byte alternates 00 and 0C (+12 semitones) with the waveform kept (00 left byte) and an FF jump back — the readme's 4-note arpeggio example (41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 02) shrunk to two rows; add left-byte delays (01–0F) to slow it to 8ths (derived from the documented table semantics, source: s-goattracker-readme).
Pitch slides and tone portamento › GoatTracker #
1XY / 2XY slide up / down and 3XY tone portamento all take a speedtable index holding a 16-bit pitch step per tick; 300 is a tie note (instant pitch change, no retrigger). Speedtable examples: 00 20 (old parameter $08), 01 00 (old $40), 4F FF "loops the pitch highbyte very fast so that a SEUCK-like 'space' effect is heard"; a high bit in the left byte (80 01) makes the speed note-independent (divisor 1 = half). SHIFT+H on a command precalculates a note-independent speed from the frequency difference of adjacent notes (00110 = double the C-3→C#3 difference). Portamento is a realtime command: it continues under one-shot commands and stops at 0XY (source: s-goattracker-readme).
Pulse width modulation (PWM) › GoatTracker #
The pulsetable: 01–7F xx = modulate for that many ticks at signed speed xx (right byte), 8X xx = set width $Xxx, FF xx = jump (00 stops). Readme examples: 88 00 / FF 00 sets $800 and stops; 80 10 (very thin), 20 40 (32 ticks up at speed 64), 40 E0 (64 ticks down at −32), 40 20 (64 ticks up at 32), FF 03 (loop from row 3) — "a nice loop". Enter sweeps as limit-based steps (84 00, C0 10 modulate to $C00, 40 10 back to $400) and convert them with SHIFT+L; the player only understands time-based steps. Speeds doubled in v2.4. Pulse execution is skipped on note-init ticks unless -O0; 900 or a 80 00 / FF 00 program stops an unused pulse program under non-pulse instruments (source: s-goattracker-readme).
Ring modulation and oscillator sync › GoatTracker #
Set the bits in the wavetable byte: $02 sync, $04 ring ("most effective with the triangle waveform"), $08 test — e.g. 15 = triangle + ring + gate. The inaudible values $00–$0F are typed as E0–EF, so test + gate is E9; the instrument's 1stFrame Wave is normally $09 (gate + test) (source: s-goattracker-readme).
Shuffle, swing and FunkTempo › GoatTracker #
EXY = funktempo from a speedtable entry whose two bytes are the alternating tempos (09 06 corresponds to the old parameter $96; 24 18 is the same feel at 4× multispeed); it applies to all channels, and FXY with $83–$FF overrides the tempo on one channel (F00/F01 recall the funktempo values). Tempo 3 is normally the fastest, but a funktempo entry 02 02 with gate-off timer 1 in every instrument and pulse skipping disabled gives tempo 2 (source: s-goattracker-readme).
Vibrato and delayed vibrato › GoatTracker #
4XY and the instrument's vibrato parameter both index the speedtable: left byte = how many ticks until the direction changes (speed), right byte = pitch added each tick (depth). 03 40 equals the old one-byte parameter $34; 05 04 is "slow shallow vibrato, suitable for bass notes. Not possible to achieve with old parameters"; 83 04 (high bit set) makes the depth note-independent with a divisor of 4 right-shifts. The instrument's vibrato delay is the tick count before it starts (00 = off) — a delayed vibrato without any pattern command, which also packs smaller. Realtime commands are skipped on tick 0 of each row unless -R0; a one-shot command (5XY–FXY) between vibrato rows leaves the vibrato running, but 0XY stops it; SHIFT+H precalculates "hifi" note-independent depths from the frequency difference of adjacent notes (source: s-goattracker-readme).
Wavetable programming (waveform / arp tables) › GoatTracker #
Wavetable rows are left right bytes: left 00 keep waveform, 01–0F delay 1–15 frames, 10–DF waveform/control, E0–EF the inaudible values $00–$0F (E9 = test + gate), F0–FE execute pattern command 0–E (right = parameter; not 0, 8, E), FF xx jump (00 = stop); right 00–5F semitones up, 60–7F down, 80 keep frequency, 81–DF absolute C#0–B-7. A delay or "no change" must not be the instrument's first row. Rows with a delay or 80 let vibrato and realtime commands run underneath (rastertime!). Examples from the readme (from table row 1):
| rows | sound |
|---|---|
21 00 / FF 00 | sawtooth on the note's pitch |
41 00 / 11 00 / FF 00 | "flute": pulse on the first tick, triangle after |
41 01 / 40 00 / FF 00 | "koto": one halfstep up on the first tick, then the note with the gate cleared |
81 D0 / 41 AA / 41 A4 / 80 D4 / 80 D1 / FF 00 | snare drum, all absolute notes — "use pulsewidth 800 for best result" |
81 DF / 41 00 / FF 00 | pulse note preceded by a short noise at B-7, "like a hi-hat" |
41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 02 | 4-note looping arpeggio, waveform unchanged in the loop |
21 00 / 02 03 / 02 07 / 02 00 / FF 02 | delayed minor-chord arpeggio, three ticks per step |
41 00 / 03 80 / 11 80 / 03 80 / 41 80 / FF 02 | pulse ↔ triangle every 5 ticks with frequency untouched (vibrato and slides keep working) |
81 CF / 21 00 / 08 00 / F6 2A / FF 00 | noise, then saw, then after 8 frames set sustain/release $2A from inside the table |
Instrument pointers select the start row; 8XY in a pattern jumps into a table mid-way; "Wavetable is never skipped" at any tempo (source: s-goattracker-readme).