Макрос Lilypond, который выводит блок \ Score

У меня есть следующий исходный файл 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 блок с прикрепленным \layout?

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"

Другой вариант уменьшения размера ввода - использование встроенных шаблонов. Также есть встроенный шаблон для оценки SATB.

Другие вопросы по тегам