Curso de Basic
🎹 Sons 🎵
Você está em: MarMSX >> Cursos >> BASIC
Nesse capítulo iremos falar sobre os conceitos básicos de som e música.
O processador de som original do MSX é o PSG AY-3-8910-A, que possui 3 canais de som, 8 oitavas e 1 canal adicional de ruído. Ele é um processador de sons que funciona de modo independente do processador principal, ou seja, possui autonomia para funcionar.
O PSG será a base desse curso, apesar de que ao longo dos anos, foram lançados novos processadores de som para o MSX, no qual eram acoplados via cartucho. São eles o FM-PAC, SCC, MSX-Audio e o Moonsound.
Introdução
Para a compreensão dos tópicos a seguir, veremos alguns conceitos básicos sobre sons.
O evento sonoro é a menor unidade possível de som. Por exemplo, uma nota tocada em um piano, o som de um pingo d'água batendo no chão, uma freada de carro etc.
Um evento sonoro é composto por quatro características [2]:
- Duração - tempo de duração do evento sonoro.
- Afinação - a freqüência do som que está sendo emitido. Por exemplo, um Dó possui afinação diferente de um Ré.
- Intensidade ou volume - como o nome diz, mede a intensidade do som.
- Timbre - a característica do som. Por exemplo, a mesma nota Dó tocada com a mesma intensidade e mesmo tempo por um piano e uma flauta soam diferentes.
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 para 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. |
Notas musicais
As sete notas musicais clássicas são: Dó, Ré, Mi, Fá Sol, Lá e Si.
Cada nota é representada pelas letras do alfabeto entre A a G, conforme o esquema abaixo:
- - C é o Dó
- - D é o Ré
- - E é o Mi
- - F é o Fá
- - G é o Sol
- - A é o Lá
- - B é o Si
|
|
O exemplo a seguir toca a nota Dó através do comando PLAY.
PLAY "C" ↵
Entretanto, a escala completa e usual é a escala cromática, que possui doze as diferentes notas musicais: Dó, Dó#/Ré♭, Ré, Ré#/Mi♭, Mi, Fá, Fá#/Sol♭, Sol, Sol#/Lá♭, Lá, Lá#/Si♭, Si.
O esquema a seguir apresenta a escala cromática e as 12 notas representadas nas teclas de um piano.
Entre cada uma dessas notas há um intervalo regular de meio-tom. Dois intervalos de meio-tom constituem um tom. Veja o exemplo a seguir.
Intervalo de 1 semi-tom:
Dó----Dó#----Ré----Ré#----Mi----Fá ...
Intervalo de 1 tom ou 2 semi-tons:
Dó----Ré----Mi----Fá#----G#----A# ...
O símbolo # indica o sustenido (em inglês sharp) e eleva uma nota em meio-tom. Por exemplo, Dó# eleva o Dó em meio-tom e é pronunciado como Dó sustenido.
E as notas Mi# e Si#? O Mi acrescido de meio-tom vira o Fá, assim como o Si acrescido de meio-tom vira o Dó.
No comando PLAY, o sustenido é obtido acrescentando-se o símbolo de "#" ou "+" à nota. O exemplo a seguir toca o Dó sustenido.
PLAY "C#" ↵
Toque o Mi# e Fá e compare o som das duas notas. Devem ser iguais.
PLAY "E#" ↵
PLAY "F" ↵
O símbolo ♭ indica o bemol (em inglês flat) e abaixa uma nota em meio-tom. Por exemplo, Ré♭ abaixa o Ré em meio-tom e é pronunciado como Ré bemol. O Ré bemol é equivalente ao Dó#.
E as notas Dó♭ e Fá♭? Equivalem às notas Si e Mi, respectivamente.
No comando PLAY, o bemol é obtido acrescentando-se o símbolo de "-" à nota. O exemplo a seguir toca o Si bemol.
PLAY "B-" ↵
Toque o Dó# o Ré♭ e compare o som das duas notas. Devem ser iguais.
PLAY "C#" ↵
PLAY "D-" ↵
Oitava
Quando dobramos a freqüência de uma nota ou a dividimos por dois, iremos repetir essa nota em outra oitava. Por exemplo, ao dobrarmos a freqüência de um Dó, encontraremos o Dó em uma escala acima e com o som mais agudo. Ao dividirmos pela metade a freqüência do mesmo Dó, encontraremos esse Dó em uma escala abaixo e com o som mais grave.
O MSX possui 8 oitavas e é como se fossem 8 teclados lado a lado:
|
|
|
|
|
|
|
|
Oitava 1 |
Oitava 2 |
Oitava 3 |
Oitava 4 |
Oitava 5 |
Oitava 6 |
Oitava 7 |
Oitava 8 |
← Mais grave |
Mais agudo → |
A oitava é controlada pela letra O, seguida de um número de 1 a 8. Os exemplos a seguir tocam o Dó na quarta e quinta oitavas, respectivamente.
PLAY "O4C" ↵
PLAY "O5C" ↵
O comando PLAY tem a notação N, que toca uma das 96 notas apresentadas no esquema anterior. A nota varia de 1 a 96, começando pelo lado esquerdo do teclado.
Por exemplo, PLAY"N1" toca a nota Dó da Oitava 1. A nota N0 indica uma pausa.
A fórmula para calcular a nota é:
N<n>
n = 12 x (Oitava - 1) + Nota
Notas: 1=C, 2=C#, ..., 12=B
Duração
Indica o tempo que cada nota irá soar.
A duração da nota ou pausa pode ser:
Duração |
1 |
1/2 |
1/4 |
1/8 |
1/16 |
1/32 |
1/64 |
Nota |
𝅝 |
𝅗𝅥 |
𝅘𝅥 |
𝅘𝅥𝅮 |
𝅘𝅥𝅯 |
𝅘𝅥𝅰 |
𝅘𝅥𝅱 |
Semibreve |
Mínima |
Semínima |
Colcheia |
Semicolcheia |
Fusa |
Semifusa |
Pausa |
𝄻 |
𝄼 |
𝄽 |
𝄾 |
𝄿 |
𝅀 |
𝅁 |
A duração de uma nota ou pausa é uma duração relativa. Ela não vai contar em segundos o tempo que cada nota irá soar/pausar, e sim o quanto ela dura em relação às outras notas. Por exemplo, partindo-se da nota de referência '♩', temos que '♪' tem a metade da duração de '♩'. Logo ♩ = ♪♪ . A partitura, na verdade, guarda um padrão rítmico [2].
A duração relativa no comando PLAY é feita de duas formas:
- Pela letra L, seguida de um número de 1 a 64. Nessa caso, altera todas as notas seguintes ao comando.
- Por um número após a nota. Nesse caso, afeta somente a nota em questão.
Em ambos os casos o número é o denominador da duração na tabela de tempos apresentada acima. Por exemplo, uma semicolcheia tem duração de 1/16 e é representada por L16.
O exemplo a seguir toca as notas Dó, Ré e Mi em um tempo de 1/4, das duas formas apresentadas.
PLAY "L4CDE" ↵
PLAY "C4D4E4" ↵
A pausa é representada pela letra R, seguida do denominador da duração. Uma pausa correspondente a uma colcheia dura 1/8 e é representada por "R8". Veja o exemplo a seguir.
PLAY "L4CR8DE" ↵
A duração em segundos das notas (tempo absoluto) é feita para toda a música através do andamento. A letra T indica o andamento, seguida de um número entre 32 e 255. Esse número indica a duração da nota '♩' (semínima), onde:
T<n>
Tempo = 1/n minutos.
Assim, quando T=60, a nota '♩' irá durar 1 segundo.
O exemplo a seguir irá tocar as notas Dó, Ré e Mi com diferentes durações e com andamento de 120.
PLAY "T120C4D1E8" ↵
Volume e canais
O PSG possui 3 canais de som, onde em cada um podemos escrever uma melodia diferente. O volume é controlado em cada canal distintamente, através da variável V, que varia de 0 a 15.
Sintaxe dos canais:
PLAY "frase1","frase2","frase3"
O exemplo a seguir irá tocar três melodias diferentes nos três canais, com volumes distintos.
PLAY "V15C4D8D8E2","V13G2A8A8A8A8","V14F1" ↵
Uso de variáveis
Podemos utilizar variáveis dentro do comando PLAY, para maior flexibilidade e reuso. Exemplos:
10 A$="CDEFG"
20 VOL=15
30 PLAY A$
40 PLAY "V=VOL;CDXA$;"
Após o uso da variável, devemos utilizar sempre o ponto e vírgula ";". A letra X indica o uso de um string contendo parte da música. Ela não é seguida do sinal de igual.
No capítulo extra "lendo partituras", será ensinado como ler uma partitura simples e convertê-la para o comando PLAY.
O Comando SOUND
O comando SOUND permite enviar dados diretamente aos registradores do PSG [1][2]. Sua sintaxe é:
SOUND número_do_registrador, valor
Os registradores do PSG são:
Registrador |
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
O sinal sonoro é a vibração do ar em forma de ondas, no qual se propaga e chega até aos nossos ouvidos. A onda é composta das seguintes propriedades:
- Freqüência - indica o número de oscilações (ciclos) por uma unidade de tempo.
- Período - indica o tempo gasto para completar um ciclo de oscilação.
- Amplitude - intensidade (ou volume) do sinal.
- Formato - a forma da onda.
A figura a seguir apresenta um sinal sonoro, com as propriedades de período e amplitude.
Observe na figura acima, que o sinal é repetitivo (periódico). A letra A assinala a amplitude do sinal e a letra T o período no qual delimita o inicio e fim de um ciclo.
A freqüência é o inverso do período, pois conta o número de oscilações em um determinado espaço de tempo. Assim, temos:
F = 1/T
T = 1/F
Por exemplo, se o tempo gasto para completar 1 ciclo é de 0,25 segundos, temos que a freqüência é de 1/0,25 ou 4 ciclos por segundo. A unidade básica da freqüência é o Hertz (ciclos por segundo).
Observe na figura acima, que em 1 segundo temos quatro oscilações completas do sinal.
A fatia de tempo da freqüência é sempre a mesma, o que irá variar de sinal para sinal é o número de ciclos dentro dela.
Uma onda pode ser produzida com diversos formatos. Veja os exemplos a seguir.
O PSG não controla o formato da onda.
Som x ruído
O "som" é um sinal com o período de oscilação identificável. O "ruído" é um sinal com o período de oscilação não identificável (chiado).
Como calcular o período do sinal no PSG
Observando as tabelas dos registradores do PSG no inicio da seção SOUND, temos que os registradores 0-5 controlam o período do sinal (e não a freqüência) nos três canais de som. Entretanto, a unidade do período informado não é o segundo e sim um valor equivalente a 16 vezes o período do clock interno do micro [2].
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
Onde:
- T - Período a enviar para os registradores.
- FC - Metade da freqüência do clock do MSX.
- F - Freqüência do sinal sonoro.
Por exemplo, uma freqüência de 1000 Hz terá o período a ser enviado para os registradores de 112.
Uma vez que é possível atribuir valores de período entre 0 e 4095, os registradores de período de som do PSG trabalham em pares, de modo a permitir valores inteiros maiores que 255.
O primeiro registrador contém o LSB do valor, enquanto que o segundo o MSB. Assim, temos:
Canal A Canal B Canal C
0-LSB 2-LSB 4-LSB
1-MSB 3-MSB 5-MSB
As duas equações a seguir mostram como calcular o valor a ser enviado a cada registrador de som [2].
MSB = VALOR \ 256
LSB = VALOR MOD 256
O programa completo em Basic que calcula os períodos a serem enviados para o par de registradores do canal A é apresentado a seguir [2].
10 CL = 1787805!
20 C = CL/16
30 F = 1000
40 PM = C/F
50 SOUND 0, PM MOD 256
60 SOUND 1, PM \ 256
70 SOUND 8,15 ' Volume
80 PRINT"Tecle enter para parar."
90 A$=INPUT$(1)
100 SOUND 8,0
Observa-se no exemplo acima que o som só pára quando colocamos o volume igual a 0.
Para calcularmos a freqüência do ruído, utilizamos a seguinte fórmula:
FC
T = -------
16 X FR
- T - Período a enviar para os registradores.
- FC - Metade da freqüência do clock do MSX.
- FR - Freqüência do ruído.
Assim, o cálculo do período do ruído é o mesmo utilizado para calcular o período do som. A diferença é que o período do ruído varia de 0 a 31.
Para calcularmos a freqüência da envoltória (veremos mais adiante o que é), utilizamos a seguinte fórmula:
FC
T = --------
256 X FE
- T - Período a enviar para os registradores.
- FC - Metade da freqüência do clock do MSX.
- FE - Freqüência da envoltória.
Para evitarmos erro de overflow (estouro) para valores de T maiores que 32767, devemos utilizar as seguintes expressões [2]:
se T <= 32767 então
MSB = VALOR \ 256
LSB = VALOR MOD 256
senão
MSB = (VALOR - 32767) \ 256 + 128
LSB = (VALOR - 32767) MOD 256
fim_se
O manual do Expert MSX [1] apresenta três programas em Basic para calcular o valor dos registros associados ao período. 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
A tabela a seguir apresenta as variações de período T (PSG) e da freqüência F do sinal para cada tipo.
Tipo |
Periodo |
Freqüência |
Som |
0 a 4095 |
111737,81 a 27,28 Hz |
Ruído |
0 a 31 |
111737,81 a 3604,45 Hz |
Envoltória |
0 a 65535 |
111737,8125 a 1,71 Hz |
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]:
- 1 - Liga som no canal A
- 2 - Liga som no canal B
- 4 - Liga som no canal C
- 8 - Liga ruído no canal A
- 16 - Liga ruído no canal B
- 32 - Liga ruído no canal C
Ex: ligar o som no canal B e o ruído no canal C:
SOUND 7, 255-(2+32)
Gerando sons e ruídos no MSX
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.
O programa a seguir reproduz a freqüência da nota Lá da 4a. oitava através do comando SOUND.
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 PM=1787805!/(16*F)
40 SOUND 0, PM MOD 256
50 SOUND 1, PM \ 256
60 ' Mixer - seleciona som no canal A
70 SOUND 7,255-1
80 ' Volume
90 SOUND 8,15
O som não pára até que pressionemos CONTROL + STOP ou digitemos: SOUND 8,0.
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, enquanto que a gerada pelo SOUND é infinita. Dessa forma, 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 PM=1787805!/(16*F)
40 SOUND 6, PM
60 ' Mixer - seleciona ruído em B
70 SOUND 7,255-16
80 ' Volume
90 SOUND 9,15
A relação entre freqüência e notas musicais
O Lá central é a nota Lá encontrada no meio de um teclado/piano, no qual possui a freqüência de 440 Hz. Essa nota é utilizada como padrão para afinação de diversos instrumentos musicais. Entretanto, cada nota Lá em diferentes oitavas irá possuir sua própia freqüência [2].
Quando nos movemos em uma oitava, multiplicamos ou dividimos o valor de freqüência de uma nota por 2. Assim, temos a seguintes regras [2]:
Para subir uma oitava, multiplique a freqüência por dois
Para descer uma oitava, divida a freqüência por dois
Como exercício, vamos descer uma oitava da nota Lá 440. Então, a freqüência da nota Lá na oitava 5 será de 880 Hz.
10 ' Determina a freqüência de 880 Hz em A
20 F=880
30 PM=1787805!/(16*F)
40 SOUND 0, PM MOD 256
50 SOUND 1, PM \ 256
60 ' Mixer - seleciona som no canal A
70 SOUND 7,255-1
80 ' Volume
90 SOUND 8,15
Compare o som emitido com a nota:
10 PLAY"V15O5A"
A fórmula geral para oitavas em uma nota é [2]:
FN+O = 2O x FN
Onde:
- FN+O - Freqüencia da nota procurada.
- O - Número de oitavas acima (O positivo) / abaixo (O negativo).
- FN - Freqüência da nota base.
Exemplos:
Lá 1 oitava acima:
FLá+1 = 21 x FLá
FLá+1 = 2 x 440 = 880
Lá 1 oitava abaixo:
FLá-1 = 2-1 x FLá
FLá-1 = 0,5 x 440 = 220
Como calcular a freqüência para cada uma das 12 notas? Quando subimos uma oitava, na verdade subimos 12 meio-tons [2]. Assim, podemos reescrever a fórmula das oitavas para as notas:
FN+st = 2st/12 x FN
Onde:
- FN+st - Freqüencia da nota procurada.
- st - Número de semi-tons acima (st positivo) / abaixo (st negativo).
- FN - Freqüência da nota base.
Obs: 21/12 = 1,059463094.
Exemplos:
Lá# (1 semi-tom acima do Lá central):
FLá+1 = 21/12 x FLá
FLá+1 = 1,059463094 x 440 = 466,16
Teste o valor 466 no programa de freqüência e compare com PLAY"V15O4A#".
Ré (7 semi-tom abaixo do Lá central):
FLá-1 = 2-7/12 x FLá
FLá-1 = 0,667419927 x 440 = 293,67
Teste o valor 293 no programa de freqüência e compare com PLAY"V15O4D".
Formato da onda - timbre
O volume do sinal sonoro indica o quão forte percebemos esse sinal. A freqüência determina o quão grave ou agudo percebemos o som, conforme vimos na última seção. O formato da onda sonora irá influenciar em como percebemos esse som: se ele é suave, áspero, metálico etc. A essa característica chamamos de timbre.
Podemos tocar a nota Lá em três instrumentos diferentes, com a mesma intensidade, a mesma freqüência, mas a percepção do som será diferente para cada um dos instrumentos. Isso se deve ao formato da onda emitida por cada instrumento.
Veja o exemplo a seguir, com notas Lá emitidas com o mesmo volume e freqüência por três instrumentos distintos:
Observe que as três ondas possuem a mesma freqüência, a mesma amplitude, mas formatos diferentes.
O PSG não é capaz de modificar o formato da onda. Entretanto, os dispositivos de som adicionais como o FM-PAC, permitem ajustar o timbre e produzir sons diferentes para cada instrumento musical.
Veja o exemplo para diferentes timbres no FM-PAC:
10 CALL MUSIC
20 PLAY #2,"V15@0CDE" ' @0 = Piano 1
30 PLAY #2,"V15@2CDE" ' @2 = Violino
40 PLAY #2,"V15@7CDE" ' @7 = Pipe organ
50 PLAY #2,"V15@12CDE" ' @12 = Guitarra elétrica
No exemplo acima, são as mesmas notas tocadas com sons de instrumentos diferentes.
Obs: para realizar o teste acima é necessário o FM-PAC. Os emuladores de MSX geralmente possuem o FM-PAC.
Moldando a onda - envelopes
Foi visto até aqui que o sinal gerado possui freqüência e volume constantes.
A proposta dos envelopes é criar uma variação de volume do sinal ao longo do tempo. A 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.
Um exemplo prático de envelope é quando uma nota é tocada em uma corda de violão. Ela começa forte e decai o volume até parar de vibrar. Veja o formato do envelope de uma corda de violão tocada na figura abaixo, assinalado em vermelho.
Obs: o envelope possui freqüência diferente do sinal emitido.
Quando o envelope é uma vibração periódica de volume, chamamos de vibrato. O vibrato é alcançado em guitarras e violão quando o músico vibra o dedo que segura a corda da nota tocada.
Podemos reproduzir os fenômenos de decaimento e vibrato, através do exemplo da nota Lá.
No programa de freqüências, o volume é constante e possui valor igual a 15. A idéia aqui é realizar o decaimento do volume de 15 até 0, reproduzindo a forma do envelope aproximada do exemplo da corda do violão.
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 PM=1787805!/(16*F)
40 SOUND 0, PM MOD 256
50 SOUND 1, PM \ 256
60 ' Mixer - seleciona som no canal 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á (vibrato). Nesse caso, o volume oscila entre 6 a 15 ao longo do tempo [2].
10 ' Determina a freqüência de 440 Hz em A
20 F=440
30 PM=1787805!/(16*F)
40 SOUND 0, PM MOD 256
50 SOUND 1, PM \ 256
60 ' Mixer - seleciona som no canal 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
Experimente mudar a freqüência do sinal de 440 para 466. O tempo de oscilação do volume permanece o mesmo, mas o som se tornou mais agudo.
Uma vez entendido o conceito de envelope, podemos utilizar os envelopes de fábrica do PSG.
Os envelopes do PSG controlam automaticamente o volume do sinal de som, baseado na freqüência do envelope.
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 no exercício anterior para o decaimento da nota Lá, corresponde ao envelope 0.
Vamos modificar o programa anterior, de forma a utilizarmos 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 PM=1787805!/(16*F)
40 SOUND 0, PM MOD 256
50 SOUND 1, PM \ 256
60 ' Mixer - seleciona som no canal A
70 SOUND 7,255-1
80 ' Envelope
90 SOUND 8,16
100 FE=0.25
110 PE=1787805!/(256*FE)
120 IF PE > 32767 THEN 160
130 SOUND 11, PE MOD 256
140 SOUND 12, PE \ 256
150 GOTO 180
160 SOUND 11, (PE - 32767) MOD 256 + 128
170 SOUND 12, (PE - 32767) \ 256
180 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=1 ' Periodo = 0.25 segundos
e
180 SOUND 13,14
O comando PLAY com envelope
Podemos utilizar o envelope para "moldar" as ondas das notas musicais no comando PLAY. O comando S escolhe uma das formas de envelope disponíveis no PSG, enquanto que o comando M informa o período do mesmo modo calculado no SOUND. Entretanto, o período aqui é um número de 16 bits (2 bytes) e não mais dois valores de 8 bits, como no SOUND.
Veja o exemplo do livro do Expert [1] a seguir.
10 REM PROGRAMA PLAY
20 PLAY"S0M10000T180"
30 PLAY"L4O3GFL8EDECO2BABG"
40 PLAY"O3L4CEAGBO4L3CO3"
50 PLAY"L8AGFEL3EL4DGBO4C"
60 PLAY"L6CEL4DL6DFL4ECFEDE"
70 PLAY"L6FEDCL4CO3B"
80 PLAY"O4L4CC#L3DL6DFL4E"
90 PLAY"L6GL4FDO3GBO4C"
O que o envelope com S=0 e M=10000 (39 e 16 no SOUND) faz na música? Ele deixa a duração das notas mais curta. Substitua a linha 20 por esta e observe a diferença.
20 PLAY"V15180"
Obs: no programa original do livro, há o comando V15 logo após o envelope. Foi visto na seção do SOUND que para o envelope funcionar, deve-se atribuir o volume igual a 16. Além disso, o envelope é um controle automático de volume. Dessa forma, esse comando anula o efeito do envelope. Coloque ele na linha 20 do programa original e observe.
20 PLAY"S0M10000V15T180"
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.