在发声边缘:LilyPond,第 1 部分
从上个月专栏的读者反馈来看,似乎许多读者对为音乐家练习而设计的应用程序和实用程序感兴趣。一位读者提出了乐谱软件的主题,这些程序旨在格式化音乐符号以进行打印。本月专栏着眼于 Linux 的乐谱软件,特别关注 LilyPond 项目。
首先,关于乐谱主题的一些说明。现代西方音乐记谱法是数百年发展实践的结果。从最初作为记录素歌的一种手段开始,该系统已经发展到可以容纳令人眼花缭乱的符号、标记和对象,所有这些都旨在传达或多或少准确的一组指令,描述作曲家音乐意图的表演,其中可能涉及庞大的乐器和声乐资源。学习阅读和书写标准西方音乐记谱法是一项重要的任务,真正的流畅性需要相当大的努力。
唉,计算机还不能为您进行视奏,但它可以减轻乐谱的许多繁琐的文书工作,尤其是在手稿准备和乐谱打印方面。程序可用作虚拟手稿纸,向用户展示一系列传统的音乐符号,例如谱号(或更迂腐地说,五线谱)、谱号、拍号、调号、音符、休止符、发音等等。作曲家从调色板中选择他需要的,从谱号定义开始,然后通过自由添加和删除谱号的元素来继续。通常,音符在虚拟谱号上放置或移动时可以试听,并且可以随时播放整个作品或任何部分。当作曲家对作品的外观和声音感到满意时,他可以以各种格式保存或导出它,包括 MIDI 文件和 PostScript 图形。属于此音乐软件类别的 Linux 应用程序包括 MusE 和 Rosegarden 音频/MIDI 音序器以及 Joerg Anders 的 NoteEdit 程序(请参阅资源)。
音乐排版软件是另一个类别。音乐排版系统旨在格式化出版质量的输出文件。这些系统通常使用基于文本的界面(一种语言)和编译器或预处理器(程序)。用户以系统的语言编写规范文件,并使用排版程序对其进行处理。输出通常是可缩放的图形格式,例如 PostScript 或 Adobe PDF,可以使用常见的 Linux 打印工具进行打印。凭借足够强大的语言,乐谱外观的每个细节都可以自定义,以获得完美可读且美观的印刷音乐。此类别中的 Linux 音乐应用程序包括 MusiXTeX、Mup、abc 和 LilyPond。
音乐规范语言可能看起来是处理像音乐符号这样视觉化事物的一种奇怪方式,但准备音乐手稿不一定是一个简单的过程。音符分组、变音记号的位置、连音梁要求、必要的符干方向以及许多其他因素都会影响印刷乐谱的外观和可用性,并且这些因素的变化无法通过公式轻松预测和适应。即使是最灵活的乐谱 GUI 也不是完全所见即所得的,并且底层程序逻辑必须做出可能无法创建最佳输出的决策。相比之下,规范语言允许在依赖图形界面的程序中不常见的输出自定义程度。这使我们想到了 LilypPond。
LilyPond 的主要架构师 Han-Wen Nienhuys 和 Jan Nieuwenhuizen 这样说。他们非常聪明且口齿伶俐,因此我将让他们对 LP 的概括性描述为他们代言
“用计算机制作的乐谱几乎总是看起来平淡乏味,但这是什么原因呢?机器可能是机械的,但为什么它们的产品也应该是机械的呢?考虑到这一点,我们七年前开始编程。我们试图在一个程序中捕捉良好音乐雕刻的规则,该程序称为 LilyPond。我们按照我们期望软件的方式构建它:健壮、开放和灵活。最好的是,您可以使用 LilyPond 舒适地创建漂亮的乐谱。”
确实是大胆的声明,但它们得到了扎实的编程技能和对所选主题的深入研究的支持。本文的其余部分让您一瞥 LP 的功能。如果您是一位希望创作出版质量的乐谱的音乐家,我希望您会受到启发尝试亲自使用 LP。
它的网页将 LilyPond 称为自动化雕刻系统,一种旨在创建美观可读输出的软件音乐排版器。LilyPond 设置为默认值时,会自动格式化大多数音乐以获得出色的印刷输出,同时允许高度详细的自定义以适应几乎任何音乐乐谱要求,包括不寻常和特殊的符号。
LP 的开发人员表示,从源代码构建程序是一个复杂的过程,他们建议安装预构建的软件包,并在 LilyPond 网站上方便地提供了可用软件包的列表。软件包目前可用于 Red Hat、Debian、Mandrakelinux 和 Slackware 系统。通用的源代码 tarball 也可用。无论您如何安装它,一旦安装完成,您就可以开始使用 LP。
以下示例假设 LP 版本为 2.2.0 或更高版本。LP 是一个快速发展的目标;如果您使用另一个版本运行示例,您的结果可能会有所不同。
LilyPond 文档包括使用语言界面的基础知识的良好教程指南。以下代码是一个相当简单的 LilyPond 源文件示例
% This is a comment. \score { \notes { c'4 e' g' b'} }
在此示例中,\score 元素准备了一个默认的 5 线谱号,带有高音谱号和常用 (4/4) 拍号。它的花括号包含要在乐谱中表示的数据。在本例中,乐谱包含一系列从中央 C 开始并在四分音符中琶音 Cmaj7 和弦的音符。音高元素包括音高名称 (c)、八度音程指定符 (') 和时值 (4)。如果未为下一个元素指定时值,则它从前面的音符获取其时值。
要从此代码创建 PostScript 图形文件,只需使用 LP 编译器处理它,如下所示
lilypond lj-ex-1.ly
图 1 显示了 GhostView 显示的输出文件 lj-ex-1.ps。
现在我们添加一些语言元素以创建更完整的内容
\header{ title = "Simple" composer = "DLP 2004" } \score { \notes { c'4 e' g'8 a'8 b'4 c''1 \bar "|."} \midi {\tempo 4=132} \paper { } }
新元素包括标题块、节奏和音高的进一步规范、双小节线规范以及 MIDI 输出(带有 tempocontrol)和 LilyPond 默认打印就绪格式的指令。图 2 显示了编译后的输出,同样在 GhostView PostScript 文件查看器中。
精通乐谱的音乐家可能会注意到,我没有指定 b' 和 c'' 之间预期的小节线。正如宣传的那样,LilyPond 自动化了乐谱布局的许多方面,但始终允许自定义输出到几乎任何程度的可能性。
作为最后一个代码示例,这是一个双五线谱中的复杂片段,节奏要复杂得多
\version "2.2.0" \header{ title = "Toccata Vivace" subtitle = "For Flute and Bassoon" composer = "DLP 2004" } Flute = \notes \context Voice = Flute { \set Staff.instrument = "Flute" \set Staff.midiInstrument = "flute" \key c \major \clef treble \time 3/4 \partial4 r4 | r8. g''16 -\staccato ges'' -\staccato f'' -\staccato b'-\mf -\accent fis''-\accent r e'-\sf r8 | r4 \times 2/3 { ees'16 -\staccato d'' -\staccato des'' } f''8\< ~ f''4\! \bar "||" } Bassoon = \notes \context Voice = Bassoon { \set Staff.instrument = "Bassoon" \set Staff.midiInstrument = "bassoon" \key c \major \clef bass \time 3/4 \partial4 r16 cis'-\mf -\staccato c' -\staccato d' -\staccato | f-\accent e'-\accent r a,-\sf r4 r8 \times 2/3 { a,16 -\staccato g -\staccato cis'\< ~ } | cis'4\! \>~ \times 2/3 { cis'8\! ( b bes, } d,4-\accent) \bar "||" } FluteStaff = \context Staff = FluteStaff << \Flute >> BassoonStaff = \context Staff = BassoonStaff << \Bassoon >> \score { << \FluteStaff \BassoonStaff >> \paper { } \midi {\tempo 4 = 160} }
图 3 显示了 PostScript 输出。稍加思考,您应该能够理解代码的逻辑。一点帮助:LP 使用 'is' 表示升号,'es' 表示降号。其他新元素是不言自明的,尤其是参考图 3,我建议有兴趣的读者参考 LilyPond 的文档以澄清任何剩余的模糊之处。
LilyPond 为 abc Finale 和 Mup 创建的文件以及 MIDI、MuseData 和某些 XML 格式的文件提供导入过滤器。这些过滤器在不同程度上起作用,并且在将其中一种格式的文件导入 LilyPond 后,通常需要进行一些手动编辑。LilyPond 文档包括有关最佳使用每个过滤器的建议,建议读者研究当前文档以获取最新方向,以获得最佳使用效果。
midi2ly 实用程序提供了一个很好的例子。它易于使用,遵循以下基本语法midi2ly [选项] foo.mid. 但是,与所有 MIDI 到乐谱转换程序一样,您必须格外小心原始 MIDI 文件,才能从 midi2ly 获得最佳结果。未量化的 MIDI 录音不太可能很好地呈现,您应该量化开始时间和持续时间。该实用程序目前不转录单谱号上的复音音乐,因此您可能需要将 MIDI 数据拆分为单独的轨道和通道,将每个轨道/通道视为 LilyPond 声部。您可能需要将所有轨道分配到相同的 MIDI 通道,并且您应该将您的作品保存为 Type 1 标准 MIDI 文件。Type 0 MIDI 文件将所有数据放入单个轨道,从而破坏了 midi2ly 分离声部的努力。
图 4 说明了从简单的 2 轨 MIDI 序列转换的结果。请注意,在上方谱号的第二个小节中,有一个未对齐的二分音符。该符号应该是两个连音四分音符,很容易通过少量手动校正来修复。图 5 显示了更正后的乐谱,其中包含标题信息(标题、作者、日期)和添加到下方谱号中最后一个 G 的警示性变音记号。
我对其他 LP 导入过滤器的实验产生了类似的结果。在某些情况下,我可以通过将以下行添加到无效文件中,使用 convert-ly 实用程序生成有效的 LY 文件\version "1.8". 然后,我可以使用 convert-ly 处理文件,使其更新
convert-ly filtered-foo.ly > converted-foo.ly
转换后的文件应该可以与 LilyPond 编译器一起处理,但仍可能需要一些手动格式化和修复。
下个月,我将介绍 Rosegarden、NoteEdit 和 Denemo 中发现的 LilyPond 支持。
Dave Phillips (dlphilp@bright.net) 是一位音乐家、教师和作家,居住在俄亥俄州芬德利。自 1995 年首次接触 Linux 以来,他一直是 Linux 音频社区的活跃成员。他是The Book of Linux Music & Sound的作者,以及Linux Journal中的众多文章的作者。