The Audio Registers#

The TIA gives you two independent audio channels, and that’s the whole orchestra — two voices, no more. Each channel is described by exactly three registers, and a sound is whatever you get by setting them and changing them over time.

RegisterWidthSets
AUDC0 / AUDC14 bitsthe waveform — which tone or noise shape this channel makes
AUDF0 / AUDF15 bitsthe frequency — a divisor, so 32 steps, higher value = lower pitch
AUDV0 / AUDV14 bitsthe volume — 0 (silent) to 15 (loudest)

The three combine in a fixed signal path: AUDC and AUDF feed a tone/noise generator, whose output is scaled by AUDV, and the two channels mix to the single output:

What a “sound” is#

There is no sound memory, no samples, no envelopes — just six registers holding their values until you change them. Write AUDV0 = 8, AUDC0 = 4, AUDF0 = 20 and channel 0 holds a steady tone forever, until you touch the registers again. Everything expressive — a note that ends, a pitch that slides, a volume that fades, a drum hit — is you rewriting these registers over time, almost always once per frame.

That’s the same “race against time” the rest of the machine demands, just slower: where graphics are paced to the scanline, sound is paced to the 60-per-second frame. A frame is the natural tick of VCS music.

Two voices, and how to stretch them#

Two channels means two simultaneous notes — so a melody on one channel and a bass line or drum on the other is the typical split. Want a third voice? You do what you do everywhere else on this machine: fake it in software, by rapidly switching one channel between two notes (an arpeggio that reads as a chord), or — at the extreme — by driving the volume register itself as a DAC to synthesize richer sound, at the cost of the entire CPU.

In Practice#

  • Silence is AUDV = 0. To stop a channel, zero its volume; you don’t need to touch AUDC/AUDF. Many sound bugs are just a channel whose volume was never cleared, droning under everything.
  • The registers are write-only like the rest of the TIA. If your music engine needs to know a channel’s current note or volume, keep it in a RAM variable — you can’t read AUDF back.
  • Two channels is a real constraint. Planning music for the VCS starts with “which two voices, this moment?” — melody and bass, or melody and percussion. The arrangement is a budgeting problem, like everything else here.