\version "2.13.0" halfAndHalfSlur = #(define-music-function (parser location switch-point start-dashed?) (number? boolean?) #{ % set 'layer to -2 if you're also using my \hideCurvesFrom macro: \override Slur #'layer = #-1 \override Slur #'stencil = #(lambda (grob) (let* ((grob-copy grob) (switch-point $switch-point) (this-stil (ly:slur::print grob)) (orig-stil-x-ext (ly:stencil-extent this-stil 0)) (orig-stil-y-ext (ly:stencil-extent this-stil 1)) ; kludge: extents don't completely cover the slur. (stil-x-ext (cons (- (car orig-stil-x-ext) 0.25) (+ (cdr orig-stil-x-ext) 0.25))) (stil-y-ext (cons (- (car orig-stil-y-ext) 0.25) (+ (cdr orig-stil-y-ext) 0.25))) (orig-stil-w (- (cdr orig-stil-x-ext) (car orig-stil-x-ext))) (box-x-ext (if $start-dashed? (cons (car stil-x-ext) (+ (car orig-stil-x-ext) (* orig-stil-w switch-point))) (cons (- (cdr orig-stil-x-ext) (* orig-stil-w (- 1 switch-point))) (cdr stil-x-ext))))) ;; values come from slurDashed definition in property-init.ly: (ly:grob-set-property! grob-copy 'dash-period 0.75) (ly:grob-set-property! grob-copy 'dash-fraction 0.4) (ly:stencil-add ;; first the solid slur: this-stil ;; then the white box covering part of the solid slur: (stencil-with-color (ly:round-filled-box box-x-ext stil-y-ext 0.0) white) ;; then the dashed slur: (ly:slur::print grob-copy) ))) #}) slurDashedSolid = { \halfAndHalfSlur #0.5 ##t } slurSolidDashed = { \halfAndHalfSlur #0.5 ##f } slurSolid = { % commenting this line out keeps slurs in a lower layer: \revert Slur #'layer \revert Slur #'stencil \slurSolid } slurDashed = { % commenting this line out keeps slurs in a lower layer: \revert Slur #'layer \revert Slur #'stencil \slurDashed } slurDotted = { % commenting this line out keeps slurs in a lower layer: \revert Slur #'layer \revert Slur #'stencil \slurDashed } %%%%%% EXAMPLE %%%%%% %{ \relative { \slurDashedSolid f4( d e f) \slurSolidDashed f4( d e f) \slurSolid f4( d e f) } %}