|
|
|
|
|

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

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.
- 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.



© audiomaster.it (Michelangelo Izzo) 2003-2005

<< Indietro
|
|
|