www.jupiter-ace.co.uk

Previous Page > Listings Index > Ace Music - Your Computer, July, 1983


Ace Music - Your Computer, July, 1983, page 101
























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
(continued on next page - 102)
  
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

Ace Music - Your Computer, July, 1983, page 102
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.