You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lilypond中给同一音符添加上下两个分析括号?

在LilyPond里实现同一起点的上下分析括号

你想要实现的效果是:给乐谱加两个水平分析括号,从同一个音符开始,一个摆在谱表上方,一个在下方。你试了两种方案都有问题,下面给你说正规的解决办法。

你试过的两种方案及问题

方案一:分开写\startGroup

\version "2.24.3"

\layout {
 \context {
  \Voice
  \consists Horizontal_bracket_engraver
  \override HorizontalBracket.direction = #UP
 }
}

\relative c' {
 c\startGroup
 \once \override HorizontalBracket.direction = #DOWN \startGroup
 d e f\stopGroup | g a b c\stopGroup
}
  • 问题:编译时LilyPond报错说第二个括号没附着到音符,而且第二个\startGroup被错放到了下一个d音上。

方案二:同一个音符叠加\startGroup

\version "2.24.3"

\layout {
 \context {
  \Voice
  \consists Horizontal_bracket_engraver
  \override HorizontalBracket.direction = #UP
 }
}

\relative c' {
 \once \override HorizontalBracket.direction = #DOWN
 c\startGroup\startGroup
 d e f\stopGroup | g a b c\stopGroup
}
  • 问题:编译没报错,但两个括号都跑到谱表下方了。原因是\once只对紧接着的第一个\startGroup生效,第二个\startGroup跟着用了这个临时的向下设置。

正规解决办法

核心思路就是给上下两个括号各弄一个独立的Voice上下文,这样能分别控制每个括号的方向,还能保证从同一个音符开始,而且不会因为页面布局变了就错位。

完整代码示例

\version "2.24.3"

\layout {
  % 给上方括号做专用的Voice上下文
  \context {
    \name UpperBracketVoice
    \type Engraver_group
    \consists Voice_engraver
    \consists Horizontal_bracket_engraver
    \override HorizontalBracket.direction = #UP
    % 把这个上下文里的音符元素都藏起来,只留括号
    \override NoteHead.transparent = ##t
    \override Stem.transparent = ##t
    \override Flag.transparent = ##t
  }
  % 给下方括号做专用的Voice上下文
  \context {
    \name LowerBracketVoice
    \type Engraver_group
    \consists Voice_engraver
    \consists Horizontal_bracket_engraver
    \override HorizontalBracket.direction = #DOWN
    % 同样隐藏音符元素
    \override NoteHead.transparent = ##t
    \override Stem.transparent = ##t
    \override Flag.transparent = ##t
  }
  % 把这两个上下文绑定到Staff上,保证和主声部音符对齐
  \context {
    \Staff
    \accepts UpperBracketVoice
    \accepts LowerBracketVoice
  }
}

\relative c' {
  % 主声部的音符
  c4 d e f | g a b c
  % 上方括号的声部
  \context UpperBracketVoice = "upper-brackets" {
    c\startGroup d e f\stopGroup | s1
  }
  % 下方括号的声部
  \context LowerBracketVoice = "lower-brackets" {
    c\startGroup s s s | g\startGroup a b c\stopGroup
  }
}

代码说明

  1. 独立上下文:做两个专用的上下文UpperBracketVoice和LowerBracketVoice,各自带Horizontal_bracket_engraver,分别设置方向为上和下。
  2. 隐藏多余元素:把这两个上下文里的符头、符干、符尾都设为透明,避免和主声部的音符叠在一起。
  3. 对齐同步:把这两个上下文关联到Staff,这样括号的位置会和主声部的音符严格对齐,页面布局变了也不用手动调整。
  4. 独立控制范围:在各自的上下文里用\startGroup和\stopGroup定义括号的起止,完全互不干扰。

更简洁的写法

如果觉得上面的代码有点啰嗦,可以用\parallelMusic来简化多声部的书写:

\version "2.24.3"

\layout {
  \context {
    \name BracketVoice
    \type Engraver_group
    \consists Voice_engraver
    \consists Horizontal_bracket_engraver
    \override NoteHead.transparent = ##t
    \override Stem.transparent = ##t
    \override Flag.transparent = ##t
  }
  \context {
    \Staff
    \accepts BracketVoice
  }
}

\relative c' {
  \parallelMusic #'(main upper lower) {
    % 主声部
    c4 d e f | g a b c
    % 上方括号声部
    \context BracketVoice = "upper" {
      \override HorizontalBracket.direction = #UP
      c\startGroup d e f\stopGroup | s1
    }
    % 下方括号声部
    \context BracketVoice = "lower" {
      \override HorizontalBracket.direction = #DOWN
      c\startGroup s s s | g\startGroup a b c\stopGroup
    }
  }
}

这个写法共享了一个BracketVoice模板,分别设置方向,代码更紧凑,效果是一样的。

内容的提问来源于stack exchange,提问作者Captain Banaynays

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:40:57