-> MIDI e sequencer -> Il protocollo MIDI: le istruzioni

Abbiamo visto fino ad ora, 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.
  • NOTE ON: questo messaggio è caratterizzato dal 1° nibble uguale a 1001.
    Indica al dispositivo slave di suonare una nota. Lo seguono due data byte: il primo specifica il pitch della nota, con un valore tra 0 e 127 (60 è il do centrale), il secondo la velocity.
  • NOTE OFF: messaggio caratterizzato dal 1° nibble uguale a 1000.
    Indica al dispositivo slave di interrompere l'esecuzione di una nota. Anch'esso è seguito dai due dta byte che indicano pitch e velocity.
  • CHANNEL PRESSURE: messaggio col 1° nibble pari a 1101.
    E' relativo all'aftertouch. Ha un data byte che indica il valore della pressione dell'aftertouch.
  • POLYPHONIC KEY PRESSURE: messaggio che corrisponde al 1° nibble pari a 1010.
    poichè il channel pressure assegna lo stesso valore a tutti i tasti premuti insieme, il polyphonic key pressure dà indicazioni sulla pressione di ogni singolo tasto.
    Ha due data byte, il primo individua il pitch della nota a cui va applicato, il secondo indica il valore di pressione, analogamente al data byte di aftertouch.
  • PITCH BEND CHANGE: corrisponde al 1° nibble uguale a 1110.
    Indica la variazione di intonazione di una nota, come quella che si esercita con l'omonimo controllo presente su tutte le tastiere. E' seguito da due data byte, che presi insieme forniscono 214 = 16384 valori si variazione.
  • PROGRAM CHANGE: il 1° nibble è uguale a 1100.
    Sono messaggi che indicano al dispositivo slave quale patch suonare sul canale corrispondente. Dispongono di un data byte con valore da 0 a 127 (in genere indicati sulle macchine come 1-128).
  • CONTROL CHANGE: caratterizzati dal 1° nibble pari a 1011, i control change sono i messaggi che hanno fatto la fortuna del protocollo MIDI, perchè senza di essi la musica risultante dai messaggi MIDI sarebbe piuttosto robotica.
    I control change danno le informazioni di espressione.
    Sono seguiti da due data byte: il primo indica il numero del controller, il secondo dà il valore corrispondente.
    Tra i controller vi sono ad esempio il sustain (il pedale del pianoforte, CC=64), il pan (la posizione del suono nell'immagine stereofonica, CC=7)

- 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:
  • OMNI ON corrisponde al control change con data byte uguale a 124 (01111100);
  • OMNI OFF corrisponde al control change con data byte uguale a 125 (01111101);
  • MONO corrisponde al control change con data byte uguale a 126 (01111110);
  • POLY corrisponde al control change con data byte uguale a 127 (01111111).

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.
  • MIDI TIME CODE QUARTER FRAME sono messaggi di Time Code, nel formato Ore, Minuti, Secondi e Frame. Otto messaggi (con status byte 11110001 e un data byte), ogni quarto di frame, identificano una locazione SMPTE.
  • SONG POSITION POINTER indica il punto di una sequenza MIDI in cui deve posizionarsi il puntatore durante la riproduzione. Lo status byte è 11110010, seguito da due data byte.
  • SONG SELECT seleziona una song tra quelle disponibili nel dispositivo. Lo status byte è 11110011, ha un solo data byte.
  • TUNE REQUEST ha il copmpito di eseguire l'intonazione tra due dispositivi. Status byte 11110110.
- Real Time message
Sono i messaggi che organizzano la sincronizzazione del sistema.
  • MIDI CLOCK sono messaggi analoghi ai MIDITIME CODE QUARTER FRAME, ma non danno un tempo assoluto, bensì relativo. I messaggi sono inviati 24 volte ogni quarto, con una velocità dipendente dal valore del quarto. Lo status byte è 11111000. non ci sono data byte.
  • START/CONTINUE/STOP controllano i puntatori di tutti i dispositivi MIDI collegati. Start (11111010) pone i puntatori nella posizione iniziale, Continue (11111011) determina la ripresa della riproduzione, Stop (11111100) la interrompe.
  • ACTIVE SENSING è un messaggio inviato ogni 300 millisecondi per tenere attiva la connessione tra master e slave, in sua assenza lo slave abbandona la connessione. Lo status byte è 11111110, non c'è data byte.
  • SYSTEM RESET riporta tutti i dispositivi MIDI collegati ai valori predefiniti. Status byte 11111111.
- System Exclusive Message
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.







<< Indice