SOUND

From BeebWiki
Revision as of 21:45, 17 February 2020 by Jgharston (talk | contribs) (Some errors, will clean up.)
Jump to: navigation, search

SOUND is a BASIC command to make sounds.

SOUND
Availability Present in all original versions of BBC BASIC.
Syntax SOUND <numeric>,<numeric>,<numeric>,<numeric>
Token (hex) D4 (command)
Description Generates sounds.

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]

Implementation

Internal sound system

SOUND &0xxx,volume,pitch,duration

SOUND &1xxx,volume,pitch,duration

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 non-0 (usually 0 or 1)
  • 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.

The volume, pitch and duration are 8-bit numbers with bit 8 and higher ignored.

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,Control<0,num,num - MIDI system control

If Command is &0000-&007F it is a MIDI data byte and sent stright 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.

Speech system

SOUND &FFxx,command,0,0 The channel number indicates what to do with the command, the command is an 8-bit number with bit 8 and higher ignored.

  • 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.

Summary

SOUND Channels
--------------
%000H SSSS FFFF CCCC  Internal sound system
%0010 0000 xxxx xxxx  Watford Electronics Speech
%1111 1110 1111 111x  MIDI control
%1111 1111 xxxx xxxx  Speech

Sound system
------------
SOUND %000hssss:xxxfcccc, %xxxxxxxx:xxxvvvvv, %xxxxxxxx:pppppppp, %xxxxxxxx:dddddddd - Make sound

Watford Speech
--------------
SOUND %00100000:xxxxxxxx, %xxxxxxxx:wwwwwwww, %xxxxxxxx:llllllll, %xxxxxxxx:xxxxxxxx - Speak word

MIDI
----
(note: some of this is wrong)
SOUND %11111110:xxxxcccc, %0xxxxxxx:0ddddddd, %xxxxxxxx:xxxxxxxx, %xxxxxxxx:xxxxxxxx - MIDI data
SOUND %11111110:xxxxcccc, %0xxxxxxx:10dddddd, %xxxxxxxx:xnnnnnnn, %xxxxxxxx:xvvvvvvv - MIDI note
SOUND %11111110:xxxxcccc, %0xxxxxxx:110ddddd, %xxxxxxxx:xnnnnnnn, %xxxxxxxx:xxxxxxxx - MIDI change
SOUND %11111110:xxxxcccc, %0xxxxxxx:1110dddd, %xxvvvvvv:vvvvvvvv, %xxxxxxxx:x0000000 - MIDI bend
SOUND %11111110:xxxxcccc, %0xxxxxxx:1110dddd, %xx000000:0vvvvvvv, %xxxxxxxx:xvvvvvvv - MIDI bend
SOUND %11111110:xxxxcccc, %0xxxxxxx:1111dddd, %xxxxxxxx:xxxxxxxx, %xxxxxxxx:xxxxxxxx - MIDI system
SOUND %11111110:1111111c, %1xxxxxxx:1111dddd, %xxxxxxxx:nnnnnnnn, %xxxxxxxx:xxxxxxxx - MIDI control
                                    \--\/--/
                                  MIDI command if b15=0 and b7=0
Speech
------
SOUND %11111111:11xxrrrr, %xxxaaaaa:aaaaaaaa, %xxxxxxxx:xxxxxxxx, %xxxxxxxx:xxxxxxxx - Speak word
SOUND %11111111:10xxrrrr, %xxaaaaaa:aaaaaaaa, %xxxxxxxx:xxxxxxxx, %xxxxxxxx:xxxxxxxx - Speak from address
SOUND %11111111:0cccxxxx, %dddddddd:dddddddd, %xxxxxxxx:xxxxxxxx, %xxxxxxxx:xxxxxxxx - Speak data word
SOUND %11111111:00000000, %dddddddd:dddddddd, %xxxxxxxx:xxxxxxxx, %xxxxxxxx:xxxxxxxx - Speak data word
                \--\/--/
                   if b7=0, if<>0, sent to Speech as command, normally use &FF60 for Speak External

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.

References

Jgharston 00:30, 2 January 2008 (UTC)