64'er 10/1986 — Musik wie noch nie: the Soundmonitor article and manual
The article with which 64er published chris-huelsbeck's soundmonitor as its "Listing des Monats" (listing of the month) in October 1986 — the editor that started the C64 tracker era and the first documentation of his Musicmaster play routine. The German text is a complete user manual: every key, the track/step table, bar addresses, arpeggios, recording, saving, and the 24 "registers" of a sound. The 11 KB hex listing itself is not in the etext.
Key claims#
- Why it exists. Existing SID programs (score editors, "complete music studios") could only play music while the whole program was in memory, useless for "einem selbstgeschriebenen Basic-Spiel". So Hülsbeck wrote an independent play routine, Musicmaster, whose results "can even surpass the music of professional games". Entering its data with a machine-language monitor such as SMON was tedious — "Das Musikstück »Shades« wurde auf diese Art komponiert, was eine zeitraubende Arbeit war" (shades was composed that way) — hence a monitor specialised for music data: the Soundmonitor.
- Design. The play routine "runs completely on its own in the interrupt", so the song can be heard at any time, also while editing; plus "Realtime-record" from the keyboard.
Xleaves the program,SYS 4096restarts it. - Track/step table (the start screen): a step column
SP$00–$FF("compare a step to a BASIC line number"),TRK1–3= the play order of bars for voices 1–3, and per track a transposeTRand a sound-transposeST; anARP/Scolumn holds the address of the base settings + arpeggios.SHIFT+I(+Y) initialises.F3marks FIRST STEP,F5LAST STEP. - Bars ("Takte") are memory addresses. You type
B000underTRK1at steps 00–03 and the bar at$B000plays four times. Bars live best between$B000and$BE00(the BASIC ROM is banked out); "the routine has no memory management", but bars can be put anywhere. After initialise every step points to$BE00, an empty bar (for rests longer than a bar); a metronome bar sits at$BE80(sound 00 is reserved for it; use with TR/ST = 00 while recording). - Bar length defaults to
$20= 32 notes; every note takes 2 bytes, so bars are$40apart:$B000, $B040, $B080, $B0C0, $B100 ….$30gives a 6/8 bar ($B000, $B030, $B060 …),$40a double-length 4/4 ($B000, $B080, $B100 …). - Note display.
RETURNon a bar address opens it; the bar reads top-left to bottom-right, four notes per row, e.g.B000 A-1 01 - 00 - 00 - 00. A note is C–H,#/-, octave 0–7;---= rest ("the key is released"),+++= hold. Each note carries a hex byte: low nibble = sound number, high nibble = sound options. A note typed normally shows inverse and is angeschlagen (retriggered);SHIFT+note enters it without a retrigger. - Transport.
Nstarts at FIRST STEP and re-initialises the SID;Ptoggles play at CURRENT STEP. - Transpose adds the
TRbyte to every note of the bar:00–7Fup,FF–80down. FromC-2:01→C#2,03→D#2,0C→C-3,FF→H-1,FB→G-1. The tutorial's bass (A-1/A-2octave jumps) becomes "ein einfaches A-Moll-Riff" withFCandFEon later steps. - Sound-transpose
STis added to every sound number in the bar, so one bar can be played with different sounds and sounds above$0Fbecome reachable. - Play & realtime record.
O(+SHIFT) octave,CLRsound,Kkey-transpose,,./pick the voice,F7plays (border turns red;CTRL= C,1= C#, …),F7/RETURNreturns. Recording:Rpicks the track (header turns yellow), bar addresses must be filled in,Qsets quantize (1 = 16ths, 2 = 8ths, 3 = quarters, 0 = none — "not recommended"), thenF7. - ARP/S page (
RETURNunderARP/S, "very monitor-like"): the first 8-byte line holds the base settings: byte 0 CIA-timer low (fine tempo, e.g. to sync with a record player), 1 CIA-timer high ("35 to 50 if possible"), 2 coarse tempo 0–4 (smaller = faster), 3 bar length, 4 fade-out at the song's end (FF= none;10fast …30slow; needs a second ARP/S address at the end whose only difference is this byte), 5 volume00–0F("almost identical to SID register 24, but without the filter nibble"), 6–7 unused.SHIFT+@on ARP/S writes default base settings and two arpeggios. - Arpeggios live on the following lines: always eight note-steps called in turn, each working like a transpose, "for example to simulate chords". A minor chord:
0c 07 03 00 0c 07 03 00— "as if you played a chord with four fingers … A minor: first finger A (0C), second E' (07), third C' (03), fourth A (00)". To use one, set bit 3 of the note's sound options (the digit becomes4), and choose the arpeggio with the byte after the last note of the bar (for the first note: the last byte of the bar):08= first arpeggio,10second,18third,20fourth … - Sound options (high nibble of the note byte): suppress transpose, suppress sound-transpose, arpeggio-play bit, portamento bit; the
£key inverts bits and shows the resulting digit. - Copy / edit.
SHIFT+=copies the FIRST…LAST STEP block to the cursor;LthenSHIFT+Scopies a sound, a bar (in the note display) or an ARP/S line;SHIFT+INS/DELinserts a step,DELdeletes one;SHIFT+@on a bar address clears the bar. - Save/load.
Tpicks the file type: Soundnumber (one or more sounds,Y/Uset the range), Complete Song (with the play routine —Nthen plays it "exactly as if you had loaded it absolute and started it withSYS 49152"), Steps only (no routine, fewer blocks, for work in progress).SHIFT+Ssaves,SHIFT+Lloads,$shows the directory. - Synchronisation with a turntable or tape: FINE DETUNE in the sound page, then the CIA-timer bytes;
Nrestarts the song each try. - Demo sounds (24 bytes each): Flute
11,09,99,00,00,00,00,00,10,00,00,00,10,06,10,00,FF,00,…; Basedrum11,09,09,01,00,00,00,00,10,01,FF,00,00,00,00,00,FF,…; Snaredrum81,09,09,01,00,00,00,00,80,01,10,30,00,00,00,00,FF,…; "Rambo theme sound"41,08,7D,00,00,20,10,10,40,10,00,00,10,08,1D,00,FF,…; Ringmodulationeffect15,08,7A,10,00,00,00,00,14,01,20,23,00,00,00,00,FF,…; Portamentosound11,09,99,00,00,00,90,00,10,00,70,00,00,00,00,00,FF,…(needs the portamento bit in the sound options). The tutorial's bass is41,09,99,00,20,10,10,10,40,10,00,00,00,00,00,00,FF,…, its melody41,08,7C,00,60,10,10,10,40,10,00,00,10,07,1A,00,FF,….
The 24 sound registers#
| reg | meaning (as documented) |
|---|---|
| 0 | waveform + control at key-on = SID registers 4/11/18: first digit 1 triangle, 2 sawtooth, 4 pulse, 8 noise; second digit bit 0 = "Anschlagsbit" (gate, must be 1), bit 1 sync, bit 2 ring mod, bit 3 test. Enter 11, 21, 41 or 81; "for effects also 15" |
| 1 | attack/decay (SID 5/12/19) |
| 2 | sustain/release (SID 6/13/20) |
| 3 | portamento-effect byte, the target when the portamento is "overdriven" (with reg 9) |
| 4 | pulse width 00–FF |
| 5 | pulse-EG count up: how long reg 7 is added to the pulse width |
| 6 | pulse-EG count down |
| 7 | pulse-EG count byte ("above 30 the tone gets dirty") |
| 8 | waveform at key-off: like reg 0 with the gate bit cleared (10, 20, 40, 80); normally the same waveform (21/20, 11/10, 41/40, 81/80), changing it "does not always give a good result" |
| 9 | left digit 1 = restart the pulse EG constantly; right digit: bit 0 pull the tone up, bit 1 down (between the struck note and reg 3), bit 2 = only once instead of constantly ("hear it in BASEDRUM"); 0 for a normal portamento |
| 10 | portamento speed low (00 = none; the note also needs the portamento bit in its sound options) |
| 11 | portamento speed high (large values with bit 0 of reg 9 give "an interesting effect") |
| 12 | vibrato level (depth) |
| 13 | vibrato speed (00 very fast … 7F very slow; bit 7 = start downward or upward) |
| 14 | vibrato delay after key-on |
| 15 | fine detune (normally 00) |
| 16 | high nibble of SID register 24 = filter type (bit 0 low-pass, bit 1 band-pass, "bit 3" high-pass as printed; 0 = none). FF = this sound touches no filter register, which avoids the SID's click when filters switch; a voice that was filtered stays filtered unless a later sound clears regs 16–23 to 00 |
| 17 | resonance / filter-to-voice = SID register 23 (left digit resonance, right digit bits 0–2 = voices 1–3) |
| 18 | cutoff frequency 00–FF |
| 19 | filter-EG count up (same principle as the pulse EG, regs 5–7) |
| 20 | filter-EG count down |
| 21 | filter-EG count level lo: left digit how much (0–F) is added going up, right digit going down (for effects with reg 23) |
| 22 | filter-EG count level hi (02–20 recommended) |
| 23 | filter-EG mode / trigger voice: left digit bit 0 = restart constantly, bit 1 = start with count-up or count-down; right digit = which voice starts the EG (bits 0–2 = voices 1–3, normally the filtered voice itself) |
Practical takeaways#
- The whole editor is a thin skin over a data format: bars are raw memory, the track/step table is a list of addresses, a sound is 24 bytes. That is why it could be typed in from a magazine and why its tunes run in anybody's game with
SYS 49152— the sid-player-routine idea made public. - Chords are arpeggios of eight steps written as semitone offsets (
0c 07 03 00 …), the same idea as every later chord-arpeggio table; the "Rambo theme sound" and the drum recipes are usable instrument-design starting points for any editor with pulse and filter "EGs" (pulse-width-modulation, filter-programming). - The
FF"don't touch the filter" convention and the warning about the SID clicking when filter bits change are early, practical filter advice.
Notable quotes#
"Der Hauptteil des Programms, die Abspielroutine, läuft völlig selbständig im Interrupt. Das bedeutet, daß der Song zu jeder Zeit, also auch während des Editierens angehört werden kann." — the main part of the program, the play routine, runs entirely on its own in the interrupt, so the song can be heard at any time, even while editing.
"Lesen Sie die Anleitung komplett und sorgfältig durch, bevor Sie eine größere Komposition starten." — read the manual completely and carefully before starting a larger composition.
Relevance to the wiki#
Primary source for soundmonitor (cheat sheet), for Musicmaster as the first published C64 driver on sid-player-routine, for shades and chris-huelsbeck, and for the pre-history of the tracker (tracker-scene-history).
Pages touched#
soundmonitor · chris-huelsbeck · shades · 64er · sid-player-routine · tracker · tracker-scene-history · chord-arpeggio · instrument-tables · instrument-design · pulse-width-modulation · filter-programming · vibrato · pitch-slide-and-portamento · sid