因此,您似乎有两个问题。对于第一个,只需使用命令\repeat unfold N { ...music... }
,该命令在此链接的文档中进行了描述。所以你上面的代码会变成这样:
\version "2.17.28"
{
c2 \repeat unfold 8 {gis'8} r2
es1 | \repeat unfold 2{<es \parenthesize es'>8\staccato g bes4}
}
在和弦的情况下,有q
一个重复最后一个和弦的特殊命令(它只重复音高,它不携带有关持续时间、发音、动态等的信息):
\version "2.17.28"
{
<a' c'' e''>4\p-> q q q |
q-> q\ff q\p->\< q\! |
d'8 e' q q q2
}
您还可以定义代码的较短部分并在主代码中使用它们,例如:
\version "2.17.28"
A = {gis'8}
B = {<es \parenthesize es'>8\staccato 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'>8\S g bes <es, \P es'>\S g bes
}
所以如果你只是想在你的代码中替换一些长文本,你可以使用这个模板:functionname = #(define-event-function (parser location) () #{ text #})
, wherefunctionname
和text
have to be changed,但其余的应该保持不变。应用,它看起来像这样:
\version "2.17.28"
test = #(define-event-function (parser location) ()
#{ ^"test"\fermata\trill->\pp #}
)
{c''1\test | d'' }
对于仍然有点复杂的东西,请看这个music-function
使用notes
as 参数的示例。请注意如何操作参数在最终输出中的位置:
\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
}
现在如果你想做更复杂的事情,那么你将需要真正研究有关音乐功能的文档并自己尝试很多。你也可以检查这个和这个链接。