Каков наилучший способ автоматического переноса исходного файла LilyPond на несколько ключей?

Проблема

Я использую LilyPond, чтобы набирать ноты для церковного хора. В зависимости от того, кто доступен на любой неделе, песни будут воспроизводиться различными клавишами. У нас есть потрясающий пианист, который может сыграть все, что мы бросаем на нее, и гитаристы обычно карандашом играют в альтернативных аккордах, но я хочу облегчить работу, имея красивую набивку для нот в любом ключе, который мы хотим.

Итак, говорим, что мы будем петь наши ABC. Сначала я возьму все доступные транскрипты источников и введу их в LilyPond script:

melody = \relative c' {
    c c g g
    a a g2
    f f e e
    d d c2 }

Мне нужна возможность транспонировать это автоматически, поэтому, если я хочу, чтобы все это в "G", я завершаю песню в вызове \transpose следующим образом:

melody = \transpose c g \relative c' {
    c c g g
    a a g2
    f f e e
    d d c2 }

Я действительно хочу заменить что-то для "g" и генерировать вывод для мелодии несколько раз. Простые переменные LilyPond, похоже, не работают здесь, и до сих пор мне не удалось определить функцию схемы для этого.

То, к чему я сейчас обращался, это взять файл выше, назовите его twinkle.ly и превратите его в M4 script под названием twinkle.ly.m4, содержимое которого выглядит так:

melody = \transpose c _key \relative c' {
c c g g
a a g2
f f e e
d d c2 }

Затем я компилирую объект while, выполнив следующую строку:

> m4 -D _key=g twinkle.ly.m4 > twinkle_g.ly && lilypond twinkle_g.ly

Я написал Makefile, чтобы сделать это для меня, определяя правила для каждой песни, которую у меня есть, и каждый интересующий меня ключ.

Вопрос Там должен быть лучший способ обойти это. Учитывая, что Lilypond поддерживает встроенную схему, я бы предпочел не использовать макрос, предварительно обработанный на нем. Кто-нибудь еще придумал решение этой же проблемы?

Ответы

Ответ 1

Вы можете обратиться к переменной мелодии и перенести ее в нужные клавиши:

melody = \relative c' { c8 e c e g4 g }
\score {
  \transpose c d \melody
}
\score {
  \transpose c e \melody
}
% etc.

Если вы хотите вывести транспозиции в виде отдельных файлов, вставьте их в \book blocks.

Ответ 2

Если вы хотите создать две копии одного и того же фрагмента, один транспонированный и один нет, вы можете использовать \displayLilyMusic. Например,

{
  \displayLilyMusic \transpose c a, { c4 e g a bes }
}

отобразит

{ a,4 cis e fis g }

Скопируйте этот вывод и вставьте его туда, где хотите.