# The Sound Manager

&BCA7 | SOUND RESET
Action | Resets the sound manager by clearing the sound queues and abandoning any current sounds
Entry | No entry conditions
Exit | AF, BC, DE and HL are corrupt, and all others are preserved
&BCAA | SOUND QUEUE
Action | Adds a sound to the sound queue of a channel
Entry | HL contains the address of a series of bytes which define the sound and are stored in the central 32K of RAM
Exit | If the sound was successfully added to the queue, then Carry is true and HL is corrupt; if one of the sound queues was full, then Carry is false and HL is preserved; in either case, A, BC, DE, IX and the other flags are corrupt, and all others are preserved
Notes | The bytes required to define the sound are as follows byte 0 - channel status byte byte 1 - volume envelope to use byte 2 - tone envelope to use bytes 3&4 - tone period
byte 5 - noise period
byte 6 - start volume
bytes 7&8 - duration of the sound, or envelope repeat count
&BCAD | SOUND CHECK
Action | Gets the status of a sound channel
Entry | A contains the channel to test - for channel A, bit 0 set; for channel B, bit 1 set; for channel C, bit 2 set
Exit | A contains the channel status, BC, DE, HL and flags are corrupt, and all others are preserved
Notes | The channel status returned is bit significant, as follows bits 0 to 2 - the number of free spaces in the sound queue bit 3 - trying to rendezvous with channel A bit 4 - trying to rendezvous with channel B bit 5 - trying to rendezvous with channel C
bit 6 - holding the channel
bit 7 - producing a sound
&BCB0 | SOUND ARM EVENT
Action | Sets up an event which will be activated when a space occurs in a sound queue
Entry | A contains the channel to set the event up for (see SOUND CHECK for the bit values this can take), and HL holds the address of the event block
Exit | AF, BC, DE and HL are corrupt, and all other registers are preserved
Notes | The event block must be initialised by KL INIT EVENT and is disarmed when the event itself is run
&BCB3 | SOUND RELEASE
Action | Allows the playing of sounds on specific channels that had been stopped by SOUND HOLD
Entry | A contains the sound channels to be released (see SOUND CHECK for the bit values this can take)
Exit | AF, BC, DE, HL and IX are corrupt, and all others are preserved
&BCB6 | SOUND HOLD
Action | Immediately stops all sound output (on all channels)
Entry | No entry conditions
Exit | If a sound was being made, then Carry is true; if no sound was being made, then Carry is false; in all cases, A, BC, HL and other flags are corrupt, and all others are preserved
Notes | When the sounds are restarted, they will begin from exactly the same place that they were stopped
&BCB9 | SOUND CONTINUE
Action | Restarts all sound output (on all channels)
Entry | No entry conditions
Exit | AF, BC, DE and IX are corrupt, and all others are preserved
&BCBC | SOUND AMPL ENVELOPE
Action | Sets up avolume envelope
Entry | A holds an envelope number (from 1 to 15), HL holds the address of a block of data for the envelope
Exit | If it was set up properly, Carry is true, HL holds the data block address + 16, A and BC are corrupt; if the envelope number is invalid, then Carry is false, and A, B and HL are preserved; in either case, DE and the other flags are corrupt, and all other registers are preserved
Notes | All the rules of enevelopes in BASIC also apply; the block of the data for the envelope is set up as follows byte 0 - number of sections in the envelope bytes 1 to 3 - first section of the envelope bytes 4 to 6 - second section of the envelope bytes 7 to 9 - third section of the envelope
bytes 10 to 12 - fourth section of the envelope
bytes 13 to 15 - fifth section of the envelope
Each section of the envelope has three bytes set out as follows
byte 0 - step count (with bit 7 set)
byte 1 - step size
byte 2 - pause time or if it is a hardware envelope, then each section takes the following form
byte 0 - envelope shape (with bit 7 not set)
bytes 1 and 2 - envelope period
See also SOUND TONE ENVELOPE below
&BCBF | SOUND TONE ENVELOPE
Action | Sets up a tone envelope
Entry | A holds an envelope number (from 1 to 15), HL holds the address of a block of data for the envelope
Exit | If it was set up properly, Carry is true, HL holds the data block address + 16, A and BC are corrupt; ¡ if the envelope number is invalid, then Carry is false, and A, B and HL are preserved; in either case, DE and the other flags are corrupt, and all other registers are preserved
Notes | All the rules of envelopes in BASIC also apply; the block of the data for the envelope is set up as follows byte 0 - number of sections in the envelope bytes 1 to 3 - first section of the envelope bytes 4 to 6 - second section of the envelope bytes 7 to 9 - third section of the envelope
bytes 10 to 12 - fourth section of the envelope
bytes 13 to 15 - fifth section of the envelope
Each section of the envelope has three bytes set out as follows
byte 0 - step count
byte 1 - step size
byte 2 - pause time
See also SOUND AMPL ENVELOPE above
&BCC2 | SOUND A ADDRESS
Action | Gets the address of the data block associated with a volume envelope
Entry | A contains an envelope number (from 1 to 15)
Exit | If it was found, then Carry is true, HL holds the data block's address, and BC holds its length; if the envelope number is invalid, then Carry is false, HL is corrupt and BC is preserved; in both cases, A and the other flags are corrupt, and all others are preserved
&BCC5 | SOUND T ADDRESS
Action | Gets the address of the data block associated with a tone envelope
Entry | A contains an envelope number (from 1 to 15)
Exit | If it was found, then Carry is true, HL holds the data block's address, and BC holds its length; if the envelope number is invalid, then Carry is false, HL is corrupt and BC is preserved; in both cases, A and the other flags are corrupt, and all others are preserved