GoatTracker
GoatTracker 2 is "a tracker-like C64 music editor running on Win32 or Linux platforms" by lasse-oorni (Cadaver), GPL, that drives a reSID emulation (Dag Lem's, with Antti Lankila's distortion model) or real HardSID / CatWeasel hardware. Version 2 replaced v1's arpeggio command with uniform step-programming tables for waveform/arpeggio, pulse and filter, plus a speed table — "likely much more complex to learn & master than v1.xx"; the readme assumes you know trackers, hex and the sid (source: s-goattracker-readme). hermit names it first among the editors sid-wizard was modelled on ("Goattracker-like pattern-editing concept and keyboard control to ease migration") and ships sng2swm to import its .sng files (sources: s-sid-wizard-manual, s-witchmaster-creating-chiptunes-with-sid-wizard).
Model#
- 32 subtunes; each channel has its own orderlist (pattern numbers, transpose
+0..14/-1..15, repeatR1–R16,RSTrestart mark; max 254 entries; transpose must precede repeat, and a pattern must precedeRST). - 208 single-channel patterns of up to 128 rows; a row is note+octave · instrument
$01–$3F· command$0–$F· databyte. Highest noteG#7....rest,---key off,+++key on; the gate actually written is the key mask AND the wavetable's gate bit. - 63 instruments of 9 parameters, pointing into four shared tables (instrument-tables).
- Emulated SID model 6581 or 8580 (
SHIFT+F8,-E); speed multiplier for multispeed (SHIFT+F5/F6,-S); Protracker two-row or DMC one-row note entry (-K).
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.
Playback: what happens on which tick#
With tempo 6 and gate-off timer 2: tick 0 initialises new notes (silent), advances the orderlist, runs pulse (unless the orderlist advanced), wavetable and one-shot commands; tick 1 the note sounds; tick 4 fetches the next note and does gate-off and hard restart "2 ticks before first frame" (no pulse that tick); the filter table runs every tick; "Wavetable is never skipped, so arpeggios/drumsounds should always play OK". Pulse skipping (-O0) and tick-0 realtime-command skipping (-R0) can be disabled for tempo-3 tunes at a rastertime cost.
Hard restart#
Global HR ADSR (-A, 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 chooses an alternative player that writes the waveform before ADSR (more reliable with releases 0–1). If a packed tune ADSR-bugs with unbuffered writes: give the instrument a nonzero pulse start, nudge 1stFrame from $09 to $0B, use buffered writes, or attack F. Details on hard-restart.
Tips from the readme#
- Fewer command changes = smaller packed patterns; instrument vibrato instead of
4XYsaves more. - Stop an unused pulse program with
80 00/FF 00or with900— otherwise it wastes rastertime under a sawtooth. - Tempo 2: funktempo speedtable
02 02, gate-off timer 1 in every instrument, pulse skipping off. - Enter pulse/filter sweeps as limit-based steps (
84 00,C0 10,40 10) and convert withSHIFT+L. - Multispeed: multiply tempos and gate-off timers; vibrato speed ×, depth ÷; prepend
E9 00rows if attack 0 mutes the first wavetable row (multispeed). - reSID "is in some cases quite far from the output of a real SID. Especially if filters are in use" — test on hardware.
Tips from elsewhere#
- A siddump trace maps onto wavetable rows almost byte for byte: the dump's absolute-note bytes use the same
$80+ semitone numbering as the wavetable's81–DF(C#0–B-7), and itsWFcolumn is the wavetable's left byte — Hubbard's Auf Wiedersehen Monty bass drum becomes11 AD/81 C7/41 A8/40 A5/40 96/FF 00with ADSR08/F8(a translation, worked out on wavetable-programming; source: s-ucapps-wavetable-sounds-tutorial-1). 4mat once tried to automate exactly this — "a log > gt instrument converter" — "but didn't get it working" (source: s-chipmusic-sid-music-hints-n-tips). - Why some people choose sid-wizard instead: "I do not like to 'do things C64' on a PC" (source: s-lemon64-sid-wizard-instrument-recommendations); the 2012 tutorial author went the other way (s-chipmusic-c64-music-for-dummies).
- A 2006 user's settings for cross-composing: nata answered the "it does not work on a real C64" objection with "there is hardly any difference. You just have to use 8580 emulation and reSID interpolation turned on", named Hein, Jammer and Randall as GoatTracker users, credited Cadaver with implementing features he requested, and called his Stargate (GoatTracker 2.0 beta) "THE FIRST song that has been released with the improved GT system"; C64-native editors (Voicetracker, DMC, JCH) had been "simply too hard"; an MMC64 card carried the results to the real machine (source: s-sidin09-nata-interview).
- GoatTracker as a sketchpad for hand-coded players: Tognon found the two instruments of his 256-byte Random Ninja in "a little Goattracker test tune" and wrote them in wavetable notation in the source — drum
$81 C8 / $41 A8 / $40 00, lead$41 00 / $21 00— before coding them as a tick script (source: s-sidin09-tiny-sid-256b). In 2005 GoatTracker "support MK3 card" and detected a catweasel Mk4 (source: s-sidin08-catweasel-mk4).
Packer and playroutine options#
F9 packs and relocates (PRG/BIN/SID; start and 2-byte zeropage address), removing unused patterns, instruments, table rows and player code; init with LDA #subtune / JSR start, play with JSR start+3. Options: buffered SID writes, sound-effect engine (start+6), volume routine, author info with timing marks, zeropage ghost registers, disable optimisations — see sid-player-routine. Utilities: INS2SND2, SNGSPLI2, MOD2SNG, BETACONV. Files: .SNG songs, .INS instruments.
Version notes that change values#
v2.18 wavetable left-side values ($E0–$EF for inaudible waveforms); v2.2 speedtable; v2.4 pulse speeds doubled; v2.59 timer bits $80/$40; v2.62 realtime note-independent speeds; v2.68 SID write order changed for badlines (attack 0 & release 1 may bug → attack F) (source: s-goattracker-readme).
GoatTracker 1 in 2002, in Cadaver's words#
The sidin #2 interview catches the editor before version 2's tables: Öörni thought GoatTracker "would be the ultimate for my personal use, because it was fast & easy to compose on", but its music "takes too much memory (because of the patterns, they're like in Amiga/PC tracker programs)", which sent him to write ninjatracker; the one feature he saw missing was "step-programming for sounds, that would add versatility at the cost of easiness" — what the v2 wave, pulse and filter tables above added (source: s-sidin02-cadaver-interview). In the June 2002 comp.sys.cbm argument over iseq, GoatTracker and OdinTracker were already the tools the tracker camp named as "much better" (source: s-sidin01-iseq).
GT2 in 2006–2007, seen from SIDin#
- State around v2.35 (Tognon, July 2006): Linux users built it themselves (
makeinsrcafter compiling the BCE library); playback had become realtime ("with GT in Linux there was a delay too high and you cannot follow a pattern being played. In GT2 all is in realtime"); the mouse worked; the tables were "very powerful" and the documentation plus theF12help "describe … all the features". In 2.35 an instrument could not change ADSR from the wavetable; "in next version the function was implemented letting a pattern command to be executed from wavetable" (theF0–FEentries above). His wishlist: play from the current start position without the orderlistRxxrepeat desynchronising the voices ("don't use the Rxx command or … only when the tune is finished"), a colour per instrument in the pattern editor, HardSID MK4 output (only MK3 was supported; he exported.sidfiles to hear the chip), a confirmation before saving over a file (F11pressed forF10), and undo. His cover of Haddaway's What is Love was the test piece (source: s-sidin10-goattracker-2). - A DMC user's verdict (richard-bayliss, 2006): he composes in GoatTracker "occasionally, but not all the time … don't feel comfortable with the sounds that are used in this program. It does not beat the traditional real C64 old/new SID chip"; it "lacks the real C64 SID environment" and DMC V5's sector editor for sweeping filtered sounds — "It is not a bad composer though" (source: s-sidin10-bayliss-interview).
- Sibling editor: lasse-oorni's native ninjatracker (V2 in February 2007) is the low-rastertime counterpart for his games; a converter turned GoatTracker songs into Ninjatracker format so only the instruments had to be redone, and its default grey palette was chosen to look like GoatTracker (source: s-sidin11-sid-factory-vs-ninjatracker).
Why two 2000s composers chose it (SIDin #13)#
- tsm moved from CyberTracker — FastTracker-like, but with a beta packer that made songs "too big and used too much rastertime" and sometimes failed — to GoatTracker in 2006 for a game tune: "it has mouse support and an interface very similar to that of FastTracker II. It is thought in a very rational way"; his one complaint is that it is a cross-tool. freedom left Odin Tracker over its filter handling and rastertime: GoatTracker "is easy, it is powerful, very efficient and it comes with a good documentation". TSM's Amiga-to-C64 path for Pushover: MED → MOD, adjustments, import into GoatTracker, then instruments and corrections by hand (source: s-sidin13-tsm-freedom-interview).
- jitt64 (2010) added an import for GoatTracker 2 instruments (source: s-sidin13-jitt64-tracker).
Seen from the neighbouring editors#
- What its arrival meant: SIDwave's memoir puts it in the emulator line — PlaySID (1991) → SIDPLAY → GoatTracker "somewhere in 2002" — and credits it with creating "a new kind of composer", naming Linus and Jammer: people who compose C64 music without a C64 in front of them (source: s-recollection-brief-history-of-sid).
- Against cheesecutter, from CheeseCutter's own author: the choice is "mostly a matter of taste … The player is more rastertime-heavy but I chose features/comfort over speed" — i.e. GoatTracker's playroutine is the cheaper one on rastertime. CheeseCutter's 2-series is described as "pretty close to top of the line SID music editors such as GoatTracker 2 and Sid Duzz' It", its gate-off/gate-on note entry "works mostly like in GT2", and its credits name Cadaver's GoatTracker among the programs it learned from (sid-player-routine; source: s-cheesecutter-guide). A user's version of the same ranking, 2014: "CheeseCutter is a great editor on par with Goat Tracker and Sid Duzz It" (source: s-chipmusic-cheesecutter-tutorial-thread).
- What it does not offer: scarzix, returning to SID composing in 2013, tried it and moved on — "none of them had that stacked trackview and overview as I had in JCH editor" (jch-editor; source: s-sidin14-scarzix-interview).
Release history (from the SIDin news, 2002–2010)#
Dated from the News sections of sidin (source: s-sidin-news-digest); the value changes listed above under Version notes fall on these dates.
- 1.33 (September 2002): "for cross develop", multispeed since 1.24, the 12-rasterline limit dropped from 1.3, Linux via SDL. 1.4b Final and a stereo build (
gstereo.zip), 2003-01-09: "a programmable (1 or 2 frame) hard restart", step-programmable filter, a NinjaTracker converter. 1.4c 2003-09-20: the wavetable also runs on the hard-restart frame; 1.4e (December 2003) reSID 0.15; 1.4f (January 2004) funktempo. - 1.5, 2004-01-25: "Playroutine rewritten. Uses testbit hard restart from now on for much sharper sounds", the HR ADSR configurable (before: AD only), master fader
7F0–7FF, timing mark7EF. 1.53, May 2005, was the last 1.x; Raf's HardSID build of 1.53 stereo followed in November 2006. - 2.0, 2005-06-23: breaks the 1.x file format — "more commands and uniform step programming tables for waveform/arpeggio, pulse effects, and filter effects", 63 instruments; 2.1 (2005-07-30) 16× maximum speed; 2.18 (November 2005) the
$01–$0F/$E0–$EFwavetable scheme; 2.2 (2005-12-11) the speedtable and the 4-table format. - 2.29beta (2006): the assembler-based relocator with selectable player features; 2.4 (2006) pattern commands from the wavetable and the GTS4 format; 2.47 an optional random delay on reSID writes "to make potential ADSR-bugging on C64 audible"; 2.57 (2006–07) the alternative hard-restart routine for attack
F; 2.59 (by 2007-02) GTS5/GTI5 and the$80/$40timer bits. - 2.62 (2007–08) note-independent portamento/vibrato; 2.66beta–2.67 "Initial cycle-exact HardSID support (Win32 only)"; a stereo 2.59 (2007-04-12). Moved to SourceForge by 2010; 2.68: "SID register write order tweaked to resemble JCH NewPlayer 21" and Antti Lankila's reSID-fp "with distortion & nonlinearity" (
/I2–3); 2.69: reSID-fp filter parameters in the config file. A "Goat Tracker 2SID Mono" hack of 2.70 by Raf existed by 2015. - Compo: c64.sk's Goat Tracker 2 Music Compo (July 2005) "for celebrating the new editor"; the entries' sources were to ship as examples with the tracker.
Related#
lasse-oorni · sid · sid-wizard · instrument-tables · hard-restart · wavetable-programming · pulse-width-modulation · filter-programming · sid-player-routine · vice · siddump · furnace
Sources#
s-goattracker-readme · s-sid-wizard-manual · s-witchmaster-creating-chiptunes-with-sid-wizard · s-lemon64-hard-restart-threads · s-chipmusic-sid-music-hints-n-tips · s-ucapps-wavetable-sounds-tutorial-1 · s-lemon64-sid-wizard-instrument-recommendations · s-sidin02-cadaver-interview · s-sidin01-iseq · s-sidin09-nata-interview · s-sidin09-tiny-sid-256b · s-sidin08-catweasel-mk4 · s-sidin10-goattracker-2 · s-sidin10-bayliss-interview · s-sidin11-sid-factory-vs-ninjatracker · s-sidin13-tsm-freedom-interview · s-sidin13-jitt64-tracker · s-sidin-news-digest · s-recollection-brief-history-of-sid · s-cheesecutter-guide · s-chipmusic-cheesecutter-tutorial-thread · s-sidin14-scarzix-interview