SOUND
SOUND is a BASIC command to make sounds.
Availability | Present in all versions of BBC BASIC. | |
Syntax | SOUND <numeric>,<numeric>,<numeric>,<numeric>
| |
Token (hex) | D4 (command)
| |
Description | Generates sounds. |
Contents
Description
SOUND
calls OSWORD &07 to generate sounds. It is most
commonly used to generate sounds with the internal sound generator, but it
can also be used to create speech or MIDI sounds, as specified by the
channel parameter.
Defined channel numbers
&0xxx | Sound generator |
&1xxx | Sound generator |
&20xx | Watford Electronics Speech system[1] |
&FExx | MIDI control [2] |
&FFxx | Speech system [3] |
Specification
Internal sound system
SOUND &0xxx,volume,pitch,duration
SOUND &1xxx,ignored,ignored,ignored
The channel number encodes &HSFC where:
- H: Hold 0 or 1
- S: Sync 0 to 15, 0 to 3 usually implemented
- F: Flush 0 or 1, 2-15 reserved
- C: Channel 0 to 15, 0 to 3 usually implemented
The internal sound system implements 4 channels (1 on the Electron), but extensions can increase the number of supported channels. For example, the Electron Sound Expansion supports four channels, and MIDI redirection can support 16 channels treating each channel as a polyphonic note. Channel 0 is conventionally a 'noise' channel.
Channel parameter ----------------- SOUND &xxxC,vol,pitch,dur play a note on channel C SOUND &xx0x,vol,pitch,dur don't flush channel SOUND &xx1x,vol,pitch,dur flush channel before playing note SOUND &xx2x,vol,pitch,dur \ to } future expansion SOUND &xxFx,vol,pitch,dur / SOUND &xSxx,vol,pitch,dur synchronise with S other channels SOUND &0xxx,vol,pitch,dur play specified note SOUND &1xxx,ign,ign,ign continue the current note on the channel Volume parameter ---------------- SOUND chn,-32768,pitch,dur \ to } future expansion SOUND chn,-16 ,pitch,dur / SOUND chn,-15 ,pitch,dur \ to } play a note with an envelope SOUND chn, -1 ,pitch,dur / SOUND chn, 0 ,pitch,dur stop note (zero volume) SOUND chn, 1 ,pitch,dur \ to } play a note with an envelope SOUND chn,16 ,pitch,dur / SOUND chn,17 ,pitch,dur \ to } future expansion SOUND chn,32767 ,pitch,dur / Pitch parameter --------------- SOUND chn,vol,&0000,dur \ to } 8-bit pitch &xx00 to &xxFF SOUND chn,vol,&00FF,dur / SOUND chn,vol,&0100,dur \ to } 8-bit pitch &xx00 to &xxFF (see notes) SOUND chn,vol,&03FF,dur / SOUND chn,vol,&x400,dur \ to } 15-bit pitch &4000+&ORRR, O=octave, RRR=residual, &4000=middle C (expansion) SOUND chn,vol,&7FFF,dur / SOUND chn,vol,&8000,dur \ to } 15-bit pitch change &C000+delta (expansion) SOUND chn,vol,&FFFF,dur / 8-bit pitches are 48 units per octave, with middle C=101 (see notes) 15-bit pitches are &1000 units per octave, with middle C=&4000 Duration parameter ------------------ SOUND chn,vol,pitch,-32768 \ to } future expansion SOUND chn,vol,pitch,-2 / SOUND chn,vol,pitch,-1 play note forever (until flushed) SOUND chn,vol,pitch,0 \ to } play for specified 1/20th second SOUND chn,vol,pitch,32767 /
Watford Speech
SOUND &20xx,word,library,0
Watford speach commands can be sent with SOUND &2000, which is usually coded as SOUND 8192.
Bit 0-7 of the channel number is ignored.
MIDI control
SOUND &FExx,command,note,velocity
MIDI commands can be sent with SOUND &FEFF and SOUND &FEFE which are usually coded as SOUND -257 and SOUND -258.
- SOUND -257,Command,Note,Velocity - Send to current channel (channel=&FEFF)
- SOUND -258,Command,Note,Velocity - Send raw MIDI command (channel=&FEFE)
- SOUND -257 or -258,Command<0,num,num - MIDI system control
If Command is &0000-&007F it is a MIDI data byte and sent straight to the MIDI system unchanged. This allows extended sequences to be sent, such as MIDI System Exclusives.
If Command is &0080-&00FF it is a MIDI command byte. Command bytes &80-&EF are channel-specific commands. SOUND -258 uses them as supplied, SOUND -257 sends them to the current MIDI channel by adding the current channel to the bottom nybble. So, if the current MIDI channel is 4, SOUND -257,&80... will send to MIDI channel 4, and SOUND -257,&8F should send to MIDI channel 3. Some implementations do not correctly round the channel number within the nybble in the second example.
Note and Velocity are 7-bit numbers with bit 7 and higher ignored, other than MIDI command &Ex which can specify a 14-bit Note number.
SOUND -257,&0000,ignore,ignore \ to } send data byte SOUND -257,&007F,ignore,ignore / SOUND -257,&0080,param1,param2 \ to } send command and 0, 1 or 2 data bytes SOUND -257,&00FF,param1,param2 / SOUND -257,&0100,param1,param2 \ to } reserved for expansion SOUND -257,&7FFF,param1,param2 / SOUND -257,-32768,param1,param2 \ to } reserved for expansion SOUND -257,-3 ,param1,param2 / SOUND -257,-2 ,param1,param2 set MIDI channel SOUND -257,-1 ,param1,param2 silence all channels SOUND -257 can also be SOUND -258 SOUND -259 (&FEFD) \ to } reserved for expansion SOUND -512 (&FE00) /
Speech system
SOUND &FFxx,command,0,0
The channel number indicates what to do with the command.
- SOUND &FFFx,number,0,0 - speak from PHROM 15-x with word number. From a coding view this is usually written as SOUND -1,n,0,0 to SOUND -16,n,0,0.
- SOUND &FFBx,address,0,0 - speak from PHROM 15-x from the absolute address.
- SOUND &FF60,command,0,0 - start sending speech using phoneme 'command.
- SOUND &FF00,command,0,0 - continue sending speech using phoneme 'command.
SOUND &FF01-&FF7F actually send the bottom byte as the Speech command to use.
Trivia
In the original development of BBC BASIC, the sound command was BEEP
which can be seen from the token position for SOUND
, alphabetically with other keywords starting with 'B'[4]:
Originally: Became: D4: BEEP D4: SOUND D5: BPUT D5: BPUT D6: CALL D6: CALL D7: CHAIN D7: CHAIN etc.
See also
See OSWORD 7 for implementation
References
Jgharston 00:30, 2 January 2008 (UTC) Jgharston (talk) 23:58, 7 March 2020 (CET)