Notation musicale (MusiXTeX/LilyPond)

Le manuel de MusiXTeX s'ouvre sur une affirmation : la musique n'est pas une ligne de symboles comme la prose, c'est une matrice à deux dimensions. Ce seul fait explique pourquoi LaTeX, si à l'aise avec les mathématiques, ne compose pas de partitions sans aide. La position horizontale d'une note n'est fixée que lorsqu'on sait combien de mesures tiennent sur la ligne, et on ne le sait qu'une fois les notes dotées d'une largeur : une boucle de la poule et de l'œuf. Cette page suit MusiXTeX, qui brise cette boucle en trois passes, LilyPond, qui a répondu à la même question en quittant TeX, et la notation ABC, compacte — sans éluder la question concrète de ce que votre TeX Live contient réellement et de ce qui lui manque.

Pourquoi LaTeX seul ne peut pas composer de musique

La réponse : les notes se déploient vers le bas autant que vers la droite. Le modèle de TeX consiste à aligner des boîtes horizontalement pour faire une ligne, puis à empiler les lignes pour faire une page ; cela suffit à la prose et aux mathématiques. Une partition, elle, fait avancer plusieurs portées à la fois, et l'espacement entre les notes s'étire ou se resserre selon le nombre de mesures que l'on met sur un système. Le manuel de MusiXTeX parle d'accumuler horizontalement des peignes verticaux, et l'entrée fonctionne exactement ainsi : tout ce qui va de \notes à \en forme un peigne, et à l'intérieur & sépare les portées, en partant de l'instrument du bas. LaTeX ne possède pas cette mécanique : la musique réclame donc toujours une couche supplémentaire.

Cette couche prend deux formes générales. La première consiste à rester dans TeX : ajouter des fontes et des macros et laisser TeX graver lui-même la musique — c'est MusiXTeX. La seconde consiste à sortir de TeX : confier la gravure à un programme spécialisé et récupérer le résultat sous forme d'image avec \includegraphics — c'est la voie de LilyPond et des outils ABC. Ce qui rend le couple intéressant, c'est qu'il est historiquement lié : LilyPond est né lorsque deux personnes parties pour écrire un préprocesseur destiné à MusiXTeX ont abandonné ce projet.

Les trois passes de MusiXTeX, et pourquoi musixflx est au milieu

La route standard compte trois passes — etexmusixflxetex — et le musixflx du milieu n'est pas du TeX : c'est un programme distinct qui ne fait que couper les lignes. Dans l'ordre : à la première passe TeX, \startmuflex ouvre nomdujob.mx1 et y note, mesure par mesure, la quantité d'espace rigide et d'espace élastique que chacune contient. musixflx lit ensuite ce .mx1, décide combien de mesures tiennent sur chaque système et écrit les facteurs d'étirement par système dans nomdujob.mx2. À la troisième passe, TeX lit les deux fichiers, et l'espacement définitif n'est arrêté qu'à ce moment. La boucle de la poule et de l'œuf est ainsi rompue par un aller-retour sur disque.

Inutile de piloter ces trois passes à la main. TeX Live fournit un script enveloppe nommé musixtex : musixtex score.tex enchaîne les trois passes, puis appelle au besoin dvips et ps2pdf. L'option -p emprunte la voie courte et produit directement un PDF via pdfetex ; l'option -i conserve les fichiers intermédiaires .mx1 et .mx2 au lieu de les effacer — et en ouvrant le .mx2, on trouve des lignes comme \lineset{1}{2}{...}, c'est-à-dire littéralement la décision « deux mesures sur le système un ». À noter : musixflx est lui-même un script texlua dans TeX Live, si bien que ce « programme distinct » tourne sur l'interpréteur Lua embarqué dans le binaire TeX.

terminal
musixtex score.tex      # 3 passes: etex -> musixflx -> etex, then dvips + ps2pdf
musixtex -p score.tex   # same 3 passes, straight to PDF via pdfetex
musixtex -i score.tex   # keep score.mx1 and score.mx2 so you can read them
musixtex -1 score.tex   # single pass: fast draft, spacing NOT final

Un piège : un PDF produit avec -1 (une seule passe) n'a pas encore de découpage en systèmes définitif. C'est rapide et commode pour vérifier un travail en cours, mais la version que l'on remet ne doit jamais être fabriquée avec -1. Second point : le moteur exigé par MusiXTeX n'est pas le tex simple mais e-TeX. Ce changement date de la version 1.15 (avril 2011) et visait à sortir d'une pénurie de registres ; c'est pourquoi le script musixtex appelle etex par défaut.

Pourquoi trois passes ? La réponse tient dans l'histoire de MusiXTeX lui-même. Le chapitre « A very brief history » du manuel livré avec le paquet fait remonter l'idée de composer de la musique avec TeX aux environs de 1987, à un mémoire de maîtrise de l'université de Bonn signé Andrea Steinbach et Angelika Schofer, Automatisierter Notensatz mit TeX. Leur paquet, MuTeX, ne gérait qu'une seule portée, mais il a laissé deux idées : fabriquer ligatures et liaisons à partir d'un grand nombre de caractères de fonte, et se servir du ressort (glue) de TeX pour contrôler l'espacement horizontal et la justification. Vers 1991, Daniel Taupin étend cela à plusieurs portées avec MusicTeX — au prix de la souplesse sur l'espacement horizontal : éviter des blancs trop larges ou trop serrés autour des barres de mesure devient affaire de tâtonnements, car MusicTeX ne faisait qu'une seule passe. Le seul remède était le multi-passe, et c'est sur ce constat que Taupin, avec Ross Mitchell et Andreas Egler, écrit le premier MusiXTeX vers 1997. Le musixflx au milieu de la compilation, c'est cette décision, toujours debout.

Taupin était physicien de métier. Il est mort en 2003 dans un accident d'escalade — le README et les pages liminaires du manuel, tous deux livrés avec TeX Live 2024, le rapportent. La maintenance est depuis assurée par Don Simons, Hiroaki Morimoto et Bob Tennent. Quant au musixflx intermédiaire, ce fut d'abord un programme écrit par Ross Mitchell entre 1992 et 1997 ; Nikhil Helferty l'a réécrit en Lua en 2011, et c'est cette réécriture qui constitue le musixflx.lua d'aujourd'hui.

Un document MusiXTeX minimal, et pourquoi \begin{music} déclenche « Undefined control sequence »

MusiXTeX possède deux formes d'entrée, l'une plain TeX et l'autre LaTeX ; les mélanger casse tout. La forme plain TeX, chargée par \input musixtex, ne connaît pas \begin{music} : l'écrire produit ! Undefined control sequence. et, pour couronner le tout, compose le mot « music » comme du texte courant. L'environnement music est défini de l'autre côté, dans musixblx.tex, c'est-à-dire dans la forme LaTeX chargée par \usepackage{musixtex}. Le squelette plain TeX est le suivant : la musique se place entre \startpiece et \endpiece, cette paire est enveloppée par \startmuflex\endmuflex, et le fichier s'achève sur \bye.

score.tex
% plain TeX form: run it with  musixtex -p score.tex
\input musixtex
\instrumentnumber{1}
\setclef1\treble
\generalmeter\meterC
\startmuflex
\startpiece
  \NOtes\qa{cdef}\en\bar
  \NOTes\ha{g}\en
\endpiece
\endmuflex
\bye
score-latex.tex
% LaTeX form: the music environment exists only here.
% Run it with  musixtex -p -l score-latex.tex
\documentclass{article}
\usepackage{musixtex}
\begin{document}
\begin{music}
  \instrumentnumber{1}
  \setclef1\treble
  \generalmeter\meterC
  \startpiece
    \NOtes\qa{cdef}\en\bar
    \NOTes\ha{g}\en
  \endpiece
\end{music}
\end{document}

Un peu de vocabulaire rend la suite lisible. \NOtes\en forme un « peigne », et les majuscules croissantes — \notes, \Notes, \NOtes, \NOTes, \NOTEs — choisissent l'espacement de base associé à une valeur de note, de plus en plus large de la double croche à la ronde. \qa{cdef} signifie « noires sans hampe sur c d e f », \ha{g} une blanche sans hampe sur g, et \bar est une barre de mesure. \instrumentnumber fixe le nombre d'instruments, \setclef1\treble met le premier en clé de sol et \generalmeter\meterC règle la mesure à quatre temps. Les macros brutes ayant cette allure, ce sont les préprocesseurs décrits ensuite que l'on écrit réellement.

pmx, M-Tx et autosp : ne pas écrire MusiXTeX à la main

Le manuel de MusiXTeX affirme lui-même que la plupart des travaux se font entièrement via un préprocesseur, sans avoir à apprendre les commandes ni la syntaxe de MusiXTeX. PMX pour la musique instrumentale et M-Tx pour la musique vocale avec paroles sont les deux standards, et comme le second alimente le premier, on obtient la chaîne M-Tx → PMX → MusiXTeX. TeX Live 2024 fournit les exécutables, avec des noms un peu retors : le programme PMX s'appelle pmxab et le programme M-Tx prepmx (m-tx en étant un alias).

Heureusement, le script musixtex choisit son point d'entrée d'après l'extension. Donnez-lui un .mtx et il démarre à prepmx, un .pmx et il démarre à pmxab, un .aspc et il démarre à autosp — puis il enchaîne les trois passes sans rien demander. autosp est le préprocesseur qui automatise le choix de \notes / \Notes / \NOtes selon les valeurs de note : on n'écrit donc jamais ces majuscules à la main. Et avec xml2pmx, on entre par MusicXML, la voie pour le matériel issu d'autres logiciels de notation.

terminal
musixtex piece.pmx   # pmxab -> etex -> musixflx -> etex
musixtex song.mtx    # prepmx -> pmxab -> etex -> musixflx -> etex
musixtex draft.aspc  # autosp -> etex -> musixflx -> etex
musixtex score.xml   # xml2pmx -> pmxab -> etex -> musixflx -> etex
musixtex -m song.mtx # stop after producing the .pmx, to inspect or hand-edit

Un point encore : les fontes forment un paquet distinct. Les fontes de notes de MusiXTeX sont détachées sous le nom musixtex-fonts ; n'installer que les macros ne permet pas de compiler. Une installation TeX Live normale contient les deux, une installation minimale bute ici. Des extensions accompagnent le tout : musixlyr.tex (Rainer Dunker) pour les paroles, musixcrd (Robert Hennig) pour les chiffrages d'accords.

LilyPond avec lilypond-book ou lyluatex : appeler un graveur hors de TeX

LilyPond est un programme entièrement distinct de TeX, doté de son propre langage d'entrée et de la meilleure réputation en matière de gravure. Son point de départ fut MusiXTeX, ce qui prête aujourd'hui à sourire : Han-Wen Nienhuys et Jan Nieuwenhuizen ont commencé en 1995 à travailler ensemble sur MPP (MusiXTeX PreProcessor), l'ont abandonné et ont lancé LilyPond en 1996. La version 1.0, en 1998, a achevé la séparation d'avec MusiXTeX, et LilyPond produit désormais lui-même PDF (via PostScript), SVG et PNG. Tous deux ont présenté « LilyPond, a system for automated music engraving » au Colloquium on Musical Informatics (CIM) de 2003.

La voie classique vers un document LaTeX s'appelle lilypond-book. Dans un fichier d'extension .lytex, on mêle du texte LaTeX et des fragments LilyPond — les courts dans \lilypond{…}, les longs dans un environnement lilypond, les fichiers externes via \lilypondfile{…}. lilypond-book rend chaque fragment avec LilyPond et écrit un fichier .tex ordinaire où les fragments sont devenus des appels à \includegraphics. Il ne reste qu'à le compiler normalement. La largeur de ligne de la musique est ajustée automatiquement d'après la largeur du texte lue dans le préambule.

score.lytex
\documentclass{article}
\begin{document}
A short phrase:
\begin{lilypond}[quote,fragment,staffsize=26]
  c'4 d' e' f' g'2 g'
\end{lilypond}
\end{document}
terminal
lilypond-book --pdf score.lytex   # renders the fragments, writes score.tex
pdflatex score.tex                # compile the generated document

L'option plus récente est lyluatex. Conçue pour LuaLaTeX, elle supprime l'étape de prétraitement et appelle LilyPond directement pendant la compilation. Sa forme propre est l'environnement ly (ou \lily pour un fragment court), et il suffit de lancer lualatex avec --shell-escape. Elle fournit en outre \lilypond et \lilypondfile pour la migration depuis lilypond-book, si bien qu'une source .lytex existante se transpose presque telle quelle. Avec un seul fichier à gérer, les brouillons souvent remaniés deviennent plus simples. TeX Live 2024 contient la v1.1.5 (2023/04/18), sous licence MIT.

document.tex
% compile with:  lualatex --shell-escape document.tex
\documentclass{article}
\usepackage{lyluatex}
\begin{document}
\begin{ly}
  \relative c' { c4 d e f g2 g }
\end{ly}
\end{document}

Voici l'écueil qu'il faut connaître. Le .sty de lyluatex figure bien dans TeX Live, mais LilyPond lui-même (la commande lilypond) et lilypond-book n'y sont pas. Inspectez le répertoire des binaires d'une installation TeX Live 2024 : ni lilypond ni lilypond-book ne s'y trouvent. Charger lyluatex seul ne suffit donc pas : LilyPond doit être installé séparément et ajouté au PATH. Disposer du paquet et disposer du programme externe sont deux choses différentes.

Le paquet abc : airs traditionnels et mélodies à une voix, vite fait

La notation ABC est un format musical textuel conçu avant tout pour être lu et écrit par un humain ; on l'emploie beaucoup pour les airs traditionnels et les lead sheets à une seule ligne mélodique d'Irlande, d'Angleterre, d'Écosse et d'ailleurs. Des en-têtes d'une lettre — X:, T:, M:, L:, K: — portent le titre, la mesure et la tonalité, puis on écrit simplement les notes : CDEF|GABc|. Comme notation, c'est rudimentaire, mais assez léger pour tenir dans un courriel. Le point d'entrée côté LaTeX est le paquet abc (Enrico Gregorio ; v2.0b dans TeX Live 2024).

tune.tex
% compile with:  pdflatex -shell-escape tune.tex
\documentclass{article}
\usepackage{abc}
\begin{document}
\begin{abc}
X:1
T:Simple Tune
M:4/4
L:1/8
K:C
CDEF|GABc|
\end{abc}
\end{document}

Mécaniquement, cela fonctionne comme lilypond-book : par une conversion externe. Le paquet écrit le corps de l'environnement abc dans un fichier temporaire, le transmet via \write18 (exécution du shell) à abcm2ps, qui produit du PostScript, puis met celui-ci en forme d'EPS avec ps2eps avant l'inclusion. -shell-escape est donc obligatoire — et le même problème que pour LilyPond se pose ici : abcm2ps n'est pas fourni avec TeX Live. On se retrouve facilement avec abc.sty mais sans convertisseur ; installez abcm2ps avant d'y compter (l'option mup appelle Mup à la place). Le classique abc2mtex, qui convertit de l'ABC ASCII en entrée MusicTeX/MusiXTeX, doit lui aussi être obtenu séparément.

Ce que TeX Live fournit, ce qu'il ne fournit pas, et lequel choisir

Une règle simple suffit : les outils qui gravent à l'intérieur de TeX sont tous dans TeX Live ; ceux qui gravent à l'extérieur n'y sont pas. L'ensemble MusiXTeX (musixtex, musixflx, pmxab, prepmx, autosp, xml2pmx) et les points d'entrée côté LaTeX (lyluatex.sty, abc.sty) sont fournis. Les moteurs externes qui dessinent réellement la musique — lilypond, lilypond-book, abcm2ps — ne le sont pas. Le tableau ci-dessous consigne ce qu'une installation TeX Live 2024 contient effectivement.

Programme / fichierDans TeX Live 2024Rôle
musixtexfournienveloppe qui pilote les trois passes et les préprocesseurs
musixflxfournila deuxième passe ; script texlua qui répartit les systèmes
pmxab / prepmx / autosp / xml2pmxfournipréprocesseurs PMX, M-Tx, espacement automatique et MusicXML
lyluatex.sty / abc.styfourniles points d'entrée LaTeX ; les programmes appelés, non
lilypond / lilypond-booknon fournià installer séparément ; LilyPond et son script d'inclusion
abcm2ps / abc2mtexnon fournià installer séparément ; les convertisseurs ABC

De tout cela découle la décision pratique. Si vous ne voulez aucune installation supplémentaire, ou si vous savez que les machines de compilation n'ont que TeX Live, choisissez MusiXTeX — mais entrez par pmxab / prepmx plutôt que d'écrire des macros brutes. Si la qualité de gravure prime, choisissez LilyPond : lyluatex si vous êtes déjà sous LuaLaTeX, lilypond-book sinon. Pour quelques mélodies monodiques à la hâte, abc suffit. Une leçon vaut pour les trois : tout montage qui appelle un programme externe (lyluatex, abc) exige -shell-escape ; vérifiez donc que c'est autorisé avant de vous y engager sur une machine de compilation partagée ou en intégration continue. Si vous voulez la partition sous forme d'image autonome à transmettre à une autre application, la page consacrée à TeX2img traite précisément de cela.