|
|
Nel tutorial precedente
abbiamo visto, molto in generale, cos'è il protocollo MIDI e
quali sono gli obiettivi della sua adozione negli strumenti
musicali elettronici. In questo secondo tutorial cercheremo di fornire una lista, per quanto possibile completa, delle istruzioni formali che caratterizzano il protocollo e dei formati possibili per ogni comando. Struttura dei messaggi MIDI I messaggi MIDI sono informazioni binarie che viaggiano in sequenza. Ogni "parola" è costituita da 10 bit, dei quali il primo e l'ultimo individuano l'inzio e la fine della parola, per cui il messaggio significativo della parola è contenuto negli 8 bit rimanenti, e, poichè 8 bit costituiscono un byte, si vede che il messaggio della parola è costituito da un byte. Il primo bit viene detto start bit, i seguenti 8 data byte e l'ultimo bit stop bit. Un messaggio MIDI può essere costituito da una o da più parole successive contenenti 1 byte ciascuna. Il primo byte viene detto status byte e serve ad identificare il tipo di messaggio; il successivo o i successivi (non più di due, in ogni caso) sono dei veri e propri data byte che contengono le informazioni significative. Come fa il dispositivo ricevente a distinguere uno status byte da un data byte? Dobbiamo infatti ricordare che le parole sono in semplice successione una dietro l'altra, e il dispositivo non può sapere quale sia l'uno o l'altro se non introduciamo un'informazione che lo identifichi. Per far questo viene utilizzato il Most Significant Bit, ovvero bit più significativo, anche detto sinteticamente MSB. Il Most Significant Bit è semplicemente il bit più a sinistra di ogni byte. E' stato stabilito che i messaggi con MSB 1 contengano gli status byte, mentre quelli con MSB 0 contengano i data byte. In questo modo il dispositivo che riceve le istruzioni (ricordiamo che questo viene detto slave), quando incontra un MSB uguale ad 1, legge il byte come status, comprendendo quindi come interpretare il byte o i byte di dati seguenti, e poi, finchè incontra MSB uguali a 0, legge i byte come dati. All'1 successivo cambia status. Nella figura che segue vediamo questa struttura di base. La prima parola contiene, oltre allo start bit e allo stop bit, un byte il cui primo bit è un 1: si tratta perciò di uno status byte. Il dispositivo slave interpreta quindi il byte come istruzione che definisce un certo tipo di messaggio MIDI. Segue un'altra parola binaria, nel cui byte il primo bit è uno 0: il dispositivo interpreta quindi il byte come istruzioni da eseguire per il tipo di messaggio MIDI definito dallo status byte. Questo data byte potrebbe essere seguito da un secondo data byte; dopo, in ogni caso (sia che vi sia un solo data byte o due), si passa ad un nuovo status byte, e così via. Tipi di informazioni MIDI Ci chiediamo: ma quali informazioni viaggiano nel protocollo MIDI? Vediamole brevemente, poi ci occuperemo della loro struttura. Innanzitutto i canali: il MIDI dispone di 16 differenti canali, o indirizzi, o se vogliamo vie sulle quali incanalrsi. A seconda del canale corrispondente ad una informazione, questa informazione giungerà ad una destinazione piuttosto che ad un'altra. Un canale potrà quindi servirci a far giungere l'informazione ad un certo strumento MIDI slave piuttosto che ad un altro, oppure a far suonare una certa sezione di una tastiera piuttosto che un'altra. Su ogni canale, sono poi disponibili 128 patch, o "programmi": questo serve ad esempio a far eseguire allo strumento associato al canale una certa istruzione con un particolare timbro tra 128 disponibili. Un esempio molto semplice: abbiamo una successioni di istruzioni MIDI che devono essere fatti eseguire a tre strumenti: una batteria elettronica, un campionatore che deve riprodurre un pianoforte, un synth che produrrà un suono di archi elettronici. Assoceremo ad esempio alla batteria il canale 1, al campionatore il canale 2, al synth il canale 3 (ovviamente in questo esempio scegliamo i canali a caso, vedremo poi che in standard più evoluti ma anche meno "liberi", come il General MIDI, c'è una mappatura precisa dei canali, ma questo a noi non interessa in questo momento). Sul canale 1 assoceremo un comando di patch (o di program change) che sceglierà ad esempio il programma 3 della drum machine; sul canale 2 un comando di patch che sceglierà ad esempio il suono numero 7 del sampler (il nostro pianoforte campionato); sul canale 3 un comando di patch che selezionerà ad esempio la patch numero 35 del sintetizzatore (gli archi synth). Vi sono poi i messaggi di nota: queste sono le informazioni che costituiscono i "mattoni" della sequenza MIDI, in quanto sono quelle che verranno convertite in note suonate. Si distinguono in note on e note off, la prima per definire l'istante di ingresso della nota, la seconda l'istante di rilascio. Per entrambe vi è un dato di velocità, la velocity, che indica con quale velocità il tasto viene premuto (questo non solo in genere influisce sul volume della nota, come si intuisce - e attenzione però a non confondere la velocity col volume! - ma anche su altre variazioni o modulazioni previste dallo strumento in associazione, appunto, alla velocità con cui si preme il tasto: vi sono ad esempio molti campionatori che permettono di associare differenti suoni a differenti valori della velocity, ad esempio un basso può essere pizzicato su suonato con certi valori di velocity, e slappato con altri). Viene inoltre associato alla nota un valore di pitch che ne indica l'altezza, un valore di aftertouch che indica il valore di una variazione di pressione esercitata sul tasto dopo che il tasto è stato premuto (anche a questo valore molte tastiere permettono di assegnare varie funzioni, in genere modulazioni); inoltre vi sono altri valori di controller, alcuni dei quali siono fissi, altri assegnabili dai costruttori. Altri messaggi riguardano il timing del sistema, che consente ad un dispositivo slave di riprodurre la sequenza ad un certo tempo, e di eseguire eventuali cambi di velocità, nonchè di sincronizzare tutti i generatori di suono laddove necessario (ad esempio si può dare via MIDI un time ad un arpeggiatore, o anche ad un oscillatore). Infine vi sono da considerare quattro messaggi che costituiscono i modi: si tratta in pratica di quattro differenti configurazioni possibili per gli strumenti MIDI. Vediamoli uno ad uno: (notate che i 4 modi sono combinazioni di Omni On/Off e Poly/Mono) - Modo 1: Omni On - Poly (anche detto sinteticamente Omni). Modo nel quale il dispositivo slave interpreta i messaggi su tutti i canali senza distinzione di canale (omni) e in modo polifonico (poly). - Modo 2: Omni On - Mono. Modo nel quale il dispositivo slave risponde su tutti i canali ma in modo monofonico. - Modo 3: Omni Off - Poly (anche detto sinteticamente Poly). Modo nel quale il dispositivo slave risponde alle informazioni sul suo specifico canale e in modo polifonico. - Modo 4: Omni Off - Mono (anche detto sinteticamente Multi). Modo nel quale il dispositivo slave risponde alle informazioni sul suo specifico canale, in modo monofonico. Il modo Multi in realtà è nato per gestire gli strumenti multitimbrici, che oggi possono parere un'ovvietà ma sono stati al tempo della loro introduzione una forte innovazione, e serve a fare in modo che ogni strumento interno di uno stesso dispositivo riceva i dati su uno specifico canale, e in base ad un messaggio di patch o program change suoni un determinato timbro. In origine per far ciò era necessario che ogni strumento interno suonasse in monofonico, oggi in realtà il modo Multi è polifonico su tutti i canali. Classificazione dei messaggi MIDI I messaggi MIDI si classificano in due famiglie principali: messaggi di canale (Channel Message) e messaggi di sistema (System Message). I messaggi di canale sono quelli relativi ad un certo canale: noi sappiamo che i messaggi MIDI possono essere riferiti ad uno di sedici canali, o a tutti i canali contemporaneamente. I messaggi di sistema sono relativi al sistema nel suo insieme, dando ad esempio istruzioni relative al tempo, alla sincronizzazione, etc. Come fa il protocollo MIDI a distinguere tra messaggi di canale e messaggi di sistema? Torniamo ad osservare la struttura dei byte contenuti nelle parole binarie, in particolare dello status byte. Suddividiamo il byte in due parti uguali, di 4 bit ciascuna. Ogni blocco di 4 bit viene detto nibble. ognuno dei due nibble ha una sua funzione. Il nibble a sinistra, il cui primo bit è occupato, come sappiamo, dal bit 1 che identifica lo status byte, identifica il tipo di messaggio. Siccome il primo bit è occupato, abbiamo tre bit a disposizione, per cui possiamo identificare 23 = 8 tipi di messaggi differenti. Sette di questi saranno messaggi di canale, mentre la combinazione 111 identifica i messaggi di sistema. Il secondo nibble serve, nei messaggi di canale, a identificare il canale: con 4 bit disponibili, possiamo contare su 24 = 16 differenti canali. Nei messaggi di sistema, per i quali non c'è bisogno di identificare un canale, il secondo nibble serve a identificare 16 differenti messaggi di sistema (in realtà ne vengono attualmente utilizzati solo 11). Ora vedremo un elenco dei messaggi di canale e dei messaggi di sistema. Messaggi di canale Abbiamo visto che i messaggi di canale sono composti da un nibble 1xxx e poi da un nibble #### che identifica un canale. Possono essere seguiti da uno o due data byte: ognuno di questi ha il MSB pari a 0 e poi 7 bit liberi: ogni data byte può perciò assumere un valore compreso tra 0 e 127 (27 = 128). I messaggi di canale si suddividono in due sotto-classi: voice message e mode message. - Voice message Questi sono i messaggi che si riferiscono alle note vere e proprie.
- Mode message Sono i messaggi che indicano il modo da utilizzare tra i quattro disponibili (Omi On e Off, Poly e Mono). Vengono rappresentati sfruttando quattro valori possibili di control change, per cui il 1° nibble è sempre 1011. Esattamente si ha:
Messaggi di sistema I messaggi di sistema hanno il 1° nibble sempre uguale a 1111, mentree il 2° nibble, non essendo destinato al canale, identifica il tipo di messaggio. Il 2° nibble può definire 16 messaggi di sistema, ma, come abbiamo già detto, ne sono utilizzati attualmente solo 11. Questi si dividono in tre sotto classi: common message, real time message, system exclusive message. - Common message Sono i messaggi che danno istruzioni generali relative a tutto il sistema.
Sono i messaggi che organizzano la sincronizzazione del sistema.
Sono i messaggi destinati alle informazioni specifiche di ogni produttore. Sono composti da una sequenza particolare: un primo status byte (11110000) dà l'inizio alla sequenza SystemExclusive (abbreviato comunemente in SysEx; segue un byte che contiene il Manufacturer ID tipico del produttore; se questo viene riconosciuto, viene letta la sequenza di data byte che segue, in numero variabile a seconda del produttore; chiude la sequenza un ultimo status byte (11110111) che indica la chiusura del SysEx. Schematizziamo nelle seguenti illustrazioni tutti i messaggi di canale e di sistema. |
Coordinatore del Laboratorio Musicale: Prof. Gennaro Vespoli (Facebook)Contatta l'autore del sito: gennarovespoli63@gmail.com |