Sei sulla pagina 1di 15

Progetto e realizzazione di un dispositivo per il polling temporizzato di una matrice di contatti e la generazione conseguente di messaggi secondo lo standard musicale

MIDI.
Corso: Elettronica III Studente: Giancarlo Todone

Materiali
1 x microcontrollore Microchip PIC18F452 2 x 3-to-8 demux 74hc138 Alimentazione stabilizzata a 5v tramite integrato 78ls05 e un paio di condensatori Clock da 20 MHz con quarzo e condensatori stabilizzatori Resistenze da 2.2K e 10K (+ 1 da 220 e un trimmer da 1K)

Attrezzature
Multimetro Oscilloscopio Frequenzimetro Alimentatore da banco PC con porta seriale e porta MIDI

Setup base
Lalimentazione viene fornita stabilizzata dal regolatore di tensione 78ls05 e dai due condensatori di contorno La resistenza posta tra MCLR e Vcc inibisce il reset Il quarzo da 20 MHz e i condensatori stabilizzatori forniscono il clock ( facile sostituire il quarzo con uno fino a 40 MHz; il software andrebbe modificato di

La matrice di contatti

La matrice di contatti della tastiera pu essere vista come una griglia di interruttori 8 banchi x 8 note, ai quali vanno aggiunti altri 8 banchi per i contatti dedicati al rilevamento della dinamica. Lo schema (semplificato qui a 3 banchi di tre note) evidenzia le connessioni e la presenza di diodi per evitare ritorni di tensione durante multiple pressioni contemporanee. Le resistenze di pull-up sulla destra sono interne al microcontrollore.

La matrice di contatti

Alcuni comandi MIDI


Opcode 0x80-0x8F 0x90-0x9F 0xB0-0xBF Cc parameter modifica di un parametro continuous controller; seguito da due byte (uno per il codice controller, l'altro per la nuova impostazione parametro) Nome Note off Note on Descrizione indica di silenziare una nota; seguito da due byte di parametri (uno per la nota, l'altro per l'intensit) indica di suonare una nota (o silenziarla se l'intensit 0)

0xE0-0xEF Pitch wheel indica la posizione assoluta della rotella che sposta finemente il tono; seguita da due bytes rappresentanti una parola di 14 bits (i 7 bits meno significativi per primi)

0xFE Active Sensing Token viene mandato ogni 300 ms circa dal master quando questo non ha niente da fare (per far capire che ancora vivo); quando non viene ricevuto alcun messaggio per pi di 300 ms il master da considerarsi

Software
Ciclo infinito Ad ogni ciclo si legge tutto I messaggi MIDI appropriati vengono generati e inviati alloccorrenza

while (1) { scanBeforeAndAfter(); readOtherInputs(); sendMIDIMessageAccordingly(); handleActiveSensing(); }

Procedura di scansione
0 7 : 8 banchi di 8 switches before 8 15 : 8 banchi di 8 switches after I de-mux sono invertenti riconoscimento degli eventi void scanBeforeAndAfter() { appena for (i = 0; I < 16; ++i ) { accaduti oldData[i] =newData[i];
newData[i] = ~PORTB; justPressed[i] = ~ oldData[i] & newData[i]; justReleased[i] = oldData[i] & ~ newData[i]; } }

Procedura di scansione
A A B B C C D D E E F F G G H H

Allattivazione di ognuno degli 8 banchi di contatti before e degli 8 banchi after, le corrispondenti 8 note (o meno nell ultimo banco) sono leggibili direttamente sulla PORTB del PIC in logica negativa

Gestione della velocity


Ad ogni ciclo si decrementa il parametro velocity dei tasti per i quali stato chiuso il contatto before ma non l after Allavvenuta chiusura di entrambi i contatti, loperazione di pressione di un tasto conclusa, e la misura del tempo tra la pressione dello switch before e after contenuta nella variabile velocity Alla riapertura di un Before si segnala lavvenuto rilascio di un tasto
for (i = 0; i < 64; ++i) { if (pressedBefore[i]) --velocity[i]; If (justPressedAfter[i]) sendNoteOn(i, velocity[i]); if (justReleasedBefore[i]) { sendNoteOff(i); velocity[i] = 127; } }

Altri controlli
I controlli digitali (switch del pedale sustain) vengono letti tramite le porte rimaste libere I controlli analogici vengono gestiti tramite lADC interno del 18F452 (in figura PB)

Running Status Byte


Si sfrutta la convenzione running status byte del protocollo MIDI per ridurre il traffico sulla linea seriale: evitiamo di rimandare gli stessi comandi se inframezzati solo da dati. Questo insieme alla convenzione che un note-on con intensit zero viene interpretato come un note-off, permette di mandare lunghe sequenze di note (o cambi di tono, o ) riducendo di molto la banda occupata

void sendCommand(cmd) { if (lastSB != cmd) { lastSB = cmd; send(cmd); } activeSensingTimeout = 0 }

Active Sensing
Ogni volta che un comando o un dato qualsiasi viene inviato, il contatore activesensingTimeout viene azzerato Quando invece raggiunge 300, viene spedito un token Con 1000 scansioni al secondo, un token viene inviato ogni 300 ms di inattivit per segnalare il funzionamento (come richiesto dal protocollo)
++ activesensingTimeout; if (activeSensingTimeout>300) { activesensingTimeout = 0; send(activeSensingToken); }

Fine
Dettagli nella documentazione Links e downloads sulla pagina di presentazione in inglese e sul sito online http://sites.google.
com/site/nerdsheadquarter/pic_midi

progetti, schemi, immagini, foto, informazioni e codici sorgenti di Giancarlo Todone vengono rilasciati con licenza Apache 2.0, a parte le informazioni sul protocollo MIDI 1.1 dedotte dallottimo documento The Usenet MIDI Primer di Bob McQueer, facilmente reperibile in rete.