Separatore di canali MIDI con PIC16F876
Il circuito
Il software
La realizzazione
Altre realizzazioni
Un possibile miglioramento
Conclusioni e ringraziamenti
Introduzione
Il protocollo MIDI è uno standard affermato da tempo in campo musicale per gestire le comunicazioni fra strumenti elettronici come master keyboard, expander, sintetizzatori, generatori di effetti, e chi più ne ha, più ne metta.
Messo a punto verso l'inizio degli anni '80, questo sistema ha conosciuto una grandissima espansione grazie anche agli intrinseci vantaggi di praticità ed economicità che offre, tali da garantirne la presenza in tutti gli strumenti musicali elettronici odierni che siano anche solo un po' più che un giocattolo. Si tratta di un protocollo seriale asincrono che funziona alla velocità moderata (rispetto ai più evoluti standard attuali quali Firewire o USB) di 31,25kbit/s.
Dal punto di vista dell'utilizzatore, una porta MIDI si presenta come due prese femmina DIN a 5 poli chiamate IN ed OUT affiancate da una terza chiamata THRU. L'ingresso (IN) riceve le informazioni rispetto alle note da suonare o gli strumenti da selezionare; l'uscita (OUT) ovviamente si comporta in maniera complementare. Per collegare una tastiera dotata di MIDI OUT ad un modulo sonoro, bisognerà quindi collegare l'uscita OUT della tastiera con l'ingresso IN del modulo.
Dal punto di vista della comunicazione, le informazioni inviate tramite lo standard MIDI viaggiano sotto forma di pacchetti ciascuno formato da un marcatore di inizio, da un corpo di pacchetto e da un marcatore di fine. Per ogni collegamento fisico, vi sono 16 canali i quali costituiscono delle classi di appartenenza di ciascun messaggio. Per esempio, un musicista può scegliere di far suonare un pianoforte nel canale 0, un violino nel canale 1, una viola nel canale 2 ed un violoncello nel canale 3 e via continuando. In questo modo, ogni nota suonata sarà identificata da un canale che ne specifica (fra le altre cose) quale sia lo strumento con cui vada eseguita.
Quello che desideriamo ottenere è un progettino utilizzante un PIC16F876 e che sia capace di dividere fisicamente un flusso MIDI. Si dispone quindi di un solo ingresso e di due uscite. Per ogni messaggio ricevuto, in pratica si guarda in una tabella su quale uscita debbano essere dirottati i segnali.
Un tale oggetto è utile per chi (come me) disponga di più di uno strumento MIDI, ma solamente di una interfaccia per il calcolatore. Lo strumento permette di separare fisicamente la comunicazione pilotando indipendentemente due diversi dispositivi.
Il circuito
Data la scelta di un PIC funzionante a 4MHz abbastanza flessibile, il circuito da realizzare è abbastanza semplice, dato che tutto il lavoro "sporco" è svolto grazie al software caricato sul microcontrollore. Analizzando il circuito a partire dall'ingresso MIDI IN, si nota che l'accoppiamento con l'ingresso del PIC16F876 è realizzato tramite un fotoaccoppiatore. Questo componente ha il compito di proteggere il microcontrollore da eventuali tensioni pericolose che si trovassero per errore nell'ingresso del circuito, ma soprattutto è indispensabile per evitare fastidiosi loop di massa che si formerebbero attraverso la connessione audio del dispositivo MIDI.
Dato che disponevo di una grande quantità di MTC62 recuperati da un vecchio apparato per camera pulita (un RIE dismesso), ho utilizzato questo fotoaccoppiatore (doppio) per questo circuito, utilizzandone solo una metà. Rispettando ovviamente la diversa piedinatura, è possibile (e perfino consigliabile!) utilizzare un fotoaccoppiatore rapido del tipo Sharp PC900, più comunemente utilizzato per questo genere di funzioni.
Il segnale entra nel piedino 18 del PIC che è configurato via software come ingresso di dati seriali alla velocità specificata dal protocollo MIDI. Questa operazione è semplificata dal fatto che il PIC16F879 dispone di una USART hardware, capace di semplificare grandemente i problemi di ricezione seriale sincrona e asincrona. Il problema non è molto diverso rispetto alla ricezione di dati su un bus RS232 e del resto qualche anno fa erano diffuse delle interfacce MIDI minimaliste che si collegavano proprio alla RS232...
Il connettore denominato ICSP (In Circuit Serial Programming) dà accesso a tutti i segnali necessari per programmare il microcontrollore senza estrarlo dal circuito, caratteristica nota dei microcontrollori di casa Microchip. Ovviamente, questo andrà fatto con un programmatore che prevede questa possibilità. La porta B del PIC è quasi completamente utilizzata per pilotare un display LCD alfanumerico 16x2 basato su un chip Hitachi HD44780 o compatibile. Questo permetterà di gestire la tabella di attribuzione dei canali alle differenti uscite grazie ai due pulsanti DATA e SET, collegati ai piedini A0 e A1 del PIC.
Il traffico MIDI è rispedito in uscita al piedino 17 il quale, grazie alle porte NAND contenute in un SN74LS00, viene indirizzato all'uscita MIDI A o B, a seconda dei livelli logici presenti sulle uscite C0 e C1 del microcontrollore.
Piccola nota folkloristica: come ho detto sopra, il fotoaccoppiatore era usato in un apparecchio per la RIE in camera pulita. Ho anche usato un SN74LS00 proveniente dalla scheda di un vetusto microscopio elettronico a scansione smantellato, a posto del 74HC00. In realtà, quest'ultimo rappresenterebbe una scelta ben migliore, perché può fornire una corrente più che sufficiente ad accendere un led, mentre il primo può avere qualche problema nei casi al limite.
Il software
Ecco il firmware, in assembler MPASM, da compilare e caricare sul microcontrollore, rilasciato sotto licenza GPL. Ho cercato di commentare il più possibile il sorgente (in inglese, sorry...) per facilitarne la comprensione e la modifica.
Sorgente: MIDI_splitter.asmCompilato: MIDI_splitter.hex
Il software non deve fare altro che ricevere i pacchetti MIDI, riconoscere il canale di ciascun pacchetto, ed indirizzare l'uscita sulla porta A o B corrispondente al canale letto nel pacchetto. Ovviamente, l'utente deve poter modificare la tabella di corrrispondenza dei canali in qualunque momento e quest'ultima deve essere salvata in EEPROM, di modo da non dover essere ricaricata ad ogni accensione del dispositivo.
Il programma caricato nella memoria del PIC è in realtà abbastanza semplice, perché tutta la parte difficile di ricezione della comunicazione seriale è svolta tramite la USART hardware fornita dal PIC16F876. Quello che deve essere fatto è in realtà solo la configurazione della USART alla velocità corretta (31,25kbit/s), 8 bit di dati, con un bit di stop ed uno di start e trasmissione asincrona, come specificato dallo standard MIDI. La USART si occuperà di attivare un'interruzione nel momento in cui un carattere è pronto nel buffer di ricezione e deve essere trattato.
In questo modo, tutto quello di competenza con la trasmissione e la gestione dei segnali MIDI avviene all'interno della interruzione, mentre il programma principale può occuparsi solo dei problemi della configurazione iniziale e della gestione dell'interfaccia utente. Un messaggio MIDI è composto da diversi byte che sono inviati in sequenza. Il primo è l'intestazione, che è l'unico byte del messaggio avente il bit più significativo ad 1. I restanti sette bit sono usati per riconoscere il tipo di messaggio (su 3 bit e quindi 8 disponibili) ed il canale relativo al messaggio (su 4 bit e quindi 16 canali).
Vi sono due tipi di messaggi; il primo tipo è rappresentato dai messaggi che fanno effettivamente riferimento ad un canale, il secondo i messaggi generali che hanno influenza su tutto lo strumento e non su un canale specifico.
Nell'interruzione, la presenza di un'intestazione di messaggio viene testata attraverso lo stato del bit più significativo. Nel caso si riceva un'intestazione, il programma va a vedere il numero del canale (impaccato nell'intestazione) e verifica sulla tabella delle corrispondenze l'uscita A o B che concerne il canale in questione ed attivando di conseguenza le linee C0 e C1.
Allo stato attuale, il software non offre un'implementazione completa della gestione dei messaggi MIDI (mancanza di tempo...). Eventi di tipo SDS o sistema esclusivo (che non fanno quindi parte di un canale definito) non vengono trattati correttamente, almeno in questa implementazione e fino a che non trovero' il tempo e la voglia di scrivere le poche righe di codice necessarie a risolvere questo problema.
Il microcontrollore potrebbe in teoria controllare tramite la tecnica del PWM il contrasto del display LCD, ma per il momento non ho attivato la gestione tramite il software, sempre per problemi di tempo e perché per il mio modello di display il contrasto massimo è quello ottimale.
L'interazione con l'utente avviene con due bottoni. L'idea è che il bottone DATA permette di muovere il cursore attraverso gli elementi di un menu, mentre il bottone SET permette di modificare l'elemento corrente. A livello software, il tutto è gestito tramite una macchina a stati dove ogni stato corrisponde ad un elemento attivo del menu e la pressione dei bottoni (gestita da un'apposita routine che elimina i rimbalzi) permette la commutazione degli stati.
La realizzazione
Nel mio caso, ho montato il tutto su una basetta millefori ed ho usato un display retroilluminato. L'alimentazione è realizzata tramite un trasformatore a muro che fornisce circa 8V raddrizzati, i quali sono poi stabilizzati a 5V grazie ad un semplice uA7805.
Il tutto è fissato in una scatola di metallo, forando il pannello anteriore per far fuoriuscire il display ed i bottoni per l'interazione con l'utente. Le scritte visibili nelle fotografie sono eseguite con la classica tecnica dei trasferibili, ricoperti da una diverse mani leggere di vernice trasparente.
Altre realizzazioni
Floriano
Da quando questa pagina è stata pubblicata, ho potuto constatare con piacere che questo semplice circuitino ha suscitato un qualche interesse. In particolare, nel 2007 sono stato contattato da Floriano che ha perfino sbrogliato un circuito stampato ed ha ridisegnato in maniera più elegante il mio schema elettrico. La versione di Floriano adotta un fotoaccoppiatore modello CNY 17 ed è stato obbligato ad aumentare a 27 kΩ la resistenza tra il piedino 18 del PIC ed il positivo affinché la trasmissione avvenisse senza problemi. Al circuito originale è stato aggiunto anche un LED che testimonia l'arrivo di messaggi MIDI al circuito.
Riporto quindi qui con molto piacere lo schema della sua realizzazione nonché le immagini che mi ha fatto gentilmente pervenire. Senza dubbio, la sua realizzazione che adotta un vero circuito stampato è più elegante ed ha un aspetto decisamente migliore della mia su millefori!
Max Marenghi
Nel febbraio 2013, Max mi ha mandato qualche foto del suo circuito e mi ha autorizzato a pubblicarle, cosa che faccio con piacere. Max ha messo il circuito in un contenitore simile al mio e lo utilizza nel suo studio. Discutendo a proposito del circuito, mi ha suggerito che sarebbe interessante mostrare in qualche modo la tavola di ripartizione dei canali invece della scritta "Splitting...". Io la trovo una buona idea, chissà che un giorno non rimetta mano al progetto.
Un possibile miglioramento
Discutendo con Floriano, ci siamo accorti che il realtà il progetto poteva essere esteso notevolmente, permettendo di gestire più uscite. Il tutto può diventare quindi una sorta di "patch bay", capace di incanalare un messaggio MIDI su un'uscita in particolare, a scelta fra sei possibili. Per prova (e per prendere un po' la mano con Eagle), ho giocato a fare il progetto completo del circuito, benché poi questo non sia stato mai realizzato.
Ecco qui l'archivio completo contenente questa estensione del progetto, così com'è. E' proposta una scheda doppia faccia, piuttosto densa (la clearance minima è 10 mils) e che probabilmente contiene ancora degli errori, perché non è stata testata. Se vi va di far qualcosa (a vostro rischio e pericolo), fatemi sapere come va a finire. Utilizzate sempre la serie HC per gli integrati logici, quindi 74HC245 e 74HC00. Ho aggiunto un po' di led per indicare un'attività MIDI su ognuna delle porte di ingresso e di uscita.
La scheda rientra nel formato massimo gestibile dalla versione di Eagle liberamente scaricabile ed utilizzabile gratuitamente. Questo vuole dire che potete modificare la scheda come più vi piace e magari correggere gli eventuali errori che sono presenti. Mi farà piacere restare al corrente delle evoluzioni, anche se ovviamente non mi prendo responsabilità se tutto esplode al primo colpo, perché, ripeto, NON ho realizzato la scheda e non l'ho testata. Il file assembler PIC contenente il firmware aggiornato è presente nell'archivio. Potete benissimo utilizzarlo nella versione base del circuito (cambiando solo il numero di porte di uscita da 6 a 2 in una delle dichiarazioni iniziali). Sentitevi liberi di modulare il progetto in base alle vostre necessità.
Conclusioni e ringraziamenti
Anche se era da tempo che desideravo costruire qualcosa che si interfacciasse tramite il protocollo MIDI alla mia catena di strumenti musicali, lo stimolo per incominciare il lavoro è venuto da una serie di discussioni molto fruttuose che ho portato avanti con Daniele e Sebastiano, due frequentatori del forum di Nuova Elettronica. Sebastiano aveva bisogno di qualcosa di leggermente differente e Daniele ed io abbiamo risposto alla sua richiesta d'aiuto. Da lì sono nati molti interessanti scambi di opinioni sulla USART, sulla gestione del software, sul circuito e sull'architettura generale del progetto.
Grazie mille!
Ovviamente, se avete commenti o volete mandarmi delle foto della vostra realizzazione, potete contattarmi per posta elettronica davbucciNoNsPaMmArE@tiscali.it
License:
--------
Copyright (C) 2005-2007 Davide Bucci davbucci at tiscali dot it
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.