LilyPond报Cannot Find Voice,编译报错且不显示歌词求助
解决LilyPond "Cannot Find Voice" 报错与歌词不显示问题
我太懂这种卡语法细节的痛苦了!折腾好几个小时找不到问题真的闹心,咱直接说核心原因和解决方案:
问题根源
你遇到的Cannot Find Voice报错+歌词不显示,本质是多声部的\符号用错了位置。LilyPond里的\是用来延续当前音乐上下文的,但如果在两个独立声部的花括号之间加\,会让程序误以为要延续前一个声部的Voice上下文——可前一个声部的花括号已经闭合,上下文早就结束了,自然找不到对应的Voice,歌词也就没地方绑定了。
错误写法示例(你的精简版大概率是这类)
\score { << { \voiceOne c'4 d'4 \addlyrics { 词1 词2 } } \ { \voiceTwo e'4 f'4 } // 这里花括号前的\就是罪魁祸首! >> }
正确解决方案
方案1:显式声明Voice上下文(最稳妥,官方推荐)
给每个声部单独声明\new Voice,把声部标记和歌词都放在对应的Voice花括号里,让LilyPond清晰识别每个声部的上下文:
\score { << \new Voice = "高声部" { \voiceOne c'4 d'4 \addlyrics { 第一句 第二句 } } \new Voice = "低声部" { \voiceTwo e'4 f'4 } >> }
方案2:紧凑写法(去掉多余的\)
如果想保持紧凑的并列花括号写法,直接去掉两个花括号之间的\即可——这也是你说“移除\就正常”的原因,因为这样LilyPond会把两个花括号识别为独立的并行声部,各自创建默认Voice上下文:
\score { << { \voiceOne c'4 d'4 \addlyrics { 词1 词2 } } { \voiceTwo e'4 f'4 } // 去掉这里的\就正常了 >> }
额外排查要点
- 确保
\voiceOne/\voiceTwo是在Voice上下文内部调用的,不能脱离Voice单独使用 - 如果歌词是单独写的,一定要用
\lyricsto "声部名称"绑定到对应Voice,比如:\new Lyrics \lyricsto "高声部" { 第一句 第二句 }
内容的提问来源于stack exchange,提问作者bgmCoder




