Homeentitytool

Johannes Bjerregaard's player

The driver johannes-bjerregaard wrote for himself — in 1986 the only "scene composer with own player" SIDwave can name (s-recollection-brief-history-of-sid) — and kept when he joined maniacs-of-noise in 1988 ("preferred his own driver"; s-vgmpf-maniacs-of-noise). Two of his own Turbo Assembler sources are public: the James Bond 3 demo, whose header is a MoN job sheet ("30 SECS OF JAMES BOND TITLE TUNE INCLUDING A DEMO OF THE MANIACS OF NOISE MUSIC STYLE"), and Myth (both 1989) — two versions of the same design with different table addressing (source: s-realdmx-bjerregaard-player). Its specialities: a second sustain level done in software, two flavours of hard restart, vibrato proportional to the semitone, and drums as ordinary instruments.

Facts#

  • Entry points: init at $1000 (A = song), stop at $1003, play at $1006; a fade-rate byte (1–127) the game can poke; Myth keeps three raster-time bytes at $1009 ($d012 sampled per voice) — a rastertime meter shipped in the player (sid-player-routine). About 1.5 KB of code; JB3 ≈ 1.3 KB and Myth ≈ 2.7 KB of data (estimates) (source: s-realdmx-bjerregaard-player).
  • JB3's "IMPROVEMENTS" list and the job sheet (RECEIVED : 18/6, LATEST DELIVERY : 19/6) show the player evolving between commissions; an instrument named JEROEN PLOINK and a commented BASIC stub reading "STORM LORD MUSIC (C)MON." tie the file to the MoN period. No code is shared with Deenen's musicfile (source: s-realdmx-bjerregaard-player).
  • SIDId: Bjerregaard, MoN/Bjerregaard, (Bjerregaard); Ruben Spaans's (Audiomaster_V1) (1989) is "based on the player of" Bjerregaard (source: s-sidid-player-list).

Cheat sheet#

All from the two sources (source: s-realdmx-bjerregaard-player).

Song → tracks → patterns: a song is 8 bytes — !by voices,tempo / !wo V0,V1,V2 (tempo = frames per tick − 1); a track is a list of pattern numbers with prefix bytes; a pattern is a byte stream.

track bytemeaning
$00–$7fpattern number
$80–$fdtranspose (byte & $7f) − $40 ($c0 = 0, $cc = +12, $bc = −4)
$festop
$ffrestart all three voices
pattern bytemeaning
$00–$5fnote (+ transpose); $00 = silence in Myth
$60–$7fselect arpeggio / note program
$80–$9fselect instrument
$a0–$bfglide speed; next byte = target note
$c0–$dfnote length in ticks ($c0 = 1, $c7 = 8)
$e0–$fbrest of that length
$fctie (legato) — working in Myth
$fe xxMyth only: override sustain/release for the following notes ($fe,$39)
$ffend of pattern

Example (JB3 S0B): $E1 / $C1,$88,$34,$39,$3B / $3C,$E1,$3E,$E1,$C2 / $A2,$3C,$3B ….

Instrument = 8 bytes — JB3's header ;0=ATK/DCY ;1=SUS1/REL ;2=VIB1 ;3=PULSE/DLY ;4=NOTES ;5=FILTER ;6=WAVES ;7=VIB2/SUS2:

byteJB3Myth
0attack/decayattack/decay
1sustain/release (low nibble kept as the note's release)sustain/release (overridable by $fe)
2vibrato: delay (hi nibble × 2 frames), half-period (lo)vibrato delay/speed
3pulse program (lo) + auto-release delay (hi × 2 frames)pulse-program offset from p0
4default arpeggio/note programnote-program selector; bit 7 = "shutup notes" (hard restart)
5filter program (lo) + vibrato ramp-in (hi × 4 frames)filter-program offset from f0
6waveform program (lo) + second-sustain delay (bits 5–7, frames)wave-program offset from w0
7vibrato rate (lo) + second sustain level (hi nibble)vibrato rate (lo) + ramp-in (hi × 4)

Rows: ;GUITAR $08,$6C,$79,$02,$04,$80,$05,$01 · ;DRUMM $06,$A9,$00,$00,$03,$00,$01,$00 · ;MELODY $06,$50,$17,$04,$04,$20,$07,$51 · ;JEROEN PLOINK $08,$86,$17,$00,$04,$20,$08,$23 (JB3); ;chord $02,$79,$19,p0-p0,$84,f0-f0,w0-w0,$00 · ;bazedrum $08,$66,$00,p1-p0,$05,f0-f0,w2-w0,$00 (Myth).

Programs (one byte per frame; byte 0 = repeat point; JB3 $FE keep last / $FF repeat, filters $7E/$7F; Myth only $ff):

kindformatexamples
waveformcontrol bytesW0 ;BASSDRUM $01,$81,$41,$40,$FE · W5 ;GUITAR $01,$43,$43,$43,$40,$FE · Myth w2 ;bazedrum $01,$81,$41,$11,$40,$40,$40,$40,$40,$80,$ff
note / arpeggio< $80 semitone offset, ≥ $80 absolute note; JB3 with bit 7 in byte 0 = raw $D401 bytesN0 $01,$04,$04,$00,$FF · N2 $81 / $58,$08,$06,$04,$03,$02,$03,$04,$03,$FE (drum sweep) · Myth n0 $07,$03,$00,$07,$ff (minor)
pulsebyte 1 = initial width, then (delta, frames) pairs, bit 7 of the delta = addP2 ;GUITAR $01,$E0, $C0,$01, $B0,$01, $A0,$02, $10,$03, $08,$04,$FE · Myth p1 ;skwear polls waive $08,$00,$7f,$ff
filterbyte 1 = cutoff, byte 2 = $D418 mode nibble, then signed (delta, frames) on one global cutoff; resonance fixed at $FF1 $01,$80,$10, $F0,$06,$7E · Myth f1 ;filterbass $90,$10,$d0,$03,$00,$7f,$ff

Envelope tricks: JB3 — after N frames the gate is dropped and raised in one frame with AD = 0 and a new sustain nibble (second sustain), then auto-released after 2 × M frames; ADSR zeroed two ticks before every note, $F0 to the control register one tick before, $09 (test + gate) on the note frame. Myth — ADSR zeroed one tick early only for "shutup" instruments; no test bit (mask $f7/$f6); bit 3 of a wave entry forces pulse width $0800; AD/SR rewritten every frame (hard-restart, adsr-envelope). Vibrato depth = the semitone distance from the frequency table shifted by the rate — constant in cents (vibrato).

johannes-bjerregaard · maniacs-of-noise · musicfile · hubbard-player · sid-player-routine · instrument-tables · hard-restart · wavetable-programming · sidid

Sources#

s-realdmx-bjerregaard-player · s-recollection-brief-history-of-sid · s-vgmpf-maniacs-of-noise · s-sidid-player-list

source file wiki/entities/bjerregaard-player.md · graph