弦月之舞

人生不设限

用jianpu-ly配合lilypond打复杂的合奏谱

乐团内所用的声部分谱较为复杂,制谱比较考验技术。本文介绍了jianpu-ly配合lilypond打谱的经验与技巧,并比较了番茄简谱、jianpu-ly及其他市面上常见的简谱打谱软件,讨论了目前各软件的优劣。

乐团谱或移植乐曲的谱多为线谱,在视奏时有一定门槛。可以用PhotoScore把线谱识别成musicXML,但麻烦主要在线谱与简谱互转,目前缺少开源免费的程序。

目前简谱的打谱软件主要有三类:所见即所得型、代码型、线谱转简谱程序。
所见即所得的打谱软件主要有EOP、MusicWriter、xunscore、来音制谱、Word简谱字体等。EOP用来入门不错;MusicWriter功能强大、支持简线互转与移调,但学习成本比较高;xunscore需要付费使用,运行时可能不稳定,且个人觉得并不是十分好用,musicxml转简谱时升降音记号有bug。这一类软件共同的特点是:多数为闭源,每种软件的使用方法都需要重新学习,文件格式互通性有限。代表性的Word简谱字体是怒独僧的简谱字体,效果不错,但因为字体的总字符数限制,不少符号无法打出来。此外,动手打谱也是费心费力的一件事。
MusicWriter、来音制谱、Sibelius+简谱插件、MuseScore+简谱插件可以将线谱转成简谱。MusicWriter看起来挺不错的(虽然排版字体不好看)但我还没有尝试过;来音制谱或者基于JS的xml2jianpu可以转,但是不支持多声部;Sibelius需要付费,MuseScore的简谱插件操作复杂且已经断更许久,比较遗憾。
代码型的简谱打谱软件主要有番茄简谱和lilypond,两者各有优劣。个人偏好代码型的打谱软件,虽然不太直观(就像Word和LaTeX的区别一样),但修改起来容易,也便于复制。在未来如果能有线谱简谱互转且使用通用格式的开源软件想是最好,但需要一些努力。

使用方法

安装lilypond和jianpu-ly,lilypond的基本操作:https://www.yuque.com/qqbunny/lilypond/begin#

基本操作:请看谱例。为展示各种记号,这段旋律没有意义。

1
2
3
4
R2{ 6 letterA \mf \upbow \< - - 5\ ( 6\ \prall  ) } 7b \downbow  \fermata - - - - - - - | 
2'///\ ^"foo"_"bar" ( 1' ) 7b'. 6\ ( 7b\ ) 1' - - -
g[d7b] 1' \cresc ( - 1'\ ) 6\ \accel Fr=2 7b\ Fr=内 ( 1'\ Fr=外 ) |
R*8 0 0 0 0\\ x\. | % 这一行中后面的内容是是注释

注意语法中的空格问题,该加空格的时候一定要加够。时值可以用字母也可以就反斜杠,个人偏爱用反斜杠,直观一点。倚音不能加空格,也不能用反斜杠。
理论上顺序不重要,个人习惯大概是这样:5b'\\,与番茄一致。如果在多声部遇到升降号的识别bug时再把升降号放到音符前面。
小节线可加可不加,为了方便在程序报错时(音符穿过小节线/乐曲没有在整数拍结束,拍子不够)检查错误,在复杂段落时我会加上。用-来表明和前面相同的音符比较好用,跨小节时会自动添加连弓记号。例如:

1
5 - - - - - - -\  2\\\ ( 3b\\\ 4#\\\ 5\\\ )

和下面的效果一样。

1
5 ( - - - - - - -\ ) 2\\\ ( 3b\\\ 4#\\\ 5\\\ )

可以看出程序提供了丰富的记号,比如颤音\prall, \trill, \startTrillSpan、颤弓(震音 Tremolo)、延长、弓指法记号、强弱记号等。音符头上的各种音乐语气(Articulations)符号可以用Fr=***打出,可以组合使用,等同于lilypond五线谱里音名后面紧跟着的-***。常用的有断弓(保持音)_、拨弦+、重音>等。符号表里没有提供的符号,可以直接粘Unicode字符进去解决,比如二胡的顿弓、人工泛音等。可以去word的“插入”选项卡里找字符大全。
美中不足的是,如果标了内外弦,由于中文的自动换行问题目前无法解决,无法做到书上标指法时竖着排的样子。还有就是符号大小和位置不好看,因为这些符号都是五线谱里的,生搬硬套到简谱上尚有问题。符号表见 https://sheet-poem.com/lilypond/notation.pdf 的755-769页(符号真多……)。

渐强渐弱:\< \> (Hairpin),后接\!标明结束渐强渐弱的位置,不标默认延续到下个力度记号位置。

利用正则表达式和查找替换功能可以快速地改谱。正则表达式在VSCode、例如,有一段旋律:

1
6 - - 5\ ( 6\  ) 7b - - - 2'\ ( 1' ) 7b'. 6\ ( 7b\ ) 1' - - - 

[1-7][#b]?[']?这一表达式即可匹配到音符。想要升八度,只需要替换成$0'即可(建议单开个文件替换完了再贴回去)。目前临时多声部我是用和弦来做的,想要高低两个八度多声部,替换成$0$0'就有高八度的,$0,$0就有低八度的(注意必须按音高从低到高写)。之后处理一下例外情况就行,比如1'降八度后应该是1而非1',(查找',替换成空白即可),比如有时升降号和八度记号会识别错误(我一般会写成,b555#'这种样子,但遇到,b56#7'还是没辙),需要调整下顺序,反正就排列组合直到能编译为止。常见报错:
Ambiguous octave marks (please set OctavesBefore or OctavesAfter if writing them in the middle)
多声部的例子:

1
2
44'\\ ( 55'\\ 6b6b'\\ 55'\\ ) 77'\\ ( 7b7b'\\ 6b6b'\\ 55'\\ ) 44'\\ ( 55'\\ 6b6b'\\ 55'\\ ) 77'\\ ( 7b7b'\\ 6b6b'\\ 55'\\ ) 
,55\ \f \< ( ,55\ ) 6,b6b\ ( g[7b,] 6,b6b\ ) | ,55\ ( ,55\ ) ,55\ ( ,55\ )

但目前移调还是个问题。对于八度以外的情况,正则表达式的替换就不管事了。可能需要程序来实现。

多声部还有一些其他问题,比如高声部音符时值必须相等,没法加颤弓等符号、低声部有高音点时会把高声部的音符向上顶等问题。还有待解决。

最后给出一小段体现各种功能的段落。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
title = Temp
composer = Kai
1=bE
7/4
4=69
instrument = 高胡
2 3b 4# 5 6 7b 1'
4 5 6b 7b 1' 2b' 3
2 letterA 3b up 4# down 5/// 6 7b 1#' bend
\break
4/4
R2{ 6 \upbow letterB \mf \< - - 5\ Fr=◇ \! ( 6\ \prall ) } 7b \downbow \fermata - - - - - - - |
2'///\ ^"foo"_"bar" ( 1' ) 7b'. 6\ Fr=> ( 7b\ \mordent ) 1' \turn - - -
1=F
g[d7b] 1' Fr=_ \cresc ( - 1'\ ) 6\ Fr=2 7b\ Fr=内二 ( 1'\ Fr=外 ) | 1' 7 6 Fr=▼ 5 4. 5\ 6\ 1'\ 0
R*8 0 0 0 0\\ x\.
2 \trill 2 harmonic 8 Fr=x 9 Fr=+
% 这一行中后面的内容是注释
\pageBreak
NextPart
instrument = Erhu
15 - - - - - 22' -\ 33'\\\ 44'\\\ 5#5#'\\\ 66'\\\

还有一个常见的问题是弱起小节(anacrusis)。拍号里设置起来不难,例如4/4,4,但是要注意在最后一个小节时少打这一拍。这是五线谱里的习惯。但是在简谱里一般最后一小节也是打满拍数的,这时需要参照GitHub上issue里提到的办法,设置环境变量。https://github.com/ssb22/jianpu-ly/issues/74

编译需要在cmd下进行。第一行设置编码为UTF-8,因为lilypond的编码格式是不带BOM的UTF-8。PowerShell是UTF-16 BOM,编译时会遇到问题。

1
2
3
chcp 65001
python jianpu-ly.py SilkRoad_Huqin.txt > SilkRoad_Huqin.ly
lilypond SilkRoad_Huqin.ly

建议每打一小段就编译一下,容易查错。如果遇到”failed”的情况也不要惊慌,看看生成的pdf从哪里开始出错,从开始出错的地方开始一段段排查。lilypond和latex类似,都会尽量把能成功生成的部分打印出来。目前jianpu-ly生成的文件还是很容易有bug,可以去GitHub上看有没有人提过类似的issue。

合奏谱的考量

在打合奏谱时,需要特别考虑几点。

一是长时间休止后的进板问题。不能全指望指挥给提示,需要在长时间停顿后的最后几小节标上其他乐器的名字或旋律(旋律用小一号字体并放在括号里)。如果恰逢翻页,需要把停顿的小节拆成两部分,把进板提示写到下一面上。

二是谱子比较长的时候如何处理翻页问题。如果全部单面打印,不装订/不放到谱夹里,只需要标明页码,尽量在空小节处分页,让乐手自己决定在谱架上放哪3-4页即可;如果要放到谱夹里,就需要考虑只有两面时的翻谱问题。我目前的办法是额外加一页首页,同时尽量把空小节放到偶数页结尾以减少一次翻页。在制谱时还要注意,多次反复的小节如果简写的话,尽量放在同一行里,且至少每一页都要有一个完整的小节,不然翻面后就没法演了。

更详细的页脚需要自行修改生成的.ly文件。我自己的设置是在页面内外侧都加页码,页脚处写明乐曲名称,以便查阅。

三是小节编号问题。尽量不要用区间反复功能(R{ ... }),因为反复不会记入小节数,导致总小节数对不上,需要手动修改。建议多标一些排练记号,比标小节数更好用。

更多关于打谱的细节考量,可以参考《Behind Bars》,知乎上有人翻译了一部分:https://zhuanlan.zhihu.com/p/492401201 https://zhuanlan.zhihu.com/p/493149160

技巧与经验

输入的纯文本文件可以是任何格式,我习惯存成.tex格式,配合文本编辑器的注释快捷键用起来比较快。善用各种光标控制键(Home, End, Ctrl+方向键, Ctrl+Shift+方向键, Shift+方向键, Insert, Alt+Shift激活块选择……)和正则表达式替换功能提高效率。

拍数不对,分段注释检查。一般的错多为时值打错、休止符少加一拍等。

音高不对,一般是差个二度,因为把五线谱的线和间看错了。

番茄简谱和jianpu-ly的比较

番茄简谱的思路介于脚本生成和手动排版之间,每一行都要打一遍分谱的各个声部,小节线也要自己打。好处是接近“所见即所得”,上手相对容易。多声部的大括号也比较接近传统习惯。
临时多声部功能很好用,特别适用于乐团里同种乐器经常分分合合的情况。手动加括号和注释比较方便,可以把用于提示乐手进板的其他乐器的旋律也打进来。
缺少小节重复等符号。升降还原记号需要自己处理,音符的分组功能尚有bug。
由于flash终止支持的原因,试听功能已经不能用了。功能全部在服务器端实现,且服务器经常被攻击,导致实际体验有时不太好。个人很佩服开发者,从2014年至今维持着服务器运转,且其功能、易用性在同类软件中至今仍相当优秀。

jianpu-ly依托于lilypond强大的排版功能,分页、断行、小节重复等操作相当方便。升降号、音符分组等会自动处理,打谱时只要把每个音的音高和时值打对即可。连音线的添加习惯和番茄不同,是把从第二个音开始的音括住。加括号、调字号、小节高亮等复杂功能不是实现不了就是会引起排版错乱,还需要改进。
每一部分的分谱就像音轨的一轨一样,这使得拆分和合并相当容易,也无须处理换行问题。但是目前简谱不能打临时多声部,如果通过和弦功能实现还是有不少问题。
脚本会严格地检查每一小节的拍数,散板段落目前还不太好处理(虽然ly本身打线谱时都可以实现)。弱起小节的问题前文已经说过。
本地编译上手比番茄稍复杂,而且处理报错需要一点经验。习惯后还好。
musicxml转简谱的功能仍在开发中,目前不可用。ly可以生成midi文件,虽然有bug但至少还能一听。