Spécifications MIDI
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.
n° | 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é