MIDI et GM
Émulation
Cont@ct
S'abonner
Ce fichier:
Structure
- Entête
- Données
- Lecture
Contenu
- Delta-time
- Events
- Controls
- Metadata
L'interface MIDI est 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 (prenant chacun trois octets) si l'on ne compte pas les codages de contrôles (pitch bend, portamento, aftertouch... et les paramétrages.
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'apparaissaient pas claires. Cela a été réalisé avec le séquenceur rosegarden en exportant des fichiers en MIDI, puis en important des fichiers fabriqués pour l'occasion grâce à python.
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 dé 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 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); chaque rang vers la gauche multiplie un nombre par 16. x13 vaut 16+3= 19 et n'est donc pas égal à 13. 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 être 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) donne l'octet x9B.
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"), les autres (commençant par "MTrk") 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.
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.
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.
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.
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é
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.
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 bit moins significatifs d'octets, et concerne le nombre de tranches défini dans la plage d'entête.
Si nous avons la suite x82-x7C-...
2*128 + 124 = 480 unité 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.
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énement sont codés sur trois octets, le bit de poids fort du premier octet est positionné à 1.
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/forte. Les claviers non sensitifs codent normalement cette valeur à x40 (64). La valeur 0 est une façon d'éteindre une note.
x9n - 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
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).
x8n - note - vélocité
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 moins forte pression, 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
xAn - note - vibrato
Permet de paramétrer chaque canal. Voir la section consacrée au Control Change.
Sert à préciser l'instrument (de 0 à 127) de la banque de son en cours. Cette fonction se code sur deux octets seulement.
xCn - instrument
Control Change permet de changer de banque de sons - voir également la liste des instruments General MIDI.
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: Low Frequence Oscillator). Une réinitialisation du contrôle (voir ci-après) remet la pression sur le canal à 0
xDn - vibrato
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
xEn - faible - fort
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).
xBn - 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 reath 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
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 qui délimite la longueur de la séquence des données, qui ne peut excéder 255 octets.
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
Insère un texte.
xFF - x01 - n - texte
Le copyright se précise avant tout événement, dans une première plage à part.
xFF - x02 - n - texte
Permet de préciser le nom de la piste.
xFF - x03 - n - texte
Permet de préciser le nom d'un instrument.
xFF - x04 - n - texte
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.
Remarque, souvent sur la première piste
xFF - x06 - n - texte
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
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
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
Chaque plage de données doit impérativement se terminer par les trois octets qui suivent:
xFF - x2F - x00
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
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
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
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
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é.
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.
Peuvent intervenir à n'importe quel moment, et terminent un message System Exclusive.
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
À 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
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
Un octet supplémentaire est nécessaire pour préciser la chanson.
xF3 - octet
Force les synthétiseurs analogique à accorder leurs oscillateurs
xF6
Voir xF0 System Exclusive Message.
Envoyé 24 fois par noire en cas de synchronisation
xF8
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
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
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
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
Réinitialisation
xFF
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) | x0E | Matthews Research | x24 | Hohner | x46 | Kamiya Studio |
| x01 | Sequential Circuits | x10 | Oberheim | x25 | Crumar | x47 | Akai |
| x02 | Big Briar | x11 | PAIA | x26 | Solton | x48 | Victor |
| x03 | Octave / Plateau | x12 | Simmons | x27 | Jellinghaus Ms | x4B | Fujitsu |
| x04 | Moog | x13 | DigiDesign | x28 | CTS | x4C | Sony |
| x05 | Passport Designs | x14 | Fairlight | x29 | PPG | x4E | Teac |
| x06 | Lexicon | x15 | JL Cooper | x2F | Elka | x50 | Matsushita |
| x07 | Kurzweil | x16 | Lowery | x36 | Cheetah | x51 | Fostex |
| x08 | Fender | x17 | Lin | x3E | Waldorf | x52 | Zoom |
| x09 | Gulbransen | x18 | Emu | x40 | Kawai | x54 | Matsushita |
| x0A | Delta Labs | x1B | Peavey | x41 | Roland | x55 | Suzuki |
| x0B | Sound Comp. | x20 | Bon Tempi | x42 | Korg | x56 | Fuji Sound |
| x0C | General Electro | x21 | S.I.E.L. | x43 | Yamaha | x57 | Acoustic Technical Lab. |
| x0D | Techmar | x23 | SyntheAxe | x44 | Casio |
↑ Celeste - jeu d'orgue double, avec un léger désaccord entre les deux tuyaux
LFO - Low Frequency Oscillator: utilisé pour le vibrato
MMA - MIDI Manufacturers' Association: association des constructeurs ayant éditant la norme MIDI
VCO - Voltage Controlled Oscillator: pour la production d'une note
VFO - Variable Frequency Oscillator