如何在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 } }
代码说明
- 独立上下文:做两个专用的上下文
UpperBracketVoice和LowerBracketVoice,各自带Horizontal_bracket_engraver,分别设置方向为上和下。 - 隐藏多余元素:把这两个上下文里的符头、符干、符尾都设为透明,避免和主声部的音符叠在一起。
- 对齐同步:把这两个上下文关联到Staff,这样括号的位置会和主声部的音符严格对齐,页面布局变了也不用手动调整。
- 独立控制范围:在各自的上下文里用
\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
相关产品推荐
相关产品推荐

