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:
Postar um comentário