Neste número: Efeitos Sonoros no MSX, Música MSXextro!, Dicas: Desenho Gráfico, Círculos, Terremoto no Vídeo
Efeitos Sonoros no MSX
Artigo Original: Cláudia Eleone Gomes, Digitação: Wilson Pilon
Se você tem dificuldade em produzir efeitos sonoros em seu MSX, não desanime! Com o método e o programa utilitário apresentados aqui, a sua tarefa de criar efeitos será bastante simplificada.
Facilitar a utilização do comando SOUND no MSX BASIC através do uso de um utilitário que possibilita a criação de sons e ruídos de forma direta, por controles do teclado, é a finalidade deste artigo.
Antes de prosseguir, sugiro digitar a listagem em BASIC ao final desta matéria e salvá-la em fita com o comando:
CSAVE "SOUND"
Após esta operação, digite o comando:
CLOAD?"SOUND"
para certificar-se que o programa foi corretamente armazenado.
Para carregar o utilitário da fita, digite
CLOAD "SOUND"
e quando a mensagem "Ok" aparecer na tela, pressione [F5]. A tela será apresentada e um pequeno zumbido poderá ser ouvido, assim você estará pronto para continuar a leitura do artigo.
Operando o Utilitário
Se você não domina o comando SOUND, não se preocupe ainda em entender o que está na tela. Por enquanto veja como operar o utilitário, que é extremamente simples. Com ele, é possível realizar cinco operações: mover o cursor para cima ou para baixo, incrementar, decrementar ou zerar valores.
O cursor é o símbolo > que pode ser visto no lado esquerdo da primeira das 14 linhas apresentadas na tela. Esta posição pode ser modificada pressionando-se as teclas de controle do cursor localizadas no canto inferior direito do teclado. Para movimentar o cursor para cima e para baixo, pressione as teclas correspondentes.
A linha em que está posicionado o cursor poderá ter o seu valor alterado, sendo que a tecla de controle do cursor que aponta para a esquerda decrementa de uma unidade, enquanto que a da direita faz o inverso. Experimente posicionar o cursor na segunda linha e pressionar a tecla da direita, você verá o valor ser modificado (não se importe com ele ainda) e o som variar.
Para eliminar as mudanças efetuadas e colocar os valores originais, basta teclas [RETURN]. Você, certamente, compreenderá melhor a finalidade do programa utilitário lendo este artigo com atenção.
PSG e SOUND
Os microcomputadores da linha MSX, ao contrário da grande maioria dos micros pessoais, possui três microprocessadores: um para o processamento de dados, realizado pelo Z80 da Zilog; outro para o controle de vídeo, o TMS-9128 (ou compatível); e, finalmente o AY-38910 (ou compatível) para geração de sons.
Isto significa que simultaneamente o MSX pode rodar o seu programa enquanto gera gráficos e toca música. Na realidade, ele pode fazer mais do que simplesmente tocar música, sendo também capaz de criar diversos sons cacofônicos e ruídos através do comando SOUND. Porém, para utilizarmos todo o seu potencial, é necessário conhecermos mais um pouquinho das características sonoras dos MSX.
Os MSX possuem três canais para geração de sons e ruídos. Imagine estes três canais como se dentro do MSX existissem três caixas de som, capazes de emitir sons independentemente uma da outra. Estas caixas são denominadas A, B e C, e quem controla suas operações é o PSG (Programmable Sound Generator), que é capaz de:
- Controlar o volume de cada canal (a caixa de som);
- Determinar a frequência do som gerado em cada canal;
- Determinar a frequência do ruído
- Selecionar os canais para geração de som e/ou ruídos
- Determinar a frequência do gerador de envelope
- Determinar a forma do envelope.
Todas estas ações são controladas mediante valores presentes nos 14 registros do PSG, numerados de 0 a 13. Por exemplo, o comando SOUND 6,13 coloca o valor 13 no sexto registro, o qual controla a frequência do ruído gerado. Experimente posicionar o cursor na linha correspondente ao volume do canal A. A seguir, incremente o valor do registro pressionando a tecla de controle do cursor da direita e observe como o volume do canal aumenta.
Os 14 Registros
Como já foi comentado, o controle de som e ruído dos MSX é realizado mediante valores armazenados nos 14 registros do PSG. Na tela do utilitário podemos ver 14 linhas que correspondem aos 14 registros, os quais são numerados de 0 a 13.
Os registros 0 e 1 são responsáveis pela frequência do canal A. Isto significa que podemos obter sons mais agudos neste canal, colocando valores menores nos registros 0 e 1, pois a frequência é inversamente proporcional aos valores neles armazenados. Da mesma forma, aumentando esses valores, obtemos valores menores de frequência para o canal A, consequentemente obtemos sons mais graves.
Vale ressaltar que o valor do registro 1 é mais significativo que o do registro 0. Portanto, na seleção de um som mais grave ou mais agudo, busque primeiro o valor do registro 1 que mais se aproxima da frequência desejada, para então alterar o valor do registro 0 que agirá como se fosse a sintonia fina de frequência do canal.
Ao ser pressionada a tecla [RETURN] dentro do utilitário, será dado um reset nos valores dos registros e colocado um som no canal A. Experimente, então, com as teclas de controle do cursor, alterar os valores dos registros 0 e 1 e veja como o som ficará mais grave ou agudo. Observe que, nesta situação, só o canal A estará emitindo ruído (mais tarde você entenderá porquê).
Outra observação importante é que todos os registros possuem valores limites, que poderão ser encontrados no manual do equipamento.
Os registros 2 e 3 fazem o mesmo que os registros 0 e 1, só que no canal B. Lembre-se que, no momento, o utilitário só está emitindo som no canal A, e consequentemente qualquer valor de frequência no canal B não trará qualquer alteração no som produzido. Todas estas observações são também válidas para os registros 4 e 5, que controlam a frequência do canal C.
O registro 6 controla a frequência do ruído e, da mesma forma que o som nos canais A, B e C, os valores menores armazenados no registro 6 produzem maiores frequências, consequentemente, ruídos mais agudos. Lembro mais uma vez que somente o canal A está emitindo som e que nenhum dos três canais está emitindo ruído.
O registro 7 controla quais canais emitirão som e/ou ruído. Como já foi dito, cada canal pode, independentemente, emitir som e/ou ruídos em várias frequências. Para selecioná-los, observe a tabela abaixo:
- Som canal A 1
- Som canal B 2
- Som canal C 4
- Ruído canal A 8
- Ruído canal B 16
- Ruído canal C 32
O valor a ser armazenado no registro 7 deverá ser igual a 255 menos a soma dos valores selecionados na tabela. Por exemplo, para se obter apenas som no canal A, teremos o comando SOUND 7,254, se quisermos porém som nos canais A e B teremos SOUND 7,252, pois 252 = 255-(1+2). Para obtermos som no canal C e ruído no B, teremos SOUND 7,235, pois 235=255-(4+16), e assim por diante.
É bom ressaltar que se geramos som, por exemplo, nos canais A e B, cada um deles sairá na frequência dos seus respectivos canais, no caso determinados pelos registros 0, 1, 2 e 3. Já a frequência do ruído é determinada pelo registro 6 independentemente dos valores da frequência dos canais. Experimente variar o valor do registro 7 do utilitário.
Observe que este é o único registro em que aparecem dois valores na tela separados por uma vírgula. O primeiro corresponde à soma dos valores da tabela mencionada acima; e o segundo, à diferença entre 255 e este valor, resultado este que deve ser efetivamente armazenado no registro.
Os registros 8, 9 e 10 controlam o volume de cada canal e são extremamente simples de se entender. Pelo que vimos até agora, concluímos, pelo registro 7, que estamos gerando som no canal A e que este apresenta volume 7. Primeiro dê um reset no utilitário, pressionando [RETURN] e depois experimente incrementar este valor e veja o volume subir. O valor máximo permitido é 15, mas se você chegar a 16 verá algo estranho acontecer com o som, o que é consequência dos três últimos registros.
Os registros 11, 12 e 13 controlam o gerador de envelope. Imagine este envelope como se fosse um modulador de volume, ou seja, algo que fizesse com que o volume variasse de acordo com formas pré-estabelecidas, as quais podem ser encontradas em qualquer manual MSX. Como exemplo a forma de número 13 tem o seguinte aspecto:
Isto significa que o volume partirá do zero até atingir o seu valor máximo, permanecendo assim até que alguma mudança ocorra. A forma de número 0 tem a seguinte característica:
Nela o volume iniciará em seu valor máximo e decrescerá até que atinja seu valor mínimo, ou seja, zero.
Existem outras formas que poderão ser observadas no manual do equipamento. O número da forma deverá ser armazenado no registro 13, ou seja, através do comando SOUND 13,10 é possível acessar a forma de número 10.
Para selecionar os canais que terão seus sons e/ou ruídos modulados pelo envelope, basta coloar o volume destes canais em 16. Pressione então dentro do utilitário a tecla [RETURN] e coloque o registro 7 com valor 8, com isso obteremos ruído apenas no canal A. A seguir, coloque o registro 6 com valor 16, de forma a obter um valor nem muito grande ou pequeno para a frequência do ruído. Por último, coloque o registro 13 com o valor 8, obtendo a forma abaixo para o envelope:
Note que até aqui o envelope não agiu sobre o ruído produzido. Experimente agora incrementar o registro 8 até que o volume do canal atinja o valor 16. Observe que o volume do ruído agora está modulado pelo envelope, sendo que podemos modular simultaneamente mais de um canal, bastando para isto que o volume de cada canal tenha valor 16. Desta maneira, a forma do envelope será a mesma para todos os canais selecionados.
Os registros 11 e 12 controlam a frequência do gerador de envelope. Da mesma forma que a frequência dos canais e do ruído, valores menores armazenados nos registros 11 e 12 produzem maiores frequências no gerador. Aqui o registro 12 é o mais significativo, tal como os registros 1, 3 e 5 nas frequências dos canais.
Para sentir o efeito da frequência no envelope, aproveite o exemplo anterior do utilitário e experimente incrementar e decrementar o registro 12, e observe como a ação do envelope é mais rápida ou lenta, de acordo com o valor de frequência gerado pelos registros 11 e 12. Com o recurso da escolha da forma do envelope e da freuquência do gerador, poderemos obter os mais variados efeitos sonoros.
Com tudo que foi exposto até aqui, dominamos os registros do PSG e estamos aptos a compreender suas funções para determinados valores armazenados. Quando você produz um determinado efeito sonoro com o utilitário, o que você tem na mão são os valores dos 14 registros que produzem o referido efeito.
Lembre-se que o valor a ser armazenado no registro 7 é o que está após a vírgula, e que nem sempre é necessário atribuir valores a todos os registros. Como exemplo, dê com [CTRL]+[STOP] no utilitário e em seguida pressiona [SHIFT]+[HOME/CLS]. Digite então o programa a seguir sem apagar o utilitário da memória:
1000 SOUND 7,254
1010 SOUND 0,28
1020 SOUND 1,1
1030 SOUND 8,7
A seguir digite RUN 1000 e [RETURN]. Certamente este som lhe é familiar. Ele é gerado quando o utilitário é carregado no computador ou quando a tecla [RETURN] é pressionada, dando assim um reset nos registros. O importante é observar que embora o utilitário apresente os valores dos 14 registros, apenas quatro estão envolvidos na geração deste som, como foi mostrado no programa anterior.
Quando você criar um efeito sonoro com o utilitário e for passar os valores obtidos para os registros num programa que use o comando SOUND do MSX-BASIC, lembre-se de só utilizar as instruções realmente necessárias, pois nem sempre todos os registros são necessários. Os que não forem utilizados poderão ter qualquer valor armazenado, ou serem omitidos.
Etapas Básicas de Criação
Agora que sabemos a função de cada registro do PSG, só falta dispor os valores armazenados de forma a produzir os mais variados efeitos sonoros. Isto não é uma tarefa fácil. O caminho a ser percorrido dsde a ideia do efeito sonoro em nossa mente até a reprodução do mesmo no equipamento, vai exigir um perfeito conhecimento dos registros do PSG, um pouco de tentativa e erro e, principalmente, muita experiência.
Os registros do PSG são nossos conhecidos. A tentativa e erro é um processo que vai exigir paciência e determinação. Não existe outra forma senão experimentar os valores na tentativa de alcançar o efeito desejado. No entanto, quanto mais tentamos maior será nossa experiência, diminuindo assim o tempo necessário na elaboração de outros efeitos sonoros. Portanto, mesmo que você não esteja conseguindo atingir seu intento, a cada hora perdida, certamente uma larga experiência será adquirida e seu ouvido em breve estará acostumado aos mais variados sons e ruídos.
Apesar do que foi exposto acima, você poderá minimizar o seu esforço se observar que todo efeito sonoro nada mais é que uma combinação de sons e ruídos em várias frequências e volumes diferentes, modulados ou não por envelopes. A partir disso, podem ser consideradas básicas na criação destes efeitos:
- Definição do efeito sonoro
- Divisão do efeito sonoro em sons e ruídos componentes
- Escolha dos canais
- Determinação das frequências
- Determinação dos volumes
- Forma e frequência do envelope.
A única etapa que pode ser desnecessária é a última, dependendo do efeito desejado.
Analisaremos agora cada uma destas etapas:
1-Definição do efeito sonoro: Indubitavelmente, tudo na vida fica mais fácil quando sabemos realmente o que queremos fazer. Na programação, por exemplo, é triste ver um programador partir direto para o computador na tentativa de resolver um problema sem antes pensar e esquematizar a respeito do que se deseja. Não raro, uma perda considerável de tempo ocorre.
No caso do efeito sonoro no MSX, é importante definirmos bem o efeito em nossa mente para não ficarmos diante do utilitário testando valores que produzem um som que acreditamos ser aquele procurado para nossa necessidade. Quando isto ocorre, frequentemente descobrimos novos efeitos ao longo dos testes, e acabamos por nos fixar num que nada tem a ver com a necessidade em si. É o caso, por exemplo, de termos um jogo no qual desejamos o efeito de um tiro de canhão, e acabamos perdendo horas a fio no refinamento do som de um avião que nos pareceu interessante.
Outro aspecto importante é a adequação do efeito ao programa. Às vezes, efeitos complexos não satisfazem tão bem num dado momento quanto outro até mais simples.
Todos estes aspectos citados resume-se na definição do som que se quer gerar, ou seja, é necessário saber que efeito você deseja e verificar se ele realmente satisfaz a sua necessidade. Portanto, não tente nada antes de fazer esta definição, pois além da perda de tempo os resultados são imprevisíveis.
2-Divisão do efeito sonoro em sons e ruídos componentes: Após a definição completa do efeito sonoro desejado, é necessário dividi-lo em partes de forma a simplificarmos um efeito mais complexo com a obtenção de vários efeitos mais simples que, em conjunto, produzem o resultado esperado.
Muitos efeitos são simples por natureza, exigindo apenas um canal emitindo som, sem ruídos ou envelopes. Outros necessitarão de várias frequências com variações de volume que exigirão a adoção de envelopes. Lembre-se que o importante é separar o efeito nos sons e ruídos necessários à sua geração, e que nem sempre o mais complexo é o mais bonito e adequado.
3-Escolha dos canais: Esta etapa está intimamente ligada ao registro 7 do PSG e só pode ser realizada se o efeito foi dividido corretamente em suas partes componentes. Para isso, selecione os canais de forma a não haver comprometimento entre sons e ruídos. Como exemplo, se na divisão você concluiu que o efeito necessita de som no volume 5 e ruído no volume 3, escolha canais diferentes para gerá-los; por exemplo, som no canal A e ruído no B.
Outro problema comum acontece quando usamos o gerador de envelope num canal que está emitindo som e ruído e, no entanto, só queremos modular o ruído. Ora, para o envelope funcionar, o canal deve ter volume 16, consequentemente tudo que está sendo produzido neste canal, som e ruído, será modulado. Dessa forma, quando se quizer usar o gerador para modular um som ou ruído, reserve um canal exclusivo para ele.
4-Determinação das frequências: Esta etapa exige experiência e um pouco de tentativa e erro. Preocupe-se apenas com os canais envolvidos na geração do som e com a frequência do ruído, caso este seja utilizado. A frequência do ruído nada tem a ver com a frequência do(s) canal(is) em que ele está sendo gerado.
5-Determinação dos volumes: Muitos efeitos exigem que um canal contenha volume mais baixo que outro, dando aquela sensação de música de fundo ao efeito sonoro. Recomendo colocar em zero o volume dos canais não utilizados, tendo em vista que se forem deixados num valor um pouco alto, o volume dos canais utilizados cai um pouco. Para observar esta situação, pressione a tecla [RETURN] no utilitário, coloque o volume do canal A em 15 e, a partir de zero, aumente o volume do canal B até atingir 15. Note que, mesmo sem estar gerando som ou ruído, este valor elevado faz com que um pouco do volume do canal A seja perdido.
6-Forma e frequência do envelope: Procure observar as formas de envelope possíveis de serem geradas e compare-as mentalmente com o efeito desejado. Se você quer um som intermitente como o barulho das pás de um helicóptero golpeando o ar, não use um envelope que faça com que o volume chegue a zero, ou a um determinado valor, e assim permaneça. Use portanto o seu bom senso na escolha da forma do envelope e mexa no valor da frequência até obter o resultados desejado.
Seguindo estas etapas, você certamente tem em mãos uma boa forma de atingir seu objetivo sem partir para cima do micro às pressas. Para exemplificar, serão apresentados três efeitos interessantes que servem ao propósito. O primeiro, simples, é o som da turbina de um avião a jato. O segundo é o famoso barulho do impacto, muito usado em jogos. O terceiro, um pouco mais complexo, é o efeito de um helicóptero voando.
Turbina de Avião a Jato
Podemos definir o som de uma turbina a jato como um zumbido extremamente agudo que chega a machucar nossos ouvidos num aeroporto. Isto é o que estamos procurando. Definido o efeito, podemos dividi-lo para buscar, individualmente, cada som ou ruído componente.
Portanto, para obter este efeito, basta um som bem agudo; consequentemente, como o mesmo só é composto de um som, selecionaremos para ele o canal A. Necessitamos agora determinar as frequências dos canais e do ruído, porém como não estamos precisando de ruído e apenas geramos som no canal A, basta nos preocuparmos com os registros 0 e 1. Deles, o registro 1 é o mais significativo, e portanto vamos mexer nele primeiro.
Observe que o valor 0 armazenado é o que mais se aproxima do valor que procuramos. Mude agora o valor do registro 0 para 15 e veja que esta combinação é satisfatória. O passo seguinte, determinação do volume, depende muito da aplicação. Aqui, como é apenas uma demonstração, vamos colocá-lo em 15.
Neste exemplo não precisamos do gerador de envelope, e consequentemente chegamos ao final de todas as etapas. Para ver o resultado, coloque os registros abaixo com os seguintes valores (use o utilitário):
- 0: 15
- 1: 0
- 7: 1,25
- 8: 15
- 9: 0
ou, então, digite a rotina a seguinte e dê o comando RUN 1000.
1000 SOUND 9,15
2000 SOUND 1,0
3000 SOUND 7,254
4000 SOUND 8,15
5000 SOUND 9,0
6000 SOUND 10,0
Impacto
O efeito de impacto pode ser definido como um ruído de volume decrescente. Poderia também ter outras definições, pois aqui o caso não é tão específico quanto o do exemplo anterior.
A divisão do efeito é simples, bastando gerar o ruído num canal próprio, tendo sido escolhido para essa tarefa o canal B. Para achar a frequência do ruído podemos escolher um valor intermediário, nem muito alto nem muito baixo.
O volume deverá ser colocado em 16; pois como definimos o impacto como um ruído de volume decrescente, haverá a necessidade de usarmos um gerador de envelope. A forma será, evidentemente, a número 1.
Observe que a frequência do gerador é muito importante, e neste caso, ela deve ser tal que o efeito do envelope seja rápido. Procure primeiro o valor do registro 12 e depois o do 11, usando em seguida o utilitário para inserir os valores abaixo e confira o resultado:
- 6: 16
- 7: 16, 239
- 9: 16
- 11: 215
- 12: 35
- 13: 1
Helicóptero Voando
Este efeito pode ser definido como o ruído de pás cortando o ar com o som de uma turbina ao fundo. Temos, portanto, como partes componentes, um som e um ruído. Vamos começar com o som que faz o papel da turbina, o qual já foi obtido quando vimos o exemplo da turbina do avião. Vamos então deixá-lo no canal A com as mesmas frequências do outro exemplo.
Já selecionamos assim o canal e a frequência, faltando agora definir o volume, pois não existe aqui a necessidade do envelope. Desta forma, como o som da turbina deve estar ao fundo, colocaremos o volume do canal em 10.
Passaremos agora para o ruído das pás golpeando o ar. Para esse efeito, usaremos o canal B; e para a frequência de ruído, o valor 25, além disso, o volume deve ser colocado em 16, pois há necessidade de modularmos o ruído por um envelope. Neste caso, poderíamos usar as formas 8, 10, 12 e 14, pois elas geram a intermitência necessária ao ruído. Basta então buscarmos a frequência do gerador testando estes valores e observado o resultado:
- 0: 15
- 1: 0
- 6: 25
- 7: 17,238
- 8: 10
- 9: 16
- 11: 0
- 12: 1
- 13: 14
Com a prática, você acabará observando que mentalmente poderá seguir todas as etapas, com exceção das frequências que exigem um apuro maior na seleção de valores. Habitue-se portanto a seguir estes passos, pois eles facilitarão em muito a sua tarefa.
Conclusão
O motivo que me levou a escrever este artigo foi o fato de ter encontrado muita dificuldade em entender todos os recursos e possibilidades do comando SOUND no meu equipamento.
Em primeiro lugar porque não dispunha de uma forma iterativa de ouvir o efeito produzido por alterações nos registros do PSG, pois necessitava rodar um programa contendo vários comandos SOUND, alterar linhas, rodar novamente e repetir este ciclo até chegar ao objetivo.
Em segundo lugar porque o manual, apesar de não omitir informações importantes, não apresenta este assunto de uma forma suficientemente didática que facilitasse a compreensão de um assunto relativamente complexo, se compararmos o referido comando com os outros existentes no equipamento.
Espero que eu tenha contribuído para aqueles que possuem MSX, de forma que eles passem a utilizar melhor os seus recursos. Para finalizar, gostaria de dizer que apenas exercitando é que se chega a bons resultados. Jamais desanime se o resultado não foi o esperado, pois certamente muito se ganha errando e tentando corrigir erros.
A criatividade, sem dúvida, ajudará muito, pena que é uma característica inerente a cada indivíduo e certamente uns terão mais facilidade por isso. O que não pode nunca é deixar de lado a satisfação de produzir algo novo.
10 REM ********************
20 REM * *
30 REM * CEG SOFTWARE *
40 REM * *
50 REM * Utilitario Sound *
60 REM * *
70 REM * 1986 *
80 REM * *
90 REM ********************
100 REM
110 REM Variaveis
120 REM
130 DIM V(14),L(14)
140 PL=7
150 REM
160 REM Tela
170 REM
180 SCREEN 0:KEY OFF
190 COLOR 1,15,15:CLS:WIDTH 39
200 PRINT STRING$(39,"=");
210 PRINT TAB(17);"Sound"
220 PRINT STRING$(39,"=")
230 LOCATE 15,5:PRINT"Status PSG"
240 FOR L=7 TO 20
250 LOCATE 12,L
260 READ R$,V(L-7),L(L-7)
270 PRINT R$;V(L-7)
280 NEXT L
290 LOCATE 31,14:PRINT ",";255-V(7)
300 LOCATE 10,22:PRINT "[RETURN] reseta valores"
310 REM Gera Som
320 FOR K=0 TO 13
330 IF K=7 THEN SOUND 7,255-V(7):GOTO 350
340 SOUND K,V(K)
350 NEXT K
360 REM
370 REM Rotina Principal
380 REM
390 LOCATE 11,PL:PRINT ">"
400 A$=INKEY$:IF A$="" THEN 400
410 C=ASC(A$)
420 IF C=13 THEN RESTORE:CLS:GOTO 140
430 IF C<>30 THEN 480
440 LOCATE 11,PL:PRINT" "
450 PL=PL-1
460 IF PL=6 THEN PL=20
470 GOTO 390
480 IF C<>31 THEN 530
490 LOCATE 11,PL:PRINT" "
500 PL=PL+1
510 IF PL=21 THEN PL=7
520 GOTO 390
530 IF C<>29 THEN 580
540 IF V(PL-7) > 0 THEN V(PL-7)=V(PL-7)-1
550 LOCATE 27,PL:PRINT V(PL-7);
560 IF PL=14 THEN PRINT",";255-V(7)
570 GOTO 320
580 IF C<>28 THEN 400
590 IF V(PL-7) < L(PL-7) THEN V(PL-7)=V(PL-7)+1
600 LOCATE 27,PL:PRINT V(PL-7);
610 IF PL=14 THEN PRINT ",";255-V(7)
620 GOTO 320
630 A$=INKEY$
640 IF A$="" THEN 630
650 PRINT ASC(A$),
660 GOTO 630
670 REM
680 REM Dados
690 REM
700 DATA "(Freq. CA) 0 -",28,255
710 DATA "(Freq. CA) 1 -",1,15
720 DATA "(Freq. CB) 2 -",28,255
730 DATA "(Freq. CB) 3 -",1,15
740 DATA "(Freq. CC) 4 -",28,255
750 DATA "(Freq. CC) 5 -",1,15
760 DATA "(Freq. R) 6 -",13,31
770 DATA "(Sel.Can.) 7 -",1,63
780 DATA "(Vol. CA) 8 -",7,16
790 DATA "(Vol. CB) 9 -",7,16
800 DATA "(Vol. CC) 10 -",7,16
810 DATA "(Freq. GE) 11 -",202,255
820 DATA "(Freq. GE) 12 -",1,255
830 DATA "(Envelope) 13 -",10,14
Música, MSXestro!
Artigo Original: Nilson Dias Martello, Digitação: Wilson Pilon
Os micros da linha MSX colocaram ao alcance dos usuários inúmeras opções no que diz respeito a som. Explore um pouco deste potencial, aprendendo a gerar música em seus programas.
A possibilidade de gerar música e ruídos em nossos programas por certo encanta-nos. Ao invés das suspeitas eructações produzidas em linguagem de máquina, em nossos micros mudinhos de poucos meses atrás, encontramos uma porta aberta com o CP-400 e um verdadeiro universo de opções com as máquinas MSX. Três canais de som e mais um de ruídos é... fantástico. Porém, uma coisa é ter a possibilidade e outra, bem diferente, saber usar esse instrumento.
Para os que, como eu, possuem quase nenhuma cultura de teoria musical, porém gostam de música e estão dispostos a sonorizar seus programas, eis alguns passos que, por certo, os auxiliarão.
O som mais simples que um MSX pode emitir é um BIP. O comando é facílimo e, ja de premissa, pode-se revelar valioso num programa:
FOR N=1 TO 10 : BEEP : NEXT N
e já temos algum tipo de sim aplicável. Como é de bom costume, a linha acima pode ser alcançada através de um GOSUB, permitindo que o mesmo programa (sub-rotina) seja empregado diversas vezes em pontos diferentes da ação. Veja como fica:
8000 FOR N=1 TO 10
8010 BEEP
8020 NEXT N
8030 RETURN
Essa mesma campainha de aviso (como em "seu oxigênio está acabando" ou "o alarme soou: um estranho penetra no castelo!") poderá ser transformada em sinal de ocupado de telefone:
8000 FOR Y=1 TO 6
8010 FOR N=1 TO 10
8020 BEEP
8030 NEXT N
8040 TIME=0
8050 IF TIME<30 THEN GOTO 8050
8060 NEXT Y
8070 RETURN
Pelo simples aumento do tempo na linha 8050, o sinal de ocupado se transforma em chamada telefônica! Experimente com:
8050 IF TIME<100 THEN GOTO 8050
Eu Quero Música!
Está bem leitor; não se desespere. A primeira coisa é escolher - obviamente - qual música acompanhará um dado momento de seu programa. Aí entram as limitações. A primeira - perdoe-me a falta de sutileza - é o bom gosto do leitor. Não proponha, como fez um amigo meu, a Marcha Fúnebre, de Chopin, para o momento em que o jogador morre durante uma aventura. Isto dá vontade de chorar!
Se você não tem experiência musical, por certo não faltarão amigos ou colegas que poderão - com alegria - sugerir-lhe inúmeras alternativas do universo musical. De preferência, escolha alguma versão para flauta doce e acompanhamento de piano ou transposição para coro, trios, quartetos, etc.. O motivo é óbvio: nosso MSX "só" possui três vozes.
Desta forma, poderemos aproveitar a parte da flauta (ou soprano, num coral) e introduzirmos diretamente no canal A. O acompanhamento de piano (só a mão direita, só a esquerda ou combinação) será introduzido nos canais B e C.
Darei como exemplo os compassos iniciais de O Mistress Mine, uma melodia do século XVI em arranjo de T.Morley para flauta doce e piano, que aproveitei em Aventura no Castelo Maldito, criado por mim. Ao invés de pedir ao amigo músico que traduza tudo, aproveite a oportunidade que o mundo da informática lhe oferece para ampliar a cultura geral. Vamos suar juntos!
A parte superior da figura 1 tem a anotação para flauta; as duas partes inferiores, a mão direita (no centro) e esquerda (abaixo) do piano. Se observar o pentagrama do centro, perceberá que existem duas notas em acorde; por conseguinte já ocupamos os três canais do MSX. Vamos ignorar, assim, o pentagrama inferior.
Figura 1 (Alegro):
Comecemos a traduzir a "primeira voz". Observe que a clave de SOL (essa você conhecia, não é?) está "assinada" na segunda linha do pentagrama; portanto, todas as notas nessa linha serão SOL. A nota imediatamente acima será um LÁ e a imediatamente abaixo, um FÁ. Contando linha por linha, ou confrontando com as informações do excelente manual do Expert, página 120, vamos decifrando o primeiro compasso:
SOL-SI-SI
segundo compasso:
LÁ-SOL-SI-DÓ#
Pronto, já deu bode! Ao lado da nota DÓ há um sinal. O amigo músico ou a página 120 do manual explicam que trata-se de um acidente musical, que eleva a nota em meio tom. Aliás, os próprios MSX obedecem a este mesmo sinal (parte superior da tecla do "3") ou "+", indiferentemente. Pronto, já matamos o bode.
terceiro compasso:
RÉ-SOL.-LÁ-SI-SI
Outro bode: há um ponto ao lado da nota SOL. Este ponto aumenta em 50% a duração da nota, e o MSX também o obedece.
A Duração
Berra o leitor, apavorado: "Você esqueceu a duração das notas!". Não esqueci, não. Vamos descascando a cebola camada por camada. Suponhamos que você tenha terminado a quantidade de compassos que irá utilizar num treco de seu programa. Vem agora o trabalho da segunda tradução.
Você sabe - ou vai aprender - que outra forma de notação musical é chamando-as por letras do alfabeto (uma primeira forma medieval): A, B, C, D, E, F, G são respectivamente, LÁ, SI, DÓ, RÉ, MI, FÁ, SOL.
Tomamos agora cada compasso (sem esquecer de assinalar em nosso caderno de trabalho onde termina cada um) e traduzimos:
- G-B-B
- A-G-B-C#
- D-D-G.-A-B-B
Perceba que agora já é possível introduzir esta informação no computador e ordenar um:
PLAY "GBBAGBC#DDG.ABB"
e ele, obedientemente, assobiará nossa melodia. Por certo ela será quase irreconhecível, precisamente porque não temos a duração de cada nota. Vamos descascar mais uma camada da cebola (ou trabalhar estruturalmente o nosso programa, se você prefere ser elegante).
Você sabe - o próprio manual o afirma - que as notas brancas - têm duração maior; que as pretinhas duram menos e se, ainda mais, possuírem rabinho, terão ainda menor duração. Daí os diferentes nomes que levam.
Consultando o manual, percebemos que a nota semínima equivale à duração L4 (ou um quarto). Vamos introduzir isso no programa e ouvir como fica:
- L4 GBB
- L2AG L4BC#
- L4DDG. L8A L4BB
"Eureca!", berra o leitor maravilhado. "A melodia está começando a ficar reconhecível!"
Exatamente. Perceba, no entanto, dois problemas: o MSX une duas notas iguais, vizinhas, somando sua duração. Nada de errado quanto à duração; porém num instrumento musical ambas são emitidas distintamente, embora sejam a mesma! O jeito será colocar uma minúscula pausa entre elas. Por exemplo, R64 (R é pausa musical na função PLAY) é a menor que existe. Experimente colocá-la entre notas iguais:
- L4G B R64 B
- L2AG L4BC#
- L4D R64 DG.L8A L4B R64 B
Puxa, como melhorou! Porém, esbarramos em um problemão real.
Como Encher um Litro com Leite
Como você sabe, num litro cabem 1000 centímetros cúbicos. Pois no compasso que viemos trabalhando cabiam três figuras rítmicas mínimas - no linguajar dos músicos - vale dizer: a mínima. Ou como a figura rítmica semínima vale a metade, caberiam seis semínimas. Aliás, é precisamente isso que está dito ao lado da clave de SOL: 32. Três mínimas por compasso ou qualquer outra combinação de valores.
Quer dizer, você pode encher um litro com 600cc de leite e 400cc de água, mas não pode exceder os 1000cc. Se o fizer, derramará o excesso - de água, de leite ou... duração da nota dentro do compasso!
Não estou preocupado com filigranas musicais. O problema é que, se não obedecermos estritamente às regras musicais, será o caos. (Não consigo evitar o trocadilho: será o musicaos). Quando trabalhamos a segunda e terceira vozes será o festival dos desencontros!
Solução
Usaremos o ponto que aumenta a duração das notas em 50%. Veja como fica:
- L4GBR64L8B...
Perceba que não assinalei reticências após a nota SI; porém aumentamos a semínima em 50%, + 50% do tempo anterior e ainda +50% da fração de tempo, criando um espaço para inclusão da pausa R64. Dessa maneira, o leite não derramou, uma vez que não excedemos os 1000cc.
Agora trabalharemos o acompanhamento do segundo pentagrama (a mão direita do piano) como se fossem duas vozes, uma vez que há notas tocadas simultaneamente (em acorde). Vamos ao primeiro compasso:
- SI-RÉ-RÉ (são as notas de cima)
- SOL-SI-SI (aquelas embaixo)
As de cima serão introduzidas no canal B; e as de baixo, na voz C do MSX. Vamos continuar descascando a cebola - um problema por vez - e fiquemos apenas com a B.
- SI-RÉ-RÉ
- RÉ.-DÓ-SI-SI-DÓ#
- RÉ-SI-RÉ-RÉ
Segundo tratamento (duração das notas):
- L4 SI-RÉ-RÉ
- L4 RÉ.-DÓ L2 SI-DÓ#
- L2 RÉ-SI L4 RÉ-RÉ
Terceiro tratamento: introduzimos as pausas e corrigimos o tempo total de cada compasso:
- L4 SI-RÉ R64 L8 RÉ...
- L4 RÉ.-DÓ L2 SI R64 L8 SI... L4 DÓ#
- L2 RÉ-SI L4 RÉ R64 L8 RÉ...
Última tradução:
"L4BDR64L8D... L4D.CL2BR64L8B... L4C#L2DBL4DR64L8D..."
... e pronto! Coloque a primeira voz, uma vírgula e esta segunda. tudo deverá tocar lindamente. Se assim for, trate a terceira voz como veio fazendo até agora e ouvirá uma linda melodia medieval a três vozes.
Se você construir, compasso a compasso, voz a voz, a sua "transposição", poderá perceber quando surge um erro e corrigi-lo com facilidade. Ao mesmo tempo, com a instrução V (volume, variando de 1 a 15) antes de cada voz, modificar a "proporção" entre os canais, com resultado muito agradável.
Este tratamento passo a passo é de resultado seguro, fácil e imprescindível se você pretende compreender os princípios de um instrumento musical maravilhoso como o MSX. Resta agora descobrir os demais universos das funções S e M, alcançando timbres encantadores. Mas isso já é assunto para outro artigo.
Dicas
Desenho Gráfico
Artigo Original: José Guilherme Séez Jr, Digitação: Wilson Pilon
Eis aqui um curioso desenho gráfico para os usuários da linha MSX.
1 CLS
2 KEY OFF
4 INPUT "De um valor para G (0 ate 254): ";G
9 COLOR 15,1,1
10 SCREEN 2
11 H=0
12 H=H+2
13 IF H=G THEN GOTO 20
14 LINE (127,0)-(H,92),15
15 LINE (127,192)-(H,92),4
16 GOTO 12
20 FOR F=0 TO 255
30 PSET (0,F),15
40 PSET (F,0),15
41 PSET (255,F),15
42 PSET (F,191),15
45 NEXT F
50 FOR R=0 TO 450:NEXT
60 GOTO 1
Círculos
Artigo Original: Kenedy Pereira de Araújo, Digitação: Wilson Pilon
Observe os interessantes efeitos produzidos por este pequeno programa:
10 TIME=0:N=1
20 SCREEN 2
30 FOR I=0 TO 60
40 K=INT(RND(-TIME)*15)
50 CIRCLE(120,100),N,K
60 N=N+2
70 NEXT
80 FOR I=0 TO 1000:NEXT:GOTO 20
Depois, experimente mudar a linha 50 para:
50 CIRCLE (120,100),N,K,,,.4
E acrescente:
55 CIRCLE (120,100),N,K,,,3
10 TIME=0:N=1
20 SCREEN 2
30 FOR I=0 TO 60
40 K=INT(RND(-TIME)*15)
50 CIRCLE(120,100),N,K,,,.4
55 CIRCLE(120,100),N,K,,,3
60 N=N+2
70 NEXT
80 FOR I=0 TO 1000:NEXT:GOTO 20
Terremoto no Vídeo
Artigo Original: Flávio José M.Jr, Digitação: Wilson Pilon
Se na sua cidade não há terremotos, agora vai ter. Digite este programinha e comprove.
10 SCREEN 2:COLOR 15,1,1
20 H=255
30 V=191
40 LINE (255-H,191-V)-(H,V),,B
50 H=H-6
60 V=V-6
70 IF H=69 AND V=5 THEN 90
80 GOTO 40
90 C=INT(RND(-TIME)*15)+1
100 SOUND 0,200:SOUND1,0:SOUND 6,20:SOUND7,238:SOUND 8,16:SOUND 9,16:SOUND 11,90:SOUND 12,1:SOUND 13,10
110 COLOR,,C
120 GOTO 90
WebMSX
- ms-61.dsk: Rode os programas pelo WebMSX