Matt Gray's player (Driller / Dominator engine) cheat sheet

From Matt Gray's player (Driller / Dominator engine) · print · built 2026-08-31

Reference

Cheat sheet#

Pattern bytes (Driller, 1987; the same in V4.2 with additions):

bytemeaning
$01–$60note number (V4.2 source uses names C0 … B7 = 1 … 96)
$00gate off for the previous note → release (hard-restart)
$FA nninstrument nn
$FB mm / $FC ppslide down / up by that amount per frame (pitch-slide-and-portamento)
$FD kkDriller: note duration kk. V4.2: $FD ci is the chord-plex command (count nibble c, table nibble i; AGAIN3 CMP #$FD → PLEXSETUP in Gray's source) — a Driller-style duration byte would be read as an arpeggio (sources: s-sidin02-matt-gray-driller, s-sidin14-dominator-player)
$FFend of pattern
V4.2 only: $F9 nnvibrato delay (label VIBDELAY)
V4.2 only: $70–$F8note duration = byte − $70 (NOTEDUR CMP #$70 / SBC #$70): $70 = 0, $71 = 1 … $EF = 127, $F8 = 136 frames — e.g. $71,D2,D2,$70,F2; the bytes $AF/$DF/$EF/$EE/$97/$E7 seen in the Dominator bars are durations 63/111/127/126/39/119 (source: s-sidin14-dominator-player)

Example (Driller): $FA,$0C / $FD,$01 / $31,$3D,$49,$3D … = instrument $0C, very short notes a 12-semitone stack apart (source: s-sidin02-matt-gray-driller). Example (Dominator): T1: $FA,$04, $71,D2,D2, $70,F2,D2,F2, $71,G2,G2, $70,G2, $FF (source: s-matt-gray-dominator-source).

Instruments — two 8-byte rows per instrument (Driller instr1/instr2, Dominator VDATA/VDATA2; source: s-sidin02-matt-gray-driller):

table 1table 2
0 pulse width as nibbles xxyy → lo xx00, hi 00yy0 vibrato step
1 control register (waveform + gate)1 vibrato length
2 attack/decay2 control register for the first two frames (drum switch)
3 sustain/release3 portamento value
4 pulse inc/dec step; hi byte bounces between $08 and $0E4 portamento flag: 00 none, 01 −lo, 02 +lo, 03 −hi, else +hi
5 arpeggio xxyy: xx notes, table yy5 length of the effect-1 cycle
6 control register written at the end of the note, same frame as the next6–7 unused
7 effect bits: 1 freq/noise effect, 2 re-set pulse each note, 4 waveform switch (drums)
  • Arpeggio tables are short semitone lists ($00,$08,$12; $00,$08; $00,$04,$08) and the instrument says how many entries to use, so $30 = table 0 with 3 notes, $22 = table 2 with 2 (source: s-sidin02-matt-gray-driller). V4.2 adds the PLEX chord tables P0–P6 = $07,$03,$00, $09,$05,$00, $08,$03,$00, $18,$0C,$00, $07,$05,$00, $07,$04,$00, $08,$05,$00 — the "note or chord plex" (chord-arpeggio; source: s-matt-gray-dominator-source).
  • Vibrato: subtract the step for L frames, add it for 2L, subtract for 2L … — a triangle on the frequency value, which is why Gray says "the higher the notes you played, the less vibrato you got, and the lower you went, the deeper it got" (vibrato; sources: s-sidin02-matt-gray-driller, s-c64com-matt-gray-interview).
  • Drums: effect bit 4 plays table-2's control register for two frames, then the instrument's own; V4.2 adds a drum table of (control, pitch) frame pairs — DT: $81,$30, $11,$02, $41,$04, $80,$30, $80,$15 … $FF — and a hi-hat routine that writes $50 to the frequency high byte and $81 (noise+gate) to the control register (wavetable-programming; sources: s-sidin02-matt-gray-driller, s-matt-gray-dominator-source).
  • Pulse: a per-instrument step and a bounce between $08xx and $0Exx, i.e. pulse width 2048–3584 — Gray's "pulse width mod" (pulse-width-modulation; source: s-sidin02-matt-gray-driller).
  • Gray: "I was always adding-in modifiers and routines to produce better-sounding drums, but I always kept a bank of sounds that could be modified from project to project" (source: s-c64com-matt-gray-interview).