Matt Gray's Dominator subtune 6 source (PLAYER V4.2, 1987) and the Reformation driver competition

author Matt Gray (source, CC BY-NC 4.0); competition article by Matt Gray on Remix64; chipmusic.org announcement by c64audio (Chris Abbott)
date 2014-11-26
article the zip (dom6-public.asm 1033 lines, 64tass.exe, readme.txt, matt-gray-dom6-public-source.txt), the Remix64 article 'Matt Gray Reformation Chiptune Driver Competition' (dated '26 November 2015' on the page; announced 2014-11-26) and the chipmusic.org thread of 2014-11-26
created 2026-08-30 · updated 2026-08-30

The only C64 driver in the wiki published by its author: matt-gray's own 6502 source for one dominator subtune, released under Creative Commons on 2014-11-26 as a gift to SID composers and the basis of a composing competition for his Reformation Kickstarter. It is the same engine family Tognon documented from Driller (s-sidin02-matt-gray-driller), three years and two version numbers on, and almost uncommented.

Key claims#

The release

  • "While we were retrieving the driver from my work disks, I thought it would be cool to release the source to one of my drivers so that SID composers would have a go at composing in it." The £40 000 Kickstarter stretch goal committed him to "six new SIDs in my old Dominator driver: imaginary sequels to my old SIDs, such as Dominator 2 and Last Ninja 2 – The Lost Level" (c64audio adds "a Driller prequel").
  • Licence: "Creative Commons licence (remix, attribution, non-commercial)"; the source header says CC Attribution-NonCommercial 4.0. Rules: entries "written in my driver and submitted as ASCII source code which will compile and run in the 64TASS cross-assembler"; modifications allowed if "largely based on my work"; closing date 2015-03-31; top ten in a digital download, the winner a VIP invitation to the launch party.
  • His framing of the era: "Myself, Martin Galway, Rob Hubbard, Fred Gray, Ben Daglish and Martin Galway all typed their tunes directly into their assembler. Now you can do the same!" (sid-player-routine). c64audio: "If you wondered how composers such as Matt, Rob Hubbard, Fred Gray, etc, did their original tunes, then this will give you some good insight."

The source (dom6-public.asm, 1033 lines, 16 comment lines)

  • Header: ;PLAYER V4.2 / ;(C)1987 / ;MATT GRAY; a BASIC autostart stub, the player assembled at $C000 (STARTADD), an IRQ installer (SETIRQ, raster line $82, calls DRIVER once a frame) and a '(C)1988 MG' string.
  • Note constants C0 … B7 = 1 … 96 let bars be typed as note names; NTL/NTH are the 96-entry frequency tables.
  • DRIVER runs MAIN for X = 0, 7, 14 (the three voices); TN holds the tune number ($AB while playing) and FADE a fade-out; TDATA/VOICE1L…VOICE3H select the sequence lists per tune (TUNE1–3, OVER1–3, FIN1–3).
  • Sequences (TUNE1: .BYTE 5,5,7,7,7,7,14,14,…,$FF) are lists of bar numbers ended by $FF; OVER1: .BYTE 46,$FE,0,0 shows $FE as a stop, as in Driller. Bar pointers in BARLO/BARHI (T0–T56).
  • Bars are byte streams of commands and note names, e.g. T1: $FA,$04, $71,D2,D2, $70,F2,D2,F2, $71,G2,G2, $70,G2, $FF and T6: $FA,$02, $EF, $FC,$0A,AS3, $FB,$0A,AS4, $FF. Readable from the code: $FA nn instrument (NEWVOICE), $FB/$FC slide down/up with a value (SLIDE, SLIDEUP), $FD ci chord plex (AGAIN3 CMP #$FD → PLEXSETUP: count nibble c, table nibble inot a duration as in Driller), $F9 nn vibrato delay (VIBDELAY), $70–$F8 note duration = byte − $70 (NOTEDUR CMP #$70 / SBC #$70), 0 a rest/gate-off, $FF end of bar. So $71,D2,D2 is two one-frame D-2s, $EF = 127 frames, and the bytes $AF, $DF, $EE, $97, $E7 are durations 63, 111, 126, 39, 119 — settled on 2026-08-30 against the source and SIDin #14's commented listing (s-sidin14-dominator-player).
  • Instruments: two tables of 8-byte rows, VDATA and VDATA2 (19 rows each; e.g. VDATA2 row $90,$02,$81,$00,$00,$00,$35,$00). The code tests VDATA+7 AND #4 for the "IMPLEX" first-frames control byte from VDATA2+2, and AND #$10 for HAT, which writes $50 to the frequency high byte and $81 (noise + gate) to the control register — a built-in hi-hat (instrument-tables, wavetable-programming).
  • PLEX — the chord-plex Gray describes in interviews: PLEXLH points to P0 … P6, three-byte semitone lists $07,$03,$00, $09,$05,$00, $08,$03,$00, $18,$0C,$00, $07,$05,$00, $07,$04,$00, $08,$05,$00; PLEXADD adds the current entry to the note (chord-arpeggio).
  • Drum table: DT: $81,$30, $11,$02, $41,$04, $80,$30, $80,$15, $80,$20, $80,$10, $80,$20, $80,$20, $80,$10, $80,$20, $FF and BT: $81,$30, $41,$03, $40,$03, $80,$20, $80,$10, $80,$20, $80,$10, $80,$20, $FF — pairs read by DRUMMOD2; a pair with bit 7 set is written straight to the control register and the frequency high byte ($81,$30 = noise at a high pitch), a pair without it stores a waveform and subtracts the second byte from the note's frequency high byte, so a drum is a frame list of waveform/pitch steps ending in $FF (wavetable-programming, instrument-design).
  • Vibrato has delay, speed and depth state (VIBDELAY, VIBSTEP, VIBTIME, VIBD, VIBDIR), pulse modulation has direction and limits (PMODDIR, PUCH/PUCL), and FADE/VOLTIME implement the fade-out (vibrato, pulse-width-modulation).

Practical takeaways#

  • Composing "in the driver" means editing these tables: a bar is a list like $FA,$0B,$FD,$33,$71,F4,D4,A3,D4,$FF; a drum a list of (waveform, pitch) frames; a chord a three-byte PLEX entry. It is the pre-tracker workflow the wiki's tracker pages abstract away.
  • The 64tass toolchain and a BASIC autostart make the whole thing runnable in VICE with one command — the readme's compile_and_run.bat.

Relevance to the wiki#

Primary source for matt-gray-player (V4.2 tables and command bytes), dominator, and the "imaginary sequels" story on matt-gray; concrete drum/chord data for wavetable-programming and chord-arpeggio.

Pages touched#

matt-gray-player · matt-gray · dominator · driller · last-ninja-2 · sid-player-routine · instrument-tables · wavetable-programming · chord-arpeggio · vibrato · pulse-width-modulation · instrument-design · tracker

source file wiki/summaries/s-matt-gray-dominator-source.md · graph