terça-feira, janeiro 21, 2014

Chip de Som AY-3-8910 / KC89C72 - Parte 5

Neste post vamos ver a geração de efeitos sonoros com o KC89C72, que é feita através de dois blocos: o "gerador de ruídos" e o "gerador de envelope".

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!
A figura abaixo mostra a saída do KC89C72 para duas programações diferentes de R6 (atenção que as escalas horizontais são diferentes).


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: