JITT64 (Java Ice Team Tracker) cheat sheet
From JITT64 (Java Ice Team Tracker) · print · built 2026-08-31
Reference
Cheat sheet#
All from s-sidin13-jitt64-tracker unless noted.
Track commands (right-click in a track cell)#
| value | meaning |
|---|---|
0..222 | pattern number to play |
REP | repeat the following sequence of commands (up to 16 entries) 2–17 times |
TR | transpose −15..+15 semitones for all following patterns |
RST | always last: index to restart from, or let the voice end |
Pattern commands ($00–$10)#
| cmd | name | parameter |
|---|---|---|
00 | Stop | bit field: 0 arpeggio, 1 portamento up, 2 portamento down, 3 tone portamento, 4 vibrato, 5 pulse up, 6 pulse down |
01 | Set Tempo | new tempo from this row; 0 = the pattern's own |
02 / 03 | Set AD / SR | $xx |
04 | Set Volume | 0–15 (starts at 15) |
05 | Set Arpeggio | bits 7–6 speed (0–3), bits 5–3 first offset, bits 2–0 second offset added to the first note (source: s-sidin13-inside-jitt64) |
06 / 07 | Portamento up / down | amount, applied ×2 per tick to the 16-bit frequency |
08 | Tone Portamento | amount, same units; target = the note on the same row |
09 | Set Vibrato | low nibble + 1 = speed in ticks, (high nibble + 1) × 16 = frequency units per tick (source: s-sidin13-inside-jitt64) |
0A / 0B | Pulse slide up / down | amount per tick on the 12-bit pulse width |
0C | Auto fade out | delay in ticks between volume steps |
0D / 0E / 0F | Filter type / resonance / cut-off | type = high/band/low + voices; resonance 0–15; cut-off high byte |
10 | Gate Sustain/Release | new SR with the gate released ("you can go up in volume level") |
Planned but not implemented in 2010: a hard-restart command, a pointer command into an instrument, note-independent ("hifi") portamento and vibrato, a vibrato slider.
Instrument: restart of note#
| field | meaning |
|---|---|
| none | no action at note change — "all is left to you for preventing ADSR bugs" |
| Gate off + N. ticks | gate bit cleared N ticks before the end of the note |
| Hard Restart + N. ticks | N ticks before the end: Attack/Decay HR, Sustain/Release HR and First Control HR are written; on the last tick before the new note, Second Control HR |
| write order | Wave–ADSR or ADSR–Wave per instrument, "for letting you obtain good hardrestart" |
N is capped by the pattern tempo (timing 3, ticks 4 → 3 effective). Test-bit recipes: (a) first control gate off, second control $09, ≥ 2 ticks, ADSR–Wave; (b) both controls gate off, 1 tick, and the instrument table's first row $09 before the real waveform, ADSR–Wave. See hard-restart.
Instrument table (127 rows, column pairs with a D/N field)#
| column | entries |
|---|---|
| D/N | delay | repeats: 0|0 one tick; 2|0 next command after 3 ticks; 2|3 = (2+1)×(3+1) = 12 ticks |
| AD, SR | $00–$FF |
| Wave | control byte $00–$FF (0 = keep) |
| Frequency | absolute note (8 octaves, hard-coded), relative note (±0–31 from the pattern note), relative frequency (±0–32768, editable — instrument-level vibrato/portamento), absolute frequency (0 = silence) |
| Pulse | fixed 0–2048 (editable) or relative ± |
| Filter cut-off | relative or absolute |
| Resonance | fixed, add or subtract, 0–15 |
| Filter type | high / band / low pass, filter on voice 1 / 2 / 3 |
"Set step to here" marks a column's loop row, "Set no step" removes it; loop count 1–255 or inf. The values behind the relative/absolute menus live in the per-instrument Table of Values (red = used), which can be saved as a library. In the player each table is a header of (length, repeats, step position) followed by (value, delay/repeat index) pairs, stepped by one macro for all eight columns (source: s-sidin13-inside-jitt64).
Player structure (source: s-sidin13-inside-jitt64)#
- Init clears the variables, pre-reads the first pattern per track, sets volume 15. The IRQ routine first copies every shadow register to the SID (all voices together, one frame of latency), then per voice from 3 to 1: Play Pattern (only when the pattern tempo has elapsed), Play Instrument (eight table cores), Play Command (continuous commands, then one-shots), and Play Hard-Restart last so that it overrides the rest.
- Instrument record:
HRbyte (low nibble = ticks, bit 7 = hard restart rather than gate off),AD,SR,CTRL1,CTRL2, then 16 table pointers (AD, SR, Wave, Freq, Pulse, Filter, Res, Type, FixFreq, RelFreq, FixPulse, RelPulse, RelFilter, FixFilter, Delay, Repeat).
Techniques
Chord arpeggio (the 0 3 7 trick) › JITT64 (2010) #
Pattern command 05: the parameter byte packs a speed in bits 7–6 (0–3 ticks between steps), a first offset in bits 5–3 and a second offset in bits 2–0 that is added to the first arpeggio note, not to the root — so $23 (offsets 4 and 3) gives root, +4, +7, a major triad; the player cycles root → note 1 → note 2, a new note in the pattern clears the command, and 00 with bit 0 stops it. Chords of more than three notes, or offsets above 7 semitones, need the instrument's relative-note column instead (sources: s-sidin13-inside-jitt64, s-sidin13-jitt64-tracker).
- matt-gray-player, the 2015 readings: in V4.2 the plex is a pattern command,
$FD ci—cnotes from tablei, so$FD,$36plays table 6 as a three-note chord and$FD,$40the first four entries of table 0 — and it persists until the next instrument or slide; Tognon's empty template offers 16 tables (nine of three notes, four of four, three of two: "95% of arpeggio are based into 3 values") (source: s-sidin14-dominator-player). The earlier Serpent Demo build keeps the arpeggio in instrument byte 5 and lists eight four-note chords with the octave on top —$00,$03,$07,$0C,$00,$04,$07,$0C,$00,$05,$07,$0C,$00,$04,$09,$0C,$00,$03,$08,$0C,$00,$05,$09,$0C,$00,$07,$0A,$0C— and one running downward,$13,$0C,$07,$00(source: s-sidin15-serpent-demo-player).
Filter programming on the SID › JITT64 (2010), two tiny players, and an 8580 trick #
- jitt64: three pattern commands —
0Dfilter type (high/band/low pass and the voices to filter),0Eresonance (0–15),0Fcut-off — and three instrument columns: cut-off relative or absolute (values from the instrument's own table), resonance fixed / add / subtract, and a type entry of six checkboxes (HP, BP, LP, voice 1, 2, 3), each with the D/N delay/repeat field; the player keeps them in shadow registers (shadow_FCH,shadow_RES,shadow_TYPE) written after the three voices. The example "filtered bass drum" moves the cut-off per tick (sources: s-sidin13-jitt64-tracker, s-sidin13-inside-jitt64). - 512 and 256 bytes: Plaster sweeps the cut-off high byte between
$3Fand$FFone step per frame with$D417 = $F1and$D418 = $3F; Back To Basics writes the same counter to$D416that it uses for pulse width, with$D417 = $F4and$D418 = $1F(source: s-sidin12-tiny-sid-2-part-3). - freedom's reason to prefer the 8580: "when you change filter type you don't get an unwanted noise as noticeable as the one you hear in 6581. This makes it possible to change filter type on an instrument while a note is being played and you get more sophisticated sounds" — but "way too open filters"; tsm adds that every 8580 sounds the same, unlike the 6581 (source: s-sidin13-tsm-freedom-interview). hermit in 2008: the 6581 "has good bass-filter behavior for older compositions", the 8580 "is more accurate" (source: s-sidin12-hermit-interview).
- Two 1980s filter policies from the SIDin interviews: matt-gray wrote no filter code until after Dominator — "I only started using them post Dominator on Vendetta … I was well aware of the filter inconsistencies and wanted to avoid using them, but eventually I needed the extra palette of sounds" (source: s-sidin15-matt-gray-interview), and elsewhere: "Initially, like others I didn't use the filters because they often sounded very different on another machine, but eventually I simply had to just to move the sound on" (source: s-vandalism63-matt-gray-interview); scarzix's 6581 had "a very light filter", so when the programmer could not hear CombatZone's leads the game got a filter on/off option in its menu (1989/90) (source: s-sidin14-scarzix-interview).
Hard restart › JITT64 (2010): hard restart as five instrument fields #
Tognon's jitt64 makes every part of the restart an explicit per-instrument setting (sources: s-sidin13-jitt64-tracker, s-sidin13-inside-jitt64):
- Three choices: no action ("all is left to you for preventing ADSR bugs"), Gate off N ticks before the end of the note, or Hard Restart — N ticks before the end the player writes Attack/Decay HR, Sustain/Release HR and First Control HR, and on the last tick before the new note Second Control HR. N is capped by the pattern tempo (timing 3, ticks 4 → 3 effective).
- A per-instrument write order, Wave–ADSR or ADSR–Wave, "for letting you obtain good hardrestart (some one need accurate write timing to be achieved)" — the choice GoatTracker makes globally with its attack-
Fplayroutine. - Two test-bit recipes: (a) HR AD/SR set, first control with the gate released, second control
$09(test + gate), at least 2 ticks, order ADSR–Wave; (b) both HR controls gate-off, one tick, and the instrument table's first row sets ADSR and wave$09before the real waveform, order ADSR–Wave. - In the player the instrument record starts with an
HRbyte (low nibble = ticks, bit 7 = full HR rather than gate off) andAD,SR,CTRL1,CTRL2; the hard-restart block runs last in the interrupt so that it overrides every other command, and the SID is written from shadow registers at the start of the next interrupt so that all voices — and the HR frame — land together; Tognon restructured the routine because variable block timing "can cause some hard-restart of note problem too". A hard-restart pattern command was still on the to-do list.
And a hard restart in 512 bytes: GRG's Tiny Sid Compo II winner Plaster writes SR $01 and AD $0F when a note's remaining duration reaches 1 — the 0F01 value — and starts every control sequence with $09 then $81 (source: s-sidin12-tiny-sid-2-part-3); the same GRG is credited above with the "soft restart".
Pitch slides and tone portamento › JITT64 (2010) #
06 xx / 07 xx add or subtract xx twice per tick ("the amount (*2)") to the 16-bit frequency until 00 (bits 1–2) stops them; 08 xx is a tone portamento entered on the same row as the target note: the player takes the new note's frequency as the target, restores the previous frequency as the start, chooses the direction by a 16-bit compare, moves xx × 2 per tick and snaps to the target when it is passed, then clears the command. Portamento at instrument level uses the frequency column's relative-frequency entries; a note-independent "hifi portamento" was planned (sources: s-sidin13-inside-jitt64, s-sidin13-jitt64-tracker).
Pulse width modulation (PWM) › JITT64 (2010) and the 512/256-byte players #
- jitt64: pattern commands
0A xx/0B xxadd or subtractxxper tick to the 12-bit pulse value (carry into the high byte, no bounds) until00with bits 5–6 stops them; in the instrument table the Pulse column takes fixed values (0–2048, from the instrument's own value table) or relative steps, the D/N field setting how many ticks each step holds and repeats — that is how the example instruments do "a 'vibrato' to the pulse" (Emil's string, a Dane lead, Matt Gray's bass) and "a 'portamento' onto the pulse" (the filtered bass drum, the other Dane lead) (sources: s-sidin13-jitt64-tracker, s-sidin13-inside-jitt64). - The 2005 512-byte entries are three variations on a free-running counter (source: s-sidin08-tiny-sid-512b): Crue Gurl steps the pulse high byte for voices 1 and 3 from
pwmMin = 3topwmMax = 6every four frames, wrapping — with the source's own warning that the step counterpwmSpeed = 3 ; must be (n^2)-1!!!!because the code masks rather than compares; laxity's Twone Five gives each voice a start high byte (pulsehi $08,$01,$04) and adds a per-voice constant (pulseadd $00,$10,$3d) to the low byte at every SID write, so voice 3 sweeps fast and voice 1 not at all; 4mat's Empty makes it an instrument parameter — oneinstaddbyte per instrument ($1c,$0c,$00,$15,$00,$74,$a5) added to the pulse low byte each frame, with the pulse high byte packed into the low nibble ofinstpuls. - In GRG's 512-byte Plaster the pulse low byte of each voice is simply incremented by
$18every frame from high bytes$08,$08,$04— a free-running sweep with no bounds; in Jaymz Julian's 256-byte Back To Basics one counter, incremented every four loops, is written as the pulse high byte of all three voices with the voice offset added, and as the filter cut-off at the same time (source: s-sidin12-tiny-sid-2-part-3).
- matt-gray-player V4.2: the bounce limits became part of the instrument — byte 14 holds them as nibbles
$LH, i.e. between$0Lxxand$0Hxx($8E= the Driller$08–$0E;$33keeps the width "around"$03xx;$35=$0300–$0500); byte 0 is the start width as swapped nibbles ($23→$0320), byte 4 the per-frame step. Tognon's worked example: start$0320, step$A0, limits$18→ 800, 960, 1120 … 2080, then down to$01xxand back (source: s-sidin14-dominator-player).
Vibrato and delayed vibrato › JITT64 (2010) #
Command 09 xy: y + 1 ticks per leg, and each tick adds or subtracts (x + 1) × 16 to the raw 16-bit frequency; the first leg lasts one speed count and the following ones two (plus the reload tick), so it starts with a half period — a triangle on the register value, deeper in cents at low pitch like the matt-gray-player's and unlike Bjerregaard's semitone-proportional one; 00 with bit 4 stops it, and a "hifi vibrato … independent from octave/note" was planned. Instrument-level vibrato goes in the frequency column as relative-frequency entries timed by the D/N delay field (sources: s-sidin13-inside-jitt64, s-sidin13-jitt64-tracker).
- matt-gray-player V4.2 adds a per-note vibrato delay: pattern byte
$F9 nncounts down before the instrument's vibrato (step in row byte 8, length in byte 9, the same down / up / up / down / down triangle as Driller) starts (source: s-sidin14-dominator-player). Gray in 2015: "My vibrato routine was very different to his [Hubbard's] and Martin Galway's" (source: s-sidin15-matt-gray-interview).
Wavetable programming (waveform / arp tables) › Two more starts: Plaster's $09,$81 and JITT64's noise drums #
- GRG's 512-byte Plaster keeps its "wavetables" as three control-register sequences shared by five instruments —
$09,$81,$41,$00,$09,$81,$11,$11,$11,$11,$11,$00,$09,$81,$41,$40,$40,$80— every sound opening with a test-bit frame and a noise frame, and a parallel list supplying fixed high-frequency bytes ($8B,$89,$86,$84,$8E,$8C,$8A) for the drum steps (source: s-sidin12-tiny-sid-2-part-3). - jitt64's wave column is one of eight per-instrument columns with a delay/repeat field per row (0 = keep the waveform); its example bank builds bass drums and Matt Gray's snares from "fixed notes" in the frequency column and noise in the wave column, a second bass drum with "more low pitch notes and less noise", and a sea effect from noise with a very long attack/decay and no sustain (source: s-sidin13-jitt64-tracker).