Lilypond宏输出\得分块

时间:2017-01-13 18:34:26

标签: lilypond

我有以下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)它不会产生任何输出。如果我尝试将\layout { }块放在(Choral)定义中,则lilypond会产生以下错误:error: syntax error, unexpected \layout

是否有一种简单的方法可以编写一个生成带有\score的{​​{1}}块的宏?

1 个答案:

答案 0 :(得分:0)

为什么选择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