MusiXTeX 공식 매뉴얼은 첫 장부터 한 가지를 못박습니다. 음악은 산문처럼 기호가 한 줄로 늘어선 것이 아니라 2차원 행렬이라는 것입니다. 수식을 그토록 아름답게 조판하는 LaTeX가 유독 오선보 악보만은 혼자 해내지 못하는 이유가 여기에 있습니다. 음표의 가로 위치는 그 줄에 몇 마디가 들어가는지 정해져야 확정되고, 몇 마디가 들어가는지는 음표의 너비가 정해져야 알 수 있습니다. 닭과 달걀입니다. 이 페이지에서는 그 순환을 3패스로 끊어 낸 MusiXTeX와, 같은 문제에 “TeX를 떠난다”는 답을 내놓은 LilyPond, 그리고 간편한 ABC 기보법을, 지금 TeX Live에 무엇이 들어 있고 무엇이 들어 있지 않은지까지 포함해 살펴봅니다.
LaTeX만으로는 왜 악보를 조판할 수 없는가
답은 “음표가 가로로도, 세로로도 늘어서기 때문”입니다. TeX의 조판 모델은 상자를 가로로 늘어놓아 한 줄을 만들고, 줄을 세로로 쌓아 페이지를 만드는 것입니다. 산문과 수식에는 이것으로 충분합니다. 그러나 악보는 여러 오선이 동시에 진행하고, 게다가 한 단(시스템)에 몇 마디를 넣느냐에 따라 음표 간격 자체가 늘고 줄어듭니다. MusiXTeX 매뉴얼은 이를 세로 빗을 가로로 늘어놓는 일이라고 표현하며, 입력도 정확히 그런 모양입니다. \notes부터 \en까지가 빗 하나이고, 그 안을 &로 나누면 맨 아래 악기부터 차례로 다른 오선에 실립니다. LaTeX에는 이런 기구가 없으니, 악보에는 반드시 무언가 한 겹이 더 필요합니다.
이 한 겹에는 크게 두 방향이 있습니다. 하나는 TeX 안에 머무는 길로, 글꼴과 매크로를 더해 TeX 자신에게 악보를 조판시키는 방식입니다. 이것이 MusiXTeX입니다. 다른 하나는 TeX 밖으로 나가는 길로, 악보 전용 프로그램에 조판을 맡기고 그 결과를 \includegraphics로 그림처럼 가져오는 방식입니다. LilyPond와 ABC 계열이 이렇게 합니다. 흥미로운 것은 이 둘이 역사적으로 이어져 있다는 점입니다. LilyPond는 MusiXTeX용 전처리기를 만들려던 두 사람이 그 계획을 버린 자리에서 시작되었습니다.
MusiXTeX의 3패스 — musixflx가 중간에 끼는 이유
MusiXTeX의 표준 처리 경로는 etex → musixflx → etex의 3패스이고, 가운데의 musixflx는 TeX가 아니라 줄바꿈(단 나누기)만 하는 별도 프로그램입니다. 차례대로 보면, 첫 TeX 실행에서 \startmuflex가 작업이름.mx1을 열어 마디마다 “고정 폭 여백”과 “늘어나는 여백”이 얼마인지 써 냅니다. 다음으로 musixflx가 그 .mx1을 읽어 각 단에 몇 마디를 넣을지 정하고, 단별 신축 비율을 작업이름.mx2에 씁니다. 세 번째로 TeX가 두 파일을 읽어 들이고, 그제서야 최종 간격이 확정됩니다. 이 페이지 첫머리의 닭과 달걀은 이렇게 파일을 한 번 거치는 것으로 끊깁니다.
이 세 번을 손으로 돌릴 필요는 없습니다. TeX Live에는 musixtex라는 래퍼 스크립트가 들어 있어서, musixtex score.tex라고 치기만 하면 3패스를 차례로 실행하고 필요하면 뒤이어 dvips와 ps2pdf까지 처리합니다. -p를 붙이면 pdfetex로 곧장 PDF를 만드는 짧은 경로가 되고, -i를 붙이면 중간 파일 .mx1 / .mx2가 지워지지 않고 남습니다. 실제로 .mx2를 열어 보면 \lineset{1}{2}{...} 같은 줄이 있는데, “1단에는 2마디”라는 결정이 그대로 적혀 있는 것입니다. 참고로 TeX Live의 musixflx도 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입니다. 이는 레지스터 부족을 해소하려고 버전 1.15(2011년 4월)에서 단행한 변경이며, musixtex 스크립트가 기본으로 etex를 부르는 이유이기도 합니다.
왜 3패스일까요. 답은 MusiXTeX 자신의 내력에 있습니다. 함께 배포되는 매뉴얼의 「A very brief history」 장은 TeX으로 악보를 조판한다는 발상을 1987년 무렵, 본 대학의 Andrea Steinbach와 Angelika Schofer의 석사 논문 Automatisierter Notensatz mit TeX까지 거슬러 올라갑니다. 두 사람의 패키지 MuTeX는 한 단짜리 보표밖에 다루지 못했지만 두 가지 착상을 남겼습니다. 많은 수의 폰트 글자를 이어 붙여 빔과 이음줄을 만드는 방식, 그리고 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}는 g에 기둥 없는 2분음표, \bar는 마디선입니다. \instrumentnumber로 악기 수를, \setclef1\treble로 첫 악기를 높은음자리표로, \generalmeter\meterC로 4분의 4박자로 설정합니다. 원시 매크로가 이런 모양이라, 다음에 이야기할 전처리기가 사실상의 표준 입력이 되었습니다.
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를 따로 설치해 PATH에 넣어야 합니다. 패키지가 있다는 것과 외부 프로그램이 있다는 것은 다른 이야기입니다.
abc 패키지 — 민요와 단선율을 가장 빠르게
ABC 기보법은 사람이 읽고 쓰기 쉬운 것을 최우선으로 설계한 텍스트 음악 형식으로, 아일랜드·잉글랜드·스코틀랜드 등지의 민요와 리드 시트(단선율) 기록에 널리 쓰입니다. X: T: M: L: K: 같은 한 글자 머리말에 곡명·박자·조성을 적고, 이어서 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 | 포함 | 두 번째 패스. 단 배치를 정하는 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 페이지가 그 이야기를 다룹니다.