如何在Coda标记嵌套于重复段时正确使用LilyPond的\repeat segno?
LilyPond 实现带反复跳转与Coda的曲式结构
问题背景
你需要实现的曲式逻辑是:
- 歌曲开头是两段带普通volta重复的乐段
- 乐段结束后进入附加部分,附加部分结尾要跳转回歌曲开头
- 第二次重复时,不再完整演奏两段乐段,而是在第一段乐段结束后直接通过Coda标记进入终曲
你尝试用嵌套\alternative块编译通过,但输出不符合预期,推测LilyPond误解了\alternative与\repeat的关联,你的尝试代码如下:
\version "2.22.0" \relative c { \autoBeamOff \clef "treble_8" \partial 4 c \repeat segno 2 { \repeat volta 2 { c c c c %<verseNotes> } \alternative { \volta 1 { \alternative { \volta 1 { g1 %<firstEndFromVoltaRepeatRepeatingVerseNotes> } \volta 2 { c1 %<secondEndFromVoltaRepeatRepeatingVerseNotes> } } c4 c c c } \volta 2 \volta #'() { \section \sectionLabel "Finale" } } c2 c \fine } }
解决方案
LilyPond目前不支持给\alternative设置锚点来指定所属的\repeat,嵌套\alternative很容易让解析逻辑混乱,建议拆分结构,用\segno+\volta标记的方式明确各段的反复逻辑,下面是修正后的代码:
\version "2.22.0" \relative c { \autoBeamOff \clef "treble_8" \partial 4 c \segno % 标记反复起始点 % 带volta的乐段 \repeat volta 2 { c c c c % <verseNotes> \alternative { \volta 1 { g1 % <firstEndFromVoltaRepeatRepeatingVerseNotes> } \volta 2 { c1 % <secondEndFromVoltaRepeatRepeatingVerseNotes> } } } % 附加部分:第一次演奏时执行 \volta 1 { c4 c c c c2 c \fine % 第一次演奏结束,跳转回segno } % 第二次重复时直接进入终曲 \volta 2 { \coda \section \sectionLabel "Finale" % 这里填入终曲的音符内容,示例用c1占位 c1 \fine } }
逻辑说明
- 用
\segno明确标记反复的起始位置,第一次演奏完附加部分后,会自动跳转回这个标记点 \volta 1块包含第一次演奏的附加部分,\volta 2块单独定义第二次重复时的终曲逻辑- 第二次触发反复时,LilyPond会直接执行
\volta 2块的内容,跳过\volta 1里的附加部分,实现第一段乐段后直接进终曲的需求
这种写法避免了嵌套\alternative的歧义,完全符合乐谱的常规标记逻辑,输出结果会和预期一致。
内容的提问来源于stack exchange,提问作者flauschi
相关产品推荐
相关产品推荐

