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):
| byte | meaning |
|---|---|
$01–$60 | note number (V4.2 source uses names C0 … B7 = 1 … 96) |
$00 | gate off for the previous note → release (hard-restart) |
$FA nn | instrument nn |
$FB mm / $FC pp | slide down / up by that amount per frame (pitch-slide-and-portamento) |
$FD kk | Driller: 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) |
$FF | end of pattern |
V4.2 only: $F9 nn | vibrato delay (label VIBDELAY) |
V4.2 only: $70–$F8 | note 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 1 | table 2 |
|---|---|
0 pulse width as nibbles xxyy → lo xx00, hi 00yy | 0 vibrato step |
| 1 control register (waveform + gate) | 1 vibrato length |
| 2 attack/decay | 2 control register for the first two frames (drum switch) |
| 3 sustain/release | 3 portamento value |
4 pulse inc/dec step; hi byte bounces between $08 and $0E | 4 portamento flag: 00 none, 01 −lo, 02 +lo, 03 −hi, else +hi |
5 arpeggio xxyy: xx notes, table yy | 5 length of the effect-1 cycle |
| 6 control register written at the end of the note, same frame as the next | 6–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 tablesP0–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$50to 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
$08xxand$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).