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