Gerador de Ruídos
O gerador de ruídos gera uma "sequência de pulsos com largura pseudo aleatória, modulada por frequência". A frequência é definida através de 5 bits no registrador R6 (Noise Period), o clock do KC89C72 é dividido por 16 e depois pelo valor nestes bits. Embora esta operação seja parecida com a dos geradores de tons que vimos anteriormente, existem duas diferenças importantes:
- A faixa de frequência é bem menor, pois são apenas 5 bits (valores de 0 a 31).
- A saída dos geradores de tons é uma onda quadrada (tempo em nível alto = tempo em nível baixo); os pulsos gerados pelo gerador de ruídos tem largura variável. Por este motivo o som gerado pelo gerador de ruído se assemelha a ... ruído!
O KC89C72 possui somente um gerador de ruído, que pode ser mixado em qualquer um dos três canais de saída (ou combinação deles)
Gerador de Envelope
O gerador de envelope provoca uma variação da amplitude (volume). Existe somente um gerador de envelope, que pode ser aplicado a qualquer um dos três canais de saída (ou combinação deles). O uso ou não do envelope em cada canal é definido no respectivo registrador de amplitude, no bit 4.
A programação do gerador de envelope envolve dois parâmetros. O primeiro é o período (frequência) que é definido pelos registradores R13 e R14 (num total de 16 bits). Ao contrário dos geradores de tom e ruído, o gerador de envelope trabalha com o clock dividido por 256, o que resulta em frequências bem menores (e, portanto, períodos longos).
O segundo parâmetro controla a forma do envelope. Existe uma explicação teórica para o efeito de cada um dos quatro bits do registrador correspondente (R15), mas o mais fácil é usar a tabela abaixo.
Gerando Efeitos Sonoros
O manual de programação (AY-8910Prog.pdf nos arquivos do blog) fornece alguns exemplos que ajudam a entender um pouco como tudo isto funciona.
Vamos começar pelo som de um tiro. O período do gerador de ruído (R6) é programado com 15 e o gerador de envelope é programado para um único ciclo, passando da intensidade máxima para a mínima em um tempo curto (cerca de 0,6 segundos):
writeReg (regNoisePeriod, 15); writeReg (regEnv_Lo, 0); writeReg (regEnv_Hi, 16); writeReg (regEnvShape, 0); writeReg (regAmpA, 0x1F); writeReg (regEnable, 0x37);Um efeito de explosão é feito de forma semelhante, porém gerando um ruído com período máximo (R6 = 0) e esticando ao máximo o envelope (para cerca de 2 segundos):
writeReg (regNoisePeriod, 1); writeReg (regEnv_Lo, 0); writeReg (regEnv_Hi, 56); writeReg (regEnvShape, 0); writeReg (regAmpA, 0x1F); writeReg (regEnable, 0x37);Um barulho semelhante a um motor pode ser gerado usando ruídos e envelope com período curto e usando um envelope que alterna subida e descida do volume:
writeReg (regNoisePeriod, 2); writeReg (regEnv_Lo, 0); writeReg (regEnv_Hi, 1); writeReg (regEnvShape, 8); writeReg (regAmpA, 0x1F); writeReg (regEnable, 0x37);
O sketch KC89C72_C (nos arquivos do blog) permite gerar estes efeitos.
Juntando Tudo
O vídeo abaixo permite ouvir o resultado do que vimos até agora e mais o efeito de usar mais de um canal simultaneamente (isto requer uma pequena alteração no circuito que apresentei anteriormente: é necessário inter-conectar as saídas dos três canais - pinos 3, 4 e 38). O sketch KC89C72_Demo (nos arquivos do blog) foi usado para gerar os sons.
Nenhum comentário:
Postar um comentário