【发布时间】: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 { } }
显然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) 它不会产生任何输出。如果我尝试在(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