Johannes Bjerregaard's player cheat sheet
From Johannes Bjerregaard's player · print · built 2026-08-31
Reference
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 byte | meaning |
|---|---|
$00–$7f | pattern number |
$80–$fd | transpose (byte & $7f) − $40 ($c0 = 0, $cc = +12, $bc = −4) |
$fe | stop |
$ff | restart all three voices |
| pattern byte | meaning |
|---|---|
$00–$5f | note (+ transpose); $00 = silence in Myth |
$60–$7f | select arpeggio / note program |
$80–$9f | select instrument |
$a0–$bf | glide speed; next byte = target note |
$c0–$df | note length in ticks ($c0 = 1, $c7 = 8) |
$e0–$fb | rest of that length |
$fc | tie (legato) — working in Myth |
$fe xx | Myth only: override sustain/release for the following notes ($fe,$39) |
$ff | end 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:
| byte | JB3 | Myth |
|---|---|---|
| 0 | attack/decay | attack/decay |
| 1 | sustain/release (low nibble kept as the note's release) | sustain/release (overridable by $fe) |
| 2 | vibrato: delay (hi nibble × 2 frames), half-period (lo) | vibrato delay/speed |
| 3 | pulse program (lo) + auto-release delay (hi × 2 frames) | pulse-program offset from p0 |
| 4 | default arpeggio/note program | note-program selector; bit 7 = "shutup notes" (hard restart) |
| 5 | filter program (lo) + vibrato ramp-in (hi × 4 frames) | filter-program offset from f0 |
| 6 | waveform program (lo) + second-sustain delay (bits 5–7, frames) | wave-program offset from w0 |
| 7 | vibrato 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):
| kind | format | examples |
|---|---|---|
| waveform | control bytes | W0 ;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 bytes | N0 $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) |
| pulse | byte 1 = initial width, then (delta, frames) pairs, bit 7 of the delta = add | P2 ;GUITAR $01,$E0, $C0,$01, $B0,$01, $A0,$02, $10,$03, $08,$04,$FE · Myth p1 ;skwear polls waive $08,$00,$7f,$ff |
| filter | byte 1 = cutoff, byte 2 = $D418 mode nibble, then signed (delta, frames) on one global cutoff; resonance fixed at $F | F1 $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).