Matt Gray's Dominator subtune 6 source (PLAYER V4.2, 1987) and the Reformation driver competition
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, callsDRIVERonce a frame) and a'(C)1988 MG'string. - Note constants
C0 … B7 = 1 … 96let bars be typed as note names;NTL/NTHare the 96-entry frequency tables. DRIVERrunsMAINfor X = 0, 7, 14 (the three voices);TNholds the tune number ($ABwhile playing) andFADEa fade-out;TDATA/VOICE1L…VOICE3Hselect 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,0shows$FEas a stop, as in Driller. Bar pointers inBARLO/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, $FFandT6: $FA,$02, $EF, $FC,$0A,AS3, $FB,$0A,AS4, $FF. Readable from the code:$FA nninstrument (NEWVOICE),$FB/$FCslide down/up with a value (SLIDE,SLIDEUP),$FD cichord plex (AGAIN3 CMP #$FD → PLEXSETUP: count nibblec, table nibblei— not a duration as in Driller),$F9 nnvibrato delay (VIBDELAY),$70–$F8note duration = byte −$70(NOTEDUR CMP #$70 / SBC #$70),0a rest/gate-off,$FFend of bar. So$71,D2,D2is two one-frame D-2s,$EF= 127 frames, and the bytes$AF,$DF,$EE,$97,$E7are 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,
VDATAandVDATA2(19 rows each; e.g.VDATA2row$90,$02,$81,$00,$00,$00,$35,$00). The code testsVDATA+7 AND #4for the "IMPLEX" first-frames control byte fromVDATA2+2, andAND #$10forHAT, which writes$50to 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:
PLEXLHpoints toP0 … 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;PLEXADDadds 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, $FFandBT: $81,$30, $41,$03, $40,$03, $80,$20, $80,$10, $80,$20, $80,$10, $80,$20, $FF— pairs read byDRUMMOD2; 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), andFADE/VOLTIMEimplement 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