首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lilypond对于简单缩写有什么语言机制,以避免代码重复?

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

Stack Overflow用户
提问于 2013-10-16 05:46:14
回答 1查看 356关注 0票数 2

丁香中,我经常发现自己写了这样的东西

代码语言:javascript
复制
\version "2.14.2"
{
  r2 c2 | gis'8 gis gis gis gis gis gis gis |
}

或者这个

代码语言:javascript
复制
\version "2.14.2"
{
  \time 3/4 \clef bass \relative es,
  {
    <es \parenthesize es'>8\staccato g bes
    <es, \parenthesize es'>8\staccato g c
  }
}

在这里,我反复加倍一些音符,一个八度高,圆括号。

我已经浏览了丁香文献,但没有找到简单的机制来避免这种重复。一个更复杂的方法显然是编写一个音乐功能,但这似乎需要深入到Scheme中。

到目前为止,我发现的唯一一种机制是我不理解这种机制:

代码语言:javascript
复制
\version "2.14.2"
S = #staccato
P = #parenthesize
{
  \time 3/4 \clef bass \relative es,
  {
    <es \P es'>8\S g bes <es, \P es'>8\S g c
  }
}

那么:我怎样才能在Lilypond中写出稍微复杂一些的缩略语,而不逃到Scheme呢?

Update.I编辑了我问题的一部分,以表明(1)我目前使用的是2.14.2,这是Ubuntu12.04 LTS上的当前;(2)在我的第二个示例中,在bes之后,我想回到以前的es,而不是一个八度以上:由于我总是以\relative模式工作,所以我有意地写了es,;(3)我正在寻找一种方法来缩写类似于‘这个音符用一个更高的八度括号’之类的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-16 20:14:18

看来你这里有两个问题。对于第一个命令,只需使用\repeat unfold N { ...music... }命令,该命令将在此链接的文档中描述。所以上面的代码会变成这样:

代码语言:javascript
复制
\version "2.17.28"
{
  c2 \repeat unfold 8 {gis'8} r2
  es1 | \repeat unfold 2{<es \parenthesize es'>8\staccato g bes4}
}

在和弦的情况下,有一个特殊的命令q重复最后一个和弦(它只重复音高,不包含关于持续时间、发音、动态等的信息):

代码语言:javascript
复制
\version "2.17.28"
{
  <a' c'' e''>4\p-> q q q |
  q-> q\ff q\p->\< q\! |
  d'8 e' q q q2 
}

您还可以定义代码的较短部分,并在主代码中使用它们,例如:

代码语言:javascript
复制
\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中最基本的函数(据我所知):

代码语言:javascript
复制
\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 #}),其中必须更改functionnametext,但其余的应该保持不变。应用后,如下所示:

代码语言:javascript
复制
\version "2.17.28"
test = #(define-event-function (parser location) ()
  #{ ^"test"\fermata\trill->\pp #}
)
{c''1\test | d'' }

对于更复杂的内容,请看这个示例,它是一个使用music-function作为参数的notes。请注意如何操作参数在最终输出中的位置:

代码语言:javascript
复制
\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
}

现在,如果您想要做一些更复杂的事情,那么您将需要真正地学习关于音乐功能的文档,并且自己尝试很多。您还可以检查链接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19396078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档