Проблема
Я использую 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 поддерживает встроенную схему, я бы предпочел не использовать макрос, предварительно обработанный на нем. Кто-нибудь еще придумал решение этой же проблемы?