Feuille de spécifications du standard MIDI : construction des messages et des fichiers.

Spécifications MIDI

Les infos présentées sont tirés du poste Stackoverflow https://stackoverflow.com/questions/29481090/explanation-of-midi-messages .

Protocole, composition d’un message

Chaque message midi est composé de 3 octets : 1 octet de statut suivi de 2 octets de données. Le premier bit de chaque octet est utilisé pour identifier s’il s’agit d’un octet d’état ou d’un octet de données. Tous les octets de statut commencent par 1 et tous les octets de données commencent par 0.

Statut Donnée 1 Donnée 2
1_x_x_x 0_x_x_x 0_x_x_x

Octet de statut

Le premier chiffre hexadécimal spécifie le type de message.

De 0x80 à 0xEF, il s’agit de messages spécifiques au canal. Le premier chiffre hexadécimal correspond au type de message et le second au canal.

Concernant les F, il s’agit de messages globaux et de sysex.

Message hex Bit de statut 3 bits de type 4 bits de chan
NOTE_OFF 0x8c 1 0_0_0 c3_c2_c1_c0
NOTE_ON 0x9c 1 0_0_1 c3_c2_c1_c0
POLY_AFTERT 0xAc 1 0_1_0 c3_c2_c1_c0
CC 0xBc 1 0_1_1 c3_c2_c1_c0
PC 0xCc 1 1_0_0 c3_c2_c1_c0
CHAN_AFTERT 0xDc 1 1_0_1 c3_c2_c1_c0
PITCH_BEND 0xEc 1 1_1_0 c3_c2_c1_c0

Octet de statut pour un message de cannal

Message hex Message hex
System Exclusive 0xFO Timing clock 0xF8
System Exclusive 0xFO Timing clock 0xF8
MIDI Time Code Qtr. Fram 0xF1 Undefined (Reserved) 0xF9
Song Position Pointer 0xF2 Start 0xFA
Song Select (Song #) 0xF3 Continue 0xFB
Undefined (Reserved) 0xF4 Stop 0xFC
Undefined (Reserved) 0xF5 Undefined (Reserved) 0xFD
Tune request 0xF6 Active Sensing 0xFE
end of SysEx (EOX) 0xF7 System Reset 0xFF

Octet de statut pour un message global / sysex

Octets de données

Type Statut Octet 1 Octet 2
NOTE_OFF 0x8c Note Vélocité
NOTE_ON 0x9c Note Vélocité
POLY_AFTERTOUCH 0xAc Valeur -
CC 0xBc Type Valeur
PC 0xCc Programme -
CHAN_AFTERTOUCH 0xDc Valeur -
PITCH_BEND 0xEc LSB MSB
Oct. min / max - min 0x00 max 0x7F (127)

Valeurs pour une trame de message de canal

Fichier standard

Les infos présentées sont tirés de la page http://personal.kent.edu/~sbirch/Music_Production/MP-II/MIDI/midi_file_format.htm .

Chunks

Les fichiers MIDI sont structurés en chunks.

Un chunk se sompose de :

  • 4 caractères ASCII (4 octets) qui décrivent un type de chunk
  • Un entier de 32 bits Most Significant Byte first (MSB first). qui décrit la longueur des données
  • Des données (data) sur une longueur len octets
  Type Longueur Données
Oct. 4 4 len

Il existe deux types de chunks :

  • Les Header Chunks qui ont un type MThd
  • Les Track Chunks qui ont un type MTrk

Un fichier MIDI se compose d’un seul header chunk suivi d’un ou plusieurs track chunks.

Étant donné que le champ de longueur est obligatoire dans la structure des chunks, il est possible d’accommoder des chunks autres que MThd ou MTrk dans un fichier MIDI, en sautant leur contenu. La spécification MIDI exige que le logiciel soit capable de gérer les types de chunks inattendus en ignorant le chunk entier.

Type Len o_0 o_1 o_2 o_3 o_4 o_5
01 MThd* 6* x x x x x x  
02 MTrk 2 x x          
03 Mtrk 4 x x x x      
               
n Mtrk 1 x            

* Le n°01 est forcément de type MThd et avec len=6

Représentations des Valeurs

Dans un fichier MIDI, il y a une variété d’informations en plus des données MIDI de base, telles que les différences de temps (delta-times) et les méta-événements.

Lorsqu’une telle information contient des valeurs numériques, celles-ci sont représenté dans un format binaire ou bien dans une format dit quantité à longueur variable.

Les valeurs binaires sont stockées MSB.

La quantité à longueur variable (QLV) fournit un moyen pratique de représenter des entiers arbitrairement grands, c’est à dire sans devoir recourir à des entiers de largeur fixe qui consommerait une place inutile.

Une QLV est représentée comme une série de valeurs de 7 bits, du plus significatif au moins significatif, où le dernier octet de la série a le bit 7 (le bit le plus significatif) défini à 0, et les octets précédents ont le bit 7 défini à 1.

La plus grande valeur autorisée dans un fichier MIDI est 0FFFFFFF. Cette limite est fixée pour permettre aux quantités à longueur variable d’être manipulées comme des entiers de 32 bits.

Valeur ——- ———– QLV ——-
Décimal Hex Binaire Binaire Hex
127 0x7F 0111_1111 0111_1111 0x7F
128 0x80 0000_0000 1000_0000 1000_0001 0000_0000 0x81_00
16383 0x3F_FF 0011_1111 1111_1111 1111_1111 0111_1111 0xFF_7F
100000 0x0F_42_40 1111 0100_0010 0100_0000 1011_1101 1000_0100 0100_0000 0xBD_84_40

Header Chunks

La partie données d’un header chunk contient trois champs de 16 bits. Ces champs spécifient le format, le nombre de pistes et le timing pour le fichier MIDI.

La longueur du header chunk est toujours de 6 octets. Cependant, le logiciel qui lit les fichiers MIDI est tenu de respecter le champ de longueur, même s’il est plus grand que prévu; toutes les données inattendues doivent alors être ignorées.

  Type Longueur Format Nbr pistes Timing
Oct. 4 4 2 2 2
Val. MThd 6 { 0 1 2 } nbrp cf $

Le timing (ou division du temps) peut être dans l’un des deux formats suivants, selon la valeur du bit MS :

  • bit 15 à 0 : la plage 0-14 correspond au nombre de ticks dans chaque noire.
  • bit 15 à 1 :
    • Plage 14-08 : forment un nombre négatif, représentant le nombre de frame SMTPE par seconde. Les valeurs valides correspondent à celles du message MTC Quarter Frame.
    • Plage 07-00 : nombre d’unités de delta-time par trame SMTPE
Mode 15 14..08 (7) 07..00 (8)
#1 0 <–nbr-ticks– –par-noire–>
#2 1 - frame /s ticks /frame
-24 = 24 trames par seconde
-25 = 25 trames par seconde
-29 = 30 trames par seconde, drop frame
-30 = 30 trames par seconde, non-drop frame

Dans le cas où la valeur de division (dans le header chunk) définit les unités de delta-time en ‘ticks par noire’ (MSbit=0), un changement de tempo signifie un changement dans la longueur d’une unité de delta-time.

Dans le cas où division MSbit=1, et les ‘ticks’ sont définis en termes absolus (ticks/trame et trames/seconde), il n’est pas clair dans la spécification quel effet un nouveau tempo devrait avoir.

Formats de Fichiers MIDI

Les fichiers MIDI se présentent en 3 variations :

  • Format 0 : contient une seule piste
  • Format 1 : contient une ou plusieurs pistes simultanées (c’est-à-dire que toutes les pistes doivent être jouées simultanément).
  • Format 2 : contient une ou plusieurs pistes indépendantes (c’est-à-dire que chaque piste doit être jouée indépendamment des autres).

Les fichiers MIDI Format 0 se composent d’un header-chunk et d’un seul track-chunk. Le seul track chunk contiendra toutes les informations de notes et de tempo.

Les fichiers MIDI Format 1 se composent d’un header-chunk et d’un ou plusieurs track-chunks, avec toutes les pistes étant jouées simultanément. La première piste est spéciale, connue sous le nom de ‘Tempo Map’. Elle doit contenir tous les méta-événements des types Time Signature, Set Tempo, Sequence/Track Name, Sequence Number, Marker, et SMTPE Offset.

Les fichiers MIDI Format 2 se composent d’un header-chunk et d’un ou plusieurs track-chunks, où chaque piste représente une séquence indépendante.

Track Chunks

La partie données d’un track chunk contient une ou plusieurs paires delta-time/event.

Delta-time est le nombre de ticks depuis l’événement précédent, et est représenté comme une quantité à longueur variable.

Event peut être du type suivant est l’un des suivants : midi_event, sysex_event ou meta_event

Il n’y a pas de délimiteurs explicites entre les instances de delta-time et event. Ceci est possible car les delta-times et les événements ont des longueurs clairement définies :

  • Le dernier octet d’un delta-time est identifié par MSbit=0 ;
  • Les messages de canal MIDI ont une longueur prédéfinie (même lorsque le statut courant est utilisé) ;
  • Les sysex-events et les meta-events contiennent un champ de longueur explicite.

Un midi_event est n’importe quel message de canal MIDI.

Le statut courant est applicable au sein des fichiers MIDI de la même manière que d’habitude. Le statut courant est annulé par n’importe quel sysex_event ou meta_event.

TODO : Les meta

TODO : Les sysex (à placer en fin)

Fichier compressé

Les infos présentées sont tirés de la page https://ultra64.ca/files/documentation/online-manuals/man-v5-2/allman52/pro-man/pro19/19-04.htm .

TODO : Fichier compressé