最近研究LilyPond。 关于如何处理/输出/显示简谱的问题研究了网上的资料,总结出三种方式:
第一种:使用jianpu-ly.py这个Python脚本。他要求在文本文件中使用它自己的格式输入简谱,然后用此脚本处理后得到的输出保存到一个.ly文件中, 再由LilyPond处理,即可。
此处不再赘述。
工具的网址:GitHub - ssb22/jianpu-ly: Jianpu in Lilypond
别人的例子: 在GNU/Linux下使用Lilypond排版简谱 - 皮波迪先生 - 博客园 (cnblogs.com)
第二种:lilypond-Jianpu/jianpu10.ly at master · nybbs2003/lilypond-Jianpu · GitHub
提供了一个LilyPond包含文件jianpu10a.ly, 可以包含到自己ly文件中。 他提供了一种自定义类型的谱表(Staff)- JianpuStaff。 输入乐谱时按照Lilypond标准的方式输入五线谱, 使用它提供的JianpuStaff 生成简谱, 下面是它提供的例子:
\version "2.18.2"
\language "english"
global = {
\key f\major
\time 4/4
}
\include "jianpu10a.ly"
notes = {
\grace d'8 c'1 f'2( g') g'2~g'2~g'2. r4 bf'1~bf'2 c''2 |\break
d'8~d'8 e'8.~e'16 \tuplet 3/2{f'8~ f'8~ f'8} \tuplet 3/2{g'16 r16 g'16} r8 r1 |\break
f'4~f'2 r4 f'2~f'4 g'4 a'4 a'4~ a'4 \tuplet 3/2{bf'8 a'8 g'8}
}
<<
\new JianpuStaff \jianpuMusic { \global \notes } % 此行生成简谱,可以看到装饰音处理的有问题
\new Staff { \global \notes } % 作为对照的五线谱
>>
第三种:
这是我在浏览Lilypond官方文档的时候无意间在其Snippets部分发现的。其中的条目-Numbers as easy note heads提供了一个简单的engraver函数配合\easyHeadsOn 命令使用。 这个\easyHeadsOn命令单独使用的时候,效果
是在符头上显示音名, 像这样:
而它提供的engraver会把音名按照首调唱名法修改为简谱音名.
像这样:
可以把它提供的engraver放入一个.ly文件,在其它文件中包含使用。
例如,创建一个ez_numbers_engraver.ly 内容是如下函数定义。
#(define Ez_numbers_engraver
(make-engraver
(acknowledgers
((note-head-interface engraver grob source-engraver)
(let* ((context (ly:translator-context engraver))
(tonic-pitch (ly:context-property context 'tonic))
(tonic-name (ly:pitch-notename tonic-pitch))
(grob-pitch
(ly:event-property (event-cause grob) 'pitch))
(grob-name (ly:pitch-notename grob-pitch))
(delta (modulo (- grob-name tonic-name) 7))
(note-names
(make-vector 7 (number->string (1+ delta)))))
(ly:grob-set-property! grob 'note-names note-names))))))
#(set-global-staff-size 26)
用法:
\version "2.24.1"
\language "italiano"
% 语言选择了italiano,则音名如下
% do re mi fa sol la si
% 升d 降b
\include "ez_numbers_engraver.ly" % 此处包含了上述文件
melody = \fixed do'{
\key fa \major
\time 2/4
\tempo 4=60
\easyHeadsOn
% 前奏
fa8. sol16 do'8 la |
sol8. la16 sol fa sol8 |
re la sol16 fa re8 |
do2~ | do |
do'8. do'16 sib8 sol |
la16( do' fa4.) |
la,4. fa8 |
re fa16( re) do4 |
fa8 fa16( sol) fa8 re |
fa( sol) do'( re'16 do') |
do'8( la4.~ | la2) |
sol8 sol16( la) sol8 mi |
re16( fa sol4.) |
do'4. sol8 |
la sol fa4 |
}
\score {
\melody
\midi {}
\layout {
\context {
\Voice
\consists \Ez_numbers_engraver
}
}
}
效果: