La norme MIDI et les fichiers MIDI

L'INTERFACE MIDI est originellement de type sériel asynchrone, avec un débit maximal de 31.250 bauds (bits par seconde). Comme il faut 10 bits pour acheminer un octet (1 bit de début, les 8 bits de l'octet et 1 bit de fin), cela représente environ 3Ko/s, à savoir près de 500 débuts et fins de notes (totalisant de six à huit octets) si l'on ne compte pas les codages de contrôles (pitch bend, portamento, aftertouch…) et les paramétrages.

1. Prérequis

2. Structure

2.1 Entête
2.2 Données
2.3 Lecture

3. Contenu

3.1 Delta-time
3.2 Events
3.3 Controls
3.4 Metadata

4. Messages

4.1 Common
4.2 Real-Time

5. Annexes

5.1 Constructeurs
5.2 Glossaire

Pour prendre connaissance de façon littéraire, deux sites francophones:

getzen.pagesperso-orange.fr/norme.htm
daffyduke.lautre.net/zik/midi_index.html.

Ces sites anglophones sont plus techniques:

www.midi.org/techspecs/midimessages.php: les spécifications techniques du MMA
educypedia.karadimov.info/library/The_MIDI_Specification.pdf: un pdf de 1,6Mo
faydoc.tripod.com/formats/mid.htm
www.sonicspot.com/guide/midifiles.html
home.roadrunner.com/~jgglatt/

Par ailleurs, il a fallu expérimenter certaines fonctions qui n'étaient pas clairement décrites. Cela a été réalisé par l'analyse de fichiers en MIDI exportés par le séquenceur rosegarden, puis en y important des fichiers fabriqués pour l'occasion grâce à python.

1. Prérequis

Le binaire est un mode d'écriture des nombres ne connaissant que deux chiffres, le 0 et le 1. De la même manière que le nombre décimal 982 est l'addition de deux unités, huit dizaines et neuf dizaines de dizaines, le nombre binaire 101011 vaut l'addition d'une unité (1), une paire (2), une paire de paires de paires (8) et une paire de paires de paires de paires de paires (32), ce qui fait 43.

Le mode d'écriture binaire est intéressant lorsque l'on s'intéresse à certaines particularités des octets, que l'on peut tous écrire sous la forme nnnnnnnn, chaque n pouvant prendre la valeur 0 ou 1, l'octet valant de 0 à 255. 0nnnnnnn par exemple signifie que le bit de poids le plus fort (le plus à gauche) vaut 0, ce qui donne les possibilités de valeur de 0 à 127.

En informatique, les nombres sont parfois donnés en hexadécimal: il s'agit d'une forme d'écriture des nombres en base 16, dont les chiffres vont de 0 à 9 puis de A (10) à F (15). x35 vaut 3x16 + 5= 43 et n'est donc pas égal à 35. Dans cette page, les nombres hexadécimaux sont préfixés d'un x.

Une donnée codée sur quatre bits, un quartet, peut prendre les valeurs de 0 à 15 tout en étant représentée par un seul chiffre hexadécimal, ce qui facilite l'assemblage de deux données, comme par exemple l'evénement «début de note» x9 sur le canal 11 (xB), qui donne l'octet x9B.

2. Structure d'un fichier MIDI

Attention: l'organisation des données stockées dans un fichier MIDI n'est pas nécessairement la même que celles envoyées aux instruments MIDI, plus proches de la séquence des événements joués.

Il existe au moins deux plages ("chunk" dans la terminologie informatique anglophone, ce qui désigne tout paquet structuré de données dans un fichier): l'un pour l'entête de fichier (commençant par MThd, peut-être de MIDI Track header), les autres (commençant par MTrk, peut-être de MIDI Track?) rassemblant données. MThd ou MTrk est suivi d'un nombre de quatre octets qui indiquent la place occupée par les données qui suivent.

2.1 La plage d'entête

Jusqu'à présent invariablement de 14 octets, la première plage de donnée renseigne sur la structure du fichier et de la plus petite unité de temps considérée.

2.2 Les plages de données

Les plages sont composées de délais, d'événements musicaux, de contrôles et de métadonnées dont il sera question dans la section suivante.

2.3 Lecture des données

La lecture des données se fait de deux façons: mode «délai», qui calcule le nombre divisions de la noire depuis la dernière action (cela peut être égal à zéro) et le mode «action», qui concerne les événements (notes), les contrôles (paramétrages) ou les métadonnées (informations sur la partition). La lecture des données commence en mode délai.

Mode délai

Mode action

Running status

Le mode «running status» permet de ne pas répéter le premier octet (status + Canal), tant qu'il s'agit de la même fonction. Sur le canal 3, au lieu d'être codé

Dél  ÉvCan  Note  Vél
x00 - x93 - x3C - x40
x00 - x93 - x40 - x40
x00 - x93 - x43 - x40

l'accord C3 - E3 - G3 sera codé

x00 - x93 - x3C - x40
x00 -       x40 - x40
x00 -       x43 - x40

où l'on gagne deux octets. Néanmoins, l'utilisation de la vélocité nulle pour éteindre une note avec le status x9 empêche de préciser une vélocité qui aurait accompagné une extinction de note x8.

3. Contenu des plages de données

3.1 Delta-time (mode «délai»)

Chaque événement (production de son, contrôle, métadonnées) est précédé d'un délai, même nul, par rapport à l'événement précédent. Le codage ne se fait que sur les sept bits moins significatifs d'octets, et concerne le nombre de tranches défini dans la plage d'entête.

Si nous avons la séquence x82-x7C-…

2*128 + 124 = 480 unités de temps à attendre avant l'événement qui suit.

En cas des 3 octets x93-x85-x40 (147-133-64), cela se calcule de la façon suivante:

311.296 (147-128)*128*128
    640 (133-128)*128
     64 (valeur inférieure à 128: dernier octet)
312.000 En cas de division de la noire à 480, cela donne un délai de 650 unité de temps (650x480=312000).

La limite de 4 octets imposée par la norme MIDI se code xFF-xFF-xFF-x7F, ce qui permet la valeur extrême de 128^4 = 268.435.455 représentant 559.240 noires à 480 divisions.

3.2 Événements (mode «action»)

Les événements sont des données qui servent à coder un son à produire, dont l'ouverture ou la fermeture de note et quelques paramètres… Les événements sont codés sur trois octets, le bit de poids fort du premier octet est positionné à 1.

x9 Note On Event

Cet événement déclenche la production de la note précisée.

Le troisième octet «vélocité» permet de coder une rapidité, une force d'attaque: 1 est le plus lent/faible, 127 le plus rapide/fort. Les claviers non sensitifs codent normalement cette valeur à x40 (64). La valeur 0 est une façon d'éteindre une note.

x9c - note - vélocité

Pour produire la note A3 (440Hz) sur le premier canal, le premier octet sera composé de x9 pour les 4 bits de poids fort et x0 pour les bits de poids faible: %10010000= x90; le second est l'ordre du la3: 45, le 0 étant le C0.

x8 Note Off Event

Cet événement met fin à la note précisée.

La fin de note est un événément qui doit être précisé. Le troisième octet «vélocité» détermine la rapidité d'extinction (0 le plus lent, 127 le plus rapide).

x8c - note - vélocité

xA Polyphonic Key Pressure (Aftertouch)

La fonction «aftertouch» donne un vibrato opéré par une variation de pression sur la touche. Le troisième octet est la valeur de pression (0 la pression la moins forte, 127 la plus forte) d'un clavier «aftertouch». L'«aftertouch» contrôle le vibrato (LFO: Low Frequence Oscillator). Une réinitialisation du contrôle (voir ci-après) remet la valeur vibrato à 0

xAc - note - vibrato

xB Control Change

Permet de paramétrer chaque canal. Voir la section consacrée au Control Change.

xC Program Change

Sert à préciser pour un canal l'instrument (de 0 à 127, voir la liste des instruments General MIDI) de la banque de son en cours. Cette fonction se code sur deux octets seulement.

xCc - instrument

xD Canal Pressure

La valeur «aftertouch» s'applique ici l'ensemble des sons produits sur un canal, si c'est l'ensemble du clavier (et pas chacune des notes) qui est sensible à la pression. Aucune note ne devant être précisée, la fonction n'est codée que sur deux octets. Comme pour la fonction «aftertouch», la pression sur le canal contrôle le vibrato (LFO). Une réinitialisation du contrôle (voir ci-après) remet la pression sur le canal à 0

xDc - vibrato

xE Pitch Wheel Change

Le pitch bend est la molette servant à infléchir les notes en train d'être jouées sur un canal. Les deux octets admettent les valeurs de 0 à 127 (x7F), ce qui donne 128*128 valeurs possibles, de 0 à 16383. Pour la calculer: fort*128 + faible. Le premier octet contient la valeur de poids faible, le second de poids fort. Attention: la profondeur de l'infléchissement (un demi-ton, une octave?) dépend du matériel et rien ne dit qu'elle y soit paramétrable. Une réinitialisation du contrôle (voir ci-après) remet le pitch bend à 0 - 64

xEc - faible - fort

3.3. Control Change

Permet de paramétrer chaque canal. J'ai tenté une traduction des termes, que je ne garantis pas. Les valeurs vont de x00 à x7F (127).

xBc - type - valeur

Types définis:

  x00 Bank Select: sélection d'une banque de sons
  x01 Modulation Wheel: roulette de modulation (à 0 si réinitialisation)
  x02 Breath Controller: contrôle par le souffle
  x04 Foot Controller: contrôle au pied
  x05 Portamento Time: rapidité du portamento
  x06 Data Entry MSB: octet fort de donnée supplémentaire
  x07 Channel Volume: volume principal d'un canal
  x08 Balance
  x0A Pan: panoramique, 64 est le milieu
  x0B Expression Controller: contrôle de l'expression (127 si réinitialisation)
  x0C Effect Control 1: effet 1
  x0D Effect Control 2: effet 2
  x10 à x13 General Purpose 1-4: contrôleurs tout usage
  x20 à x3F octet de poids faible pour les contrôleurs 0-31
  x40 Damper Pedal: maintient toutes les notes (0 si réinitialisation)
  x41 Portamento On/Off (0 si réinitialisation)
  x42 Sostenuto On/Off: sustain pour la note jouée au moment du déclenchement (0 si réinitialisation)
  x43 Soft Pedal On/Off: pédale douce (0 si réinitialisation)
  x44 Legato Footswitch: contrôle de legato au pied
  x45 Hold 2: autre sustain
  x46 Sound Controller 1 / Sound Variation: variation du timbre
  x47 Sound Controller 2 / Timbre/Harmonic Intens.: contenu harmonique du timbre
  x48 Sound Controller 3 / Release Time: temps de release par défaut
  x49 Sound Controller 4 / Attack Time: temps d'attaque
  x4A Sound Controller 5 / Brightness: brillance
  x4B Sound Controller 6 / Decay Time: temps d'extinction du son
  x4C Sound Controller 7 / Vibrato Rate: fréquence de vibrato
  x4D Sound Controller 8 / Vibrato Depth: profondeur du vibrato
  x4E Sound Controller 9 / Vibrato Delay: délai avant le vibrato
  x50 à x53 General Purpose Controller 5-8
  x54 Portamento Control
  x58 High Resolution Velocity Prefix
  x5B Effects 1 Depth / Reverb Send Level: intensité de réverbération
  x5C Effects 2 Depth / formerly Tremolo Depth: intensité de trémolo
  x5D Effects 3 Depth / Chorus Send Level: intensité de chorus
  x5E Effects 4 Depth / formerly Celeste Detune Depth: profondeur du désaccord
  x5F Effects 5 Depth / formerly Phaser Depth: intensité de phaser
  x60 Data Increment (Data Entry +1): incrémentation de donnée (pas d'octet de valeur)
  x61 Data Increment (Data Entry -1): décrémentation de donnée (pas d'octet de valeur)
  x62 NRPN / Non-Registered Parameter Number - LSB: octet de poids faible de numéro de paramètre non enregistré
  x63 NRPN / Non-Registered Parameter Number - MSB: octet de poids fort de numéro de paramètre non enregistré
  x64 RPN / Registered Parameter Number - LSB: octet de poids faible de numéro de paramètre enregistré
  x65 RPN / Registered Parameter Number - MSB: octet de poids fort de numéro de paramètre enregistré
  x78 - x00 All Sound Off: éteint tous les sons, même les fins d'enveloppe
  x79 - x00 Reset All Controllers: réinitialise tous les contrôles
  x7A - xnn Local Control On/Off: désactive (x00) ou réactive (x7F) la production du son par le clavier maître
  x7B - x00 All Notes Off: éteint toutes les notes (mais pas les enveloppes), comme le font les quatre suivant
  x7C - x00 Omni Mode Off - recommandé explanations
  x7D - x00 Omni Mode On: envoie les événements sur tous les canaux
  x7E - xnn Mono Mode On: ne permet qu'une note à la fois sur un canal, ce qui permet de mieux simuler la production de son d'un instrument monophonique (portamento); xnn est le nombre de canaux???
  x7F - x00 Poly Mode On: permet plusieurs notes simultanées sur un même canal

3.4 Métadonnées

Les métadonnées servent au séquenceur, et ne sont pas envoyées à l'interface. Elles commencent par l'octet xFF, un type selon la fonction, un octet n qui délimite la longueur de la séquence des données, qui ne peut excéder 255 octets.

0 Sequence Number

L'identifiant, allant de 0 à 65535, doit être écrit avant tout délai et événement, mais ne semble pas obligatoire (sauf pour le SMF 2?), car en cas de plages multiples, elle sont considérées selon l'ordre d'apparition.

xFF - x00 - x02 - octet fort - octet faible

1 Text Event

Insère un texte.

xFF - x01 - n - texte

2 Copyright Notice

Le copyright se précise avant tout événement, dans une première plage à part.

xFF - x02 - n - texte

3 Sequence Name

Permet de préciser le nom de la piste.

xFF - x03 - n - texte

4 Instrument Name

Permet de préciser le nom d'un instrument.

xFF - x04 - n - texte

5 Lyric/Display

Sert à écrire les paroles, ajustées à la musique.

xFF - x05 - n - texte

La pratique recommandée (RP-017) est d'écrire une seule syllabe à la fois (ce qui facilite l'affichage karaoké), terminer le texte par l'espace chr(x20), terminer chaque ver par le retour-chariot chr(x0D), chaque strophe par la nouvelle ligne chr(x0A)

Les caractères ASCII de 32 à 127 semblent tous acceptés, mais [ ] { } servent au codage. Pour les utiliser, il faut les précéder de \ : \{, \}, \[, \]. Pour coder \, il suffit de le doubler: \\. L'antislash permet également de coder la tabulation \t, le retour-chariot \r et la nouvelle ligne \n. Pour plus d'information, voir RP-26.

6 Marker text

Remarque, souvent sur la première piste

xFF - x06 - n - texte

7 Cue point

Permet d'indiquer un événement à un endroit précis de la partition, éventuellement le nom d'un fichier son à télécharger.

xFF - x07 - n - texte

8 Program Name

Permet d'étiqueter le nom de l'instrument choisi, en conjonction avec le choix de la banque de son xB* - x00 - xnn ou du choix de l'instrument xC* - xnn (RP-019).

xFF - x08 - n - texte

9 Peripheric Name

Doit permettre d'étiqueter de façon unique le périphérique d'une piste, en précisant par exemple le nom de la boîte de son ou du clavier/synthétiseur. À placer en tout début de plage, avant le contrôle de la banque de son xB* - x00 - xnn ou du choix de l'instrument xC* - xnn , et avant tout envoi d'événement. Un nom d'instrument ne peut se retrouver qu'une fois dans le fichier: une seule piste pour les fichier SMF1 (RP-019).

xFF - x09 - n - texte

32 / 33 Supprimés

47 End of track

Chaque plage de données doit impérativement se terminer par les trois octets qui suivent:

xFF - x2F - x00

81 Tempo Setting

Par défaut, le tempo d'un fichier MIDI est de 120 battements par minute, donc d'une durée d'une demi-seconde par noire, soit 500.000 microsecondes (µs) codés en trois octets valant de 0 à 255.

xFF - x51 - x03 - Octet1 - Octet2 - Octet3

65 battements par minute= 60.000.000µs/65= 923076 (arrondi par défaut), qui vaut x0E15C4, soit les octets x0E - x15 - xC4

84 SMPTE Offset

Le marquage SMPTE, hérité de la vidéo, précise le décalage en nombre d'heures, de minutes, de secondes, d'images (frames) et encore de subdivision d'images (subframe)

xFF - x54 - x05 - heure - minutes - secondes - images - sub

88 Time Signature

Définit la mesure (2/4, 3/4, 3/8, 4/4, 5/4, 7/8…)

xFF - x58 - x04 - numerateur - dénominateur - metronome - ntc

par défaut: (4/4) x04-x02-x18-x08

89 Key Signature

Concerne la tonalité et le mode: nombre de dièses ou de bémols «à la clé», majeur ou mineur. Cela peut changer en cours de route.

xFF - x59 - x02 - altération - mode

127 Sequencer Specific Event

Permet l'envoi de commandes, spécifiques aux constructeurs d'appareils MIDI.

xFF - x7F - n - octet(s) - chaine

Le premier octet de la chaîne est l'ID du contructeur (si 0, les deux suivants sont l'ID), les octets suivants ne devraient être lus que par le matériel concerné.

4. Messages

Il n'y a pas identité parfaite entre ce qui compose un fichier MIDI et ce qui transite par l'interface.

Les événements (débuts et fin de note, action de la molette, l'aftertouch… sont communs au fichier et au flux envoyé par l'interface.

Les métadonnées (paroles, noms des pistes, copyright, clés, tonalité…) que l'on indique au séquenceur n'ont pas de rapport avec la production de son.

Quelques commande en temps réel transitent par l'interface en dehors de tout fichier MIDI. Ils sont envoyés à tous les périphériques connectés.

4.1 System Messages

Peuvent intervenir à n'importe quel moment, et terminent un message System Exclusive.

xF0 System Exclusive Message (SysEx)

Permet d'envoyer des données autre que des événements MIDI à un matériel spécifique.

xF0 - id - données - xF7

Exemples trouvés:

GM Mode ON: F0 7E 7F 09 01 F7
GM Mode OFF: F0 7E 7F 09 02 F7
GM Master Volume: F0 7F 7F 04 01 faible fort F7 (7F 7F: volume maximal)
GM Master Balance: F0 7F 7F 04 02 faible fort F7 (00 40: au centre)
Roland GS Mode: F0 41 10 42 12 40 00 7F 00 41 F7

xF1 MIDI Time Code Quarter Frame

À préciser.

xF1 - octet

L'octet est organisé comme suit: 0nnndddd, où nnn est un type de message de 0 à 7, et le quartet dddd la valeur de 0 à 15

xF2 Song Position Pointer

Marque le nombre de beats (1 beat= six MIDI clocks) depuis le début de la chanson. Deux octets supplémentaires sont nécessaires pour calculer l'emplacement: fort*128 + faible

xF2 - faible - fort

xF3 Song Select

Un octet supplémentaire est nécessaire pour préciser la chanson.

xF3 - octet

xF6 Tune request

Force les synthétiseurs analogiques à accorder leurs oscillateurs

xF6

xF7 End of System Exclusive

Voir xF0 System Exclusive Message.

4.2 Real-Time Message

xF8 Timing Clock

Envoyé 24 fois par noire en cas de synchronisation

xF8

xFA Start

Démarre une séquence. Il est possible souvent d'autoriser un clavier à déclencher le démarrage d'une séquence (typiquement pour un enregistrement).

xFA

xFB Continue

Reprend une séquence à l'endroit où elle avait été arrêtée. Il est souvent possible d'autoriser un clavier à déclencher le démarrage d'une séquence (typiquement pour un enregistrement).

xFB

xFC Stop

Arrête la séquence en cours. Il est souvent possible d'autoriser un clavier à déclencher le démarrage d'une séquence (typiquement pour un enregistrement).

xFC

xFE

En cas de premier envoi, ce message doit être répété avec un délai maximum de 0,3 seconde, sinon la connexion sera réputée coupée, et tous les voix éteintes

xFE

xFF Reset

Réinitialisation

xFF

5. Annexes

5.1 Constructeurs

Ces identifiants servent lors de messages spécifiques au matériel (SysEx, DLS and XMF). Les membres historiques du MMA disposent d'un identifiant d'un octet; les plus récents consistent en deux octets préfixés de l'octet nul.

x00(préfixe)x0EMatthews Research  x24Hohnerx46Kamiya Studio
x01Sequential Circuits  x10Oberheimx25Crumarx47Akai
x02Big Briarx11PAIAx26Soltonx48Victor
x03Octave / Plateaux12Simmonsx27Jellinghaus Ms  x4BFujitsu
x04Moogx13DigiDesignx28CTSx4CSony
x05Passport Designsx14Fairlightx29PPGx4ETeac
x06Lexiconx15JL Cooperx2FElkax50Matsushita
x07Kurzweilx16Loweryx36Cheetahx51Fostex
x08Fenderx17Linx3EWaldorfx52Zoom
x09Gulbransenx18Emux40Kawaix54Matsushita
x0ADelta Labsx1BPeaveyx41Rolandx55Suzuki
x0BSound Comp.x20Bon Tempix42Korgx56Fuji Sound
x0CGeneral Electrox21S.I.E.L.x43Yamahax57Acoustic Technical Lab.
x0DTechmarx23SyntheAxex44Casio

5.2 Glossaire

Celeste - jeu d'orgue double, avec un léger désaccord pour provoquer un effet de battement

LFO - Low Frequency Oscillator: utilisé pour le vibrato

MMA - MIDI Manufacturers' Association: association des constructeurs ayant édité la norme MIDI

VCO - Voltage Controlled Oscillator: utilisé pour la production d'une note

VFO - Variable Frequency Oscillator