Furnace tracker — C64 (SID) system and instrument documentation
Two pages of the manual of furnace, a multi-system tracker (GPL-2.0 repository), describing how it drives the sid. Furnace is not one of this wiki's focus tools; the pages are kept as a second, independent description of the same chip behaviour — waveform AND-mixing, the envelope bug and its "envelope reset", the 6581 DC-offset digi channel — in a different vocabulary: macros instead of tables, xxx effect values instead of table bytes, "envelope reset" instead of hard restart.
Key claims#
The chip, as Furnace describes it#
- The C64 has "a synthesizer-grade sound chip of which people took decades to master": three oscillators with four selectable waveforms, ring modulation, oscillator sync, a multi-mode filter and an ADSR envelope. Two versions: the 6581 (original) and the 8580, an "improved version with working waveform mixing and somewhat more consistent filter curves".
- Selecting more than one waveform gives "a logical AND mix of waves"; "due to hardware flaws, the mixing is a bit weird and sounds different between the 6581 and the 8580"; noise "cannot be used with any of the other waveforms".
- The 6581 "produces a DC output with its intensity being regulated by the global volume register", which "can be abused to produce a crude, virtual fourth 4-bit PCM channel" — Furnace's system variant Commodore 64 (SID 6581) with software PCM. "The later 8580 chip fixed this problem, making such PCM nearly inaudible"; other PCM methods exist but are not supported.
- Ring modulation: "the channel's output will be multiplied with the previous channel's" (the datasheet's triangle-only condition is not mentioned). Oscillator sync: "as the previous channel's oscillator finishes a cycle, it resets the period of the channel's oscillator, forcing the latter to have the same base frequency. this can produce a harmonically rich sound, the timbre of which can be altered by varying the synchronized oscillator's frequency."
- Filter: cutoff
0–2047; resonance0–15"amplifies or focuses on the cutoff frequency, creating a secondary peak"; modes low, high, band and ch3off, combinable — "selecting both 'low' and 'high' results in a bandstop (notch) filter". Its aside on ch3off: it "was originally planned for usage with two registers where program could read current oscillator and envelope outputs … but who wanted to sacrifice one channel out of three! so aforementioned was just done in software, and the feature was never used" (an opinion; the datasheet and PRG pages in this wiki document that use).
Envelope reset — Furnace's hard restart#
- Chip config: Hard reset envelope — "configure the envelope parameters used during the short reset before a note"; Envelope reset time in ticks — "0 disables reset, which prevents notes from triggering. 1 is short, but may exhibit SID envelope bugs. 2 is a good value."
- Effects:
15xxset envelope reset time — "the amount of ticks the channel turns off before a note occurs in order to reset the envelope safely";00, or more than the song speed, means no reset.1Axxdisables the reset for the channel. - Instrument: Don't test before new note — "disables the one-tick hard reset and test bit before a new note".
- A/D/S/R macros change the running envelope immediately in the matching phase, with one hardware rule: in the sustain phase "you can only go down. for example, 9-to-8 and 8-to-8 both work, but 8-to-9 immediately mutes the channel."
Effects (C64 system page)#
| effect | meaning |
|---|---|
10xx | change wave: 00 nothing · 01 triangle · 02 saw · 03 triangle+saw · 04 pulse · 05 pulse+triangle · 06 pulse+saw · 07 pulse+triangle+saw · 08 noise |
11xx | coarse cutoff 00–64 — "only exists for compatibility reasons", use 4xxx |
12xx | coarse duty 00–64 — compatibility only, use 3xxx |
13xx | resonance 00–0F |
14xx | filter mode: 00 off · 01 low pass · 02 band pass · 03 low+band · 04 high pass · 05 band reject/stop/notch · 06 high+band · 07 all pass |
15xx | envelope reset time in ticks |
1Axx | disable envelope reset for this channel |
1Bxy | reset cutoff: x ≠ 0 on new note, y ≠ 0 now ("not necessary if the instrument's cutoff macro is absolute") |
1Cxy | reset duty cycle, same digits (not necessary with an absolute duty macro) |
1Exy | compatibility: x = 0 attack, 1 decay, 2 sustain, 3 release (y = 0–F), 4 ring modulation, 5 oscillator sync, 6 disable channel 3 (y = 0/1) |
20xy | set attack x / decay y |
21xy | set sustain x / release y |
22xx / 23xx | pulse width slide up / down at speed xx (00 stops) |
24xx / 25xx | filter cutoff slide up / down at speed xx (00 stops) |
3xxx | set duty cycle 000–FFF |
4xxx | set cutoff 000–7FF |
The 10xx values are the SID waveform nybble (triangle 1, saw 2, pulse 4, noise 8, sums for combinations) without the control bits — an observation from the table, not a statement of the docs.
Instrument editor and macros (C64 instrument page)#
- Fields: Waveform (multi-select); Attack, Decay, Sustain, Release
0–15("the bigger the value, the slower the attack"; sustain = the level held); Duty0–4095; Reset duty on new note ("only useful when using relative duty macro"); Ring Modulation; Oscillator Sync; Enable filter; Initialize filter with Cutoff, Resonance and Filter mode; Absolute Cutoff Macro ("the cutoff macro will go from 0 to 2047, and it will be absolute … rather than being relative"); Absolute Duty Macro (0–4095); Don't test before new note. - Macros: Volume — "volume sequence is global! this means it controls the chip's volume and therefore affects all channels"; Arpeggio (pitch sequence); Duty; Waveform; Pitch (fine); Cutoff; Filter mode; Resonance; Special — ring and sync plus the gate bit (set: "key on. if previous state was 0 it triggers envelope start/restart; if previous state was 1, it does nothing"; reset: "key off. if previous state was 1 it triggers envelope release") and the test bit (set: "immediately mute channel — if the channel is a source of ring mod and/or hard sync, those stop working until the bit is reset"; reset: "unmute channel and restore ring mod/hard sync"); Attack, Decay, Sustain, Release (each takes effect at once in its own phase).
- Chip config also has Global parameter priority for macros that touch global parameters "such as volume and filter": Left to right — "process channels from 1 to 3. the last one to run macros will take effect"; Last used channel — "process channels from oldest to newest (since last note). the one which had the latest note on will take a effect"; and a Clock rate setting. Other options are DefleMask/old-Furnace compatibility and undocumented.
- Channel-status icons in the pattern view: silent / gate bit disabled / gate off + test on / test bit enabled / ch3off active.
Practical takeaways#
Furnace confirms, in its own words, the three facts every SID tracker builds on: combined waveforms are an AND and differ by chip; a note needs a short gate-off with a special ADSR before it (two ticks is the safe value, one may bug, zero stops notes from triggering at all); and the 6581's volume register leaks a DC level that can carry 4-bit samples. Its "last used channel wins" filter policy is a third option beside SID-Wizard's leftmost-channel rule and its "latest instrument takes over" (filter-programming). Its sustain-only-goes-down rule explains why raising the sustain register mid-note silences a voice.
Notable quotes#
"0 disables reset, which prevents notes from triggering. 1 is short, but may exhibit SID envelope bugs. 2 is a good value."
"if you modify sustain level when envelope is in sustain phase it immediately changes, although you can only go down."
Relevance#
An independent cross-check for hard-restart, adsr-envelope, sid, pulse-width-modulation and filter-programming, and the source of the furnace cheat sheet.
Pages touched#
furnace · sid · hard-restart · adsr-envelope · pulse-width-modulation · filter-programming · chord-arpeggio · ring-modulation-and-sync · chip-samples · commodore-64 · instrument-tables · sidechain-pump