# Musical Instrument Digital Interface

MIDI (Musical Instrument Digital Interface) è il protocollo standard per l'interazione degli strumenti musicali elettronici, anche tramite un computer.

## Storia

Il protocollo MIDI nacque all'inizio degli anni ottanta: esso era la risposta all'esigenza di far comunicare tra loro diversi strumenti musicali elettronici, tenendo conto delle caratteristiche di ognuno. Diversi costruttori, ad esempio Oberheim e Roland, offrivano già sui propri strumenti alcuni sistemi di interfacciamento, tipo CV/gate, DIN sync and Digital Control Bus (DCB). Queste interfacce, basate su algoritmi proprietari, garantivano il funzionamento solo su strumenti dello stesso costruttore, mentre serviva un sistema in grado di garantire il funzionamento su strumenti di costruttori diversi.
Il presidente dalla Roland, Ikutaro Kakehashi, sapeva che la mancanza di standard limitava la crescita del mercato della musica elettronica e quindi chiese aiuto a Dave Smith della Sequential Circuits, che accolse con favore la proposta. Insieme all'ingegnere Chet Wood scrissero il documento Universal Synthesizer Interface, che fu presentato all'Audio Engineering Society ad Ottobre 1981. Lo standard fu discusso dai rappresentanti di Roland, Yamaha, Korg e Sequential Circuits e decisero che sarebbero stati utilizzati connettori DIN a cinque poli, la velocità di trasferimento dati a 31,25 kbaud e la scelta del nome: Kakehashi propose di chiamarlo Universal Musical Interface (UMI), ma invece si decise per Musical Instrument Digital Interface (MIDI).
Il progetto terminato apparve solo due anni dopo: nell'agosto del 1983 le specifiche MIDI furono presentate al pubblico alla fiera NAMM Show, 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, e i costruttori che supportano il protocollo MIDI sono 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).
La tastiera PROPHET 600 della SCi (Sequential Circuits inc.) di San Francisco, il primo synth dotato di interfaccia MIDI, fu presentata nel 1983 e costruita su licenza in Italia dalla SIEL di Acquaviva Picena in provincia di Ascoli Piceno nelle Marche, anche se la versione definitiva del protocollo MIDI venne implementata l'anno seguente sulla Yamaha DX7.
Lo standard MIDI consiste in un protocollo per lo scambio di messaggi progettato per l'uso con strumenti musicali elettronici e nella relativa interfaccia fisica. Un collegamento MIDI consiste in una connessione seriale unidirezionale (simplex) a loop di corrente, che funziona alla velocità di trasmissione di 31,250 bps. Il loop è tenuto a massa solo da un lato e 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 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 molto veloce (un dispositivo molto usato è lo Sharp PC900) e 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 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, attualmente dotate tutte di connessione USB, in passato utilizzavano quel connettore, poi abbandonato per il mini-DIN. Il MIDI è rimasto quindi una delle poche applicazioni per questo genere di connettori.
Nel 1991 fu deciso uno standard anche per i file delle canzoni e la connettività con le prese USB e Firewire. Nel 2016 fu formata la Midi Association, una web community, per continuare a portare avanti e supervisionare lo standard. È nel 2019 che viene annunciata l'iniziativa di creare la versione 2.0, che in seguito verrà presentata ed approvata al NAMM show del 2020.

## Le specifiche MIDI standard
### Introduzione

Il termine MIDI indica due aspetti: un linguaggio informatico, ossia una serie di specifiche che danno vita al protocollo, e un'interfaccia hardware che consente il collegamento fisico tra dispositivi. Il MIDI è nato negli anni ottanta e, sebbene nel tempo siano emersi protocolli dalle prestazioni superiori, è rimasto pressoché inalterato fino al recente rilascio delle specifiche MIDI 2.0 ed è tuttora intensamente utilizzato nella produzione di musica elettronica. I motivi risiedono probabilmente nel ruolo di standard che ha assunto nell'ambito musicale e nella cura riposta dai progettisti nella stesura delle prime specifiche.
Le caratteristiche del MIDI sono:
* qualità e praticità del sistema: l'integrazione tra eventi audio ed eventi MIDI sì è dimostrata vincente, confermando l'importanza di questo standard nella realizzazione di musica digitale.
* il basso peso dei file (nell'ordine dei Kb) che consente il trasferimento tramite Internet anche su connessioni con poca banda.
* la qualità delle basi.
* il basso costo: con un investimento minimo o ricorrendo a programmi freeware, è possibile realizzare produzioni musicali di buon livello.

### L'interfaccia hardware

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, di cui 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 cui 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 protocollo MIDI al livello software

Una delle caratteristiche fondamentali del MIDI è l'essere un'interfaccia multicanale. Grazie a delle applicazioni software chiamate sequencer, installabili sia in unità hardware specifiche sia 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, uno 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. 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) in cui suonare quelle note. Come farlo dipende dal tipo di strumenti utilizzati. Oltre alle note e alle varie informazioni necessarie alla loro esecuzione è possibile trasmettere in MIDI anche del testo sincronizzato con la musica. Questo aspetto è stato ampiamente sfruttato per karaoke. Ai file di questo tipo è spesso cambiata l'estensione da .mid a .kar.

## Tipi di dati

Status byte: gli status byte 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 message, un nuovo Status byte obbliga il ricevitore ad adottare un nuovo stato, anche se l'ultimo messaggio non è ancora stato completato.
Data byte: a seguire gli Status Bytes, ad eccezione dei Real-time message, ci possono essere uno o due Data Byte che trasportano il contenuto del messaggio. I Data byte 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 numero di Data Byte corrispondente; il ricevitore del messaggio deve aspettare fino a quando non ha ricevuti tutti i Data byte richiesti dallo Status byte.
Running Status: solo per Voice e Mode Message. Quando uno Status byte viene ricevuto ed elaborato, il ricevitore rimane in quello stato fino alla ricezione di un differente Status Byte; quindi in caso di ripetizione lo Status Byte può essere omesso ed è sufficiente inviare solo i Data Byte. Nel 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

Un Channel message usa quattro bit nello Status Byte per indirizzare il messaggio a uno dei sedici canali MIDI e quattro bit per definire il 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 channel".
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 message sono spediti sui Voice channel;

### Channel mode

Un singolo strumento fisico può fungere da diversi strumenti virtuali. In questa trattazione, "strumento" si riferisce a uno strumento virtuale. I sintetizzatori e altri strumenti contengono elementi di generazione del suono chiamati "voice". L'assegnamento di voice è il processo algoritmico con cui si instradano i note On/Off data dai messaggi MIDI in arrivo alle voice stesse, in modo che le note siano suonate correttamente.
Sono disponibili quattro Mode message 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 message su tutti i Voice Channel. Quando off, il ricevitore accetta solo i Voice Message che provengono da Voice Channel selezionati.
Mono, quando on, riduce l'assegnamento di Voice a solo una Voice per Voice Channel (monophonic). Quando off (Poly on), un certo numero di Voice può essere allocato dal normale algoritmo di Voice assignment del ricevitore.
Ricevitori e trasmettitori 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 Channel. Questo strumento si comporta come se fosse più di un ricevitore e ogni ricevitore può essere impostato con un differente Basic Channel. Inoltre ogni ricevitore può essere impostato con diversi Mode, sia attraverso il pannello dei controlli dello strumento sia attraverso Mode message ricevuti sul Basic channel. Sebbene non sia un vero MIDI mode, questa maniera di operare è detta "Multi Mode".

### Channel voice

I channel voice message 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 byte, che richiedono 960 μs 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

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

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

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

## System message

I System message non sono codificati con i numeri di canale. Ci sono tipicamente tre tipi di System Message.
* System Common message: I common message riguardano tutti i ricevitori in un sistema indipendentemente dal canale.
* System Real message: 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 byte.
* System Exclusive message: Possono contenere un numero qualsiasi di data byte e possono terminare sia con un "End Of Exclusive" (EOX) o con un qualsiasi status byte ad eccezione dei RealTime message.

## Struttura del file MIDI
### Il file MIDI e le sue strutture fondamentali

Il file MIDI, o più formalmente Standard Midi File (SMF), è un archivio contenente dati, informazioni espresse in uno o più byte. Queste informazioni organizzano un sistema compiuto di regole, il protocollo (o codice) MIDI, e 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, chiamate Track Chunk ("blocco-traccia"), formate da un certo numero di byte (informazioni-istruzioni). Questi Blocchi sono parti fondamentali e pertanto necessarie del file MIDI.

### La prima struttura: il blocco d'intestazione

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. 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. Il Midi Track header chunk è costituito dai seguenti byte in notazione esadecimale:
    4D 54 68 64 00 00 00 06 00 0n 00 nn 0n nn
dove n rappresenta i byte di valore variabile.
4D 54 68 64 = (in codice ASCII: MThd) definisce il chunk come Midi Track header ed è 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 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 che fa da riferimento a tutte le altre. Il formato 1 permette la 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
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 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 nel 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 gli Eventi contenuti nella traccia, Eventi Midi, Eventi SysEx, Eventi Dati Meta che sono la codifica informatica del un brano, la 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Δ

All'interno delle tracce MTrk fra ogni Evento viene sempre inserito il dato temporale Tempo Delta (Delta-time), che esprime in byte la durata dell'intervallo temporale tra due singoli eventi, ovvero è la durata in PPQN tra i due eventi (…EVENTO1…TΔ…EVENTO2…). Se, ad esempio, TΔ = 00, allora gli eventi avvengono simultaneamente.
Dunque, per far suonare due note simultaneamente si ha 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. Ad esempio, per PPQN = 01 80 la semiminima ha TΔ = 83 00; invece per un PPQN = 60 la semiminima ha TΔ = 60.

### Durata in microsecondi di un impulso-tick

La durata in microsecondi di un impulso-tick per ¼ di nota si ottiene dalla seguente operazione:
    (60 000 000 / bpm) / PPQN
dove bpm rappresenta i "battiti per minuto" (tempo metronomico) e PPQN è la "risoluzione in Impulsi per nota da ¼" come impostata nel chunk MThd.

### I dati Meta

I Dati Meta (Meta Data) sono informazioni non fondamentali del file MIDI e, se presenti, sono contenute nelle tracce MTrk. Si identificano 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 08 – Metro 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: numero di byte contenuti nella parte seguente (sempre 4);
* 0x: (byte variabile) numeratore del rapporto della suddivisione della misura (inserire il corrispondente numero in esadecimale: ad esempio 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 indicare i mezzi (ad esempio $^3$⁄$_2$): y = 1 (poiché 2$^1$ = 2 );
    · per indicare l'unità (ad esempio $^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 xx – Tempo metronomico (velocità del brano: indica quanti microsecondi dura un quarto di nota):
* FF: definisce il tipo di evento (ossia che è un Dato Meta);
* 51: identifica il tipo di Dato Meta (Dato Meta 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 × 2) / nb |
| $^n$⁄$_{16}$ | (60 000 000 × 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 yy – Chiave 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 Meta che definisce la Chiave di Tonalità);
* 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 : | 1♭ | Fa M | → | Re m |
| | xx = FE : | 2♭ | Si♭ M | → | Sol m |
| | xx = FD : | 3♭ | Mi♭ M | → | Do m |
| | xx = FC : | 4♭ | La♭ M | → | Fa m |
| | xx = FB : | 5♭ | Re♭ M | → | Si♭ m |
| | xx = FA : | 6♭ | Sol♭ M | → | Mi♭ m |
| | xx = F9 : | 7♭ | Do♭ M | → | La♭ 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 e in quelle lo salvano. Altri sequencer ancora riconoscono questo Dato Meta ovunque esso sia. Il Dato Meta FF 59 può essere considerato opzionale poiché la nota alterata è definita in realtà non da questo Dato Meta, bensì dal secondo byte componente l'evento MIDI “NOTE ON”.
Altri Dati Meta utili sono:
FF 03 ll xxxx – Nome 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 xxxx – Testo 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 stringa alfanumerica di qualunque lunghezza.
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 –".

### I principali eventi MIDI

9n hh vv – Note ON
* 9 definisce il tipo di Status byte (Note ON) e n è il numero che definisce il Canale a cui applicare lo status byte, il primo byte 9n 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 vv – Note OFF
* 8 definisce il tipo di Status byte (Note OFF) e n è il numero che definisce il Canale a cui 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 decimale = LA a 440 hrz] con velocità 64).
Il Canale 10 è riservato nel modulo GM a suoni percussivi.
Pause
immediatamente dopo il “NOTE OFF” viene inserito un Tempo Delta di valore pari alla figura di pausa corrispondente. Se è prevista una pausa all'inizio del brano, il TΔ è inserito innanzi al primo evento “NOTE ON” della traccia MTrk interessata.
An aa vv – Aftertouch Polyphonic:
* A definisce il tipo di Status byte e n è il numero che definisce il Canale a cui applicare lo status byte; questo primo byte ordina che si applichi un'ulteriore pressione su una nota che sta suonando e su cui si è già esercitata una pressione iniziale (velocity);
* aa si riferisce alla nota su cui 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 vv – Control Change:
* B definisce il tipo di Status byte (Control change: usato per ottenere particolari effetti) e n è il numero che definisce il Canale a cui applicare lo status byte; questo primo byte 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 decimale, pertanto è un Messaggio di Dati) da applicare al Messaggio di controller per variarne le caratteristiche.
Esempio: B0 07 64 Imposta il volume generale della traccia da quel momento a 64 hex, ossia a 100 in decimale.
Cn cc – Program 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 a cui applicare lo status byte; questo primo byte ordina che si applichi sul canale n l'evento Program Change definito nel successivo secondo byte cc;
* cc definisce i dati specifici dello status byte da 00 a 7F (da 0 a 127, pertanto è 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 dd – Channel Aftertouch
* D definisce il tipo di Status byte (Channel Aftertouch) e n è il numero che definisce il Canale a cui applicare lo status byte; questo primo byte ordina che sia aumentata la velocità di tocco delle note attive, quindi 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 è un Messaggio di Dati).
Esempio: D0 64 al canale 1 viene applicato da quel momento l'Aftertouch di valore uguale a 100.
En ee zz – Pitch Bend Change
* E definisce il tipo di Status byte (Pitch Bend Change [Pitch Wheel]) e n è il numero che definisce il Canale a cui applicare lo status byte; questo primo byte ordina che sia modificata la frequenza della nota;
* ee definisce il 1° valore (da 0 a 127, pertanto è un Messaggio di Dati);
* zz definisce il 2° valore (da 0 a 127, pertanto è 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 decimale, e secondo valore uguale a 64, ossia 100 in decimale).

### Chiusura della Traccia

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

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):
COMMENTO :
    Chunk Header (MThd):
* 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 : 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 2F 00 : questi tre byte informano che ha termine il blocco traccia
    2° Chunk MTrk (seconda traccia):
* 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 numero 42 esadecimale (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 numero 42 esadecimale (FA♯) con una velocity (velocità di pressione) avente valore pari a 64 (100 decimale)
* 00 : Tempo Delta pari a zero PPQN
* FF 2F 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

* Logic Pro X (Mac OS)
* Rosegarden per Linux. Programma sotto GNU GPL open source.
* Cubase (Microsoft Windows, Mac OS)
* Cakewalk Sonar
* Steinberg Nuendo
* Guitar Pro, Multipiattaforma
* MuseScore, con licenza GNU GPL