输出 \score 块的 Lilypond 宏

Posted

技术标签:

【中文标题】输出 \\score 块的 Lilypond 宏【英文标题】:Lilypond macro that outputs a \score block输出 \score 块的 Lilypond 宏 【发布时间】: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   

显然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) 它不会产生任何输出。如果我尝试在(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)。 【参考方案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"

另一个减小输入大小的方法是使用内置模板。还有一个built-in template for SATB scores。

【讨论】:

Pure Scheme(我刚刚发布了一个解决方案)既干净又快速(可能很明显,具体取决于文件系统)。

以上是关于输出 \score 块的 Lilypond 宏的主要内容,如果未能解决你的问题,请参考以下文章

如何将 midi 导出集成到现有的 lilypond 分数中

射击猎人输出宏问题

用PHP,if语句做一个代码:成绩>=90的时候输出优秀,成绩>=80的时候输出良好,<60输出不及格,求助!

2022-11-23: 分数排名。输出结果和表的sql如下。请写出输出结果的sql语句? +-------+------+ | score | rank | +-------+------+ | 4.

写出PHP代码,判断成绩,变量$score,用if判断,分数小于60则输出不及格,大于60

Python构建lassocv模型并输出Rad-score公式