将LilyPond源文件自动转换为多个键的最佳方法是什么?

Mic*_*ele 15 scheme typesetting m4 lilypond music-notation

问题

我正在使用LilyPond为教堂合唱团排版乐谱.根据任何给定周的人数,歌曲将以各种键播放.我们有一位出色的钢琴演奏家可以演奏我们扔在她身上的任何东西,吉他手通常会以交替的和弦方式画笔,但我希望通过在我们想要的任何键上提供精美排版的乐谱来让事情变得更轻松.

所以说我们要唱我们的ABC.首先,我将采用任何可用的源代码转换并将其输入LilyPond脚本:

melody = \relative c' {
    c c g g
    a a g2
    f f e e
    d d c2 }
Run Code Online (Sandbox Code Playgroud)

我希望能够自动转置它,所以如果我想要'G'中的整个内容我将这首歌包装在\ transpose调用中,如下所示:

melody = \transpose c g \relative c' {
    c c g g
    a a g2
    f f e e
    d d c2 }
Run Code Online (Sandbox Code Playgroud)

我真正想要的是用'g'替换某些东西并多次为旋律生成输出.简单的LilyPond变量似乎在这里不起作用,到目前为止,我在定义一个方案函数时没有成功.

我暂时使用的是获取上述文件,将其称为twinkle.ly并将其转换为名为twinkle.ly.m4的M4脚本,其内容如下所示:

melody = \transpose c _key \relative c' {
c c g g
a a g2
f f e e
d d c2 }
Run Code Online (Sandbox Code Playgroud)

然后我通过执行以下行来编译while事物:

> m4 -D _key=g twinkle.ly.m4 > twinkle_g.ly && lilypond twinkle_g.ly
Run Code Online (Sandbox Code Playgroud)

我已经写了一个Makefile来为我做这个,为我拥有的每首歌和我感兴趣的每个键定义规则.

问题 必须有更好的方法来解决这个问题.鉴于Lilypond支持嵌入式方案,我宁愿不使用预处理的宏.还有其他人想出解决同样问题的方法吗?

thS*_*oft 19

您可以参考旋律变量并将其转换为所需的键:

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

如果要将转置输出为单独的文件,请将它们嵌入\ book块.