因为自学乐理需要写一些 note,我需要使用 LaTeX 编辑含有谱例、音乐记号的音乐文档。常见的选项是 MusiXTeX 包用来制作谱例,musicography 包用来提供正文中的音乐记号。但 MusiXTeX 的语法实在是太反人类了,非常低效,而且不太好看。考虑到 LilyPond 语法比较简单,而且具有导出 midi 文件等强大的功能,我平时单纯打谱也是用它,于是考虑整合 LilyPond 和 LaTeX 成为了一个好的选择。LilyPond 的下载和基本使用都可参考其官网:LilyPond – Music notation for everyone。
添加谱例
现成工具:lilypond-book
参考 LilyPond Application Usage: 3. Running lilypond-book。但目前我在 Windows 10 系统中运行总是出错,现象和 lilypond-book on Windows 10 always shows usage info (#6008) · Issues · LilyPond / LilyPond · GitLab 中所述类似,而上述链接中的方法均不能解决问题,于是放弃。
乐谱中截取
事实上,将乐谱导出为 eps 或 pdf 格式的矢量图并导入文档也是一种可行的方案,该方案的要点在于保持谱表大小一定并使得边距尽量小。LilyPond 提供了类似的功能,见 LilyPond Notation Reference: 3.4.1 Extracting fragments of music。
如果我们要导出单行乐谱,只需要在 layout
中加入下列片段
\layout {
clip-regions
= #(list
(cons
(make-rhythmic-location 5 1 2)
(make-rhythmic-location 7 3 4)))
}
make-rhythmic-location
之后的数字表示从第 5 小节第 1 个二分音符的对应的时间之后开始,到第 7 个小节第 3 个四分音符之前结束。运行时,加上 -dclip-systems
选项。这样操作输出的是 eps 和 pdf 格式的乐谱片段,其大小就是 LilyPond 中设置的谱表的大小。
LilyPond 中上述截取只能截取单行,如果设置范围跨行了,会截多张图出来。如果涉及多行的谱例,续设定乐谱的行宽和 LaTeX 文档的行宽相等(或者设置到任何你想要的行宽)。同时我们希望首行不缩进,末行在该结束的位置正常结束不扩展为一整行,因此 layout
设置为
\layout {
indent = #0 % 首行不缩进
line-width = 6.25\in % 设置行宽
ragged-last = ##t % 最后一行正常结束
\context {
\Score
\omit BarNumber
} % 不显示小节号
clip-regions % 截取
= #(list
(cons
(make-rhythmic-location 1 0 1)
(make-rhythmic-location 17 1 2)))
}
由于小节号标在每一行前,如果小节号位数不一致,截出来的图最左边对齐的位置就不一样,因此这里作一妥协:不显示小节号,上述代码中 \context
部分即实现不显示小节号的功能。
LaTeX 浮动体设置
用上述方法截取谱例后,需要将其放在 LaTeX 浮动体中。我们自定义 Example
浮动体。使用 float
宏包,同时设置外形类似三线表的浮动体。
\usepackage{float}
\floatstyle{ruled}
\newfloat{Example}{h}{example}[section]
使用时只需
\begin{Example}
\raggedright % 多行谱例时使用,避免 Underfull \hbox warning.
\includegraphics{clip1.pdf}
\includegraphics{clip2.pdf}
\caption{A testing example}
\label{eg:test}
\end{Example}
其中 clip1.pdf 等是 LilyPond 生成的乐谱片段。
音乐记号
使用 lilyglyphs
宏包以提供音乐符号。该宏包默认的临时记号太大了,我们可以自行调整如下
\renewcommand{\sharp}{\lilyGlyph[scale=1.2,raise=.5]{accidentals.sharp}}
\renewcommand{\flat}{\lilyGlyph[scale=1.2,raise=.5]{accidentals.flat}}
\renewcommand{\natural}{\lilyGlyph[scale=1.2,raise=.5]{accidentals.natural}}
\renewcommand{\flatflat}{\lilyGlyph[scale=1.2,raise=.5]{accidentals.flatflat}}
\renewcommand{\doublesharp}{\lilyGlyph[scale=1.2,raise=.5]{accidentals.doublesharp}}
在公式环境中无法调整其大小,故定义
\newcommand{\mathscript}[1]{\text{\scriptsize #1}}
三个数字的数字低音使用如下命令实现
\newcommand{\fbtri}[3]{
\begin{array}{l}
\scriptstyle{#1}\\
[-1.35ex]\scriptstyle{#2}\\
[-1.35ex]\scriptstyle{#3}
\end{array}
}
角标等使用 amsmath
宏包的公式环境实现。