Lilypond 对简单的缩写有什么语言机制,以避免代码重复



在百合池中,我经常发现自己写这样的东西

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 #}) ,其中必须更改functionnametext,但其余部分应保持不变。应用,它看起来像这样:

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
}

现在,如果您想做更复杂的事情,那么您需要真正研究有关音乐功能的文档并自己尝试很多。你也可以看看这个和这个链接。

相关内容

  • 没有找到相关文章

最新更新