番茄简谱和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但至少还能一听。

2026-06-14 12:52:07
磨刀的時候為什麼要加點水?
“榛树”出鞘:解析俄罗斯新型高超声速导弹