用lilypond自带案例编命令:给一列音加Staccato
lilypond有一个教学,是如何设计一个命令为音符加accent的,具体可看:
Extending LilyPond: 1.3.4 Adding articulation to notes (example)
但是,这个命令只适合加单音,不适合加在一列音上,所以把它稍加改造,可以加到一串音上,这样就能节省很多打代码的时间
例子:给一列音加上断奏记号(staccato)
命令格式:\addStaccato { 音列 }
要命令生效,需要将下面命令区的内容全部复制。
先贴效果,再贴代码
效果图:
%%%%%%%%%%%%% 以下是命令区,要使用该命令请复制全部内容 %%%%%%%%%%%%%
%%%%%%%%%%%%% 基础指令区 %%%%%%
#(define (get-elements mymusic)
(ly:music-property mymusic 'elements)
)
#(define (get-sequential-music mymusic)
(ly:music-deep-copy mymusic)
)
%%%%%%%%%%%%% 根据官方文档改造得来 %%%%%%%%%%%%%%%%
addStaccatoSingle =
#(define-music-function (note-event) (ly:music?)
(set! (ly:music-property note-event 'articulations)
(cons (make-music 'ArticulationEvent
'articulation-type "staccato")
(ly:music-property note-event 'articulations)))
note-event)
%%%%%%%%%%%%% 把单音上的命令运用到音列上 %%%%%%%%%%%%
addStaccato=
#(define-music-function (mymusic) (ly:music?)
(make-sequential-music
(map addStaccatoSingle
(get-elements(ly:music-deep-copy mymusic))
)))
%%%%%%%%%%%%%% 命令区结束,复制到此为止 %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%% 下面是试验效果 %%%%%%%%%%%%%%%%%%
MyNote ={
% 这是做实验用的音符
c'4 d'
}
\markup {"这是原来的样子"}
{ \MyNote }
\markup {"这是加了命令的样子"}
{ \addStaccato \MyNote }