MUSICFILE — the Maniacs of Noise driver
The C64 music driver charles-deenen wrote in 1987 for maniacs-of-noise — "Deenen programmed a music driver ('Musicfile') and a sound effects driver in Turbo Ass" — into which jeroen-tel, Marcel Donné and reyn-ouwehand "arranged by typing hexadecimal numbers and labels into the driver's source code". Tel "used the Maniacs Of Noise driver that I wrote for several years. He only started to write his own after I left to the states" (sources: s-vgmpf-maniacs-of-noise, s-charles-deenen-interviews). The Cybernoid II source, headed MUSICFILE V01-07-1988 / Programmed by Charles Deenen / The most advanced music player ever written for the commodore 64!, is public on GitHub (source: s-realdmx-sid-players).
Facts#
- Tel's first account: a BASIC player of his own, then "me and Charles designed our first MoN routine" after Deenen saw him arrange a song in about ten minutes in soundmonitor (sources: s-sidmusic-jeroen-tel-interviews, s-vgmpf-maniacs-of-noise).
- The editor was the assembler: "The editor for both of us was easy: turbo-assembler"; the behind the notes videos show the Turbo Assembler source of player and note tables next to the tune (s-cybernoid-behind-the-notes).
- Deenen sent Johannes Bjerregaard "a disk with Turbo Ass, his music driver, and some 4-bit samples", but Bjerregaard and Laxity kept their own drivers; Markus Schneider was resented "for using his music driver without permission in 1988"; the driver "was officially converted to the [ZX Spectrum] 128K" (source: s-vgmpf-maniacs-of-noise). A forum claim says Future Composer "is made from a ripped MON player" (unverified; source: s-cybernoid-behind-the-notes).
- Deenen: about 2 days per tune, longest 7 minutes, £100–1000 per game (sources: s-charles-deenen-interviews, s-vgmpf-maniacs-of-noise).
Cheat sheet#
From the Cybernoid II source (MUSICFILE V01-07-1988), all via s-realdmx-sid-players; the names are Deenen's Dutch/English labels, the semantics read from the code where noted.
- Tune-wide constants at the top of the file:
volume = $0f,vibtotzover = $30,pulserunspeed = $63,dubvoice = $0c(double voice),noisehitone = $fa,pulsearpwait = $01,gitarwait = $0f,spacelength = $00,spacewait = $60,wavearpwait = 2. - Routines (the driver's feature list): Tonearpeggio · Vibrato · Tone glide · pulse handling ("pulsegedoe") · Wavearpeggio · Pulsearpeggio · Tonesweep up · filter handling ("Filterklooi") · Strangefilter · Pulserun · Double voices · Space effect · Drumroutine · noisetik.
- Song → sequences → steps:
snelheid(speed) per song;seqtabelgives three sequences per song (seq0a–ctitle,seq1a–cgame over); a sequence is a list of step-table numbers below$40with prefix bytes — verified in the code:$80–$fd= transpose,toneadd = byte & $1f, added to every note and glide target of the following steps, upward only (0–31 semitones;$84,$01= +4 then step 1,$8c= +12);$40–$5f= repeat the next step& $3fmore times;$60–$7f= an instrument-number offset& $0f;$fe= end;$ff= restart the sequence without resetting the transpose (source: s-realdmx-deenen-test-tunes); 33 step tablesst00–st20hold the notes (orderlist). - Instruments: 8-byte rows with the columns
pulsehi, waveform, attdec, susrel, filcount, fx1, fx2, fx3(instrument-tables, instrument-design):
| name (Deenen's label) | pulsehi | waveform | attdec | susrel | filcount | fx1 | fx2 | fx3 |
|---|---|---|---|---|---|---|---|---|
| leeg (empty) | $00 | $00 | $00 | $00 | $00 | $00 | $00 | $00 |
| bass | $05 | $41 | $08 | $89 | $00 | $53 | $64 | $80 |
| bassdrm | $08 | $11 | $00 | $a8 | $f0 | $00 | $00 | $10 |
| snardrm | $08 | $11 | $00 | $a9 | $f0 | $01 | $00 | $10 |
| arp+filt | $04 | $21 | $00 | $c8 | $01 | $00 | $81 | $85 |
| melo-1 | $0c | $41 | $00 | $b8 | $00 | $52 | $22 | $01 |
| melo-2 | $06 | $41 | $00 | $e8 | $02 | $53 | $74 | $01 |
| $17zooi | $00 | $17 | $00 | $88 | $f0 | $00 | $00 | $80 |
| arp-filt | $04 | $21 | $00 | $88 | $00 | $00 | $81 | $84 |
| $55 | $00 | $55 | $00 | $b8 | $00 | $00 | $00 | $20 |
| bassfilt | $03 | $41 | $07 | $69 | $00 | $00 | $51 | $80 |
| melo-3 | $05 | $41 | $00 | $b8 | $03 | $53 | $83 | $01 |
| tingel | $01 | $41 | $00 | $89 | $f0 | $00 | $00 | $02 |
| omhoogt (upwards) | $06 | $41 | $00 | $c8 | $08 | $00 | $41 | $00 |
| $81lang | $07 | $81 | $08 | $fd | $f0 | $00 | $00 | $00 |
| solo | $05 | $41 | $00 | $b8 | $03 | $c5 | $24 | $01 |
| melo-1 (2nd) | $0c | $41 | $00 | $b8 | $00 | $c6 | $22 | $00 |
| basso | $07 | $41 | $08 | $89 | $00 | $00 | $31 | $00 |
| solo2 | $05 | $41 | $00 | $a7 | $00 | $c5 | $22 | $00 |
- Per-instrument start ("noisetik",
fx3bit 7):starttabel($81,$81,$81,$81, $41,$11,$11,$81, $41,$81,$81,$81) andstartlen($02 … $05, $06) — verified in the code of Deenen's own test tune: while the note's frame counter is belowstartlen, the waveform written is thestarttabelvalue; a value of$7for more forces the frequency high byte tonoisehitone = $faand the waveform to$81. Effects skip the note's first frame, sostartlen = $02is exactly one frame of high noise on the second frame of the note, and$41/$11with$05/$06swap in that waveform at the note's own pitch for four or five frames; for two frames afterwards pitch and waveform are restored explicitly (source: s-realdmx-deenen-test-tunes; hard-restart, wavetable-programming).vibtabwaitholds vibrato delays per instrument ($0c,$18). - Drums:
drumtabel→dwa(waveform per frame, length byte first:$0b; $81,$81,$20,$20,$10,$10,$10,$10,$10,$10,$10,$10) anddto(pitch per frame:$34,$0a,$08,$06,$04,$05,$06,$05,$04,$05,$06,$05) — two frames of noise, then sawtooth and triangle sliding down (wavetable-programming). - Chords:
arp0–arp7= length byte + semitone offsets:$02,$00,$03,$07(minor),$02,$00,$04,$07(major),$02,$00,$05,$08,$02,$00,$05,$09,$02,$00,$03,$08,$02,$00,$04,$09,$02,$00,$03,$06;arp6 = $17+ a 24-step descending run$e9 … $00;wavearp $80,$10,$80,$10alternates noise and triangle (chord-arpeggio). - Filter:
filterbytes→ four 10-byte programsfb0–fb3, e.g.$a0,$fe,$02,$ff,$80, fp0,$02,$22,$42,$62wherefp0 = $10 + volumeis the$D418byte (mode nibble + volume);strafilterandaftrekspeedfor the "strange filter" (filter-programming). - Pulse:
pulsetabel, four 8-byte programs such as$04,$0c,$02,$30, $04,$30,$06,$30(pulse-width-modulation). - The driver shadows the SID registers per voice (
d400 … d403,stod404) and keeps glide, vibrato, arpeggio, pulse-run and filter counters in 3-byte tables — the state a sid-player-routine needs.
Other builds and the second MoN player#
Four more MoN-family sources in the realdmx collection show the driver at other moments (sources: s-realdmx-deenen-test-tunes, s-realdmx-ouwehand-mon-tunes):
- Deenen's Test Tune — the same code base without the
MUSICFILE V01-07-1988line: a voice-enable mask (numvoice = 7), a per-song note-cut table, a three-state stop byte, a 95-entry note table (the Cybernoid II file's 87 entries are its tail),dubvoice = $10; novibtotzoverorpulserunspeedyet. Probably the earlier state (dead variables, a ";]aha! a samplerouty]" banner with no code, a commented-out Turbo Assembler harness withdec $d020 … inc $d020around the play call as a rastertime meter). Its six instruments:bassdrum $08,$11,$08,$08,$f0,$00,$00,$10,snaredrum $08,$11,$08,$e8,$f0,$01,$00,$10,bass $02,$41,$08,$a7,$01,$43,$63,$81,lit arp $06,$41,$08,$08,$f0,$00,$11,$84. Column meanings read from the routines:filcounthigh nibble = gate-off in units of 4 ticks before the note ends, bit 3 = double voice, bits 0–2 = filter program;fx3bits$01filter,$02pulserun,$04tone arpeggio,$08pulse arpeggio,$10drum,$20sweep,$40wave arpeggio,$80noisetik. - Armada (1989) — "MUSICFILE V01-07-1988 … Scoop Designs L.T.D. in 1989 / Special version for :Reyn Ouwehand", with 25 named instruments (
bass $05,$41,$00,$ab,$00,$53,$69,$00,lead $03,$41,$00,$77,$00,$53,$12,$80,big-git $07,$41,$00,$a6,$00,$42,$56,$80,bass met fil $02,$41,$00,$a9,$02,$42,$82,$01), seven tunes, and a text string "music by reyn ouwehand from scoop designs" in the code. Pulse program 1 andarp0–arp5are byte-identical to Cybernoid II's — the tables travelled with the driver (reyn-ouwehand). - Dutch Breeze (1990 MON) — not this code but a rewrite by the same hand(s) (identical labels
frutsmaarraak,gwb,nohiset,starttabel): intro + loop sequence records with a global transpose, legato ($fb), explicit rests, a fade command, multi-segment filter (fi1–fi7) and bounded pulse (p1–p8) programs, looping drum pitch + wave tables, a per-instrument detune flag replacing the double voice; the wave/pulse arpeggios, tone sweep, strange filter and pulserun are gone. Who rewrote it — Deenen or Ouwehand — the file does not say. - Deenen's Test Tune 2 — "Maniacs of Noise music player / (C) Scoop designs ltd. / m.o.n.": a different player with a statement language in the source (
dur+n,snd+n,trs+n,rep+n,pause,glide), 1-based notes, a per-instrumentgateonlength, a sine-table vibrato, chords as note-name lists (arp2 !by g0,c0,e0,arpend) and every register rewritten each frame. Nothing of MUSICFILE's labels survives in it. - johannes-bjerregaard's two 1989 sources sit in the same
_MONfolder but are his own driver; the James Bond file's header is a MoN job sheet ("30 SECS OF JAMES BOND TITLE TUNE INCLUDING A DEMO OF THE MANIACS OF NOISE MUSIC STYLE") — see bjerregaard-player (source: s-realdmx-bjerregaard-player).
Lineage and names#
- SIDwave on its design: "a clone of Rob Hubbard's players … they all have the same structure. Whatever you do, if you try to code the most efficient way and the player will be able to do all effects of the SID, what you end up with is more or less the same as the Hubbard/MON way to do things"; the scene's future-composer (Finnish Gold, 1988) is "the first TMC/MON player" with an editor bolted on (source: s-recollection-brief-history-of-sid).
- SIDId:
MoN/Deenenwith tune-specific variants(MoN/Cyb2)(Cybernoid II),(MoN/TTWII),(MoN/JTS),(MoN/RWE),(MoN/Bantam),(MoN/Deenen_Digi);MoN/FutureComposer— "Charles Deenen made the player & Juha Granberg (FCS) made the editor", "made for the player of /MUSICIANS/T/Tel_Jeroen/Noisy_Pillars_tune_1.sid";Noise-Mon_V2(Piotr Pisula, 1992) is a separate editor (source: s-sidid-player-list). - The driver a game ships with is the driver its music must be in: when Ninja Remix needed new intro music, the whole last-ninja-2 score was redone in the MoN driver rather than mixing two players (source: s-remix64-ninja-remix).
What it had to fit into#
Deenen's 2010 numbers are the driver's design constraints: "Some companies only gave us six to eight kilobyte of memory for music and sound effects. Those naturally became a challenge" — for a fee of $200–1000 and two to six days of work per game, sometimes "only … two days to compose the music and do the sound effects". Music, effects, tables and the player itself all came out of that budget, which is why the tables are terse and the note data is byte code (sid-player-routine; source: s-c64com-charles-deenen-interview).
The driver in the 1989 press#
- C=Lehti 4/89 (written before 1989-05-19): Deenen "constantly develops his music routines" for new sounds; the current build is "version 78" as the OCR reads; the newest version has "complex sound-bending routines" and "a complete two-channel digitized-data play routine" (chip-samples) — a digi capability none of the surviving 1988 sources shows; his stated design goal: speed as the starting point, "as fast as possible without compromising quality at all"; the inspiration credit goes to johannes-bjerregaard (source: s-c-lehti-maniacs-of-noise).
- The same article on workflow: composing "happens entirely without an editor" — by early 1989 the notes were typed as numbers on Tel's home PC and cross-assembled for the C64, beside the native turbo-assembler route (source: s-c-lehti-maniacs-of-noise). Tel's 2015 wording of authorship: Deenen "wrote a simple music routine and together we expanded it to meet my music (effects) needs" (source: s-gamesart-jeroen-tel-interview) — Deenen's own "the driver that I wrote" stands above.
Related#
maniacs-of-noise · charles-deenen · jeroen-tel · cybernoid-ii · cybernoid · turbo-assembler · sid-player-routine · matt-gray-player · soundmonitor · instrument-tables
Sources#
s-realdmx-sid-players · s-vgmpf-maniacs-of-noise · s-charles-deenen-interviews · s-cybernoid-behind-the-notes · s-sidmusic-jeroen-tel-interviews · s-hugi38-interview-jeroen-tel · s-recollection-brief-history-of-sid · s-sidid-player-list · s-remix64-ninja-remix · s-realdmx-deenen-test-tunes · s-realdmx-ouwehand-mon-tunes · s-realdmx-bjerregaard-player · s-c-lehti-maniacs-of-noise · s-gamesart-jeroen-tel-interview · s-c64com-charles-deenen-interview