# Commodore 64

a home computer with a synthesizer-grade sound chip of which people took decades to master. Three oscillators with four selectable waveforms, ring modulation, oscillator sync, multimode filter, ADSR envelope...

very popular in Europe and mostly due to the demoscene, which stretched the machine's limbs to no end.

Two revisions do exist - 6581 (original chip) and 8580 (improved version with working waveform mixing and somewhat more consistent filter curves)

# effects

- `10xx`: change wave. the following values are accepted:
  - `00`: nothing
  - `01`: triangle
  - `02`: saw
  - `03`: triangle and saw
  - `04`: pulse
  - `05`: pulse and triangle
  - `06`: pulse and saw
  - `07`: pulse and triangle and saw
  - `08`: noise
- `11xx`: set coarse cutoff. `xx` may be a value between 00 to 64.
  - **this effect only exists for compatibility reasons, and its use is discouraged.**
  - use effect `4xxx` instead.
- `12xx`: set coarse duty cycle. `xx` may be a value between 00 to 64.
  - **this effect only exists for compatibility reasons, and its use is discouraged.**
  - use effect `3xxx` instead.
- `13xx`: set resonance. `xx` may be a value between 00 and 0F.
- `14xx`: set filter mode. the following values are accepted:
  - `00`: filter off
  - `01`: low pass
  - `02`: band pass
  - `03`: low+band pass
  - `04`: high pass
  - `05`: band reject/stop/notch
  - `06`: high+band pass
  - `07`: all pass
- `15xx`: set envelope reset time.
  - this is the amount of ticks the channel turns off before a note occurs in order to reset the envelope safely.
  - if `xx` is 0 or higher than the song speed, the envelope will not reset.
- `1Axx`: disable envelope reset for this channel.
- `1Bxy`: reset cutoff:
  - if `x` is not 0: on new note
  - if `y` is not 0: now
  - this effect is not necessary if the instrument's cutoff macro is absolute.
- `1Cxy`: reset duty cycle:
  - if `x` is not 0: on new note
  - if `y` is not 0: now
  - this effect is not necessary if the instrument's duty macro is absolute.
- `1Exy`: change additional parameters.
  - `x` may be one of the following:
    - `0`: attack (`y` from 0 to F)
    - `1`: decay (`y` from 0 to F)
    - `2`: sustain (`y` from 0 to F)
    - `3`: release (`y` from 0 to F)
    - `4`: ring modulation (`y` is 0 or 1)
    - `5`: oscillator sync (`y` is 0 or 1)
    - `6`: disable channel 3 (`y` is 0 or 1)
- `3xxx`: set duty cycle. `xxx` range is 000-FFF
- `4xxx`: set cutoff. `xxx` range is 000-7FF.
