3

我有以下 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 { } }

显然global, Soprano, Alto, Tenor,Bass定义每次都会改变,但\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)它不会产生任何输出。如果我尝试\layout { }在定义 lilypond 中放置一个块,(Choral)则会产生以下错误:error: syntax error, unexpected \layout.

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

4

1 回答 1

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"

减小输入大小的另一个选择是使用内置模板。还有一个用于 SATB 分数的内置模板

于 2017-01-14T08:26:57.760 回答