Classic Computer Magazine Archive BEST OF ANTIC VOLUME 1

Some Sound Advice


The SOUND statement in Atari BASIC is very powerful. Its ability to modify tone, distortion, and volume for each of four voices has been put to good use elsewhere in this book. One of the problems with the SOUND statement is that using it extensively slows down program execution. While this is true of BASIC statements in general, with the SOUND statement there is an easy alternative--SOUND registers. SOUND registers are memory locations which control properties (tone, distortion and volume) of the ATARI's sound.

Memory Location Function
53760 Tone of Voice 1 (SOUND 0)
53161 Distortion and Volume of Voice 1
53762 Tone of Voice 2 (SOUND 1)
53763 Distortion and Volume of Voice 2
53764 Tone of Voice 3 (SOUND 2)
53765 Distortion and Volume of Voice 3
53766 Tone of Voice 4 (SOUND 3)
53767 Distortion and Volume of Voice 4
53768 Tone "clock" control

The even-numbered memory locations (53760, 62, 64, 66) control the TONE, i.e., which note the ATARI will play. This is identical to the second number in a SOUND statement. For example, to get the same tone as SOUND 0, 100, 10, 8 you would POKE 53760, 100. This specifies Voice 0, note 100. But what about distortion and volume? The odd-numbered memory locations (53761, 63, 65, 67) take care of these two characteristics for each voice via the following relation:

16*DISTORTION +VOLUME

where DISTORTION is the third number in the SOUND statement (10 in our example) and VOLUME is the fourth number (8 in our example).

The equivalent POKE in our example is 16* (10) +8 = 168, and you would specify POKE 53761, 168. Try it. Type in: POKE 53760, 100:POKE 53761,168 [RET]. The other pairs of registers work the same way.

You can turn off the note by specifying zero in either TONE or DISTORTION-and-VOLUME registers.

Memory location 53768 is an interesting one. The ATARI maintains two internal "clocks" which it uses to measure the frequency of the sound wave it generates. The two clocks run at different speeds. Switching clocks changes the frequency (and thus the tone) of the sound. Bit 1 of memory location 53768 controls which "clock" the ATARI uses to produce its sound. Normally bit 1 is off, and the ATARI's sounds correspond to the tables in the reference manual. Turning bit 1 on (POKE 53768, 1) selects the slower clock, and alters the tone produced. Toggling bit 1 off and on will switch all four voices up and down for a pretty good "alarm" effect. Try this loop:

FOR N=0 TO 255:POKE 53768, N: NEXT N

This turns bit 1 off and on very nicely without having to worry about setting and resetting the bit. The reason this works is that the values jump back and forth from odd to even, turning bit 1 on and off.

How much faster is POKE than SOUND? Well, let's try an example. The following program downloads the ROM character set into RAM so it can be modified. With no sound (leave out the SOUND statements in line 30), this process takes 15.7 seconds. There are much faster ways to do this, but you can use this method until you feel confident. Fifteen seconds is a long time to sit looking at a computer doing nothing visible. Most people start getting nervous and wondering if "Lockup" has struck again. Let's add some sound to assure the user that something is happening.

10 POKE 106,PEEK(106)-4:POKE 53761,168:POKE 53763,168:GRAPHICS 0
20 CHBASE =PEEK(106):0LDCH = 57344:NWCH = CHBASE*256
30 FOR X =0 TO 1024:C =PEEK (OLDCH +X):POKE NWCH +X,C:SOUND 0,C,10,4:SOUND 1,X,10,4
40 NEXT X

Downloading the character set now takes some 25 seconds. If we try the following instead, substituting POKEs, the character set loads in about 20 seconds.

10 POKE 106,PEEK(106)-4:POKE 53761,168:POKE 53763,168:GRAPHICS 0
20 CHBASE=PEEK(106):0LDCH=57344:NWCH=CHBASE*256
30 FOR X =0 to 1024:C =PEEK(OLDCH +X):POKE NWCH+X,C:POKE 53760,C:POKE 53762,140
40 NEXT X

Note that X, which varies from 0 to 1024, can be used as an input to the SOUND statement--each time it rolls over a multiple of 255, it starts over at 0 (thus 256 is 0, as is 513 and 769). This is nor true of the POKE statement, so a constant was used. Doing a calculation to keep everything in range (such as POKE 53762, X/4) slows things down still further (about 28 seconds), and isn't a good idea.

Finally, various sources give the equations that relate tone to the internal clocks and note frequency. While these equations are beyond the scope of this article, they can be useful to those composing music on their computer.

by Dave Plotkin