realdmx: Charles Deenen's two test tunes — an undated MUSICFILE build and the 'Scoop designs' Maniacs of Noise player
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-yyyyline, so the only date is dmx87's "1988". Entry pointsjmp song($1000),jmp songout($1003),jmp playirq($1006). A commented-out Turbo Assembler test harness (raster IRQ,dec $d020 … inc $d020aroundjsr playirqas 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. Speedsnelheid !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 tablenootafbreek, a three-statetestbyte(";if 1-> music stop"), an unusedloadpoint, the song number in X; Cybernoid II addsvibtotzover(a cap on the growing vibrato) andpulserunspeedwith a wrap, a$d418restore 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:pulsehilow nibble = initial$d403, bit 4 = note-cut enable;filcounthigh 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;fx2bits 0–2 pulse program, bit 3 strange filter, bits 4–7 pulse speed afterwards;fx3bits = 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,$10overdto0 $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 … $10overdto2 $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 programsfb0 $ff,$e0,$e0,$e0,$f0, fp0,$02,$fd,$fe,$ff…fb5; pulse programs$06,$0a,$02,$1c,$04,$1c,$06,$1cetc.; 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(thenoti, "noisetik" routine, active for instruments withfx3bit 7): while the frame counter of the note is belowstartlen[instrument], the waveform written isstarttabel[instrument]; if that value is$7for higher, the frequency high byte is forced tonoisehitone = $faand the waveform to$81(noise + gate). Because effects skip the note's first frame,startlen = $02means 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/$02everywhere) put a one-frame noise click on the bass and arpeggio instruments, and Cybernoid II's$41/$11rows swap in a different waveform at the note's own pitch forstartlen − 1frames — 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–$fdis 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& $3fmore times,$60–$7f= an instrument-number offset& $0fadded to the step's$Cxinstruments,$fe= end,$ff= restart the sequence (without resetting the transpose) (orderlist). - Step bytes, for completeness:
$f0,note= note without retrigger (legato);$f1,v= writevto$d417(filter routing and resonance as a step event);$Ex,delay,note,target= glide;$C0–$DFinstrument;$70–$7Farpeggio table;$80–$BFlength& $3f− 1 ticks (a second such byte adds);< $60note;$ffend 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 withand #0in 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+ntranspose (& $3f),rep+nrepeat,vol+nvolume,$ffend; block bytes:dur+nduration in ticks,snd+ninstrument,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 (aftergateonlengthtickswaveform2replaceswaveform1), 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 inwfend = $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 ($0116for 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 + 1frames per tick, 8-byte instruments, transposition bytes). Its instrument row 10 is nine bytes long (drump,2fordrump+2), which misaligns rows 11–13 — the tune only uses instruments 3–5.
Practical takeaways#
- MUSICFILE's "noise click" is one frame of
$81at$faxx on the second frame of a note — the ancestor of a first-frame-waveform/noise entry in a tracker instrument. With a$41/$11value 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