我有以下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 { }
块放在(Choral)
定义中,则lilypond会产生以下错误:error: syntax error, unexpected \layout
。
是否有一种简单的方法可以编写一个生成带有\score
的{{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。