You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动