Curso de Jogos em Basic
Criando sons


Você está em: MarMSX >> Cursos >> Jogos em Basic   Nesse capítulo extra veremos como podemos utilizar o comando SOUND do Basic para gerar efeitos sonoros para um jogo.
Conceitos do Sound do MSX   O comando SOUND do Basic do MSX é capaz de modificar os registros do PSG, o chip de som do MSX.

  O capítulo 11 do curso de Basic entra em detalhes do funcionamento do SOUND. Aqui, vamos somente focar nos pontos do SOUND que nos interessam.

  A sintaxe do sound é:
SOUND número_do_registro, valor

  Os registros que usaremos são:
 0/1  - Período do canal A
  7   - Seleção para canal e ruído
  8   - Volume do canal A (0-15. 16=envelope) 
11/12 - Peíodo do envelope
 13   - Forma do envelope

  Formato do envelope (registro 13):
0-3 / 9 	| ◺            
4-7 / 15 	| ◿            
8 		| ◺◺◺◺◺◺◺
10 		| ◺△△△△△△
11 		| ◺|▔▔▔▔▔
12 		| ◿◿◿◿◿◿◿
13 		| /▔▔▔▔▔▔
14 		| △△△△△△△ 
Analisando um sinal sonoro   Vamos analisar o espectro do som de um apito para podermos entender os conceitos de período, frequencia e envelope.   O envelope é a variação de volume de um sinal ao longo do tempo. Conforme podemos observar na imagem acima, o som do apito aumenta e abaixa de volume diversas vezes ao longo do tempo. Vejamos a ampliação do espectro para observarmos melhor o envelope.   Nesse gráfico, observamos duas formas de onda principais: o sinal mais externo e com menor freqüência é o envelope. O sinal mais interno e de maior freqüência é o sinal sonoro, no qual indica o quão agudo/grave é o som.

  Ao observarmos a figura acima, constatamos que o formato do envelope é parecido com o seguinte gráfico:
 --------  --------
/        \/        \ ...

  Podemos selecionar um período do envelope para medir o tempo do ciclo.   Observando a figura acima, constatamos que os intervalos mínimos de tempo na régua são de 0,0005 segundos. Assim, concluímos que o período do envelope varia de 0,4275 a 0,4495 segundos e o seu valor é 0,022 segundos. Então, a freqüência é 1/T ou F=45,45 Hz.

  Ao ampliarmos mais, podemos medir a freqüência do sinal mais interno.   O sinal varia de 0,43895 a 0,43930. Assim T=0,00035 segundos. F=2857,14 Hz.

  No capítulo 11 do curso de Basic, tem um programa que gera um som a partir das freqüências do sinal e do envelope.
10 ' Determina a freqüência em A
20 F=freq_sinal
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=freq_envelope
110 A=3575611#/131072!/FE
120 SOUND 12, INT(A)
130 SOUND 11, INT(0.5+256*(A-INT(A)))
140 SOUND 13,forma_envelope

  O apito tem um som agudo e um volume aumenta e diminui rapidamente ao longo do tempo. Assim, podemos usar a forma de envelope número 14.
Som: apito

Sinal
T = 0,00035 segundos
F = 2857,14 Hz

Envelope
T = 0,022 segundos
F = 45,45 Hz
Tipo = 14

  O programa em Basic para gerar um som de apito é:
10 ' Determina a freqüência em A
20 F=2857.14
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=45.45
110 A=3575611#/131072!/FE
120 SOUND 12, INT(A)
130 SOUND 11, INT(0.5+256*(A-INT(A)))
140 SOUND 13,14

  O correto seria usar um formato de onda parecido com o formato do envelope visto mais acima. Entretanto, para usarmos formas pré-definidas do envelope, teremos que usar a forma 14, que é a mais parecida com o que desejamos.

  Podemos estabelecer um intervalo para o apito soar e depois interrompê-lo.
150 FOR T=1 TO 500 : NEXT T
160 SOUND 8,0 ' Pára o apito
  Notas:   Para inserir diretamente os valores no SOUND, podemos usar as seguintes fórmulas:
      FC	        FC
T = ------	T = ---------
    16 X F	    256 x Fenv

Onde: FC = clock_z80 / 2 = 1787805
A freqüência do sinal é quem varia   Há sons em que a freqüência do sinal varia ao longo do tempo. Isso ocorre em eventos em que a força geradora do sinal varia de intensidade, como um assobio e uma rajada de vento. Quanto mais forte a força, mais agudo o som.

  No próximo exemplo, vamos reproduzir o som de um assobio. Diferente do apito, o som começa em uma intensidade, diminui, e logo aumenta.
  Para reproduzi-lo, vamos manter o volume constante e variar a freqüência. No primeiro instante, a freqüência diminui (o período aumenta). Logo em seguida, a freqüência aumenta.
10 ' Determina a freqüência em A
20 SOUND 0,40
30 SOUND 1,0
40 ' Mixer - seleciona som em A
50 SOUND 7,255-1
60 SOUND 8,13
70 FOR F=40 TO 50 STEP .1 : SOUND 0,F: NEXT
80 FOR F=50 TO 30 STEP -.3 : SOUND 0,F: NEXT
90 FOR T=1 TO 25:NEXT T
100 SOUND 0,0

  Nota: para encontrar o período inicial de 40 para o assobio, fui variando o valor de SOUND 0,<n> até encontrar a mesma freqüência do meu assobio.

  Vamos reproduzir os sons da sirene de uma ambulância e da polícia, que também variam a força do sinal (freqüência).
Som: Ambulância

Sinal
T = 0,00065 segundos
F = 1538,46 Hz

TMSX = 73
MBS = TMSX \ 256 = 0		
LSB = TMSX MOD 256 = 73

  Programa em Basic da sirene da ambulância.
10 ' Determina a freqüência em A
15 T=73 : P=0.05
20 SOUND 0,T
30 SOUND 1,0
40 ' Mixer - seleciona som em A
50 SOUND 7,255-1
60 SOUND 8,13
70 FOR F=T-10 TO T+10 STEP P : SOUND 0,F: NEXT
80 FOR F=T+10 TO T-10 STEP -P : SOUND 0,F: NEXT
90 GOTO 70
  A variável "P" controla o tempo de variação da freqüência.

Som: Sirene da polícia

Sinal
T = 0,000705 segundos
F = 1418,44 Hz

TMSX = 79
MBS = TMSX \ 256 = 0		
LSB = TMSX MOD 256 = 79

  Programa em Basic da sirene da polícia.
10 ' Determina a freqüência em A
15 T=79 : P=0.3
20 SOUND 0,T
30 SOUND 1,0
40 ' Mixer - seleciona som em A
50 SOUND 7,255-1
60 SOUND 8,13
70 FOR F=T-10 TO T+10 STEP P : SOUND 0,F: NEXT
80 FOR F=T+10 TO T-10 STEP -P*3 : SOUND 0,F: NEXT
90 A = STICK(0)
100 IF A=1 THEN P=P+.05 : IF P>0.5 THEN P=.5 
110 IF A=5 THEN P=P-.05 : IF P<0.05 THEN P=.05
120 GOTO 70
  Deixe a sirene mais rápida ou mais lenta usando as teclas do cursor para cima e para baixo. Observe que a "subida" de freqüência da polícia é 3 vezes mais rápida que a descida (linha 80).

  No próximo exemplo, vamos simular o efeito Doppler para a sirene da polícia. Quando ela se aproxima, sua freqüência é alta, vai diminuindo e o volume aumenta. Quando se afasta, o volume cai e a freqüência continua diminuindo. No instante que a polícia passa por você, possui a freqüência normal e volume máximo.
10 ' Determina a freqüência em A
15 T=79 : P=0.3 : V=10
20 SOUND 0,T
30 SOUND 1,0
40 ' Mixer - seleciona som em A
50 SOUND 7,255-1
60 SOUND 8,V : T=T+20 : M=1
70 FOR F=T-10 TO T+10 STEP P : SOUND 0,F: NEXT
80 FOR F=T+10 TO T-10 STEP -3*P : SOUND 0,F: NEXT
90 IF M=1 THEN T=T+2:V=V+.5 ELSE T=T+2:V=V-.5
100 IF V=15 THEN M=2
110 SOUND 8,V
120 IF V=5 THEN END
130 GOTO 70
Cuidados com sons repetidos e seqüenciais   Vimos que os processadores Z80 e PSG trabalham de forma independente. Dessa forma, quando enviamos um determinado som para o PSG com um envelope de "fábrica", ele irá trabalhar de forma independente do Z80 para produzir aquele som por determinado período (tempo).
  Quando criamos uma seqüência de sons (ou repetimos o mesmo som) com um determinado envelope habilitado, devemos incluir uma pausa para que o PSG tenha tempo de gerar corretamente o som. Caso contrário, o som seguinte "atropela" o som corrente, de forma que este não seja percebido.
  No jogo Alcatraz, a fuga impossível, uma seqüência de tiros é disparada na tela de abertura, a partir do mesmo som. Um intervalo é feito, para que o som de cada tiro possa soar antes que outro tiro soe.
  Veja o programa a seguir.
10 FOR N=0 TO 9
20 SOUND 7,7:SOUND 8,16:SOUND 6,25:SOUND 13,0:SOUND 12,20
30 FOR M=0 TO 100:NEXT M
40 NEXT N
  Experimente comentar a linha 30 (coloque REM ou ' no inicio da linha). Apenas um tiro é percebido.

  Ao aumentar o diminuir o intervalo da linha 30, modificamos o tempo de disparo entre as balas.
Sons de programas e jogos   Nesta seção veremos alguns exemplos de sons publicados em livros e jogos.
Som de helicóptero - livro Dominando o Expert
Sinal: 0 24 (24)	F = 4655,74 Hz
       Canal C		V = Envelope
Ruído: 22		F = 5078,99 Hz
Envelope: 2 90  	F = 11,60 Hz
          (602)		T = 0,086 seg.
Tipo envelope: 12
10 FOR I=0 TO 13
20 READ S
30 SOUND I,S
40 NEXT I
50 DATA 0,0,0,0,24,0,22,3,2,2,16,90,2,12
60 DATA 0,0,0,0,0,0,21,247,16,0,0,100,60,0
Notas:

♬ - A linha 60 não é lida por esse programa. Ela reproduz o som de tiro (mais adiante), se comentada a linha 50.
♬ - O volume dos canais A e B controla o nível de ruído.


Som de mar - livro Dominando o Expert
Sinal: Não usa.
Ruído: 5 		F = 22347,56 Hz
Envelope: 180 0 	F = 0,15 Hz
          (46080)	T = 6,67 seg.
Tipo envelope: 10
10 SOUND 8,16            ' Habilita envelope
20 SOUND 7,(1+2+4+16+32) ' Mixer
30 SOUND 6,5             ' Freq. ruído
40 SOUND 13,10           ' Tipo envelope
50 SOUND 12,180          ' Freq. envelope
60 SOUND 11,0            ' Freq. envelope
Nota:

♬ - O som leva 6,67 para aumentar de 0 a 15 e voltar a 0 (ciclo).


Som de tiro - livro Dominando o Expert
Sinal: Não usa.
Ruído: 20		F = 5586,89 Hz
Envelope: 60 100	F = 0,45 Hz
          (15460)	T = 2,22 seg.
Tipo envelope: 0
10 FOR A=0 TO 13
20 READ B
30 SOUND A,B
40 NEXT
50 DATA 0,0,0,0,0,0,20,247,16,0,0,100,60,0
Nota:

♬ - O tempo de duração do tiro é de 2,2 segundos.


Jogar água no fogo - jogo Alcatraz
Sinal: Não usa.
Ruído: 0		F = 111737,81 Hz
Envelope: 50 0		F = 0,55 Hz
          (15460)	T = 1,82 seg.
Tipo envelope: 0
SOUND 7,7:SOUND 8,16:SOUND 6,0:SOUND 13,0:SOUND 12,50

Desativar o alarme - jogo Alcatraz
Sinal: 5 Q (1280 + Q)	F = 22347,56 Hz
       Canal A		V = 14
Ruído: Não usa.
Envelope: Não usa.
SOUND 7,56:SOUND 8,14:SOUND 1,5:FORQ=0TO255:SOUND 0,Q:
NEXT:SOUND 8,0
Nota:

♬ - Varia a freqüência na parte LSB do canal A.


Serra ligada - jogo Alcatraz
Sinal: 15 0 (3840)	F = 29,10 Hz
       Canal A		V = envelope
Ruído: Não usa.
Envelope: 10 0		F = 2,72 Hz
          (2560)	T = 0,37 seg.
Tipo envelope: 14
SOUND 7,56:SOUND 1,15:SOUND 8,16:SOUND 13,14:SOUND 12,10

Cortar a porta com serra - jogo Alcatraz
Sinais: 1 255 (511)	F = 218,67 Hz
	Canal A		V = 15
	7 255 (2047)	F = 54,58 Hz
        Canal B		V = 15
Ruído: Não usa.
Envelope: Não usa.
SOUND 7,56:SOUND 8,15:SOUND 9,15:SOUND 1,2:SOUND 3,7:
SOUND 0,255:SOUND 2,255:FORQ=1TO500:NEXT:
SOUND 1,0:SOUND 3,5 ' Muda ambas freq
FOR Q=1 TO 1000:NEXT:BEEP
Notas:

♬ - A um final de um tempo, os dois sinais variam a freqüência.
♬ - O BEEP finaliza o som.


Pá cavando - jogo Alcatraz
Sinal: Não usa.
Ruído: 6		F = 18622,97 Hz
Envelope: 10 0		F = 2,72 Hz
          (2560)	T = 0,37 seg.
Tipo envelope: 12
SOUND 7,7:SOUND 6,10:SOUND 8,16:SOUND 13,12:SOUND 12,10:
FOR Q=0 TO 2500:NEXT:SOUND 8,0

Queimar - jogo Alcatraz
Sinal: Não usa.
Ruído: 30		F = 3724,59 Hz
Envelope: 30 0		F = 0,91 Hz
          (7680)	T = 1,10 seg.
Tipo envelope: 5
SOUND 7,7:SOUND 6,30:SOUND 8,16:SOUND 13,5:SOUND 12,30

Disparo arma de fogo - jogo Alcatraz
Sinal: Não usa.
Ruído: 26		F = 4297,61 Hz
Envelope: 20 0		F = 1,36 Hz
          (5120)	T = 0,74 seg.
Tipo envelope: 0
SOUND 7,7:SOUND 8,16:SOUND 13,0:SOUND 6,28:SOUND 12,20

Vários tiros na abertura - jogo Alcatraz
Sinal: Não usa.
Ruído: 25		F = 4469,51 Hz
Envelope: 20 0		F = 1,36 Hz
          (5120)	T = 0,74 seg.
Tipo envelope: 0
FOR N=0 TO 9
SOUND 7,7:SOUND 8,16:SOUND 6,25:SOUND 13,0:SOUND 12,20
FOR M=0 TO 100:NEXT M
NEXT N



  Referências:

  [1] - Livro: Dominando o Expert, editora Aleph, 5a. Edição, 1987.
  [2] - Livro: Linguagem Basic MSX, editora Aleph, 5a. Edição, 1987.



<< Anterior BasGame Próxima >>