There are four independently controllable "channels", or voices (there is actually
only one physical audio output channel). They can be thought of as oscillators that are
always on, and who's frequency and amplitude are controlled by specific memory
registers. For example, each of the four channels has a frequency register, and those
registers are often referred to as AUDF1-4 (read "any of the audio frequency registers, 1
through 4"). Their addresses are $D200 (53760), $D202 (53762), $D204 (53764), and
$D206 (53766).
Being an 8-bit machine, each register can hold a number between $00 and $FF
($ signifies hexadecimal notation), or 0 and 255 decimal. This number is then divided
into whichever clock is clocking that particular channel (a "divide-by-N" circuit), and that
gives you the frequency of that channel (it's not a straight division, but I haven't figured
out exactly what happens yet). So, if you put a 2 in there, the frequency will be higher
than if you put a 100 in there because clock/2 is going to be a bigger number than
clock/100. Also, there are much more noticeable jumps in "pitch" if you make small
changes in frequency with small numbers (say from changing 3 to 4) than with larger
numbers (say from changing 234 to 233). And the 8-bit pitch resolution in general only
gives you a few octaves to reasonably work with.
Along with the AUDF1-4 registers, there is also a group of registers that are
referred to as AUDC1-4 (read "any of the audio control registers, 1 through 4"). These
audio control registers are quite special because they control things like amplitude and
"distortion". Their addresses are $D201 (53761), $D203 (53763), $D205 (53765), and
$D207 (53767). Here is a bit diagram for an AUDC1-4:
bit number 7 6 5 4 3 2 1 0
distortion vol only volume
The volume control for each channel is pretty straightforward. The lower 4 bits of
the audio control register contain a 4-bit number ("nybble") that specifies the volume of
the sound. A zero in these bits means zero volume, and a 15 means as loud as
possible. I have found that the sum of the volumes of the four channels should not be
higher than 32 or else you will get a buzzy sound and actually lose volume.
The upper three bits control the "distortion" amount. It's not really distortion in the
standard sense, it actually means something closer to "noise". The Atari uses
"polynomial counters" which are essentially shift registers with a NAND gate thrown in
there that feeds back into the input of the register. For example, with a 5-bit poly-
counter, bit 5 is sent as the output but it is also compared with bit 3 by a NAND gate.
The output of the NAND gate is the next input at bit 1 as everything gets shifted.
The poly-counters are aren't truly random because they will repeat their
sequences after a certain amount of time, and this time depends on the number of bits
employed in the poly-counter. But compared to the pure tone of the channels, they
sound very noisy. The poly-counter's random pulses are compared with the pulses
coming from the frequency register, and those that match up get through and nothing
else does. This is how the noise is introduced into the tone of the channels. The
following are the various settings for the top three bits of AUDC1-4 to determine the
distortion amount after the frequency registers (x means it doesn't matter if this bit is set
or not):
0 0 0 - select using 5 bit poly then 17 bit poly, div by 2
0 x 1 - select using 5-bit poly, then div by 2
0 1 0 - select using 5-bit then 4-bit polys, div by 2
1 0 0 - select uding 17-bit poly, div by 2
1 x 1 - div by 2 (no poly coutners i.e. pure tone)
1 1 0 select using 4 bit poly, div by 2
Bit four of the AUDC1-4 is also very special because it is the "volume only bit".
This means that when this bit is set, the volume value in AUDC1-4 bits 0-3 is sent
directly to the television speaker and is not modulated with the frequency specified in
the AUDF1-4 registers. For example, say I set AUDF1 to 10000000 (128) and I set
AUDC1 to 00000000 (0). You would hear nothing. Then by setting the bottom four bits in
AUDC1 (setting AUDC1 to 00001111), you will hear a relatively loud tone at a frequency
of clock-speed/AUDF1(128). Then if I set the volume only bit in AUDC1 (set AUDC1 to
00011111), you will again here nothing. This is because the value of the lower four bits
(the volume bits) in AUDC1 is bring sent straight to the tv speaker. If I reset these bits
(set AUDC1 to 00010000), you will hear a single "pop" as the tv speaker cone moves
back into a resting position.
This "volume only" mode is very important for two reasons. Because you have
direct control over the position of the speaker cone (thought only to a 4-bit resolution),
with assembly language you can move it back and forth quickly enough to create
different waves than just the pulse (1's and 0's) waves that the AUDF1-4's generate.
Simple waves such as sine waves and sawtooth waves can be convincingly replicated.
Secondly, you can also use it to play back stored data (i.e. samples), but once again
only at a 4-bit resolution.
There are other registers and tricks of importance, such as inserting high-pass
filters, joining two channels together for 16-bit pitch resolution, or clocking the channels
with different clocks to get different pitch ranges. There are also hardware hacks such as
getting three independent sound outputs. As you can see, the Atari 800xl is just a friggin
powerhouse of electronic sound and music potential, and I think represents the future of
audio generation technology.
by,
Brentt Dundass