Objectif
Lorsque l'on exporte et importe des fichiers midi entre différents appareils, il arrive de rencontrer des difficultés : certains événement midi ne sont pas correctement transférés, les changements de tempo, de mesure, d'instrument ne sont pas correctement appliqués... Il peut dans ces cas être utile, à des fins d'analyse, de convertir les fichiers midi en fichiers texte, afin de pouvoir identifier les différents problèmes rencontrés.
Différents outils sont disponibles pour réaliser cette opération, en ligne sur le web ou via un programme à installer sur son ordinateur. La solution présentée ci-dessous est un programme écrit en C, disponible à l'adresse suivante : http://www.archduke.org/midi/. On y trouve deux fichiers source à compiler :
mid2asc.c: pour convertir les fichiers midi en fichiers texte ;asc2mid.c: pour réaliser l'opération inverse (conversion d'un fichier texte en fichier midi) ; le pré-requis pour cette seconde opération est que le fichier texte respecte un certain format pour décrire les événements midi.
On trouve également des versions exécutables de ces deux programmes pour Windows : asc2mid.exe et mid2asc.exe. Malheureusement, ces versions ne semblent plus fonctionner avec les versions récentes de Windows.
Installation
Pour installer les deux programmes sous Linux, il faut disposer d'un compilateur gcc :
# Installation de gcc si nécessaire
$ sudo apt-get install build-essential manpages-dev
# Vérification de la disponibilité de gcc
$ whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/gcc /usr/share/man/man1/gcc.1.gz
$ which gcc
/usr/bin/gcc
# Vérification de la version de gcc
$ gcc --version
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
On crée ensuite le fichier binaire du programme :
# Commande de base
$ sudo gcc mid2asc.c -o mid2asc
/usr/bin/ld : /tmp/ccO0Pxba.o : dans la fonction « sprfrac2 » :
mid2asc.c:(.text+0x9f2) : référence indéfinie vers « floor »
collect2: error: ld returned 1 exit status
# Cette première commande renvoie une erreur.
# Ajoutez "-lm" à vos options de liaison, car floor() fait partie de la librairie "math" :
# Assurez-vous de placer le flag "-lm" après les objets que vous voulez lier.
$ sudo gcc mid2asc.c -lm -o mid2asc
# Installation de "asc2mid" de la même manière :
$ sudo gcc asc2mid.c -lm -o asc2mid
# Déplacement des deux programmes, et création de raccourcis
$ sudo mkdir /usr/local/midi
$ sudo mv mid2asc /usr/local/midi/
$ sudo mv asc2mid /usr/local/midi/
$ sudo ln -s /usr/local/midi/mid2asc /usr/bin/mid2asc
$ sudo ln -s /usr/local/midi/asc2mid /usr/bin/asc2mid
Utilisation
Format du fichier texte (ascii)
La façon la plus simple de comprendre comment est structuré un fichier texte est peut-être de regarder les exemples générés par l'utilisation de mid2asc sur des fichiers midi.
Chaque ligne non vide est soit un commentaire (commençant par '#'), soit un événement midi.
Le premier élément d'une ligne d'événement indique le moment où l'événement se produit et peut être formaté de l'une des cinq façons suivantes :
- (i)
BA+CR: Numéro de la mesure (commençant à 1) + position de l'événement dans la mesure, compté en nombre de noires. Par exemple, la valeur "1+1/2" indique que l'événement commence une noire et une croche après le début de la mesure.BA: "bar" = "measure" = "mesure".CR: "crotchet" (anglais britannique) = "quarter note" (anglais américain) = noire (français). La valeur de référence de la note étant la "ronde", un quart de note est donc une "noire".
# Note "ré 3" durant une noire, et commençant sur le premier temps de la cinquième mesure
BA 5 CR 1 TR 1 CH 1 NT D 1
- (ii)
CR: position de l'événement, compté en nombre de noires, depuis le début du morceau (la première noire du morceau a donc la valeur "0"). Par exemple, la valeur "9+3/4" indique que l'événement commence neuf noires et une croche pointée après le début du morceau. Si la mesure est à trois noires, cet événement commencera alors à la quatrième mesure, premier temps et quatrième double-croche.
# Note "mi 3" durant une croche et commençant 12 noires et une croche après le début du morceau ;
# la position dans la mesure "BA+CR" est indiquée pour mémoire entre parenthèses (elle peut varier
# suivant le chiffrement de la mesure).
CR 12+1/2 (BA 5 CR 1/2) TR 1 CH 1 NT E 1/2
- (iii)
DT: Temps Delta (Delta Time) de l'événement précédent - format midi natif. Dans ce format, chaque événement est positionné par rapport à l'événement précédent. De ce fait, on fait apparaître les événements "Note on" et "Note off", et la valeur numérique en fin de ligne indiquant la durée de l'événement est donc supprimée (elle se déduit de la durée entre les événements "Note on" et "Note off".
Dans le cas (iii), le temps est exprimé en unités de "ticks", ou en unités de noires en utilisant la notation fractionnaire, par exemple, "3+5/6". Le dénominateur doit diviser la division globale définie au début du fichier (par exemple, "division=384"). D'autres descriptions temporelles peuvent figurer entre parenthèses après la première et sont ignorées parasc2mid. Elles sont juste éditées parmid2ascpour aider à voir où vous en êtes, et il n'y a pas de problème à éditer la première description temporelle même si elle devient incohérente avec les descriptions entre parenthèses qui suivent.
# Note "sol 3" durant une noire (durée entre les événements "Note on" et "Note off") ;
# la position dans la mesure "BA+CR" est indiquée pour mémoire entre parenthèses (elle peut varier
# suivant le chiffrement de la mesure).
DT 0 (BA 6 CR 1) TR 1 CH 1 NT G on
DT 1 (BA 6 CR 2) TR 1 CH 1 NT G off voff=30
# La même note en utilisant le formatage (i) : il n'y a qu'une seule ligne, la durée apparaît en fin de ligne.
# Noter que la valeur de "Velocity off" apparaît sur cette ligne alors qu'elle se déclenche à la fin de la note.
BA 6 CR 1 TR 1 CH 1 NT G 1 voff=30
- (iv) FOL[+/-croches] Temps écoulé depuis la fin de la note précédente/du repos sur la même piste
- (v) SIM[+crotchets] Temps à partir du début de la note/du repos précédent(e) sur la même piste