我有以下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
块保持不变。
我想在方案宏中考虑该块。然而,我尝试过的最简单的定义,
#(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 { }
块,百合池会产生以下错误:error: syntax error, unexpected layout
.
有没有一种简单的方法来编写一个宏来生成带有附加layout
的score
块?
为什么是方案宏?你可以只使用 \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 分数模板。