terça-feira, setembro 30, 2014

Disquetes Musicais: Entendendo o Moppy

O ponto de partida desta série foi um instructables que usa o software Moppy para tocar arquivos MIDI em unidades de disquete. Vamos dar uma examinada rápida de como ele faz isto. Para acompanhar, baixe os fontes do repositório oficial.

O Sketch Moppy

O software que roda no Arduino é extremamente simples. O código não é muito sofisticado, abusando da força bruta e sendo bastante frágil. Independente da quantidade de unidades em uso, ele configura como saída as 16 portas digitais de 2 a 17. A porta serial é programada para operar a 9600 e o Timer1 é usado para obter uma base (ticks) de 40 microsegundos.

A recepção de um código 100 faz o que é chamado de reset: todas as unidades configuradas são comandadas a dar 80 passos para trás, para garantir que estão na primeira trilha.

Um código diferente de 100 é tratado cegamente como um índice para uma tabela de períodos; os dois bytes seguintes são o valor escrito na tabela (byte mais significativo primeiro). Acho que faltou uma proteção para a concorrência de acesso nesta tabela entre o programa principal e a interrupção de timer.

A rotina de interrupção usa somente os índices pares (2, 4, ... 16) da tabela de períodos. Portanto, o código enviado pelo PC deve ter estes valores; o índice 2 controla o floppy ligado aos pinos 2 e 3, o índice 4 o ligado aos pinos 4 e 5 e assim por diante.

A rotina de interrupção simplesmente conta os ticks e muda o sinal de STEP da unidade quando atinge o valor na tabela de período. Portanto, a cada 2*40*período microsegundos a unidade dá um passo. O software controla em qual trilha a cabeça está e muda de direção quando atinge o final.

Moppy Desk

O lado do PC pode assustar no início. Entretanto, ignorando a interface com o operador e um monte de classes de interconexão, o que sobra é bem pouco.

A leitura e interpretação do arquivo MIDI é feito pelas classes em javax.sound.mid. O ponto de partida está em MoppyDesk\src\moppydesk\inputs\MoppySequencer.java. O método loadFile carrega o arquivo. O método meta trata um único evento MIDI do tipo meta: SetTempo. Este evento define a velocidade com a qual a música deve ser tocada.

Em MoppyDesk\src\moppydesk\ui\MoppyControlWindow.java encontramos o que é feito quando o botão connect é pressionado. O que nos interessa mais é a chamada a initializeReceivers, que, de uma forma bem convulsionada, acaba criando um objeto MoppyPlayerOutput para cada Arduino conectado e registrando-o para tratar os eventos MIDI obtidos do arquivo.

Passando ao diretório MoppyDesk\src\moppydesk\outputs, encontramos MoppyPlayerOutput.java que irá tratar os eventos MIDI e comandar as unidades. Os eventos tratados são NoteOn, NoteOff e Pitch bend. No tratamento de NoteOn a nota é convertido no valor apropriado de período.

No mesmo diretório temos MoppyCOMBridge.java, que  contem os métodos para enviar as mensagens para o Arduino.


Agora que já conhecemos todas as partes, é hora de partir para um implementação própria. Vamos começar a ver isto no próximo post.

Nenhum comentário: