DigiOrganizer
A C64 editor and player by Polonius of the group Padua (code banner "DIGI-ORGANIZER BY POLONUS/PADUA") that adds a fourth, sampled voice to a normal single-speed tune made in any other editor: 4-bit samples packed two per byte, stored from $A000 upward, are streamed to the volume register $D418 from a CIA #2 NMI while the 3-voice player runs in the IRQ (chip-samples). The disk ships about ninety drum, bass, chord, guitar and vocal samples. Stefano Tognon documented it, with a reverse-engineered listing of the player, in sidin #6 (source: s-sidin06-digiorganizer).
Facts#
- Init
$9000, play$9003; a tune's own player is loaded by name with its play address ("usually $1000, but you can have music until $7500") and both are heard together withF1(source: s-sidin06-digiorganizer). - Samples are addressed by page: up to
$2Fsamples fill memory from$A000; only the last loaded sample can be deleted; the unused rest of a sample's last page is padded with$FF, so the volume ends at 15 (source: s-sidin06-digiorganizer). - Constraints on the 3-voice tune: it must not write the volume from the IRQ ("some very high noise sound will appears while playing the sample"), and because every nibble write or-s in
$10, only the low-pass filter survives while a sample plays — Polonius advises against filters altogether (filter-programming; source: s-sidin06-digiorganizer). - Tognon's wishes: moving samples in memory and naming them; Tognon reused its data in his SidWine3 demo-disk music (source: s-sidin06-digiorganizer).
Cheat sheet#
From s-sidin06-digiorganizer.
Keys: M,M load a sample module (e.g. MODULE/DEMO) · M,L load a 3-voice tune (e.g. MUSIC/DEMO) + its play address · F1 play · S sample menu, L load a sample by name / delete the last one · CTRL+2 sample definitions · SHIFT+A..I global tune speed.
Track (left): pairs pattern, repeats−1 — 01 04 = pattern 1 five times, 02 00 = pattern 2 once; $FF restart; $FE stop (orderlist).
Pattern (right): 32 steps; value = sample definition to trigger, 00 = let the previous sample continue, $FF = end early. 01 00 00 02 03 FF.
Sample definition (CTRL+2): nn: start end speed with start/end as address high bytes and speed = the CIA timer A low byte — 01: A7 AE A0 plays $A700–$ADFF; a definition may span several loaded samples (A0 A9 A0 = samples 1–3 in a row).
Making a sample: WAV → 8-bit mono 6 kHz — sox sample16.wav -c1 -b -v .8 -r 6000 sample8.wav (add a low-pass while downsampling) → 4-bit packed "low nibble, high nibble of 2 samples" with the DOS tool S64_ENG by Reiter/Apidya → load in the sample menu.
Your own 4-voice program:
init: JSR $1000 ; the 3-voice tune
JSR $9000 ; DigiOrganizer
play: JSR $1003
JSR $9003
Inside: init clears memory, sets CIA #2 timer A ($70) and timer B ($DD0E = $11, $DD0F = $51), enables the timer-B NMI ($DD0D = $82), writes $18 (low-pass, volume 8) to $D418 and points the NMI vector at nmi_null. Three NMI handlers: nmi_sx writes the high nibble (lsr ×4 / ora #$10 / sta $D418), nmi_dx the low nibble (and #$0F / ora #$10), then advances the pointer and compares the page with the sample's end page; nmi_null idles. The IRQ side steps the track/pattern every SPEED = $05 countdown and starts a sample by copying its start page, end page and speed into the NMI code. Layout: code $9000, track $9200, digiSound table $9300 (4 bytes per definition), patterns $9500 (32 bytes each), samples $A000 (sid-player-routine).
Related#
chip-samples · sid · sid-player-routine · rockmonitor · filter-programming · sidin · multisampling