Home > Previous Page >  Ace Music - Your Computer, July, 1983
Archive Search  
ACE
SOUNDS

Richard White
and the Acsttes run
through some of their
latest number.

THE VOCABULARY of the Ace contains only one word, Beep, that can be used to produce sounds. The control that the user has over the sounds that this word generates is limited to specifying its frequency and duration.

This makes it difficult to produce the kind of sounds that arcade-type games in particular require. The following Ace words were written to allow the user to produce a large range of sounds. At the heart of these words are three short machine-code routines that produce the sound. Associated with them is a variable space that holds the parameters of the sound for the machine code to pick up. A defining word, Sound, transfers data from words defined by it to the variable space when the defined word is called. Different sounds can be produced by the machine-code routine simply by defining Sound words with the required parameters. This also means that once fundamental words have been defined, new sounds can be added using the minimum of additional bytes.

It is mentioned on page 154 of the Ace manual that the diaphragm of the speaker is controllable by In and Out instructions: In pushes the diaphragm in and Out pushes it out. The motion of the diaphragm will be controlled by two machine code routines, Pause and Note.

Pause regulates the time period between pushing the diaphragm in and out and hence regulates the frequency at this time.

     Pause
     LD B, C    65      C contains the
                        delay time
LOOP DJNZ LOOP  16 254
     RET 201

This word is defined as follows:


 CREATE PAUSE 65 c, 16 c, 254 c, 201 c,

Note moves the diaphragm and regulates the time for which this frequency is heard.


      Note
NOTE  CALL PAUSE 205 PAUSE   Delay
      IN A, (0)  219         Diaphragm
                             in
      CALL PAUSE 205 PAUSE   Delay
    OUT A, (0)   211      Diaphragm
                          out
    DEC E   29            E contains
                          length of
                          note
    JRNZ   NOTE 32 243    NOTE is
                          continued if
                          E # 0
    RET    201

Defined by:


 CREATE NOTE 205 c, PAUSE, 219 c, 205 c,
 PAUSE, 211 c, 29 c, 32 C, 243 c, 201 c,

 

Because Create puts the first data address on the stack, the. definition of Note using Pause will work. Note that, as the address of Pause is of two bytes, a comma is used instead of c followed by a comma. These words are used by another machine- code word, Noise, which collects the variables from the variable area and then calls Note, varying the length and frequency of the sound as required.


The word Note requires five parameters so we first create a word with five bytes of memory available.


    CREATE VAR 0, 0, 0 c,

The five parameters stored in Var are:

Name    Location    Use

LENGTH   VAR         Specifies length used by
                     Note at start of sound
START    VAR + 1     Specifies delay time used
                     by Pause at start of sound
STOP     VAR + 2     Specifies delay time at
                     which the sound stops
FINC     VAR + 3     Amount by which the

                     delay time is changed each
                     cycle
LINC     VAR + 4     Amount by which the
                     length is changed each
                     cycle

The increment parameters are added to the length and frequency parameters each cycle so

Below, figure 2, and right figure 1.
        Noise
        LD C, 1    14 1       C = initial delay time = 1
        LD H, 1    38 1       H = final delay time = 1
        LD L, 6    46 1       L = initial length = 6
        LD D, 0    220        D = length increment = 0
 CYCLE  LD E, L    93         Transfer length to E for
        CALL NOTE  205 NOTE   use of Note.
        LD A, L    125        Add the length increment
        ADD A, D   130        to the length and
        LD L, A    111        restore in L.
        LD A, C    121        Add the time delay
                              increment
        ADD A, 13  198 13     to the time delay and
        LD C, A    79         restore in C.
        CP H       188        Compare present time delay
        JRNZ CYCLE 32 242     with final time delay. If
        JP (IY)    253 233    not equal then cycle, or
                              else return to Forth
Noise LD A, (START)  58 VAR + 1
      LD C, A        79          C = initial delay time.
      LD A, (STOP)   58 VAR + 2
      LD H, A        103         H = final delay time.
      LD A, (LENGTH) 58 VAR + 0
      LD L, A        111         L = initial Note length.
      LD A, (LINC)   58 VAR + 4
      LD D, A        87          D = length increment.
CYCLE LD E, L        93          Transfer length to E for
      CALL NOTE      205 NOTE    use of Note.
      LD A, L        125         Add the length increment
      ADD A, D       130         to the length and
      LD L, A        111         restore in L.
      LD A, (FINC)   58 VAR + 3  Add the time delay
                                 increment
      ADD A, C       129         to the time delay and
      LD C, A        79          restore in C.
      CP H           188         Compare present time delay
      JRNZ CYCLE     32 241      with Stop time delay. If
      JP (IY)        253 233     not equal then Cycle else
                                 return to Forth

that the frequency and length of the frequency changes during the sound. The sound stops when the delay time equals Stop. This means that when defining a sound the user must be sure that this will eventually occur. Stop will eventually be reached for all values of Finc other than powers of two. For powers of two the delay time must equal Stop within one cycle of its 0 to 255 range or the sound will continuously cycle through the same values of frequency. If this occurs, then remove the power supply and reload the program. Let us now look at the word Noise - see figure 1.

  This word is defined by:


CREATE NOISE 58 c, VAR 1 +, 79 c, 58 c,
VAR 2+, 103c, 58c, VAR , 111 c, 58c,
VAR 4+, 87 c, 93 c, 205 c, NOTE, 125 c, 130 c,
111 c, 58c, VAR 3+, 129c, 79c, 188c, 32c,
241 c, 253 c, 233 c,

  The defining word Sound that uses Noise is defined as follows:



DEFINER SOUND
DOES>
 5 0
 DO
  DUP I + C@ VAR
  I + C!
 LOOP
 DROP NOISE CALL
;

 When a word is defined using Sound the parameters of the sound are stored using c followed by a comma. For example, if we want to define a sound A that has the parameters Length 1, Start 1, Stop 255, Finc 1, Linc 0 then this would be done:


SOUND A 1 c, 1 c, 255 c, 1 c, 0 c,

When this word A is called, Sound transfers these numbers to Var and then calls Noise so that the sound is produced. Note that Noise Call is used instead of defining a word like Code because Noise is the only one of the machine-code routines that we wish to call directly. The other two routines cannot be called directly by the user because they end with Ret instead of JP (IY).

  We shall now look at some of the sounds that can be generated using these words. The word A that we just defined gives a short sound whose frequency starts high and then decreases with the length remaining constant at 1. This sound can be lengthened by increasing the length parameter or by introducing a length increment. It can only be shortened by decreasing the difference between Start and Stop. The word A can be used as it is for various purposes, or can be combined with another sound to give a siren effect. This new sound will be similar to A, but the frequency rises instead of falls.


SOUND B 1 c, 255 c, 1 c, 255 c, 0 c,   

  Finc equal to 255 is the same as Finc equal to -1. Therefore the frequency will rise. B can also be used alone, but with A can give a siren:

  : SIREN
    BEGIN
     B A INKEY
    UNTIL
  ;

  This gives a continuous siren until a key is pressed, but obviously the structure can be changed to give a siren of a specific duration. A different siren effect can be produced by defining a new Sound word.

SOUND C 6 c, 1 c, 1 c, 5 c, 0 c,     

If this is speeded up, then it gives the effect of a machine gun. It can be speeded up by first changing the length as in:

  SOUND D 1 c, 1 c, 1 c, 5 c, 0 c,
or by increasing Finc so that more cycles of the 0-255 range are made before the time delay equals Stop as in:
SOUND E 6 c, 1 c, 1 c, 13 c, 0 c,

  The programs can be used to produce other types of sound also. For example, the following word and words of its type can be used to make the noise that is used when something is completed successfully.

SOUND F 35 c, 44 c, 248 c, 15 c, 0 c,

Another interesting sound can be produced using:

SOUND G 10 c, 240 c, 124 c, 45 c, 0 c,

  So far all the sounds that we have looked at so far have a Linc equal to zero. This is because a non-zero value of Linc can, if not thought about, give sounds that are much too long. For example,

SOUND H 6 c, 1 c, 1 c, 13 c, 13 c,

Finc can be used to give reasonable length sounds such as


SOUND K 10 c, 250 c, 242 c 18 c, 1 c,

but the parameters must be thought of more carefully than when Finc equals zero. If you find a sound to use and wish to use only that sound in one particular vocabulary then memory space can be saved by embedding the parameters into the routine Noise. For example if you want to use only Sound E then define Pause and Note as before but chance Noise as shown in figure 2.