在百合池中,我经常发现自己写这样的东西
version "2.14.2"
{
r2 c2 | gis'8 gis gis gis gis gis gis gis |
}
或者这个
version "2.14.2"
{
time 3/4 clef bass relative es,
{
<es parenthesize es'>8staccato g bes
<es, parenthesize es'>8staccato g c
}
}
我反复将一些音符加倍,高出一个八度,括号。
我已经搜索了Lilypond文档,但没有找到避免这种重复的简单机制。 更复杂的方法显然是编写音乐函数,但这似乎需要进入 Scheme。
到目前为止,我发现的唯一机制是我不了解该机制的机制:
version "2.14.2"
S = #staccato
P = #parenthesize
{
time 3/4 clef bass relative es,
{
<es P es'>8S g bes <es, P es'>8S g c
}
}
那么:我怎样才能在Lilypond中编写自己稍微复杂的缩写,而不会逃脱到Scheme?
更新。我编辑了我问题的一部分,以表明 (1) 我目前正在使用 2.14.2,这是 Ubuntu 12.04 LTS 上的最新版本;(2)在我的第二个例子中,在bes
之后,我想回到上一个es
,而不是高一个八度:而且由于我总是以relative
模式工作,所以我故意写es,
;(3)我正在寻找一种方法来缩写诸如"此音符与相同的音符高出八度,括号"之类的内容。
所以你在这里似乎有两个问题。对于第一个,只需使用命令 repeat unfold N { ...music... }
,此链接的文档中对此进行了描述。所以你上面的代码会变成这样:
version "2.17.28"
{
c2 repeat unfold 8 {gis'8} r2
es1 | repeat unfold 2{<es parenthesize es'>8staccato g bes4}
}
在和弦的情况下,有特殊的命令q
重复最后一个和弦(它只重复音高,不携带有关持续时间、发音、动态等的信息):
version "2.17.28"
{
<a' c'' e''>4p-> q q q |
q-> qff qp->< q! |
d'8 e' q q q2
}
您还可以定义代码的较短部分并在主代码中使用它们,例如:
version "2.17.28"
A = {gis'8}
B = {<es parenthesize es'>8staccato g bes4}
{
c2 repeat unfold 8 {A} r2 |
es1 | repeat unfold 2 {B} |
repeat unfold 16 {A} |
repeat unfold 4 {B}
}
至于你的第二个问题,我也开始学习在LilyPond上使用功能。但是,看起来你的代码等同于这里的代码,这是LilyPond中最基本的功能(据我所知):
version "2.17.28"
S = #(define-event-function (parser location) ()
#{ staccato #}
)
P = #(define-event-function (parser location) ()
#{ parenthesize #}
)
{
es1 | <es P es'>8S g bes <es, P es'>S g bes
}
因此,如果您只想在代码中替换一些长文本,则可以使用此模板:functionname = #(define-event-function (parser location) () #{ text #})
,其中必须更改functionname
和text
,但其余部分应保持不变。应用,它看起来像这样:
version "2.17.28"
test = #(define-event-function (parser location) ()
#{ ^"test"fermatatrill->pp #}
)
{c''1test | d'' }
对于更复杂的东西,请查看此示例,这是一个使用 notes
作为参数的music-function
。请注意如何操作参数在最终输出中的位置:
version "2.17.28"
func =
#(define-music-function
(parser location notes)
(ly:music?)
#{
% generates 2 low pitches with cross notehead
override Staff.NoteHead.style = #'cross
g,8 a,
% reverts back to the normal noteheads and uses the notes in the argument of the function
revert Staff.NoteHead.style
$notes % these will be substituted by the arguments when you call this function on your main code
% generates 4 low pitches with cross notehead
override Staff.NoteHead.style = #'cross
g,8 a, b, c
% reverts back to the normal noteheads for the rest of the code
revert Staff.NoteHead.style
#}
)
{
func { c''4 } | d''1
}
现在,如果您想做更复杂的事情,那么您需要真正研究有关音乐功能的文档并自己尝试很多。你也可以看看这个和这个链接。