MIDI Lezione 2
1 - 3M
Prof. Cassano
- Midi
MIDI: Musical Instrument Digital Interface, Interfaccia digitale
per strumenti musicali.
Include tre aspetti distinti:
[Link]: l’insieme delle regole che stabilisce attraverso
quali modalità deve avvenire la comunicazione tra gli
strumenti musicali.
[Link]: l’hardware necessario per
collegare i diversi strumenti (Connettori e
cavi).
[Link] di archiviazione: il formato in
cui vengono memorizzati i dati MIDI
(Standard MIDI File).
- Breve storia
All’inizio degli anni ‘80 vi era la necessità di uno standard
(linguaggio comune) per il collegamento tra diversi
sintetizzatori, questo perché ogni produttore aveva il suo
sistema di comunicazione per i propri strumenti che rendeva
impossibile collegarli con strumenti di altri produttori. I primi
sintetizzatori erano monofonici, la connessione di più
sintetizzatori costituiva un modo per arricchire la possibilità di
sintesi.
Uno standard avrebbe dovuto risolvere i problemi relativi a:
[Link] dei dati musicali (definizione di altezza e
volume)
[Link] tra i dispositivi e modalità di trasmissione
dati
[Link] e costruzione di dispositivi di Input/Output
(cavi e connessioni).
Nel 1983 si arrivò alla definizione
del protocollo MIDI, che pur
avendo subìto numerose
modifiche, è rimasto nella sua
logica invariato fino ad oggi.
- Principi di definizione e livello rappresentativo
Alla base del protocollo MIDI c’è la necessità di far comunicare
sintetizzatori musicali di case produttrici diverse: i problemi
che deve risolvere il protocollo sono quelli della
rappresentazione dei dati musicali e della sincronizzazione tra i
dispositivi durante la comunicazione. Il MIDI si situa tra il livello
simbolico e quello operativo: attraverso il protocollo è possibile
rappresentare come dati elettronici una performance musicale,
non la forma d’onda del segnale audio. L’informazione
codificata dal protocollo MIDI consiste in un insieme di
istruzioni per un sintetizzatore, il quale, sulla base dei dati
ricevuti, si occupa della sintesi audio. In questo modo il
dispositivo di input dei dati musicali e quello di output dei
segnali, pur avendo hardware differenti possono comunicare
attraverso la codifica MIDI. I dati MIDI possono inoltre essere
memorizzati e modificati in un secondo momento attraverso un
sequencer, che ne consente l’editing e il reinvio al dispositivo
di sintesi.
- Tipi di informazione
Canali
I canali sono specifiche “strade per la comunicazione”
attraverso cui vengono indirizzati i messaggi MIDI. Vengono
usati per differenziare i timbri, ad ogni canale infatti è possibile
associarne uno. Tutti i messaggi indirizzati ad un canale
specifico verranno “suonati” dallo strumento associato. Il MIDI
prevede 16 canali numerati da 1 da 16, quindi si possono far
“suonare” simultaneamente 16 timbri al massimo.
Tracce
Le tracce sono flussi autonomi di messaggi MIDI, indipendenti
dai canali. E’ possibile associare più tracce allo stesso canale
se ad esempio si vogliono tenere separate le performance di
due pianoforti oppure le diverse voci di uno stesso spartito. Le
tracce sono quindi dei contenitori di messaggi MIDI.
Patch
E’ il termine che si usa per indicare gli strumenti (timbri prodotti
dai generatori sonori). I messaggi MIDI possono inviare
informazioni per un massimo di 128 patch. Il numero di patch
può essere incrementato attraverso l’uso dei banchi (bank),
che a loro volta possono essere 128.
In generale, il sistema di relazioni tra tracce, canali e patch
prevede che più tracce possano essere assegnate allo stesso
canale ma non viceversa. Allo stesso modo, a più canali è
possibile assegnare la stessa patch (uno “strumento”) ma non
viceversa.
“Una nota”
Cosa succede quando si suona una nota? L’esecuzione di una
nota viene codificata attraverso una serie di messaggi MIDI.
Alla pressione di un tasto corrisponde un messaggio di Note
On, mentre al rilascio viene inviato un messaggio di Note Off.
Entrambi sono caratterizzati da valori di pitch e velocity.
Pitch identifica l’altezza della nota, velocity corrisponde alla
velocità con cui è stato premuto il tasto (non va confuso col
volume in quanto non si tratta di identificare il volume statico di
un intero brano musicale ma le variazioni dinamiche di
un’esecuzione dal vivo). Sia pitch che velocity vengono
codificati su una scala di valori che prevede 128 step (da 0 a
127).
Un ulteriore messaggio MIDI è l’aftertouch, che indica eventuali
variazioni di pressione mentre il tasto viene tenuto premuto, e
può essere utilizzato per l’aggiunta ad esempio di vibrato.
Attraverso la categoria dei controller si possono infine
codificare altre caratteristiche dell’esecuzione come l’uso del
pedale del pianoforte o il controllo del soffio e dell’intonazione
negli strumenti a fiato.
- Informazione temporale e sincronizzazione
I messaggi MIDI non devono soltanto essere posti in
sequenza: per riprodurre una performance musicale è
necessario fornire anche l’informazione temporale che
consenta a un sequencer, a partire dalla lista ordinata dei
messaggi, di conoscere il momento esatto in cui deve reagire,
ad esempio, a un messaggio che indichi la pressione del tasto
o il suo rilascio (Note On/Off). Ogni dispositivo MIDI è perciò
dotato di un clock, un dispositivo interno di sincronizzazione,
sulla base del quale ordina nel tempo i messaggi, a seconda
dell’informazione temporale di cui questi sono dotati. Le unità
di misura impiegate dal clock per collocare temporalmente i
messaggi sono i tick, o PPQ (Parts per Quarter, parti per
quarto). Si tratta di un’unità di misura relativa, e non assoluta,
poiché dipende dal valore assunto dal quarto. Il numero di
quarti in un minuto è indicato come BPM (Beats per minutes,
pulsazioni per minuto), tipicamente compreso tra 40 e 240.
Nel momento in cui si impiegano più dispositivi collegati
insieme è altresì necessario prevedere una qualche forma di
sincronizzazione tra di essi. Essa è gestita nei dispositivi MIDI
in due modi: attraverso il MIDI Clock e il MIDI Time Code
(MTC).
Per esemplificare il caso del MIDI Clock, supponiamo di avere
un collegamento MIDI tra due sintetizzatori. Il dispositivo
master controlla quello slave: il master tiene il tempo attraverso
il suo clock (internal sync) inviando allo slave un messaggio di
sincronizzazione. Lo slave farà perciò riferimento al messaggio
di clock proveniente dal master (external sync).
Il MIDI Time Code è invece il metodo di sincronizzazione
messo a punto per coordinare i dispositivi MIDI con le
produzioni film e video e si rivela perciò di fondamentale
importanza in ambito multimediale.
Il metodo standard di codifica del tempo in ambiente audio e
video è SMPTE. Nello SMPTE il tempo è codificato non in
forma relativa (come per il MIDI Clock), ma assoluta (ore,
minuti, secondi e frame).
- Messaggi di canale/Messaggi di sistema
I messaggi MIDI si distinguono in due tipi: di canale (Channel
Message) e di sistema (System Message).
I messaggi di canale contengono dati relativi a uno specifico
canale: tutte le informazioni relative alla produzione di una nota
(ad esempio Note On) sono veicolate da Channel Message. Un
messaggio di canale contiene di conseguenza oltre
all’informazione relativa all’evento anche quella relativa al
canale a cui questa è indirizzata (il numero di canale).
I messaggi di sistema sono invece indirizzati al sistema nel suo
complesso, veicolando informazioni relative al timing, alla
sincronizzazione tra più dispositivi MIDI, o proprie di specifiche
case costruttrici. Non contengono perciò alcuna informazione
relativa al canale.
Il protocollo MIDI
La struttura dei messaggi MIDI descritta in seguito è quella
definita a partire dal protocollo MIDI 1.0 del 1983.
Struttura generale dei messaggi
I messaggi MIDI sono costituiti da sequenze di parole di 10 bit.
Poiché il primo e l’ultimo bit di ogni parola hanno
semplicemente la funzione di delimitare l’inizio e la fine (start e
stop bit), assumiamo che ogni parola sia composta da 8 bit (1
byte).
X XXXX XXXX X
Start bit 1° nibble 2° nibble Stop bit
Un messaggio MIDI è composto da una o più parole di 1 byte.
Il primo byte identifica il tipo di messaggio e prende il nome di
status byte: i byte successivi contengono il messaggio vero e
proprio (data byte). La distinzione tra status byte e data byte è
effettuata in base al Most Significant Bit (MSB), il bit più a
sinistra di ogni byte: 1 identifica lo status byte, 0 i data byte.
Status byte: 1XXX XXXX
Data byte: 0XXX XXXX
(0XXX XXXX)
Il dispositivo slave identifica dal MSB 1 lo status byte
all’interno della sequenza di byte, riconosce dai bit successivi
dello stesso status byte il tipo di messaggio (ed altre
informazioni), e sulla base del tipo interpreta i data byte
successivi, caratterizzati da MSB 0.
Classificazione dei messaggi
Lo status byte, che conserva l’informazione relativa al tipo di
messaggio, è suddivisibile in due segmenti di 4 bit, detti
nibble. Il primo nibble a sinistra (il più significativo) ha la
funzione di specificare il tipo di messaggio. Poiché il primo bit
in uno status byte è sempre 1, sono disponibili nel nibble di
sinistra i 3 bit rimanenti, per un totale di 8 combinazioni
possibili (2^3=8): di queste, sette (da 000 a 110) identificano i
messaggi di canale, mentre la combinazione 111 indica i
messaggi di sistema.
Messaggi di canale:
1000 XXXX, 1001 XXXX, 1010 XXXX, 1011 XXXX,
1100 XXXX, 1101 XXXX, 1110 XXXX
Messaggi di sistema:
1111 XXXX
Il secondo nibble ha una funzione diversa, a seconda che si
tratti di messaggi di canale o di sistema. Nei messaggi di
canale indica il numero di canale: poiché abbiamo a
disposizione 4 bit, possiamo mappare al massimo 16 canali
diversi (2^4). Nei messaggi di sistema il secondo nibble è
invece disponibile per distinguere 16 possibili messaggi di
sistema, anche se attualmente ne sono definiti soltanto 11.
Tutti i messaggi di sistema hanno perciò il primo nibble pari a
1111.
Esempio, il byte 1001 0001 viene analizzato come segue:
1 = MSB, identifica che si tratta di uno status byte
001 = messaggio di canale Note On
0001 = canale n°2
Oppure, byte 1111 0001
1 = MSB, identifica che si tratta di uno status byte
111 = identifica che si tratta di un messaggio di sistema
0001 = messaggio di sistema MIDI Time Code Quarter Frame
Channel Message
La struttura dei messaggi di canale è 1xxx nnnn (status byte) a
cui seguono uno o due data byte 0xxxxxx. Va ricordato che il
primo nibble varia tra 1000 e 1110 (non 1111, che è riservato ai
System message). Va ricordato che i Channel Message sono
indirizzati a un canale particolare specificato dal secondo
nibble dello status byte.
Note On: indica al dispositivo di suonare una
nota. Viene inviato ad esempio quando si
preme un tasto di una tastiera o quando si
percuote un pad di una batteria elettronica.
Lo status byte è 1001nnnn cui seguono due
data byte: il primo specifica l’altezza della
nota (pitch), il secondo la velocità con cui
viene premuto il tasto (velocity). Poiché un
data byte ha la struttura 0xxxxxx, ci sono 7
posizioni disponibili, per un totale di 2^7=128
valori possibili (0-127). Sono perciò
rappresentabili 128 altezze (al LA basso del
pianoforte è assegnato il valore 21, al DO
centrale 60, al DO alto 108). Allo stesso modo
sono possibili 128 valori per la velocity.
Note Off: indica quando si deve disattivare l’esecuzione di una
nota. Ha status byte 1000nnnn: i due data byte rappresentano,
come nel caso del messaggio di Note On, pitch e velocity.
Channel Pressure: è un messaggio che trasmette informazioni
relative ai cambiamenti di pressione dopo che è stato inviato
un Note On (mentre un tasto è premuto). Il valore di pressione
indicato nel data byte del Channel Pressure è applicato a tutte
le note attive: è una misura media per il canale nnnn.
Usualmente si indica con aftertouch. Lo status byte è
1101nnnn, seguito dal data byte 0xxxxxxx che indica il valore
di pressione.
Polyphonic Key Pressure: a differenza di Channel Pressure,
Polyphonic Key Pressure è sensibile ai cambiamenti di
pressione relativi a ogni singolo tasto di una tastiera. Lo status
byte è 1010nnnn, mentre i due data byte indicano
rispettivamente il pitch a cui applicare il valore di pressione e il
valore di pressione stesso.
Pitch Bend Change: il messaggio indica la variazione
frequenziale intorno alla frequenza corrispondente al numero di
tasto premuto. Equivale negli strumenti tradizionali a un
cambiamento di intonazione: quanto succede nel vibrato o in
un glissando. Lo status byte è 1110nnnn, mentre i due data
byte seguenti specificano (con una risoluzione di 14 bit poiché
128x128=16384, 2^14 valori), lo spostamento rispetto all’altezza
di riferimento.
Program Change: in un sintetizzatore le patch sono numerate,
attraverso il messaggio di Program Change si può selezionare
il timbro da associare al canale nnnn. Lo status byte è
1100nnnn ed è seguito da un data byte che indica la patch
scelta.
Control Change: i controller sono dispositivi che consentono
di aumentare l’espressività di un dispositivo MIDI, dai pedali di
smorzamento per il pianoforte al controllo del soffio per gli
strumenti a fiato. Allo status byte 1011nnnn seguono due data
byte: il primo specifica il controller, il secondo il valore che
questo deve assumere. I controller possono assumere valori
continui o discreti (On/Off).
-Gli ultimi quattro control change si riferiscono ai Channel Mode
Message, che stabiliscono possibili configurazioni di
funzionamento per gli strumenti MIDI, ottenute in base alla
combinazione di tre stati operativi.
OMNI: indica che lo strumento è in grado di rispondere a tutti i
messaggi inviati indifferentemente su tutti e sedici i canali MIDI.
POLY: lo strumento gestisce le proprie voci rispettando richieste
polifoniche tese alla realizzazione di accordi.
MONO: lo strumento lavora in monofonia.
I quattro modi disponibili combinando i tre stadi operativi sono i
seguenti.
Modo 1 – Omni On/Poly: lo slave interpreta tutti i messaggi su tutti
i canali e in maniera polifonica; è il cosiddetto modo operativo a
prova di idiota: lo slave suona in ogni caso e in ogni condizione.
Modo 2 – Omni On/Mono: lo slave risponde su tutti i canali ma
monofonicamente; chiaramente non è una condizione operativa
molto funzionale.
Modo 3 –Omni Off/Poly: lo slave risponde in maniera polifonica
solamente ai messaggi che giungono sul suo canale MIDI
(specificato in ricezione). È detto sinteticamente Poly.
Modo 4 – Omni Off/Mono: lo slave risponde monofonicamente ai
messaggi che giungono sul suo canale MIDI. È detto
sinteticamente Mono. Questi messaggi hanno solamente un data
byte.
System Message
Va ricordato che i messaggi di sistema non sono indirizzati
specificatamente a un canale, ma sono rivolti a tutto il sistema:
questo può comprendere più unità collegate che ricevono su
diversi canali. Ogni singolo dispositivo reagisce solo ai
Channel Message per i quali è abilitato a rispondere, ma a tutti
i System Message.
Lo status byte dei System Message è 1111nnnn. Poiché
l’informazione di canale non è pertinente il secondo nibble può
venire indirizzato per distinguere 2^4=16 diversi messaggi di
sistema. Attualmente ne sono definiti solo 11.
11110001 MIDI Time Code Quarter Frame, messaggio per la
codifica del tempo in termini assoluti (ore, minuti, secondi,
frame).
11110010 Song Position Pointer, indica il punto all’interno
della song caricata dove si deve posizionare il puntatore.
11110011 Song select, consente la selezione di una song
all’interno di quelle conservate in memoria dal dispositivo.
11110110 Tune request, messaggio che ha la funzione di
verificare l’accordatura tra gli strumenti.
11111000 MIDI Clock, messaggio per la sincronizzazione tra
più dispositivi in termini relativi.
11111010 Start, 11111100 Stop, 11111011 Continue,
messaggi per la riproduzione.
11111110 Active Sensing, messaggio che viene inviato ogni
300 millisecondi per con la funzione di mantenere attiva la
connessione tra master e slave.
11111111 System Reset, messaggio che riposta tutti i
dispositivi ai valori predefiniti.
11110000 System Exclusive (SysEx), messaggi attraverso i
quali i costruttori sono in grado di specificare informazioni
relative ai loro prodotti.
- Il General MIDI
Il General MIDI è uno standard che specifica ulteriormente il
protocollo MIDI 1.0. La codifica di informazioni supplementari
all’interno del protocollo consente di aumentare la
trasportabilità dei messaggi tra i diversi dispositivi. Abbiamo
ricordato i quattro modi tramite i quali un dispositivo MIDI può
rispondere ai messaggi: lo standard General MIDI (GM, o GM1)
definisce un quinto modo, detto General MIDI Mode (GMM),
che regola a priori l’associazione tra canali, patch e timbri.
Invece di costringere l’utente a definire la configurazione di
risposta del suo sistema MIDI attraverso uno dei 4 modi, il
GMM definisce dei preset, indipendenti dall’hardware
impiegato. Il canale 4 è dedicato alla melodia, l’8 all’armonia, il
10 alle percussioni: così, un dispositivo che supporti il General
MIDI assegna automaticamente ai messaggi di canale
provenienti sul canale 10 le patch che producono timbri
percussivi. In più, lo standard GM assegna a ogni valore di
Program Change una patch prestabilita, in tal modo
assicurando un risultato timbricamente più o meno simile su
ogni dispositivo. Le patch sono organizzate in 16 famiglie
timbriche, ognuna delle quali è costituita di 8 strumenti
specifici. I timbri sono gli stessi per tutti i canali, eccetto il 10.
In quest’ultimo, a ogni valore d’altezza compreso tra 35 e 81
viene fatto corrispondere un timbro percussivo. I restanti valori
sono a disposizione dei costruttori e non sono supportati dal
GM. E’ possibile trovare gli elenchi delle patch e dei timbri
percussivi sul sito della MIDI Association: click!
E’ bene ricordare che la definizione delle due tabelle non
implica affatto un risultato identico dal punto di vista audio, ma
soltanto simile. La classificazione delle patch stabilisce infatti
una tipologia timbrica che deve essere approssimativamente
simile tra tutti i dispositivi che si adeguano allo standard GM:
l’effettivo risultato audio dipende in ogni caso dall’hardware
ricevente. Lo standard GM richiede poi per i dispositivi che lo
supportano 24 voci di polifonia, 16 canali polifonici e
multitimbrici, la possibilità di impiegare 16 timbri diversi
contemporaneamente e l’utilizzo come accordatura del LA4 a
440, equivalente al pitch 69. Infine, il dispositivo deve
rispondere ai cambiamenti di velocità e di Channel Pressure,
oltre ad alcuni controller, tra cui ad esempio il pan.