realdmx: Charles Deenen's two test tunes — an undated MUSICFILE build and the 'Scoop designs' Maniacs of Noise player

author Charles Deenen (both players and tunes; original Turbo Assembler sources); ACME conversion by dmx87
date 2023-06-24
article Deenen_Charles_Test_Tune.asm (1985 lines; dmx87: 'Original sourcecode from 1988 / By Charles Deenen'; the MUSICFILE banner without a version line) and Deenen_Charles_Test_Tune2.asm (1293 lines; 'A very short testing tune'; banner 'Maniacs of Noise music player / (C) Scoop designs ltd. / m.o.n.'). Read next to Tel_Jeroen_Cybernoid2.asm (MUSICFILE V01-07-1988). The date is the repository's last push
created 2026-08-30 · updated 2026-08-31

Two of charles-deenen's own sources in the realdmx collection (s-realdmx-sid-players). Test Tune is the musicfile code base — the same routines, labels and table formats as the Cybernoid II file, in a slightly different state — with a six-instrument demo. Test Tune 2 is another player under the banner "Maniacs of Noise music player / (C) Scoop designs ltd. / m.o.n.": 1-based notes, a dur/snd/trs statement language, per-instrument gate length, a sine-table vibrato, no shadow registers. The first file also settles two readings of MUSICFILE the wiki had marked unverified: what starttabel/startlen do, and what the ≥ $80 bytes in a sequence mean.

Key claims#

Test Tune (MUSICFILE)

  • Banner: "Programmed by Charles Deenen / the most advanced music player / ever written for the commodore 64!" — no MUSICFILE Vdd-mm-yyyy line, so the only date is dmx87's "1988". Entry points jmp song ($1000), jmp songout ($1003), jmp playirq ($1006). A commented-out Turbo Assembler test harness (raster IRQ, dec $d020 … inc $d020 around jsr playirq as a rastertime meter, SPACE to exit, jmp $9000) and a ;]aha! a samplerouty] banner with no code after it.
  • Constants: volume = $0f, songetje = 0, numvoice = 7, dubvoice = $10, noisehitone = $fa, pulsearpwait = $01, gitarwait = $0f, spacelength = $00, spacewait = $60, wavearpwait = 2. Speed snelheid !by 2 = a tick every 3 frames.
  • Differences from the Cybernoid II build (read side by side; the same 943 instruction lines in each): this file has a voice mask (numvoice, playit !by 1,2,4), a per-song note-cut table nootafbreek, a three-state testbyte (";if 1-> music stop"), an unused loadpoint, the song number in X; Cybernoid II adds vibtotzover (a cap on the growing vibrato) and pulserunspeed with a wrap, a $d418 restore in the filter code, finer glide units and a range-compare parser. Its 95-entry note table (written in decimal) contains Cybernoid II's 87-entry table byte for byte from index 8 — the later file dropped the eight lowest notes. The evidence leans to this being the earlier state, but neither file dates the player.
  • Instruments (the same eight columns): leeg $00 ×8; 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; bass+vib $02,$41,$08,$a7,$01,$50,$63,$81. Column semantics read from the routines: pulsehi low nibble = initial $d403, bit 4 = note-cut enable; filcount high nibble = gate-off time in units of 4 ticks before the note ends, bit 3 = double voice, bits 0–2 = filter program; fx1 = vibrato (depth shift, width, bit 7 growing) or, for drums, the drum number; fx2 bits 0–2 pulse program, bit 3 strange filter, bits 4–7 pulse speed afterwards; fx3 bits = filter $01, pulserun $02, tone arpeggio $04, pulse arpeggio $08, drum $10, sweep $20, wave arpeggio $40, noisetik $80 (instrument-tables).
  • Drums: dwa0 $0b; $81,$41,$40,$40, $80,$10,$80,$10, $80,$10,$80,$10 over dto0 $2d,$08,$06,$04, $2d,$10,$2d,$02, $2d,$02,$2d,$02 — noise then pulse, then alternating noise/triangle at two pitches (a snare with a hi-hat tail); dwa2 $81,$41,$40 … $10 over dto2 $30,$09,$07,$05,$03,$02,$01,$01,$01,$00 … (a kick). Effects never run on the note-start frame, which is why a drum table's leading length byte is never read as a waveform (wavetable-programming). Filter programs fb0 $ff,$e0,$e0,$e0,$f0, fp0,$02,$fd,$fe,$fffb5; pulse programs $06,$0a,$02,$1c,$04,$1c,$06,$1c etc.; arpeggios $02,$00,$05,$08, $02,$00,$05,$09, $02,$00,$04,$09, $02,$00,$02,$07, $02,$00,$04,$08.
  • Sequence excerpt with Deenen's own note: seq0a !by $8c,$01,$01 / $8c,$02,$02 / $ff — "; FF to REPEAT, or FE to END."

The two unverified readings, settled by the code

  • starttabel/startlen (the noti, "noisetik" routine, active for instruments with fx3 bit 7): while the frame counter of the note is below startlen[instrument], the waveform written is starttabel[instrument]; if that value is $7f or higher, the frequency high byte is forced to noisehitone = $fa and the waveform to $81 (noise + gate). Because effects skip the note's first frame, startlen = $02 means exactly one frame — the second of the note — of high-pitched noise; for the next two frames pitch and waveform are explicitly restored. So this file's rows ($81/$02 everywhere) put a one-frame noise click on the bass and arpeggio instruments, and Cybernoid II's $41/$11 rows swap in a different waveform at the note's own pitch for startlen − 1 frames — a first-frame waveform in the GoatTracker sense, but starting on frame 2 (hard-restart, wavetable-programming).
  • Sequence bytes ≥ $80 (the "add tone" routine): $80–$fd is a transpose, toneadd = byte & $1f (bits 7–5 ignored), added to every note byte and glide target of the following steps on that voice — semitones up only, 0–31, no negative transpose ($8c = +12, $84 = +4, $80 = 0). $40–$5f = repeat the next step & $3f more times, $60–$7f = an instrument-number offset & $0f added to the step's $Cx instruments, $fe = end, $ff = restart the sequence (without resetting the transpose) (orderlist).
  • Step bytes, for completeness: $f0,note = note without retrigger (legato); $f1,v = write v to $d417 (filter routing and resonance as a step event); $Ex,delay,note,target = glide; $C0–$DF instrument; $70–$7F arpeggio table; $80–$BF length & $3f − 1 ticks (a second such byte adds); < $60 note; $ff end of step. Also read from the code: the vibrato delta is the distance to the next semitone in the frequency table shifted right by the depth nibble; the "space effect" is compiled out with and #0 in both builds.

Test Tune 2 — the "Scoop designs" player

  • Banner "Maniacs of Noise music player / (C) Scoop designs ltd. / m.o.n."; no date or version. Entry restart ($1003), plloop ($1006), stopmus ($1009); three bytes at $1000–$1002 (noot, transp, sound) are a live-play hook that sounds a poked note on voice 3.
  • A statement language in the source: end = $00, drend = $ff, wfend = $08, rep = $bf, dur = $80, snd = $e0, vol = $ef, trs = $7f, drum = $80, arp = $00, larp = $40, drump = $e0, arpp = $c0, pause = $7c, filtoff = $7d, filter = $7e, glide = $7f, stop = $7b; notes 1-based (c0 = 1 … b7 = 96) with a commented duration mnemonic list (s = dur.1 … wwwwww = dur.96). Track bytes: block number, trs+n transpose (& $3f), rep+n repeat, vol+n volume, $ff end; block bytes: dur+n duration in ticks, snd+n instrument, stop, pause, filter cutoff,fiwa,length, glide speed,note,target, note, end. Example: block00 !by snd + 4 / dur + 9,c4,c4,dur + 6,c4 / snd + 5 / dur + 9,c4,c4,dur + 6,c4 / end; a rule in the comments: "voor een 'end'-byte moet altijd een noot,pause of hold staan!!!" (before an end byte there must always be a note, pause or hold).
  • Instrument = waveform1, waveform2, attackdecay, sustainrelease, gateonlength, pulsefx, arpdrum, vibratofx — the gate length is an instrument property (after gateonlength ticks waveform2 replaces waveform1), not the note's; rows $41,$40,$03,$fc, 2,1,niks,1 (pulse, 3 ticks gate, pulse program 2, vibrato 1), $41,$40,$32,$ec, 3,1,arp + 6,3 (a chord instrument), $00,$00,$00,$f5, 0,6,drum + 3,niks (a drum: waveform from the drum's own list). Pulse programs ;pulse:slidespeed,bottom,top,speed,loop+ ($02,$10,$30,$04,$f4), vibrato programs ;vibrato: delay,length,amplitude,speed (2,255,$fe,$0a) on a 128-byte sine table, arpeggios as note names (arp2 !by g0,c0,e0,arpend, arp6 !by c0,f0,a0,arpend), drums as pitch lists (drum4 !by $50,$0a,$08,$06,$05,$04,$03,$02,$02,$01,$00,$00,drend) with waveform lists ending in wfend = $08 (the test bit as a mute), filtpasst = $10 ; $10/$20/$40:lo/band/hi, filter priority "stem 1 voor 2 voor 3" (voice 1 before 2 before 3). Every SID register is rewritten each frame from self-modified operands; the tuning table is the common one ($0116 for C-0), whereas MUSICFILE's is about a third of a semitone sharper.
  • Nothing of MUSICFILE's labels survives; this is a second MoN player, related only in concept (three tracks, speed + 1 frames per tick, 8-byte instruments, transposition bytes). Its instrument row 10 is nine bytes long (drump,2 for drump+2), which misaligns rows 11–13 — the tune only uses instruments 3–5.

Practical takeaways#

  • MUSICFILE's "noise click" is one frame of $81 at $faxx on the second frame of a note — the ancestor of a first-frame-waveform/noise entry in a tracker instrument. With a $41/$11 value instead, it is a one-to-five-frame waveform swap at pitch.
  • MUSICFILE transposes only upward, in 0–31 semitones per voice; write the sequence in the lowest key.
  • The Scoop player shows the other MoN design: durations and instruments as statements in the pattern, the gate time in the instrument, chords as note-name lists.

Notable quotes#

  • "FF to REPEAT, or FE to END." (Test Tune, beside seq0a); ;]aha! a samplerouty].
  • "voor een 'end'-byte moet altijd een noot,pause of hold staan!!!" (Test Tune 2).

Relevance to the wiki#

Resolves the two (unverified) readings on musicfile, hard-restart and orderlist; adds a second MoN player design to musicfile and charles-deenen; drum, filter and arpeggio rows for the technique pages; the rastertime-meter harness for sid-player-routine.

Pages touched#

musicfile · charles-deenen · maniacs-of-noise · cybernoid-ii · hard-restart · orderlist · instrument-tables · wavetable-programming · vibrato · filter-programming · pulse-width-modulation · chord-arpeggio · sid-player-routine · song-init-and-looping · semitone-math

source file wiki/summaries/s-realdmx-deenen-test-tunes.md · 1 unverified · graph