Musical Instrument Digital Interface

Da Wikipedia, l'enciclopedia libera.
NoteNamesFrequenciesAndMidiNumbers.svg

Con l'acronimo MIDI (Musical Instrument Digital Interface) si indica il protocollo standard per l'interazione degli strumenti musicali elettronici (anche tramite un computer).

Le specifiche MIDI standard[modifica | modifica sorgente]

Introduzione[modifica | modifica sorgente]

Il MIDI indica due cose: un linguaggio informatico, ossia una serie di specifiche che danno vita al protocollo, e un'interfaccia hardware, che consente il collegamento fisico tra vari dispositivi.
Il MIDI è nato negli anni ottanta e, nonostante possa essere soppiantato da protocolli moderni molto più performanti, è rimasto pressoché inalterato ed è tuttora intensamente utilizzato nella produzione di musica elettronica. I motivi risiedono probabilmente nel ruolo di standard pressoché incontrastato che esso ha assunto nell'ambito musicale e nella cura riposta dai progettisti nella stesura delle prime specifiche.

Di fatto, il MIDI ha peculiarità interessanti su più fronti:

  • la qualità e la praticità del sistema - L'integrazione tra eventi audio ed eventi MIDI ha dimostrato di essere una mossa vincente, confermando l'importanza di questo standard nella realizzazione di musica digitale.
  • la leggerezza dei file MIDI (nell'ordine dei kB) - Tramite Internet e i software multimediali, il MIDI diventa un media di uso comune.
  • la diffusione di basi di qualità sempre maggiore.
  • il costo basso - Molti produttori hardware e software puntano sulla multimedialità dei propri prodotti. Con un investimento minimo o ricorrendo a programmi freeware, è possibile a chiunque disporre di un computer in grado di realizzare produzioni musicali di buon livello.

Cenni storici[modifica | modifica sorgente]

Il protocollo MIDI nacque all'inizio degli anni ottanta.

Il prototipo per il MIDI fu presentato da due progettisti della Sequential Circuit (SCi), Dave Smith e Chet Wood, che nel 1981 proposero le prime specifiche delcvcc MIDI in un documento pubblicato sotto il nome di The complete SCI MIDI. Esso era risposta all'esigenza di far comunicare diversi strumenti musicali elettronici tra loro, tenendo conto delle diverse caratteristiche di ognuno di essi. Diversi costruttori, ad esempio Oberheim e Roland, offrivano già sui propri strumenti alcuni sistemi di interfacciamento. Queste interfacce, però, basate su algoritmi proprietari, garantivano il funzionamento solo su strumenti dello stesso costruttore. Il protocollo di Smith e Wood si presentava, invece, come un sistema in grado di superare questo limite. Per garantire la piena compatibilità tra i vari strumenti, al di là della casa produttrice, ogni costruttore fu invitato a partecipare alla stesura definitiva delle prime specifiche MIDI. SCI, Roland, Yamaha e Kawai furono i primi produttori di strumenti digitali ad aderire alla definizione e alla diffusione del MIDI.

Il progetto terminato apparve solo due anni dopo: nell'agosto del 1983, le specifiche MIDI furono presentate al pubblico alla fiera del National Association of Music Merchants - NAMM, tenutasi a Los Angeles. L'immediata popolarità dello standard creò divisioni all'interno del comitato fondatore: i produttori americani si unirono nella MMA (MIDI Manufactures Association), mentre quelli giapponesi fondarono la JMA (Japan MIDI Association). Benché lavorassero su un terreno comune, i due consorzi svilupparono delle caratteristiche non sempre pienamente compatibili tra loro. Queste divergenze furono risolte nel 1985, quando la IMA (International MIDI Association) pubblicò la versione 1.0 delle specifiche MIDI, istituendo di fatto lo standard del protocollo. I costruttori che supportano il protocollo MIDI sono perciò riuniti in due associazioni: MMA (costruttori Americani ed Europei) e JMSC (costruttori Giapponesi). Le modifiche da apportare allo standard MIDI vengono discusse e approvate da queste due associazioni. La diffusione delle specifiche MIDI spetta all'IMA (International Midi Association).

Il primo synth dotato di interfaccia MIDI fu presentato nel 1983, nella tastiera PROPHET 600 della SCI, anche se la versione definitiva del protocollo MIDI venne implementata l'anno seguente sulla Yamaha DX7.

Connessioni elettriche[modifica | modifica sorgente]

Porte e cavi MIDI.

Lo standard MIDI consiste in un protocollo per lo scambio di messaggi progettato per l'uso con strumenti musicali elettronici e della relativa interfaccia fisica. Un collegamento MIDI consiste in una connessione seriale unidirezionale (simplex) a loop di corrente, che funziona a una velocità di trasmissione di 31,250 kbps. Il loop è tenuto a massa solo da un lato, mentre l'altra estremità è libera (flottante) per evitare ronzii e interferenze audio indotte dalla formazione di anelli di massa. Due dispositivi collegati con interfaccia MIDI sono tra di loro optoisolati, cioè il loop di corrente dal lato del trasmettitore pilota il LED di un accoppiatore ottico dal lato del ricevitore. L'accoppiatore ottico dev'essere logicamente molto veloce (un dispositivo molto usato è lo Sharp PC900) e, comunque, i tempi di commutazione asimmetrici che caratterizzano la maggior parte degli accoppiatori sono in ogni caso causa di distorsioni. Nel caso di connessione in cascata di più dispositivi MIDI, poi, la distorsione e il ritardo del segnale si fa via via più rilevante fino a generare errori di trasmissione.

Lo standard MIDI prevede l'uso di connettori circolari a standard DIN a 5 pin. Questi connettori erano molto diffusi in Europa per ogni genere di connessione audio fino agli anni novanta, quando sono stati sostituiti dai più pratici jack. Anche le comunissime tastiere dei personal computer in passato utilizzavano quel connettore, poi l'hanno abbandonato per il mini-DIN. Il MIDI è rimasto quindi una delle poche applicazioni per questo genere di connettori.
Esiste anche una versione dello standard che sfrutta il collegamento USB ed è attualmente[quando?] in sviluppo, da parte della IETF, una versione per il trasporto di segnali MIDI su Ethernet e Internet.

L'interfaccia hardware[modifica | modifica sorgente]

Gli strumenti musicali e le varie attrezzature MIDI devono essere fisicamente connesse per poter comunicare tra di loro. A questo scopo, lo standard MIDI prevede l'uso di una triade di connettori DIN a 5 poli (anche se solo i 3 poli centrali vengono utilizzati) che tramite un cavo pentapolare consentono il collegamento fisico tra gli strumenti.
I tre connettori vengono distinti come:

  • IN - consente al dispositivo di ricevere informazioni.
  • OUT - consente al dispositivo di trasmettere informazioni.
  • THRU - consente al dispositivo di ritrasmettere i dati ricevuti dalla propria porta IN verso un altro dispositivo.

La reale configurazione dei connettori, per numero e presenza, dipende dalle funzioni per le quali uno strumento viene costruito. Su una master keyboard, per esempio, è frequente trovare 2 o 3 OUT e nessun THRU, visto che ciò che ci si aspetta da uno strumento del genere è la massima flessibilità nella trasmissione dei dati verso altre attrezzature.

L'interfaccia software: il linguaggio MIDI[modifica | modifica sorgente]

Una delle caratteristiche fondamentali del MIDI è l'essere un'interfaccia multicanale.
Grazie a delle applicazioni software chiamate sequencer, installabili sia in unità hardware specifiche che in normali personal computer, si possono registrare performance musicali sotto forma di "messaggi MIDI" per poterle successivamente modificare e riascoltare. Il compito di sincronizzare le varie sequenze MIDI è delegato al codice temporale MIDI, standard mondiale per la sincronizzazione della musica digitale che costituisce un'implementazione del codice temporale SMPTE.

Un file MIDI è un file che contiene dati comunicabili tramite il protocollo MIDI. Il MIDI supporta fino 16 canali. Per spiegare cosa si intende per "canale MIDI" si può utilizzare la seguente metafora: si voglia inviare un messaggio a un collega che pernotta in una delle 16 stanze a disposizione di un hotel; oltre all'indirizzo dell'hotel, si deve specificare anche il numero di stanza del nostro collega, se si vuole che il messaggio sia recapitato correttamente. Ora, si pensi di avere un modulo sonoro con la possibilità di suonare fino a 16 suoni diversi contemporaneamente collegato in MIDI a una tastiera musicale e ogni suono è in un canale diverso da 1 a 16: come fare per far eseguire la musica a uno solo di questi suoni? La tastiera deve inviare al modulo, oltre alle note, anche il numero di canale (la stanza dell'hotel) nel quale suonare quelle note. Le modalità per ottenere tutto ciò variano a seconda della tipologia degli strumenti utilizzati.
È anche possibile trasmettere in MIDI, oltre alle note e alle varie informazioni necessarie alla loro esecuzione, anche del testo sincronizzato con la musica. Questo aspetto è stato ampiamente sfruttato per fare karaoke. Ai file di questo tipo è spesso cambiata l'estensione da .mid a .kar.

Data type[modifica | modifica sorgente]

Status bytes: gli status bytes sono numeri di otto cifre binarie in cui il bit più significativo (Most Significant Bit - MSB) è posto a 1. Questi byte servono ad identificare il tipo di messaggio, ovvero lo scopo dei data byte che li seguono; ad eccezione dei real-time messages, un nuovo Status byte obbligherà il ricevitore ad adottare un nuovo stato, anche se l'ultimo messaggio non è ancora stato completato.

Data bytes: a seguire gli Status Bytes (ad eccezione dei Real-time messages) ci possono essere uno o due Data Bytes che trasportano il contenuto del messaggio. I Data bytes sono numeri di otto cifre binarie in cui il bit più significativo (Most Significant Bit - MSB) è posto a 0. Per ogni Status byte deve sempre essere spedito il corretto numero di Data Bytes corrispondente; nel lato ricevitore, l'azione corrispondente al messaggio deve aspettare fino a quando non sono stati ricevuti tutti i Data bytes richiesti dallo Status byte corrispondente.

Running Status: solo per Voice e Mode Messages. Quando uno Status byte viene ricevuto ed elaborato, il ricevitore rimarrà in quello stato fino alla ricezione di differente Status Byte; quindi, se lo stesso Status Byte si dovesse ripetere, esso può essere omesso in modo che ci sia bisogno di spedire solo i Data Byte. E allora, con il Running Status, un messaggio completo consiste unicamente di Data Bytes; il Running Status è particolarmente utile quando si devono spedire lunghe stringhe di Note On/Off, dove "Note On con velocità 0" è usato come Note Off.

Channel message[modifica | modifica sorgente]

Un Channel message usa quattro bit nello Status Byte per indirizzare il messaggio ad uno dei sedici canali MIDI e quattro bit per definire tale messaggio. I channel message sono quindi usati dai ricevitori in un sistema il cui numero di canali corrisponde al numero di canali codificato all'interno dello Status Byte.

Uno strumento può ricevere messaggi MIDI da più di un canale. Il canale sul quale riceve le istruzioni principali è detto "Basic channel". Uno strumento può essere impostato in modo da ricevere dati di esecuzione (performance data) su canali multipli (incluso il basic channel). A questi ci si riferisce come "Voice channels".

Ci sono due tipi di Channel Message:

  • MODE per definire la risposta degli strumenti ai Voice messages. I mode messages sono spediti sul basic channel di uno strumento.
  • VOICE per controllare le voci di uno strumento. I voice messages sono spediti sui Voice channels;

Channel mode[modifica | modifica sorgente]

NB: un singolo strumento fisico può fungere da diversi strumenti virtuali. In questa trattazione, "strumento" si riferisce ad uno strumento virtuale.

I sintetizzatori ed altri strumenti contengono elementi di generazione del suono chiamati "voices". L'assegnamento delle voices è il processo algoritmico di instradare i note On/Off data dai messaggi MIDI in arrivo alle voices stesse, in modo che le note siano correttamente suonate.

Sono disponibili quattro Mode messages per definire le relazioni tra i sedici canali MIDI e i voice assignment dello strumento. Le quattro modalità sono determinate dalle proprietà Omni (On/Off), Poly and Mono. Poly e Mono sono mutuamente esclusive. Omni, quando on, abilita il ricevitore a ricevere Voice messages su tutti i Voice Channels. Quando off, il ricevitore accetterà solo i Voice Messages che provengono da Voice Channels selezionati.

Mono, quando on, riduce l'assegnamento di Voices a solo una Voice per Voice Channel (monophonic). Quando off (Poly on), un certo numero di Voices può essere allocato dal normale algoritmo di Voice assignment del ricevitore.

Un ricevitore o un trasmettitore MIDI operano con un solo Channel Mode alla volta. Dal momento che un singolo strumento può funzionare come un insieme di strumenti virtuali, esso può avere diversi Basic Channels. Tale strumento si comporta come se fosse più di un ricevitore ed ogni ricevitore può essere impostato con un differente Basic Channel. Ognuno di questi ricevitori può inoltre essere impostato con diversi Mode, sia attraverso il pannello dei controlli dello strumento sia attraverso Mode messages ricevuti sul Basic channel. Sebbene non sia un vero MIDI mode, questa maniera di operare è detta "Multi Mode".

Channel voice[modifica | modifica sorgente]

I channel voices messages consistono nel carico di informazioni trasmesse tra gli strumenti MIDI. Includono: Note On, Note Off, program change, control change, pitchbend, channel aftertouch e polyphonic key pressure.

Un singolo Note On message consiste di 3 bytes, che richiedono 960 microsecondi per la trasmissione. Quando molte note sono suonate allo stesso tempo, i diversi Note On possono richiedere diversi millisecondi per essere trasmessi. Questo può rendere complicato per il MIDI rispondere ad un grande numero di eventi simultanei senza provocare un ritardo lieve ma udibile. Questo problema si riduce usando il Running Status mode.

Control Rpn & Nrpn[modifica | modifica sorgente]

Sono controlli che permettono di gestire estensioni specifiche per il dispositivo o l'applicazione da controllare. I controlli RPN sono specificati dallo standard MIDI, quelli NRPN sono specifici per ogni dispositivo e devono quindi essere documentati nel manuale in dotazione. Sono implementati come successione di Control Change.

NRPN, Non-Registered Parameter Number[modifica | modifica sorgente]

Il parametro da modificare è designato tramite i Controller 98 e 99, il valore da inserire è specificato da:

  • Controller 6 (Data Entry MSB)
  • Controller 38 (Data Entry LSB)

In alternativa si può usare:

  • Controller 96 (Data Increment)
  • Controller 97 (Data Decrement)

RPN, Registered Parameter Number[modifica | modifica sorgente]

Il parametro da modificare è designato tramite i Controller 100 e 101, il valore da inserire è specificato dagli stessi controller degli NRPN.

System message[modifica | modifica sorgente]

I System messages non sono codificati con i numeri di canale. Ci sono tipicamente tre tipi di System Messages.

  • System Common messages: I common messages riguardano tutti i ricevitori in un sistema, senza riguardo per il canale.
  • System Real messages: Sono usati per la sincronizzazione e sono destinati a tutte le unità basate sul clock (clock-based) in un sistema; contengono solamente lo status byte - non ci sono data bytes.
  • System Exclusive messages: Possono contenere un numero qualsiasi di data bytes e possono terminare sia con un "End Of Exclusive" (EOX) o con un qualsiasi status byte ad eccezione dei RealTime messages.

Struttura del file MIDI[modifica | modifica sorgente]

Procederemo all'analisi del protocollo del file MIDI nella sua codifica in esadecimale.

Il file MIDI e le sue strutture fondamentali[modifica | modifica sorgente]

Il file MIDI, o più formalmente Standard Midi File (SMF), è un archivio contenente dati, informazioni espresse in uno o più byte. Tali informazioni organizzano, pertanto, un sistema compiuto di regole: il protocollo (o codice) MIDI . Esse sono comprensibili dai programmi-lettori MIDI (sequencer), che le riconoscono e le interpretano come istruzioni da eseguire.

Le specifiche dello SMF furono sviluppate dalla MIDI Manufacturers Association (MMA).

Il file MIDI è composto da complesse strutture, tecnicamente chiamate: Track Chunk (Blocco-traccia), formate da un certo numero di byte (informazioni-istruzioni). Questi Blocchi, che - come si è detto - sono costituiti da insiemi di byte, sono parti fondamentali, costitutive e, pertanto, necessarie del file MIDI. Ogni Blocco è un insieme di informazioni che conferisce a questa struttura un senso compiuto ai fini del riconoscimento e della esecuzione del file MIDI da parte del sequencer MIDI.

La prima struttura: il blocco d'intestazione[modifica | modifica sorgente]

La prima struttura, posta solo all’inizio del file MIDI e composta sempre da 14 byte, è chiamata: Midi Track header chunk (MThd), ossia Blocco d’intestazione. Alcuni byte di questo Blocco-traccia d’intestazione del file MIDI sono invariabili, altri invece variabili a seconda ovviamente delle informazioni che trasmettono. In un file esiste un solo blocco Midi Track header (MThd). Il Blocco d’Intestazione (Header Chunk) specifica alcune informazioni di base e generiche relative ai dati presenti nel file. Aperto il file MIDI con un lettore del codice esadecimale di file, il Midi Track header chunk sarà così visualizzato:

4D 54 68 64 00 00 00 06 00 0n 00 nn 0n nn

laddove n rappresenta i byte di valore variabile.

4D 54 68 64 = (in codice ASCII: MThd) definisce il chunk come Midi Track header. Esso è il blocco d’intestazione, formato sempre da 4 byte invariabili, che definisce questa traccia come blocco header.

00 00 00 06 = definisce la lunghezza in byte della restante parte del blocco header. Indica che immediatamente dopo vi sono 6 byte restanti.

00 0n = questi due byte indicano il tipo di file MIDI– smf: Standard Midi File. Per il formato 0 n = 0; per il formato 1 n = 1; per il formato 2 n = 2:

  • Formato 0: le tracce di un brano sono fuse in una singola che contiene, però, tutte le informazioni degli eventi di tutte le tracce originarie del brano.
  • Formato 1: le tracce sono memorizzate singolarmente condividendo gli stessi valori di tempo e metrica. La velocità del brano viene inserita nella prima traccia, la quale fa da riferimento a tutte le altre. Il formato 1 permette una gestione multitraccia di un brano nei sequencer e riproduttori di file MIDI ed è il formato più usato.
  • Formato 2: le tracce sono gestite indipendentemente l'una dall'altra, anche per il tempo e per la metrica.

00 nn = questi due byte indicano quante tracce (del tipo MTkr) sono presenti nel file MIDI.

0n nn = questi ultimi due byte indicano il “ numero di impulsi (o risoluzione) per nota da ¼ ”: PPQN (Pulse Per Quarter Note). Ogni impulso è chiamato “ Tick ” (istante).

Per esempio 01 80 = 384 PPQN (una nota da ¼ sarà formata da 384 PPQN, ossia da 384 tick). Il PPQN condiziona per l’intero file MIDI il Tempo Delta, in quanto il PPQN è un’unità di misura, un metro di riferimento che definisce in “numero di impulsi per nota da ¼” il Tempo Delta. Dunque, la durata di due o più Tempi Delta aventi identici valori in byte, ma all’interno di diversi PPQN, sarà diversa.

Le altre strutture successive al blocco d’intestazione[modifica | modifica sorgente]

Dopo l’intera descrizione del Midi Track header chunk (Blocco primario d’intestazione) seguono le Tracce (almeno una) contenenti gli eventi del MIDI. Ciascuna traccia è composta da un’intestazione, che la definisce come tale, formata sempre da 4 byte invariabili:

4D 54 72 6B = (in codice ASCII: MTrk) definisce il chunk come Midi Track, ossia lo identifica come blocco di traccia.

Qualora nel file sia presente più di una traccia MTrk, la prima traccia MTrk, chiamata anche “Traccia del Tempo”, contiene solitamente i Dati Meta (separati fra loro e da altri eventuali eventi MIDI dal Tempo Delta - TΔ) relativi all’indicazione della suddivisione della misura, del tempo metronomico e della tonalità della scala. Le tracce successive (per esempio una per ogni strumento musicale diverso) contengono tutti gli altri eventi midi, e possono contenere anche eventi Dati Meta in caso di cambio dei valori dei Dati Meta iniziali contenuti nella prima traccia MTrk, ossia nella Traccia del Tempo.

Dopo i 4 byte identificativi della traccia seguono sempre altri 4 byte:

00 00 00 nn = indicano quanti byte successivi vi sono sino alla fine della traccia. Dopo i descritti 4 byte è sempre presente il Tempo Delta (Delta Time), espresso con uno o più byte. Seguono, quindi, gli Eventi contenuti nella traccia: Eventi Midi, Eventi SysEx, Eventi Dati Meta. Essi rappresentano quegli elementi che danno sostanza al file MIDI in quanto codifica informatica di un brano o – meglio - di una partitura musicale.

Tutti gli Eventi sono sempre separati fra loro da un valore di Tempo Delta variabile a seconda delle necessità e dello svolgersi del brano.

Il Tempo Delta - TΔ[modifica | modifica sorgente]

All’interno delle tracce MTrk fra ogni Evento viene sempre inserito il dato temporale Tempo Delta (Delta-time), che esprime in byte il tempo che scorre tra due singoli eventi (dopo quanto tempo un evento Midi avverrà rispetto all'evento che lo precede). Rappresenta, quindi, la durata in PPQN tra un evento e quello che lo segue (...EVENTO1......EVENTO2...). Se, ad esempio,TΔ = 00, allora gli eventi MIDI separati da tale TΔ avvengono simultaneamente.

Dunque, per far suonare due note simultaneamente si avrà per esempio: 90 48 64 00 90 4C 64 = Do e Mi che suonano contemporaneamente.

Il Tempo Delta è fondamentale per la durata delle note, e quindi per la creazione delle figure musicali. Più precisamente i valori del TΔ sono stabili; le figure musicali variano la propria corrispondenza al TΔ in base alla risoluzione PPQN. Infatti, ad esempio, per PPQN = 01 80 la semiminima = 83 00 (TΔ = 83 00); invece per un PPQN = 60 la semiminima = 60 (TΔ = 60); invece per un PPQN = 08 00 la semiminima = 90 00.

Durata in microsecondi di un impulso-tick[modifica | modifica sorgente]

La durata in microsecondi di un impulso-tick per ¼ di nota si ottiene dalla seguente operazione:

(60.000.000 / bpm) / PPQN

laddove bmp rappresenta i "battiti per minuto" (tempo metronomico) e PPQN è la "risoluzione in Impulsi per nota da ¼" come impostata nel chunk MThd.

I dati Meta[modifica | modifica sorgente]

I Dati Meta (Meta Data) sono informazioni non imprescindibili e non fondamentali del file MIDI, che – se presenti – sono contenute nelle tracce MTrk. Essi si definiscono dal primo byte di valore sempre uguale a FF, e sono costituiti da più byte.

I principali Dati Meta:

FF 58 04 xx yy 60 08Metro della misura (Tempo di Suddivisione della misura):

  • FF: definisce il tipo di evento (ossia che è un Dato Meta);
  • 58: identifica il tipo di Dato Meta (il Dato Meta che definisce la suddivisione della misura);
  • 04: quantità di byte contenuti nella parte seguente (sempre 4);
  • 0x: (byte variabile) numeratore del rapporto della suddivisione della misura (inserire il corrispondente numero in esadecimale: es.: per ¾ = 03),
  • 0y: denominatore (il numero da inserire è quello, espresso in esadecimali, della potenza necessaria per elevare il numero 2 al numero del denominatore prescelto):
· per indicare i quarti: y = 2 (poiché 2^2 = 4);
· per indicare gli ottavi: y = 3 (poiché 2^3 = 8);
· per indicare i sedicesimi: y = 4 (poiché 2^4 = 16 );

però

· per indicare i mezzi (es.: 3/2): y = 1 (poiché 2^1 = 2 );
· per indicare l’unità (es.: 2/1): y = 0;
  • 60: definisce che ci sono 96 clock midi in una nota da ¼;
  • 08: definisce che ci sono 8 note da 1/32 in una nota ¼.


FF 51 03 xx xx xxTempo metronomico (velocità del brano; evento che indica quanti microsecondi ci debbono essere in un quarto di nota):

  • FF: definisce il tipo di evento (ossia che è un Dato Meta);
  • 51: identifica il tipo di Dato Meta (Dato Media che definisce il Tempo metronomico);
  • 03: quantità di byte contenuti nella parte seguente del Dato Meta (sempre 3);
  • xx xx xx: il tempo metronomico prescelto ottenuto rispetto alle possibili suddivisioni di misura sempre secondo i seguenti calcoli:
Suddivisione della misura Calcolo
n/1 (60.000.000 / 4) / nb
n/2 (60.000.000 / 2) / nb
n/4 60.000.000 / nb
n/8 (60.000.000 x 2) / nb
n/16 (60.000.000 x 4) / nb
60.000.000 rappresenta la quantità di microsecondi per ogni nota da un quarto;
nb è il numero prescelto di battiti al minuto del metronomo (tempo metronomico prescelto).

Il Meta evento relativo al “Tempo metronomico” va sempre posto dopo il Meta evento della “Suddivisione della misura”.

In caso di cambio di suddivisione della misura si deve sempre ricalcolare il tempo metronomico della nuova suddivisione sulla base della precedente tabella.


FF 59 02 xx yyChiave di Tonalità (indica la Tonalità della scala):

  • FF: definisce il tipo di evento (ossia che è un Dato Meta);
  • 59: identifica il tipo di Dato Meta (Dato Media che definisce il Tempo metronomico);
  • 02: quantità di byte contenuti nella parte seguente (sempre 2);
  • xx: numero di accidenti in chiave:
Maggiore → relativa → Minore
Diesis: xx = 00 : - - Do M La m
xx = 01 : 1# Sol M Mi m
xx = 02 : 2# Re M Si m
xx = 03 : 3# La M Fa# m
xx = 04 : 4# Mi M Do# m
xx = 05 : 5# Si M Sol# m
xx = 06 : 6# Fa# M Re# m
xx = 07 : 7# Do# M La# m
Bemolle: xx = FF : 1b Fa M Re m
xx = FE : 2b Sib M Sol m
xx = FD : 3b Mib M Do m
xx = FC : 4b Lab M Fa m
xx = FB : 5b Reb M Sib m
xx = FA : 6b Solb M Mib m
xx = F9 : 7b Dob M Lab m
  • yy: definisce la tonalità: Maggiore yy = 00 oppure la corrispondente Minore yy = 01.

Il Meta-Dato FF 59, relativo alla Chiave di tonalità della scala, è riconosciuto da alcuni programmi, solo se esso è presente nella traccia del tempo (e lì lo salvano). Altri sequencer lo leggono, solo se presente nelle tracce successive a quella del tempo (ed in quelle lo salvano). E’ da notare, però, che altri sequencer ancora riconoscono questo Dato Meta sia se esso è presente nella sola Traccia del tempo, sia se esso è presente nelle sole tracce successive alla prima. Il Dato Meta FF 59 ad ogni modo può essere considerato opzionale, poiché la nota alterata è definita in realtà non da questo Dato Meta, bensì dal secondo byte (che è un messaggio di dati) componente l’evento MIDI “NOTE ON”.

Altri Dati Meta utili sono:

FF 03 ll xxxxNome della Traccia:

  • FF: definisce il tipo di evento (ossia che è un Dato Meta);
  • 03: identifica il tipo di Dato Meta (Dato Meta che definisce il Nome della Traccia);
  • ll: la lunghezza in byte dell’evento (esprime la quantità di caratteri presenti nella stringa alfanumerica che dà il nome alla traccia);
  • xxxx: il testo reale che sarà visualizzato presso la traccia evidenziata del sequencer.

FF 05 ll xxxxTesto del canto (lyric):

  • FF: definisce il tipo di evento (ossia che è un Dato Meta);
  • 05: identifica il tipo di Dato Meta (Dato Meta che esprime il testo del canto presente in un brano musicale);
  • ll: la lunghezza in byte dell’evento (esprime la quantità di caratteri presenti nella stringa alfanumerica);
  • xxxx: il testo reale che può essere formato da una sola ed intera stringa alfanumerica (di qualunque lunghezza), priva all’interno di spazi fra i caratteri che la compongono; oppure contenente spazi fra i caratteri.

Esempio di utilizzo di questo Meta evento (testo da immettere in corrispondenza di una nota): << Pro - >> (ossia: P+r+o+[spazio]+ - ) la struttura sarà ... | TΔ | Note ON | TΔ | FF 05 05 50 72 6F 20 2D | TΔ | Note OFF | TΔ | ... (in verde i valori esadecimali del codice necessari per ottenere la scrittura del testo " Pro - ".

Gli eventi MIDI[modifica | modifica sorgente]

Gli Eventi MIDI sono quegli elementi, contenuti nelle tracce MTrk, che possiamo considerare le informazioni più importanti, ed anzi costitutive, del file MIDI. Poiché il MIDI fu concepito inizialmente soprattutto per le tastiere musicali, i messaggi MIDI (Byte) si riferiscono ad un’azione musicale applicata alla tastiera. Se vi è più di una traccia MTrk, gli eventi MIDI saranno contenuti nelle tracce successive alla prima (Traccia del Tempo), restando presenti in detta traccia i Dati Meta.

Gli Eventi MIDI si suddividono in:

  • Messaggi di Stato (Status Byte), i quali si identificano dal bit più significativo (MSB) del numero binario, che è sempre pari a 1 (es.: 1xxx xxxx). Pertanto, essi si collocano in un ambito di possibili variazioni compreso fra 80 e FF(da 128 a 255 in decim.);
  • Messaggi di Dati (Data Byte), i quali si identificano dal bit più significativo (MSB) del numero binario, che è sempre pari a 0 (es.: 0xxx xxxx). Pertanto, essi si collocano in un ambito di possibili variazioni compreso fra 0 e 7F (da 0 a 127 in decim.).

Poiché l’ottavo bit del numero binario (il Bit Più Significante - Most Significant Bit, cioè il primo bit a sinistra) è utilizzato dal protocollo MIDI per distinguere i due tipi di Evento MIDI (informazioni di Stato o di Dati), si avrà che soltanto i successivi sette bit a destra del più significativo sono utili a specificare l’Evento MIDI in dettaglio. Pertanto, sono solo 128 (da 0 a 127) le possibili variazioni delle caratteristiche degli Eventi MIDI.

Ciascun Evento MIDI è costituito da 2 o da 3 informazioni (byte) necessarie:

  • il primo byte comunica il tipo di Evento MIDI (ossia che è un byte di Stato) ed il Canale (i primi 4 bit a sinistra distinguono il tipo di Evento, che è un Messaggio di Stato [in particolare il primo a sinistra – MSB], e il tipo di Byte di Stato; i seguenti 4 bit a destra distinguono il Canale, al quale va applicato l’Evento MIDI);
  • il secondo byte comunica una specificazione (Messaggio di Dati) dell’Evento MIDI;
  • il terzo byte comunica una specificazione (Messaggio di Dati) della precedente specificazione.

I principali eventi MIDI[modifica | modifica sorgente]

9n hh vvNote ON

  • 9 definisce il tipo di Status byte (Note ON) e n è il numero che definisce il Canale al quale applicare lo status byte (questo primo byte 9 ordina che si inizi a suonare sul canale n la nota definita nel successivo secondo byte hh);
  • hh definisce il numero della nota da far suonare (da 0 a 127; pertanto esso è un Messaggio di Dati);
  • vv la velocità di tocco (velocity)(forza applicata sullo strumento nell’atto di suonare), (da 0 a 127; pertanto esso è un Messaggio di Dati).

8n hh vvNote OFF

  • 8 definisce il tipo di Status byte (Note OFF) e n è il numero che definisce il Canale al quale applicare lo status byte (il primo byte 8 ordina che cessi di suonare sul canale n la nota definita nel successivo secondo byte hh);
  • hh definisce il numero della nota da far cessare (da 0 a 127; pertanto esso è un Messaggio di Dati);
  • vv la velocità di rilascio (velocity), ossia la forza applicata sullo strumento nell’atto di cessare di suonare (da 0 a 127; pertanto esso è un Messaggio di Dati).

Esempio: 80 45 64 (al canale 1 viene spenta in quel momento la nota n. 45 [ossia la n. 69 in decim. = LA a 440 hrz] con velocità 64).

Il Canale 10 è riservato nel modulo GM a suoni percussivi.

Creazione delle Pause:

immediatamente dopo il “NOTE OFF” viene inserito un Tempo Delta di valore pari alla figura di pausa corrispondente. Se, invece, è prevista una pausa all’inizio del brano, il TΔ è inserito innanzi al primo evento “NOTE ON” della traccia MTrk interessata.

An aa vvAftertouch Polyphonic:

  • A definisce il tipo di Status byte e n è il numero che definisce il Canale al quale applicare lo status byte (questo primo byte A ordina che si applichi una ulteriore pressione su una nota (che sta suonando), sulla quale si è già esercitata una pressione iniziale (velocity);
  • aa si riferisce alla nota sulla quale si intende applicare l'ulteriore pressione (da 0 a 127);
  • vv specifica la quantità di pressione aggiuntiva da applicare a quella nota (da 0 a 127).

Bn bb vvControl Change:

  • B definisce il tipo di Status byte (Control change: usato per ottenere particolari effetti) e n è il numero che definisce il Canale al quale applicare lo status byte (questo primo byte B ordina che si applichi sul canale n l’evento Control Change definito nel successivo secondo byte bb);
  • bb definisce i dati specifici, Messaggi di controller (data byte), dello status byte (da 0 a 127; pertanto esso è un Messaggio di Dati): determina quale tipo di controller inviare (es.: 07 = Volume; 0A = Pan; 5B = Riverbero; etc.).
  • vv definisce il valore da 00 a 7F (da 0 a 127 in decim.; pertanto esso è un Messaggio di Dati) da applicare al Messaggio di controller (ne varia le caratteristiche).

Esempio: B0 07 64 (Volume generale della traccia impostato da quel momento a 64, ossia a 100 in decim.).

Cn ccProgram Change:

  • C definisce il tipo di byte di Stato (Status byte), ossia di quale Evento MIDI si tratta (in questo caso Program change: usato per far suonare uno strumento musicale), e n è il numero che definisce il Canale al quale applicare lo status byte (questo primo byte C ordina che si applichi sul canale n l’evento Program Change definito nel successivo secondo byte ss);
  • cc definisce i dati specifici dello status byte da 00 a 7F (da 0 a 127; pertanto esso è un Messaggio di Dati): determina quale strumento musicale far suonare.

Esempio: C0 05 (strumento della traccia impostato da quel momento a: Piano elettrico 2).

Dn ddChannel Aftertouch

  • A definisce il tipo di Status byte (Channel Aftertouch) e n è il numero che definisce il Canale al quale applicare lo status byte (questo primo byte D ordina che sia aumentata la velocità di tocco delle note attive (viene aumentata la forza iniziale applicata sulle note che sta già suonando appartenenti ad un medesimo canale);
  • dd definisce la quantità di ulteriore velocità di tocco aggiunta alla nota che già sta suonando (da 0 a 127; pertanto esso è un Messaggio di Dati).

Esempio: D0 64 (al canale 1 viene applicato da quel momento l’Afterthouch di valore uguale a 100).

En ee zzPitch Bend Change

  • E definisce il tipo di Status byte (Pitch Bend Change [Pitch Wheel]) e n è il numero che definisce il Canale al quale applicare lo status byte (questo primo byte E ordina che sia modificata la frequenza della nota);
  • ee definisce il 1° valore (da 0 a 127; pertanto esso è un Messaggio di Dati);
  • zz definisce il 2° valore (da 0 a 127; pertanto esso è un Messaggio di Dati).

Esempio: E0 60 64 (al canale 1 viene applicato da quel momento il Pich Wheel con primo valore uguale a 60, ossia 96 in decim., e secondo valore uguale a 64, ossia 100 in decim.).

Chiusura della Traccia[modifica | modifica sorgente]

Ogni traccia MTkr termina con un evento di chiusura formato da due byte: FF 2F 00, preceduti sempre da un valore di TΔ. L’ultimo byte uguale a zero rappresenta la lunghezza del meta-evento, la quale, non essendo presenti dati ulteriori, è appunto pari a zero. Ovviamente anche la “Traccia del Tempo” termina con il comando FF 2F 00 (chiusura della traccia).

Analisi pratica di un breve file Midi[modifica | modifica sorgente]

Di seguito verrà mostrato e commentato il codice esadecimale di un semplice e breve file Midi (le varie istruzioni del protocollo Midi sono visualizzate in righe da 16 valori esadecimali - tranne l'ultima da 17 - e distinte l'una dopo l'altra con caratteri in grassetto e non):

4D 54 68 64 00 00 00 06 00 01 00 02 01 80 4D 54

72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00 FF

51 03 09 27 C0 00 FF 59 02 01 00 00 FF F2 00 4D

54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00

B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00

80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF F2 00

· · ·

COMMENTO :

Chunk Header (MThd):

4D 54 68 64 00 00 00 06 00 01 00 02 01 80

  • 4D 54 68 64 : intestazione di 4 byte del MIDI Track header chunk
  • 00 00 00 06 : questi 4 byte informano che seguiranno 6 byte di dati sino alla fine di questo chunk header
  • 00 01 : questi 2 byte informano che il file MIDI è del formato (tipo) 1
  • 00 02 : questi 2 byte informano che dopo il MThd seguiranno 2 blocchi di traccia MTrk
  • 01 80 : informazione che specifica la risoluzione in impulsi per quarto di nota PPQN (in questo caso per ogni nota da un quarto vi sono 384 impulsi).
1° Chunk MTrk (cosiddetta Traccia del Tempo):

4D 54 72 6B 00 00 00 19 00 FF 58 04 03 02 60 08

00 FF 51 03 09 27 C0 00 FF 59 02 01 00 00 FF F2 00

  • 4D 54 72 6B : intestazione di 4 byte del MIDI Track chunk (informano che il blocco è una traccia successiva al MThd e che si tratta dunque di una MTrk)
  • 00 00 00 19 : questi 4 byte informano che seguiranno 25 byte di dati fino alla fine di questa traccia (track chunk)
  • 00 : Tempo Delta. Questi 2 byte informano che il successivo evento rispetto al precedente si verificherà dopo zero PPQN, quindi immediatamente (senza alcun ritardo)
  • FF 58 04 03 02 60 08 : evento Meta Dato. Questo Meta evento informa che le misure delle tracce musicali saranno suddivise in ¾
  • 00 : Tempo Delta pari a zero PPQN. Il prossimo evento (FF 51 03 09 27 C0) avverrà dopo una quantità di tempo zero PPQN rispetto all’evento precedente (FF 58 04 03 02 60 08)
  • FF 51 03 09 27 C0 : evento Meta Dato. Questo Meta evento informa che la velocità metronomica del brano midi è impostata a 100 battiti al minuto
  • 00 : Tempo Delta pari a zero PPQN
  • FF 59 02 01 00 : evento Meta Dato. Questo Meta evento informa che la tonalità della scala musicale possiede un diesis in chiave (SOL maggiore)
  • 00 : Tempo Delta pari a zero PPQN
  • FF F2 00 : questi tre byte informano che ha termine il blocco traccia
2° Chunk MTrk (seconda traccia):

4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30

00 B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86

00 80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF

FF 02 00

  • 4D 54 72 6B : intestazione di 4 byte del MIDI Track chunk (informano che il blocco è una traccia successiva al MThd e che si tratta dunque di una MTrk)
  • 00 00 00 2A : questi 4 byte informano che seguiranno 51 byte di dati fino alla fine di questa traccia (track chunk)
  • 00 : Tempo Delta pari a zero PPQN
  • B0 07 64 : Evento Midi: Control Change n. 7 (Volume). Questo dato di Control Change di tre byte informa che il volume generale delle note presenti nella traccia è impostato da questo momento a 64 (100 in decimale)
  • 00 : Tempo Delta pari a zero PPQN
  • B0 0A 30 : Evento Midi: Control Change n. 10 (Panpot). Questo dato di Control Change di tre byte informa che il Pan (ossia il bilanciamento dei volumi tra i due canali stereo è impostato da questo momento e per questa traccia a 30 [48 decimale])
  • 00 : Tempo Delta pari a zero PPQN
  • B0 5B 40 : Evento Midi: Control Change n. 91 (Riverbero). Questo dato di Control Change di tre byte informa che il Riverbero è impostato da questo momento e per questa traccia a 40 (64 decimale)
  • B0 5D 10 : Evento Midi: Control Change n. 93 (Chorus). Questo dato di Control Change di tre byte informa che il Chorus è impostato da questo momento e per questa traccia a 10 (16 decimale)
  • 00 : Tempo Delta pari a zero PPQN
  • C0 04 : Evento MIDI: Program Change n. 4. Questo dato di Program Change di due byte informa che da quel momento sarà usato come strumento musicale presente al num. 4 (Piano Elettrico 1) della lista degli strumenti del Program Change
  • 00 : Tempo Delta pari a zero PPQN
  • 90 45 64 : Evento MIDI: NOTE ON. Questo dato di tre byte informa che deve essere accesa (cominciare a suonare) la nota num. 45 esad. (LA) con una velocity (velocità di pressione) avente valore pari a 64 (100 decimale)
  • 86 00 : Tempo Delta pari a 86 00 PPQN (con risoluzione 01 80 quello è il TΔ della minima)
  • 80 45 64 : Evento MIDI: NOTE OFF. Questo dato di tre byte informa che deve essere spenta (cessare di suonare) la nota num. 45 esad. (LA) con una velocity (velocità di pressione) avente valore pari a 64 (100 decimale)
  • 81 40 : Tempo Delta pari a 81 40 PPQN (è il TΔ della croma)
  • 90 42 64 : Evento MIDI: NOTE ON. Questo dato di tre byte informa che deve essere accesa (cominciare a suonare) la nota num. 42 esad. (FA#) con una velocity (velocità di pressione) avente valore pari a 64 (100 decimale)
  • 81 40 : Tempo Delta pari a 81 40 PPQN (è il TΔ della croma)
  • 80 42 64 : Evento MIDI: NOTE OFF. Questo dato di tre byte informa che deve essere spenta (cessare di suonare) la nota num. 42 esad. (FA#) con una velocity (velocità di pressione) avente valore pari a 64 (100 decimale)
  • 00 : Tempo Delta pari a zero PPQN
  • FF F2 00 : questi tre byte informano che ha termine il blocco traccia.

La visualizzazione in valori esadecimali del codice di un file Midi può essere effettuata mediante un programma editor esadecimale di file.

Editor MIDI[modifica | modifica sorgente]

Voci correlate[modifica | modifica sorgente]

Altri progetti[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]

musica Portale Musica: accedi alle voci di Wikipedia che trattano di musica