如何在LilyPond中定义无操作(noop)表达式?
如何在LilyPond中定义真正的无操作(noop)踏板快捷命令?
作为同样用LilyPond处理管风琴乐谱的用户,我太懂你这种需要灵活切换符号显示的痛点了!之前用<>空和弦确实会有副作用,因为它本质上还是一个音乐事件,会干扰后续的表情标记。下面给你两个完美解决这个问题的方法:
方法一:直接定义为空音乐表达式
LilyPond中,**空的音乐列表#()**就是真正的无操作——它不会生成任何音乐事件,也不会和其他表情标记产生冲突。你只需要把踏板快捷命令重定义成这样:
lt = #() lh = #() rt = #() rh = #()
之后再写c4\lt\staccato,\lt就完全不会生效,断奏标记会正常应用到c4上,没有任何副作用。
方法二:用开关变量实现优雅的多版本切换
如果你经常需要在“显示踏板符号”和“隐藏踏板符号”两个版本之间切换,可以用一个开关变量来统一控制,不用每次手动重定义:
% 开关:设为##t显示踏板符号,##f隐藏 enablePedalSymbols = ##t % 根据开关动态定义快捷命令 lt = #(if enablePedalSymbols (lambda () - weak direction #DOWN \rtoe) '()) lh = #(if enablePedalSymbols (lambda () \lheel) '()) rt = #(if enablePedalSymbols (lambda () \rtoe) '()) rh = #(if enablePedalSymbols (lambda () - weak direction #UP \lheel) '())
之后生成不同版本时,只需要修改enablePedalSymbols的值,再重新编译就可以了,非常适合通过\include复用乐谱内容的场景。
为什么空和弦<>不行?
<>是一个空和弦事件,虽然看起来没有音符,但它仍然会被LilyPond解析为一个独立的音乐对象。当你写c4\lt\staccato时,\staccato会被应用到这个空和弦上,而不是原来的c4,这就导致了断奏标记不生效或者显示异常的副作用——而空音乐列表#()不会生成任何对象,自然不会有这个问题。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

