【问题标题】:Lilypond macro that outputs a \score block输出 \score 块的 Lilypond 宏
【发布时间】:2017-01-13 18:34:26
【问题描述】:

我有以下 Lilypond 源文件,其中包含以下形式的几个块:

global = \relative { ... }
Soprano = \relative { ... }
Alto = \relative { ... } % ditto Tenor, Bass

\score { \new StaffGroup <<
  \new Staff << \clef "G" \global \Soprano >>
  \new Staff << \clef "G" \global \Alto >>
  \new Staff << \clef "G_8" \global \Tenor >>
  \new Staff << \clef "F" \global \Bass >>
>> \layout { } }

显然globalSopranoAltoTenorBass 的定义每次都会改变,但\score 块保持不变。

我想在 Scheme 宏中考虑该块。但是,我尝试过的最简单的定义,

#(define (Choral) (ly:make-score #{ \new StaffGroup <<
  \new Staff << \clef "G" \global \Soprano >>
  \new Staff << \clef "G" \global \Alto >>
  \new Staff << \clef "G_8" \global \Tenor >>
  \new Staff << \clef "F" \global \Bass >>
>> #} ))

有以下不便之处:(1) 它必须由#(Choral) 调用,而不是更自然的\Choral,更糟糕的是,(2) 它不会产生任何输出。如果我尝试在(Choral) 定义中放入\layout { } 块,lilypond 会产生以下错误:error: syntax error, unexpected \layout

有没有一种简单的方法来编写一个宏来生成一个带有附加\layout\score 块?

【问题讨论】:

  • 自我回答:只需使用collect-music-for-book 函数,在scm/lily-library.scm 中定义;完整示例:Choral = #(define-music-function (parser location) () (collect-music-for-book parser #{ ... #}) #{ #})(第二个#{ #}是一个空音乐表达式,第一个包含如上的四声部SATB)。

标签: lilypond


【解决方案1】:

为什么是 Scheme 宏?您可以只使用 \include (这就像将文件的内容粘贴到您放置的行中)。所以你可能会使用相同的乐谱块文件:

% myScoreBlock.ly file
\score {
  \new StaffGroup <<
    \new Staff << \clef "G" \global \Soprano >>
    \new Staff << \clef "G" \global \Alto >>
    \new Staff << \clef "G_8" \global \Tenor >>
    \new Staff << \clef "F" \global \Bass >>
  >> \layout { }
}

包含在具有相同变量的任何其他文件中:

% example of a piece
\version "2.19.54"

global = { \time 2/4 }
Soprano = \relative { d2 }
Alto = \relative { f2 }
Tenor = \relative { e2 }
Bass = \relative { g2 }

\include "myScoreBlock.ly"

另一个减小输入大小的方法是使用内置模板。还有一个built-in template for SATB scores

【讨论】:

  • Pure Scheme(我刚刚发布了一个解决方案)既干净又快速(可能很明显,具体取决于文件系统)。
猜你喜欢
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多