MusiXTeX の公式マニュアルは、その第1章でこう断言します——楽譜は文章のように記号が一列に並んだものではなく、二次元の行列 だ、と。LaTeX が数式をあれほど美しく組めるのに 楽譜(五線譜) だけは素直にいかないのは、この一点に尽きます。音符の水平位置は、その行に何小節入るかが決まるまで確定せず、そして何小節入るかは音符の幅が決まるまで確定しない——鶏と卵です。このページでは、その循環を 3 パス で断ち切った MusiXTeX と、同じ問題に「TeX をやめる」という答えを出した LilyPond、そして手軽な ABC 記法 を、いま TeX Live に何が入っていて何が入っていないかまで含めて見ていきます。
なぜ LaTeX 単体では楽譜が組めないのか
答えは「音符が縦にも横にも並ぶから」です。TeX の組版モデルは、箱を横一列に並べて行を作り、行を縦に積んでページを作る、というものです。文章も数式もこれで足ります。ところが楽譜は、複数の五線が同時に進行し、しかも各段(システム)に何小節入れるかによって音符の間隔そのものが伸び縮みします。MusiXTeX のマニュアルはこれを「縦の櫛を横に並べる」と表現し、実際その通りの入力を要求します——\notes から \en までがひとつの櫛で、その中を & で区切ると下の楽器から順に別の五線に載る、という書き方です。LaTeX にこの機構はありません。だから楽譜には必ず何らかの追加の仕掛けが要ります。
この追加の仕掛けには、大きく二つの方向があります。ひとつは TeX の中に居続ける 道で、フォントとマクロを TeX に足して TeX 自身に楽譜を組ませる——これが MusiXTeX です。もうひとつは TeX の外に出す 道で、楽譜専用のプログラムに組ませ、その出力を画像として \includegraphics で取り込む——これが LilyPond や ABC 系のやり方です。面白いのは、この二つが歴史的につながっていることです。LilyPond は MusiXTeX 用の前処理系を作ろうとした二人が、その計画を捨てたところから始まりました。
MusiXTeX の 3 パス — musixflx が挟まる理由
MusiXTeX の標準の処理経路は etex → musixflx → etex の 3 パスで、真ん中の musixflx は TeX ではなく 行分割(改段)専用の別プログラム です。順を追うと、1 回目の TeX 実行で \startmuflex が ジョブ名.mx1 を開き、小節ごとの「固定幅の空き」と「伸縮する空き」を書き出します。次に musixflx がその .mx1 を読み、各段に何小節入るかを決め、段ごとの伸縮率を ジョブ名.mx2 に書きます。3 回目に TeX が両方を読み込み、はじめて最終的な間隔が確定します。冒頭に書いた鶏と卵は、こうして ファイルを一度経由することで 断ち切られています。
この 3 回を手で回す必要はありません。TeX Live には musixtex というラッパースクリプトが入っていて、musixtex score.tex と打つだけで 3 パスを順に実行し、必要なら後段の dvips と ps2pdf まで面倒を見ます。-p を付ければ pdfetex で直接 PDF を作る短い経路になり、-i を付けると中間ファイル .mx1 / .mx2 が消されずに残ります——実際に中を覗くと、.mx2 には \lineset{1}{2}{...} のような1行が並んでいて、「第1段には2小節」という決定がそのまま書かれているのが見えます。なお musixflx 自身も TeX Live では texlua スクリプト なので、この「別プログラム」は TeX のバイナリに同梱された Lua インタプリタの上で走っています。
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落とし穴として、-1(1 パス)で作った PDF は 段の割り付けが確定していません。書き途中の確認には速くて便利ですが、提出する版を -1 で作ってはいけません。もうひとつ、MusiXTeX が要求するエンジンは素の tex ではなく e-TeX です。これはレジスタ不足を解消するために version 1.15(2011 年 4 月)で踏み切った変更で、musixtex スクリプトが既定で etex を呼ぶのはそのためです。
なぜ 3 パスなのか——答えは MusiXTeX の来歴そのものにあります。同梱マニュアルの「A very brief history」の章によれば、TeX で楽譜を組むという発想は 1987 年ごろ、ボン大学の Andrea Steinbach と Angelika Schofer の修士論文 Automatisierter Notensatz mit TeX に始まります。二人のパッケージ MuTeX は 1 段譜しか扱えませんでしたが、多数のフォント文字を組み合わせて連桁やスラーを作るという手口と、TeX のグルーで水平方向の間隔と均等割りを制御するという二つの着想を残しました。1991 年ごろ Daniel Taupin がこれを多段譜へ広げたのが MusicTeX ですが、代償として水平方向の間隔の自由度が失われ、小節線の前後が空きすぎたり詰まりすぎたりするのを避けるのに試行錯誤が要るようになります。MusicTeX が 1 パスだったからです。直すには多パス化しかない——そう見極めた Taupin が Ross Mitchell、Andreas Egler と組んで 1997 年ごろに書いたのが、最初の MusiXTeX でした。いま musixflx が処理の真ん中に挟まっているのは、そのときの結論がそのまま残っているからです。
その Taupin は、本業は物理学者でした。そして 2003 年、登山中の事故で亡くなっています——TeX Live 2024 に同梱されている README とマニュアル前付けが、そう記しています。現在は Don Simons、Hiroaki Morimoto、Bob Tennent らが保守を続けています。また、真ん中の musixflx はもともと Ross Mitchell が 1992〜1997 年に書いたプログラムで、2011 年に Nikhil Helferty が Lua に書き直したものが今の musixflx.lua です。
最小の MusiXTeX 文書 —「\begin{music} が Undefined control sequence になる」
MusiXTeX には plain TeX の書き方と LaTeX の書き方の二つ があり、混ぜると壊れます。\input musixtex で読み込む plain TeX 版に \begin{music} は存在しません——書くと ! Undefined control sequence. が出て、そのうえ「music」という語が本文として組まれてしまいます。music 環境が定義されるのは musixblx.tex 側、つまり \usepackage{musixtex} で読み込む LaTeX 版 です。plain TeX 版の骨格は次のとおりで、囲みは \startpiece … \endpiece、その外側を \startmuflex … \endmuflex で挟み、最後は \bye で閉じます。
% 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% 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}命令の読み方だけ押さえておくと以降が楽になります。\NOtes … \en が「櫛」ひとつぶんで、大文字の増え方(\notes / \Notes / \NOtes / \NOTes / \NOTEs)がそのまま 音価に対応する基本間隔 を選びます——16 分音符から全音符へ、大文字が増えるほど広くなります。\qa{cdef} は「符幹なしの4分音符を c d e f に」、\ha{g} は「符幹なしの2分音符を g に」、\bar は小節線。\instrumentnumber で楽器数、\setclef1\treble で第1楽器を ト音記号 に、\generalmeter\meterC で 4分の4拍子(C) にしています。生のマクロがこの調子なので、次に述べる前処理系が事実上の標準入力になっています。
pmx・M-Tx・autosp — MusiXTeX を直接書かずに済ませる
MusiXTeX のマニュアル自身が「ほとんどの作業は前処理系だけで済み、MusiXTeX の命令も文法も覚える必要はない」と書いています。器楽なら PMX、歌詞つきの声楽なら M-Tx が定番で、後者は前者を呼び出すので M-Tx → PMX → MusiXTeX という段構えになります。TeX Live 2024 にはこれらの実行ファイルが入っており、名前は少しひねくれています——PMX の本体は pmxab、M-Tx の本体は prepmx(m-tx はその別名)です。
嬉しいことに、musixtex スクリプトは 拡張子を見て入口を決めます。.mtx を渡せば prepmx から、.pmx なら pmxab から、.aspc なら autosp から始まり、そのまま 3 パスまで走り切ります。autosp は「音価に応じた \notes / \Notes / \NOtes の選択」を自動化する前処理系で、上で見た大文字の使い分けを手で書かずに済みます。さらに xml2pmx を使えば MusicXML から入れます——他の楽譜ソフトからの受け渡しはこの経路です。
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もう一点、フォントは別パッケージです。MusiXTeX の音符フォントは musixtex-fonts として切り出されているので、マクロだけ入れてもコンパイルは通りません。TeX Live をふつうに入れていれば両方入りますが、必要最小構成を組んだ環境では引っかかります。歌詞は musixlyr.tex(Rainer Dunker)、コードネームは musixcrd(Robert Hennig)といった拡張が同梱されています。
LilyPond と lilypond-book / lyluatex — TeX の外の浄書エンジンを呼ぶ
LilyPond は TeX とはまったく別のプログラム で、独自の入力言語を持ち、浄書の品質でもっとも高い評価を受けています。その出発点が MusiXTeX だったのは、いま読むと少し皮肉です——Han-Wen Nienhuys と Jan Nieuwenhuizen は 1995 年に MPP(MusiXTeX PreProcessor) の共同開発を始め、それを捨てて 1996 年に LilyPond を起こしました。1998 年の 1.0 で MusiXTeX から完全に切り離され、いまでは PostScript 経由の PDF・SVG・PNG を自前で書き出します。二人は 2003 年の CIM(Colloquium on Musical Informatics)で「LilyPond, a system for automated music engraving」を発表しています。
LaTeX 文書に取り込む定番は lilypond-book です。拡張子 .lytex のファイルに LaTeX の本文と LilyPond の断片を混在させて書き——短い断片は \lilypond{…}、長い断片は lilypond 環境、外部ファイルは \lilypondfile{…}——これを lilypond-book に通すと、各断片が LilyPond でレンダリングされ、それを \includegraphics に置き換えた ふつうの .tex ファイル が書き出されます。あとは通常どおりコンパイルするだけ。楽譜の行幅は、プリアンブルから本文幅を読み取って自動で合わせてくれます。
\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}lilypond-book --pdf score.lytex # renders the fragments, writes score.tex
pdflatex score.tex # compile the generated documentより新しい選択肢が lyluatex です。LuaLaTeX 専用で、前処理の段を挟まずに コンパイルの最中に LilyPond を直接呼び出し ます。本来の書き方は ly 環境(短い断片なら \lily 命令)で、lualatex を --shell-escape 付きで起動するだけ。加えて lilypond-book からの移行用に \lilypond と \lilypondfile も用意されているので、.lytex の原稿をほぼそのまま持ち込めます。ソースがひとつで済むぶん、版を重ねる原稿では管理が楽になります。TeX Live 2024 に入っているのは v1.1.5(2023/04/18)、MIT ライセンスです。
% 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}ここで 必ず知っておくべき落とし穴 があります。lyluatex の .sty は TeX Live に入っていますが、LilyPond 本体(lilypond コマンド)と lilypond-book は TeX Live には入っていません。実測すると、TeX Live 2024 のバイナリディレクトリに lilypond も lilypond-book も存在しません。つまり lyluatex を読み込んだだけでは動かず、LilyPond を 別途インストールしてパスを通す 必要があります。パッケージが入っていることと外部プログラムが入っていることは別の話です。
abc パッケージ — 民謡・単旋律を最短で載せる
ABC 記法 は、人間が読み書きしやすいことを最優先に設計されたテキスト音楽フォーマットで、アイルランド・イングランド・スコットランドなどの 民謡やリードシート(単旋律) の記録に広く使われています。X: T: M: L: K: といった1文字のヘッダに曲名・拍子・調号を書き、続けて CDEF|GABc| のように音を並べるだけ——楽譜としては素朴ですが、メールに貼れるほど軽いのが強みです。LaTeX 側の窓口が abc パッケージ(Enrico Gregorio、TeX Live 2024 では v2.0b)です。
% 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}しくみは lilypond-book と同じく外部変換です。abc 環境の中身をパッケージが一時ファイルに書き出し、\write18(シェル実行)で abcm2ps に渡して PostScript にし、それを ps2eps で EPS に整えてから取り込みます。だから -shell-escape が必須 で——そして LilyPond と同じ問題がここにもあります。abcm2ps は TeX Live に入っていません。abc.sty はあるのに変換器がない、という状態になりがちなので、使う前に abcm2ps を導入してください(mup オプションで代わりに Mup を呼ぶこともできます)。ASCII の ABC を MusicTeX/MusiXTeX 用に変換する古典的ツール abc2mtex も、同様に別途入手が必要です。
TeX Live に入っているもの・いないもの、そしてどれを選ぶか
見分け方はひとつです。TeX の中で組む道具は TeX Live に全部入っていて、TeX の外で組む道具は入っていない。 MusiXTeX 一式(musixtex・musixflx・pmxab・prepmx・autosp・xml2pmx)と、LaTeX 側の窓口(lyluatex.sty・abc.sty)は同梱されています。一方、実際に楽譜を描く外部エンジン——lilypond、lilypond-book、abcm2ps——は同梱されていません。下の表は TeX Live 2024 で実際に確認した結果です。
| プログラム / ファイル | TeX Live 2024 | 役割 |
|---|---|---|
musixtex | 同梱 | 3 パスを回すラッパー。前処理系も呼ぶ |
musixflx | 同梱 | 2 番目のパス。段の割り付けを決める texlua スクリプト |
pmxab / prepmx / autosp / xml2pmx | 同梱 | PMX・M-Tx・自動間隔・MusicXML の前処理系 |
lyluatex.sty / abc.sty | 同梱 | LaTeX 側の窓口。呼び出す先の外部プログラムは別 |
lilypond / lilypond-book | 同梱されない | 別途インストールが必要。LilyPond 本体と取り込み用スクリプト |
abcm2ps / abc2mtex | 同梱されない | 別途インストールが必要。ABC の変換器 |
以上を踏まえた実務の判断です。追加インストールを一切したくない、あるいは配布先の環境が TeX Live だけ と決まっているなら MusiXTeX——ただし生のマクロは書かず pmxab/prepmx から入ります。浄書の品質を最優先 するなら LilyPond で、LuaLaTeX を使っているなら lyluatex、そうでなければ lilypond-book。単旋律を数曲、手早く なら abc。そして三つとも共通の教訓として、外部プログラムを呼ぶ構成(lyluatex・abc)は -shell-escape が要る ため、共有ビルドや CI では許可の設定を先に確認してください。楽譜を単独の画像として書き出して他のアプリに渡したい場合は、TeX2img のページが役に立ちます。