quarta-feira, 6 de junho de 2018

BGM player

Subrotina em assembler para ser usada em jogos ou demos. Permite tocar uma trilha sonora de tons simples que pode ser gerada a partir de arquivos padrão RTTL.

A subrotina utiliza formato próprio, composto de 3 bytes, contendo duração da nota (1byte) e sua "frequência" (2 bytes).

duração      : [ 1 byte ]  1..255
"frequencia" : [---lsb--][0000-msb]  0..4095



A subrotina não é blocante e deve ser chamada a cada interrupção do VDP. Por isso a duração corresponde a intervalos de tempo múltiplos de 16.67ms (1/60Hz) ou de 20ms (1/50Hz) conforme o padrão da máquina.

A "frequência" corresponde ao divisor de clock que deve ser carregado nos registros de divisão do PSG (12 bits).

Uma nota com duração igual a 0 (zero) corresponde a um comando, dessa forma

duração: [ 0 ]  Comando
         [ccccrrrr][dddddddd]  

         cccc comando 0..15  
         rrrr argumento 0..15
         dddddddd dado 0..255

Até o momento três comandos estão definidos:

cccc = 0, : Reinicializa música
rrrr, dddddddd sem uso
                                  
cccc = 1,  : Escreve num registro do PSG
rrrr = registro [0..15]
dddddddd = dado [0..255] valor a ser escrito.


cccc = 2,  : Escreve num registro do PSG 
             e interpreta proximo comando ainda no mesm
             intervalo de tmepo
rrrr = registro [0..15]
dddddddd = dado [0..255] valor a ser escrito.

                                  
A geração das músicas a partir de "Ringtones" no formato RTTL pode ser feita utilizando um script python que permite inclusive que as músicas sejam ouvidas (pelo menos na versão windows)

Alguns detalhes:
Um valor de divisor para geração da frequência igual a 0 faz com que o canal do PSG fique mudo e isso é usado para gerar a pausa. Em nenhuma das referências que consultei havia essa informação.

O valor máximo de duração de uma nota é por volta de 4.3 segundos. Para gerar notas de maior duração o script gera uma segunda nota de mesma frequencia com o valor de duração excedente.

Códigos fonte e demais arquivos disponíveis no repositório do GitHub mas também tem uma imagem de disco na página do projeto no Hackaday.io que dá pra testar no WebMSX


Nenhum comentário: