Furnace
Furnace is a multi-system tracker by tildearrow and contributors (GPL-2.0, github.com/tildearrow/furnace) whose manual has a page on the commodore-64's sid and one on its C64 instrument editor; only those two pages are in the wiki (fetched 2026-08-30 from the repository's master; the system page last changed 2025-03-23, the instrument page 2024-09-14). It is not a focus tool here: the wiki keeps its documentation as a second, independent description of the chip behaviour that sid-wizard and goattracker expose through tables (source: s-furnace-c64-docs). Vocabulary: an instrument's per-tick programs are macros (arpeggio, duty, waveform, pitch, cutoff, filter mode, resonance, special, attack/decay/sustain/release); hard restart is envelope reset; effect values are xxx numbers rather than table bytes.
What its C64 docs say about the chip#
- 6581 = the original; 8580 = an "improved version with working waveform mixing and somewhat more consistent filter curves". Selecting several waveforms gives "a logical AND mix" that "sounds different between the 6581 and the 8580"; noise cannot be combined with anything.
- The 6581's DC output, "regulated by the global volume register", serves as "a crude, virtual fourth 4-bit PCM channel" in the system variant Commodore 64 (SID 6581) with software PCM; on the 8580 such PCM is "nearly inaudible" (chip-samples).
- Envelope reset: 2 ticks "is a good value", 1 "may exhibit SID envelope bugs", 0 "prevents notes from triggering" (hard-restart).
- Sustain can be lowered but not raised while a note sustains: "8-to-9 immediately mutes the channel" (adsr-envelope).
(source: s-furnace-c64-docs)
Cheat sheet#
Effects (C64)#
| 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 |
3xxx | set duty cycle, 000–FFF |
4xxx | set filter cutoff, 000–7FF |
13xx | set resonance, 00–0F |
14xx | filter mode: 00 off · 01 low pass · 02 band pass · 03 low+band · 04 high pass · 05 notch (band reject) · 06 high+band · 07 all pass |
15xx | envelope reset time in ticks (00, or more than the song speed, = no reset) |
1Axx | disable envelope reset for this channel |
1Bxy | reset cutoff: x ≠ 0 on new note, y ≠ 0 now (unneeded with an absolute cutoff macro) |
1Cxy | reset duty cycle: x ≠ 0 on new note, y ≠ 0 now (unneeded with an absolute duty macro) |
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 | cutoff slide up / down at speed xx (00 stops) |
11xx | coarse cutoff 00–64 — compatibility only, use 4xxx |
12xx | coarse duty 00–64 — compatibility only, use 3xxx |
1Exy | compatibility: x = 0 attack · 1 decay · 2 sustain · 3 release (y = 0–F) · 4 ring mod · 5 sync · 6 disable channel 3 (y = 0/1) |
Instrument fields (C64 tab)#
| field | range / meaning |
|---|---|
| Waveform | triangle, saw, pulse, noise; several at once = AND mix (never with noise) |
| Attack · Decay · Sustain · Release | 0–15 each; larger = slower (sustain is a level) |
| Duty | 0–4095 (2048 = square) |
| Reset duty on new note | reload the instrument's duty on each note — for relative duty macros |
| Ring Modulation · Oscillator Sync | with the previous channel as modulator |
| Enable filter · Initialize filter | route through the filter; set cutoff 0–2047, resonance 0–15, mode low / high / band / ch3off (combinable; low + high = notch) |
| Absolute Cutoff Macro · Absolute Duty Macro | cutoff macro 0–2047 / duty macro 0–4095 as absolute values instead of relative ones |
| Don't test before new note | skip "the one-tick hard reset and test bit before a new note" |
Macros#
| macro | notes |
|---|---|
| Volume | global — the chip's volume register, affects all channels |
| Arpeggio | pitch sequence in semitones (chord-arpeggio) |
| Duty · Waveform · Pitch | pulse width (pulse-width-modulation) · waveform (wavetable-programming) · fine pitch, per tick |
| Cutoff · Filter mode · Resonance | the filter, per tick (filter-programming) |
| Special | ring mod, sync, the gate bit (0→1 starts or restarts the envelope, 1→0 releases it, otherwise nothing) and the test bit (1 mutes the channel at once and suspends ring/sync for channels using it as a source; 0 restores) (ring-modulation-and-sync) |
| Attack · Decay · Sustain · Release | change the running envelope immediately; sustain can only go down while sustaining |
Chip configuration#
| option | meaning |
|---|---|
| Clock rate | the SID clock |
| Global parameter priority | whose macros win for global parameters (volume, filter): Left to right (channels 1→3 in order, the last to run wins) or Last used channel (the channel with the latest note-on wins) |
| Hard reset envelope | the ADSR used during the pre-note reset — the HR ADSR of other trackers |
| Envelope reset time | ticks of gate-off before a note: 0 none (notes do not trigger), 1 short but may bug, 2 good |
(source: s-furnace-c64-docs)
Related#
sid · hard-restart · adsr-envelope · pulse-width-modulation · filter-programming · ring-modulation-and-sync · chord-arpeggio · chip-samples · sid-wizard · goattracker · tracker · instrument-tables