番茄简谱和jianpu-ly的比较
乐团谱或移植乐曲的谱多为线谱,在视奏时有一定门槛。可以用PhotoScore把线谱识别成musicXML,但麻烦主要在线谱与简谱互转,目前缺少开源免费的程序。
Upd:做了个介绍这个的视频教程和PPT:jianpu-ly入门
目前简谱的打谱软件主要有三类:所见即所得型、代码型、线谱转简谱程序。
所见即所得的打谱软件主要有jp-word、EOP、MusicWriter、xunscore、来音制谱、Word简谱字体等。jp-word很强大;EOP用来入门不错;MusicWriter功能强大、支持简线互转与移调,但学习成本比较高;xunscore需要付费使用,运行时可能不稳定,且个人觉得并不是十分好用,musicxml转简谱时升降音记号有bug。这一类软件共同的特点是:多数为闭源,每种软件的使用方法都需要重新学习,文件格式互通性有限。代表性的Word简谱字体是怒独僧的简谱字体,效果不错,但因为字体的总字符数限制,不少符号无法打出来。此外,动手打谱也是费心费力的一件事。
MusicWriter、来音制谱、Sibelius+简谱插件、MuseScore+简谱插件可以将线谱转成简谱。MusicWriter看起来挺不错的(虽然排版字体不好看)但我还没有尝试过;来音制谱或者基于JS的xml2jianpu可以转,但是不支持多声部;Sibelius需要付费,MuseScore的简谱插件操作复杂且已经断更许久,比较遗憾。
代码型的简谱打谱软件主要有番茄简谱及其开源版继任者Sparks NMN,jianpu-ly和MUSE,各有优劣。个人偏好代码型的打谱软件,虽然不太直观(就像Word和LaTeX的区别一样),但修改起来容易,也便于复制。在未来如果能有线谱简谱互转且使用通用格式的开源软件想是最好,但需要一些努力。
使用方法
首先安装lilypond (最高2.24.4,2.26目前还不支持jianpu-ly。win7下只能用2.22且文件名不能有中文等Unicode字符)和jianpu-ly(GitHub或Gitee上都能下载)。
lilypond的基本操作:https://www.yuque.com/qqbunny/lilypond/begin#
基本操作:请看谱例。为展示各种记号,这段旋律没有意义。
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=内 ( 1'\ Fr=外 ) |
R*8 0 0 0 0\\ x\. | % 这一行中后面的内容是是注释
注意语法中的空格问题,该加空格的时候一定要加够。时值可以用字母也可以就反斜杠,个人偏爱用反斜杠,直观一点。倚音不能加空格,也不能用反斜杠。
理论上顺序不重要,个人习惯大概是这样:5b'\\,与番茄一致。如果在多声部遇到升降号的识别bug时再把升降号放到音符前面。
小节线可加可不加,为了方便在程序报错时(音符穿过小节线/乐曲没有在整数拍结束,拍子不够)检查错误,在复杂段落时我会加上。用-来表明和前面相同的音符比较好用,跨小节时会自动添加连弓记号。例如:
5 - - - - - - -\ 2\\\ ( 3b\\\ 4#\\\ 5\\\ )
和下面的效果一样。
5 ( - - - - - - -\ ) 2\\\ ( 3b\\\ 4#\\\ 5\\\ )
可以看出程序提供了丰富的记号,比如颤音\prall, \trill, \startTrillSpan, \stopTrillSpan、颤弓(震音 Tremolo)、延长、弓指法记号、强弱记号等。音符头上的各种音乐语气(Articulations)符号可以用Fr=***打出,可以组合使用,等同于lilypond五线谱里音名后面紧跟着的-***。常用的有断弓(保持音)_、拨弦+、重音>等。如果一个音符有多个标记,比如二胡的指法(内弦一指等),就多打几个Fr=*,程序会按先后顺序自下向上地在竖向显示,做到书上标指法时竖着排的样子。符号表里没有提供的符号,可以直接粘Unicode字符进去解决,比如二胡的顿弓▼、人工泛音◇等。可以去word的“插入”选项卡里找字符大全。
美中不足的是,现在符号大小和位置可能不太好看(比如保持音),因为这些符号都是五线谱里的,生搬硬套到简谱上尚有问题。符号表见 https://sheet-poem.com/lilypond/notation.pdf 的755-769页(符号真多……)。
渐强渐弱:\< \> (Hairpin),后接\!标明结束渐强渐弱的位置,不标默认延续到下个力度记号位置。
利用正则表达式和查找替换功能可以快速地改谱。正则表达式在VSCode、例如,有一段旋律:
6 - - 5\ ( 6\ ) 7b - - - 2'\ ( 1' ) 7b'. 6\ ( 7b\ ) 1' - - -
用[1-7][#b]?[']?这一表达式即可匹配到音符。想要升八度,只需要替换成$0'即可(建议单开个文件替换完了再贴回去)。目前临时多声部我是用和弦来做的,想要高低两个八度多声部,替换成$0$0'就有高八度的,$0,$0就有低八度的(注意必须按音高从低到高写)。之后处理一下例外情况就行,比如1'降八度后应该是1而非1',,比如有时升降号和八度记号会识别错误,需要调整下顺序,反正就排列组合直到能编译为止。常见报错:
Ambiguous octave marks (please set OctavesBefore or OctavesAfter if writing them in the middle)
声明OctavesBefore或者OctavesAfter有时会有帮助。
OctavesBefore
s,,3,,6,,7,3 ( q,,3,,6,,7,3 )
q,,3,,6,,7,3 q0 q,,5,1,2,5 q,,5,1,2,5 q0
s2,, s1 s,3 _"+" s2,, s,3 _"+" s2,, s2,, s,3 _"+" ,1,4,51/// ,2,5,62///
如果不加的话,我的习惯是,下面加点全写前面,上面加点全写后面(低音前高音后)。例如:,6363'
多声部的例子:
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\ )
但目前移调还是个问题。对于八度以外的情况,正则表达式的替换就不管事了。可能需要程序来实现。
多声部还有一些其他问题,比如高声部音符时值必须相等,没法加颤弓等符号、低声部有高音点时会把高声部的音符向上顶等问题。还有待解决。
最后给出一小段体现各种功能的段落。
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下进行(如果你用的是Windows的话)。第一行设置编码为UTF-8,因为lilypond的编码格式是不带BOM的UTF-8。PowerShell是UTF-16 BOM,编译时会遇到问题。
cmd
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。
其他技巧
副旋律/其他乐器的旋律提示 & 字体颜色
想要给一部分旋律(例如用作提示的、其他声部的旋律)加上括号,怎么办?用[( )]。在多声部里会遇到小节线的问题,需要一点小技巧,目前会遇到bar check failed的警告但不影响渲染。见https://github.com/ssb22/jianpu-ly/issues/94与https://github.com/ssb22/jianpu-ly/issues/89。配合对字体大小与颜色的设置,可以更明确地区分出括号内的旋律。注意LP语句要写在括号里面,否则改颜色的语句不起作用。官方的颜色列表
font-size的值不是绝对尺寸,而是一个相对于标准大小的偏移量。每改变-1,大小约为标准大小的 94%;改变-2,约为 89%,以此类推。正值会使音符变大。
instrument = 高胡
1=E 2/4
LP: \cadenzaOn s4 \cadenzaOff % add this in every bar that [( and )] is being used in another part
:LP
R*1 s0 s6 \mf s1' s2' s3' \< s1' s2' s3' | s5' s6' s1'' s2'' s3'' s1'' s2'' s3'' | q5'' \ff q0 0 | q1'' \sff q0 0
NextPart
instrument = 中胡
2/4
[(
LP:
\override Score.NoteHead.font-size = #-4 % 显著减小音符
\override NoteHead.color = CadetBlue
:LP
s5, s6, s1 s2 )]
LP: \override NoteHead.color = #black
\revert Score.NoteHead.font-size
:LP
s3 s1 s2 s3 | s5, \< s6, s1 s2 s3 s1 s2 s3 | s5, s6, s1 s2 s3 s1 s2 s3 | q5 \ff q0 0 | q,51 \sff q0 0
也可以使用CSS Color,X11 Color等。例如:
\override NoteHead.color = #(x11-color 'SlateGrey)
\override NoteHead.color = LightSteelBlue
jianpu-ly的环境变量
有时需要设置环境变量来绕过错误或者使程序忽略问题:
set j2ly_sloppy_bars=1
jianpu-ly会直接从 os.environ 读取这些变量。设置一次后当前终端会话中一直有效,想关闭时设成空值即可:$env:j2ly_sloppy_bars=$null
散板记号
散板记号可以暂时替换拍号来实现。脚本会严格地检查每一小节的拍数,散板段落也需要按照实际拍数写,然后把拍号替换成散板符号。
3'5'/// \f \fermata 0
LP: \once \override Staff.TimeSignature.stencil =
#(lambda (grob)
(grob-interpret-markup grob
#{ \markup \bold \huge "サ" #}))
:LP
4/4 % 散板小节实际的拍数,为了保证拍子的计算不出错
LP: \bar "!"
:LP
% 虚线小节线
琵琶等弹拨乐器的演奏符号
对于弹拨乐器的技法,可以使用Pipa-font。首先安装这个字体,在系统字体列表中能查到,之后通过需要手动指定markup的字体实现技法符号。这么搞一遍,谱子源文件肯定看起来支离破碎:
LP:
^\markup {
\override #'(font-name . "Pipa font")
ahdu
}
:LP
后来在Dr. Brown的建议下,通过在lilypond里定义Music Function简化了命令(注意LPH这个功能是jianpu-ly v1.867开始才有的,它会把这段代码放在ly文件里的谱子之前,适合用来声明Music Function等命令):
LPH:
pipa =
#(define-music-function (parser location text) (markup?)
#{
-\markup {
\override #'(font-name . "Pipa font")
#text
}
#})
:LPH
使用时只需要在简谱脚本中打\pipa"foo"(自动位置)、^\pipa"foo"(强制上方)或 _\pipa"foo"(强制下方)即可。按理说ly文件里应该打成_\pipa "foo"才行,但现在这样没有空格lilypond似乎也接受,没有空格也方便jianpu-ly处理。具体的技法符号请参考pipa-font的手册。
多次重复时的计数
如果某个小节有多次重复时,可以把重复计数也加上,免得记不住。只需要在每个声部的谱子开头加上这段:
LP:
\set countPercentRepeats = ##t %开启重复小节计数
\set repeatCountVisibility = #(every-nth-repeat-count-visible 1) %每1次重复标一次
:LP
结果是这样的:
注意如果有和弦的话,是不能用Repeat这一功能的。此外,自由反复(无穷反复)记号也打不出来。
自定义页脚、页码
想自定义页脚和页码,可以在生成的.ly文件中的\paper部分加上:
oddFooterMarkup = \markup {
\fill-line {
% 左侧:页码
\fromproperty #'page:page-number-string
% 中间:
"instrument, copyright & version"
% 右侧:留空
""
}
}
% 偶数页页脚设置
evenFooterMarkup = \markup {
\fill-line {
% 左侧:留空
""
% 中间:
"instrument, copyright & version"
% 右侧:页码
\fromproperty #'page:page-number-string
}
}
自定义小节号显示
lilypond中定义了丰富的排版控制功能,比如可以控制小节号每3小节显示一次,且每行开头显示小节号。在简谱文件中,谱面开头前加上:
LP:
% 行首 (#t)、行中 (#t)、行尾 (#f) 的可见性
% #all-visible 等同于 #(#t #t #t)
\override BarNumber.break-visibility = #all-visible
% \override BarNumber.break-visibility = #(#t #t #f) %行首与行中可见
\set Score.barNumberVisibility = #(every-nth-bar-number-visible 2)
:LP
如果想要在每4小节的第1小节显示:
Score.barNumberVisibility = #(modulo-bar-number-visible 4 1)
每4小节的第1,4小节显示需要用逻辑运算和lambda函数:
LP:
\set Score.barNumberVisibility =
#(lambda (n ctx)
(let ((m (modulo n 4)))
(or (= m 1) (= m 0)))) % m=1 是第1小节,m=0 是第4小节
:LP
简线混排
可以用lipyond自带的工具把musicxml转成.ly文件。比如运行:& "D:\Program Files\lilypond-2.24.4\bin\python.exe" "D:\Program Files\lilypond-2.24.4\bin\musicxml2ly.py" --npb --npm --npl --nsd --nd .\foo.musicxml (& 是 PowerShell 调用带路径的可执行文件的操作符,其他终端不用打&)
之后在jianpu-ly生成的.ly文件里新建一个谱表,把生成的.ly文件中对应的谱子部分粘到jianpu-ly生成的.ly文件里,编译即可。这个技巧可以用来校对谱子。
合奏谱的考量
在打合奏谱时,需要特别考虑几点。
一是长时间休止后的进板问题。不能全指望指挥给提示,需要在长时间停顿后的最后几小节标上其他乐器的名字或旋律(旋律用小一号字体并放在括号里)。如果恰逢翻页,需要把停顿的小节拆成两部分,把进板提示写到下一面上。
二是谱子比较长的时候如何处理翻页问题。如果全部单面打印,不装订/不放到谱夹里,只需要标明页码,尽量在空小节处分页,让乐手自己决定在谱架上放哪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强大的排版功能,分页、断行、小节重复等操作相当方便,官方的英文文档相当全面。升降号、音符分组等会自动处理,打谱时只要把每个音的音高和时值打对即可。连音线的添加习惯和番茄不同,是把从第二个音开始的音括住。加括号、调字号、小节高亮等复杂功能不是实现不了就是容易引起排版错乱,需要同时知道jianpu-ly和lilypond的语法逻辑才知道怎么改。
每一部分的分谱就像音轨的一轨一样,这使得拆分、合并、简线混排相当容易,也无须处理换行问题。但是目前简谱不能打临时多声部,如果通过和弦功能实现还是有不少问题。
弱起小节的问题前文已经说过。
本地编译上手比番茄稍复杂,而且处理报错需要一点经验。习惯后还好。jianpu-ly本身还存在一些问题和bug,可以上GitHub和作者提(https://github.com/ssb22/jianpu-ly/issues),Brown博士人很好,很快就会修。
musicxml转简谱的功能仍在开发中,目前不可用。ly可以生成midi文件,虽然有bug但至少还能一听。