GoatTracker cheat sheet

From GoatTracker · print · built 2026-08-31

Reference

Cheat sheet#

Keys#

keyaction
F1 / F2 / F3 / F4play from start / from position / one pattern / stop (SHIFT+F1–F3 with follow play)
F5 / F6 / F7 / F8pattern editor / song (orderlist) editor / instrument & table editor / songname
F9 / F10 / F11 / F12pack & relocate & save PRG/BIN/SID / load / save .SNG or .INS / online help
SHIFT+F4mute current channel
SHIFT+F7edit the hard-restart ADSR parameter
SHIFT+F8switch 6581 / 8580
TABcycle editing modes
SPACEjam / edit mode (pattern); play test note (instrument/table)
RETURNinsert key-off; enter the table or instrument under the cursor
SHIFT+RETURNinsert key-on; convert an old-style portamento/vibrato/funktempo value into a speedtable entry
BACKSPACEinsert rest
- + / / * / < > / backquoteinstrument / octave / pattern (subtune in song mode) / channel or table
SHIFT+Q/A, SHIFT+W/Stranspose halfstep / octave (in tables: portamento speed; pulse/filter speed ×2 ÷2)
SHIFT+O/Pshrink / expand pattern (÷2 / ×2)
SHIFT+J/Kjoin with next pattern / split at cursor
SHIFT+X/C/V, SHIFT+E/Rcut/copy/paste; copy/paste commands only
SHIFT+Lmark whole pattern/orderlist; in tables: convert limit-based step to time-based
SHIFT+Hprecalculate a "hifi" note-independent portamento/vibrato speedtable entry
SHIFT+Ninstrument name; in tables: negate speed / relative note
SHIFT+O (table) / SHIFT+R (table) / SHIFT+Uoptimise 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 / ESCoptimise 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#

cmdeffect
0XYnothing (stops a running vibrato/portamento)
1XY / 2XYportamento up / down; XY = speedtable index of a 16-bit speed
3XYtone portamento to the note; 300 = tie note (instant)
4XYvibrato; speedtable index (left = speed, right = depth)
5XY / 6XYset attack/decay / sustain/release register
7XYset waveform register (ineffective while the wavetable changes waveforms)
8XY / 9XY / AXYset wave / pulse / filter table pointer (00 stops)
BXYfilter control: X resonance, Y channel bitmask (B00 = filter off)
CXYfilter cutoff
DXYmaster volume Y (X = 0); otherwise XY is a timing mark
EXYfunktempo from speedtable (alternates two tempos row by row)
FXYtempo $03–$7F all channels, $83–$FF this channel, 00/01 recall funktempo

No effect memory: a 00 databyte never means "repeat". One-shot commands 5F leave a running 14 command or instrument vibrato intact.

Instrument parameters#

parametermeaning
Attack/Decay, Sustain/Release0 fastest / F slowest; sustain 0 silent … F loudest. All zero = "just a very short click"
Wavetable / Pulsetable / Filtertable posstart rows (00 stops wave execution; 00 leaves pulse/filter untouched)
Vibrato param, Vibrato delayspeedtable index; ticks before it starts (00 = off)
HR/Gate timerticks before the next note for note fetch, gate-off and hard-restart; ≤ tempo−1; $80 disables HR, $40 disables gate-off
1stFrame Wavewaveform 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 0E 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#0B-7. Never put a delay or "no change" in an instrument's first row; never jump onto a jump row.

Pulsetable01–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.

Filtertable00 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 $80 disables hard restart, $40 disables gate-off. 1stFrame Wave is "usually $09 (gate + testbit)".
  • Global: the HR ADSR value (-Axx, SHIFT+F7), default 0F00 — "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." Attack F enables 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 $40 and 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 attack F; 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 (5XYFXY) 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#0B-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):

rowssound
21 00 / FF 00sawtooth 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 00snare drum, all absolute notes — "use pulsewidth 800 for best result"
81 DF / 41 00 / FF 00pulse note preceded by a short noise at B-7, "like a hi-hat"
41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 024-note looping arpeggio, waveform unchanged in the loop
21 00 / 02 03 / 02 07 / 02 00 / FF 02delayed minor-chord arpeggio, three ticks per step
41 00 / 03 80 / 11 80 / 03 80 / 41 80 / FF 02pulse ↔ triangle every 5 ticks with frequency untouched (vibrato and slides keep working)
81 CF / 21 00 / 08 00 / F6 2A / FF 00noise, 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).