Curso de Basic
Sons


  O processador de som do MSX original é o PSG AY-3-8910-A, que possui 3 canais de som, 8 oitavas e 1 canal adicional de ruído. Ele será a base desse curso.
  Entretanto, ao longo dos anos foram lançados novos processadores de som para o MSX, no qual era acoplado via cartucho. São eles o FM-PAC, MSX-Music e o Moonsound.


  O Comando BEEP

  O comando BEEP tem como objetivo reproduzir um sinal de alerta. Ex:
BEEP 
Ok

  Este comando é muito útil para alertar o usuário quando erros acontecem. Veja o exemplo a seguir:
10 ON ERROR GOTO 80
20 PRINT"Divisão de um número:"
30 INPUT"Dividendo";DI
40 INPUT"Divisor";DO
50 Q=DI/DO
60 PRINT"O resultado dessa divisão é:";Q
70 END
80 ' Tratamento do erro
90 PRINT"Erro. Divisão por 0."
100 BEEP
110 END

  A partir do MSX 2, é possível alterar o tipo de som e o volume do BEEP através do comando SET BEEP. Sua sintaxe é:
SET BEEP som, volume
  Onde som e volume variam de 1 a 4.

  Exemplo:
SET BEEP 1,4 
Ok


  O Comando PLAY

  O comando PLAY toca notas musicais e é capaz de tocar até três notas simultaneamente.

  Sintaxe:
PLAY comandos_canal_A, comandos_canal_B, comandos_canal_C

  Os comandos servem ajustar o sintetizador e indicar quais as notas serão tocadas. Eles são inseridos dentro de uma string, logo após o comando PLAY.

  Os comandos disponíveis para o comando PLAY são:

Comando Valores Descrição
Tn 32 a 255 Tempo ou andamento da música. Default é 120.
On 1 a 8 Oitava. Default é 4.
Ln 1 a 64 Duração da nota. Default é 4.
Nn 0 a 96 Especifica uma nota. Quando N0, dá uma pausa.
A-G 1 a 64 Especifica a nota musical.
Rn 1 a 64 Determina uma pausa.
.   aumenta em 50% a duração de uma nota.
Vn 0 a 15 Volume. Default é 8
Mn 0 a 65535 Período do envelope. Veja SOUND.
Sn 0 a 15 Formato do envelope. Veja SOUND.


  A duração da nota ou pausa pode ser:

Duração 1 2 4 8 16 32 64
Nota 𝅝 𝅗𝅥 𝅘𝅥 𝅘𝅥𝅮 𝅘𝅥𝅯 𝅘𝅥𝅰 𝅘𝅥𝅱
Pausa 𝄻 𝄼 𝄽 𝄾 𝄿 𝅀 𝅁


  O exemplo a seguir irá tocar as notas Dó, Ré e Mi em seqüência no canal A, com volume igual a 15 (máximo), na quarta oitava e duração de cada nota igual a 4:
PLAY "V15O4L4CDE" 

  As notas são representadas pelas letras de A a G, onde:
     
  • - C é o Dó
  • - D é o Ré
  • - E é o Mi
  • - F é o Fá
  • - G é o Sol
  • - A é o Lá
  • - B é o Si

  O sustenido (♯) é obtido acrescentando-se o sinal de "#" ou "+" à letra da nota. Já o bemol (♭) é obtido através do símbolo "-". Ex:
PLAY "C#" 
PLAY "D-" 
  A primeira linha toca um Dó sustenido, enquanto que a segunda um Ré bemol. Observando o desenho abaixo, as notas são equivalentes.




  Neste próximo exemplo, vamos criar um programa que toca sons em dois canais ao mesmo tempo:
10 PLAY "V15O5","V15O2"
20 PLAY "L8CDEFFEDC","L2AC"

  No capítulo extra "lendo partituras", será ensinado como ler uma pertitura simples e convertê-la para o comando PLAY.



  O Comando SOUND

  O comando SOUND permite enviar dados diretamente ao PSG [1][2]. Sua sintaxe é:
SOUND número_do_registro, valor

  Os registros do PSG são:

Registro Valores Descrição
0 0 a 255 Período do canal A
1 0 a 15
2 0 a 255 Período do canal B
3 0 a 15
4 0 a 255 Período do canal C
5 0 a 15
6 0 a 31 Freqüência do ruído
7 0 a 63 Seleção de canal para som e ruído
8 0 a 15 Volume do canal A
9 0 a 15 Volume do canal B
10 0 a 15 Volume do canal C
11 0 a 255 Período do envelope
12 0 a 255
13 0 a 14 Forma do envelope



  O conceito de sinal sonoro

  De forma a enterder melhor o comando SOUND, vajamos alguns conceitos:
△
│ Amplitude
│
│----   -----   -----
│   |   |   |   |   |
│   |   |   |   |   |
┼─────────────────────────────▷
│   |   |   |   |             Tempo
│   |   |   |   |
│   -----   -----
│   
│   |-------|
│    1 ciclo
  A forma da onda desse esquema é "quadrada".


  Como calcular o período do sinal no PSG

  O PSG utiliza a metade da freqüẽncia de clock do Z-80. Assim, temos:
Clock = 35756110 Hz
FC = 1787805,5 Hz

  O período base do PSG é 16 vezes o período desse clock.
  Dessa forma, a relação entre período do PSG e freqüência de um sinal [2] é:
      FC
T = ------    
    16 X F 

  Por exemplo, uma freqüência de 1000 Hz terá um período igual 112 segundos.

  O manual do Expert MSX [1] apresenta três programas em Basic para calcular o valor dos registros associados ao perído. Vamos a eles:

  Canais A, B ou C:
10 ' Para R0 a R5
20 INPUT"Qual a freqüência";F
30 A=3575611#/8192/F
40 H=INT(A)
50 L=INT(0.5+256*(A-H))
60 PRINT"Alto (ímpar)=";H,"Baixo (par)=";L

  Canais de ruído:
10 ' Para R6
20 INPUT"Qual a freqüência do ruído";F
30 R6=3575611#/32/F
40 PRINT"O valor a ser atribuído ao registro 6 é:";INT(R6+.5)

  Envelope:
10 ' Para R11 a R12
20 INPUT"Qual a freqüência";F
30 A=3575611#/131072!/F
40 H=INT(A)
50 L=INT(0.5+256*(A-H))
60 PRINT"Alto (12)=";H
70 PRINT"Baixo (par)=";L


  Seleção de canal - Mixer

  A seleção do canal é feita através do registro 7, no qual o valor atribuído a ele é a subtração do valor 255 pela soma das seguintes opções [1]:
  Ex: ligar o som no canal B e o ruído no canal C:
SOUND 7, 255-(2+32)


  Gerando sons e ruídos

  Com o que foi visto até aqui, podemos gerar sons e ruídos através do comando SOUND.

  A nota Lá central de um piano possui uma freqüência de 440 Hz [2]. No MSX, é a nota Lá da oitava número 4.
  A tarefa agora é reproduzir essa nota no canal A.
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 A=3575611#/8192/F
40 SOUND 1, INT(A)
50 SOUND 0, INT(0.5+256*(A-INT(A)))
60 ' Mixer - seleciona som em A
70 SOUND 7,255-1
80 ' Volume
90 SOUND 8,15

  Para conferir o som da nota Lá, digite o programa abaixo:
10 PLAY"V15O4A"

  A nota Lá obtida através do comando PLAY tem uma duração definida, enquando a gerada pelo SOUND é infinita.
  Para interromper o som, mude a freqüência de A para zero ou o volume de A para zero.

  Agora, vamos gerar um ruído de 9800 Hz no canal B:
10 ' Determina a freqüência de 9800 Hz em A
20 F=9800
30 A=3575611#/32/F
40 SOUND 6, A
60 ' Mixer - seleciona ruído em B
70 SOUND 7,255-16
80 ' Volume
90 SOUND 9,15


  Moldando a onda - envelopes

  Foi visto até aqui que o sinal gerado do tipo "som" possui freqüência e volume constante.
  A proposta dos envelopes é criar uma variação de volume do sinal ao longo do tempo. Essa variação pode ser feita de forma manual ou automática, esta através do conjunto de formas envelope pré-definidas do PSG.

  Vejamos como funciona um envelope.

  Considere o seguinte sinal de "som":
△
│ Amplitude
│
│----   -----   -----
│   |   |   |   |   |
│   |   |   |   |   |
┼──────────────────────▷
│   |   |   |   |     Tempo
│   |   |   |   |
│   -----   -----

  E o seguinte envelope:
△
│ Amplitude
│
│----
│    -----
│         -----     
┼──────────────-----+──▷
│                     Tempo
│                 
│                

  A onda resultante é:
△
│ Amplitude
│
│----   
│   |   
│   |   -----
┼─────────────-----────▷
│   |   |             Tempo
│   -----   
│           

  Podemos reproduzir o fenômeno acima no exemplo da nota Lá.
  Naquele programa, o volume era constante e possuia valor igual a 15. A idéia aqui é diminuir linearmente o volume de 15 até 0, reproduzindo a forma do envelope.
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 A=3575611#/8192/F
40 SOUND 1, INT(A)
50 SOUND 0, INT(0.5+256*(A-INT(A)))
60 ' Mixer - seleciona som em A
70 SOUND 7,255-1
80 ' Volume
90 FOR V=15 TO 0 STEP -.01
100 SOUND 8,V
110 NEXT V

  No próximo exemplo, vamos criar um envelope periódico para a nota Lá.
  Nesse caso, o volume oscila entre 6 a 15 ao longo do tempo.
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 A=3575611#/8192/F
40 SOUND 1, INT(A)
50 SOUND 0, INT(0.5+256*(A-INT(A)))
60 ' Mixer - seleciona som em A
70 SOUND 7,255-1
80 ' Volume
90 FOR V=15 TO 6 STEP -.1
100 SOUND 8,V
110 NEXT V
120 FOR V=6 TO 15 STEP .1
130 SOUND 8,V
140 NEXT V
150 GOTO 90

  Forma do envelope:
△
│ Amplitude
│
│----     -----
│    -----     -----
│
┼──────────────────────▷
│                     Tempo
│                 
│       

  Uma vez entendido o conceito de envelope, podemos utilizar os envelopes de fábrica do PSG. Na realidade, esses envelopes controlam automaticamente o volume do sinal de som, baseado em uma freqüência. Note que a freqüência do envelope aqui é diferente da freqüência do sinal de som.




  Lista de envelopes:

Valor do registro 13 Forma da onda
0, 1, 2, 3 ou 9 | ◺            
4, 5, 6, 7 ou 15 | ◿            
8 | ◺◺◺◺◺◺◺
10 | ◺△△△△△△
11 | ◺|▔▔▔▔▔
12 | ◿◿◿◿◿◿◿
13 | /▔▔▔▔▔▔
14 | △△△△△△△

  O envelope que foi feito manualmente para a nota Lá corresponde ao envelope 0.

  Vamos modificar o programa anterior, de forma que utilizemos o envelope do PSG.
  Desejamos fazer o volume cair em 4 segundos. A freqüência F correspondente a 4 segundos é 1/4 ou 0.25 Hz.
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 A=3575611#/8192/F
40 SOUND 1, INT(A)
50 SOUND 0, INT(0.5+256*(A-INT(A)))
60 ' Mixer - seleciona som em A
70 SOUND 7,255-1
80 ' Envelope
90 SOUND 8,16
100 FE=0.25
110 A=3575611#/131072!/FE
120 SOUND 12, INT(A)
130 SOUND 11, INT(0.5+256*(A-INT(A)))
140 SOUND 13,0
  Obs: quando utilizamos envelopes para controlar o volume, indicamos o volume do respectivo canal com o valor igual a 16.

  O envelope que utilizamos não é periódico. Entretanto, se utilizarmos o envelope número 14, por exemplo, vamos produzir um "vibrato" na nota Lá. Mudanças:
100 FE=30
  e
140 SOUND 13,14



  Referências:

  [1] - Livro: Linguagem Basic MSX, editora Aleph, 5a. Edição, 1987.
  [2] - Livro: MSX Música, José Maurício Bussab, McGraw Hill, 1987.


MARMSX/CURSOS/Basic