如何全局设置Lilypond的Articulation顺序或重定义默认顺序?
全局设置Lilypond Articulation顺序的方法
当然可以全局设置或重定义Lilypond中Articulation的默认显示顺序,核心是通过调整**script-priority**属性实现——该属性数值越大,脚本的优先级越高,会被放置在更靠近音符的位置(不会被低优先级脚本挤到外侧)。以下是两种可复用为类库的实现方式:
方法1:直接全局覆盖特定Articulation的优先级
针对\accent和\portato这类有专属Grob类型的Articulation,可以直接全局修改它们的script-priority值,无需逐个音符调整。
步骤1:创建类库文件(比如articulation-order.ly)
;; 全局调整Articulation优先级的类库 ;; 降低\accent的优先级,让它显示在外侧 \override Accent #'script-priority = #50 ;; 提高\portato的优先级,让它显示在更靠近音符的位置 \override Portato #'script-priority = #100 ;; 可扩展添加其他Articulation的调整,比如: ;; \override Staccato #'script-priority = #75
步骤2:主文件中引用类库
\include "articulation-order.ly" \relative c'' { % 无论输入顺序如何,portato都会显示在accent内侧 c4^\accent^\portato d e f g^\portato^\accent a b c }
方法2:通过Lambda函数动态设置优先级
如果需要对同一类脚本(比如所有Script类型的Articulation)按类型批量调整优先级,可以用Lambda函数判断Articulation类型,灵活分配优先级数值。
类库文件示例
;; 全局动态调整Articulation优先级的类库 default-script-priority = #0 \override Script #'script-priority = #(lambda (grob) (let ((art-type (ly:grob-property grob 'articulation-type))) (cond ((equal? art-type 'accent) #50) ((equal? art-type 'portato) #100) ((equal? art-type 'staccato) #75) (else default-script-priority))))
原理说明
Lilypond中每个Articulation都有对应的articulation-type属性(比如\accent对应'accent,\portato对应'portato),Lambda函数会根据这个属性为不同Articulation分配自定义优先级,未匹配的则使用默认值。
注意事项
script-priority的数值没有固定范围,只需保证目标Articulation的数值高于需要排在外侧的Articulation即可;- 如果需要针对上下方向分别设置优先级,可以在Lambda函数中额外判断
direction属性(比如(ly:grob-property grob 'direction)),再分配不同数值。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

