「スラーの調整(その2)」で、制御点に対する相対値指定ができるようにした。しかし、このままだと、途中で段が変わった時におかしくなる。下の図の右側で、2段目のスラーの左端が歪んでいますよね。
これならデフォルトの方がいいじゃん?ということになる。だけど、例えばパート譜とスコアを作成するときなど、「途中で段が変わる場合も変わらない場合もある」というケースもありうる。もう少し頑張って、段が変わっても変わらなくても「それなりに」使える形になるようにしたい。
「大譜表をまたぐスラーの調整」で作成した Scheme コードも参考にして、下のようにコーディングした。なお、今回は 2.24 で書いているため、一部の文法が異なっている。
\version "2.24.0" \paper { indent = 0 line-width = 12 \cm } % Tweaking slurs shapeSlur = #(define-music-function (parser location offsets) (list?) #{ \once \override Slur.control-points = #(alter-curve offsets) \once \override Slur.after-line-breaking = #(broken-slur-tweak offsets) #}) #(define (add-offsets coords offsets) (if (null? coords) '() (cons (cons (+ (caar coords) (car offsets)) (+ (cdar coords) (cadr offsets))) (add-offsets (cdr coords) (cddr offsets))))) #(define ((alter-curve offsets) grob) (let* ((coords (ly:slur::calc-control-points grob)) (offset-first (if (number? (car offsets)) offsets (car offsets)))) (add-offsets coords offset-first))) #(define ((broken-slur-tweak offsets) grob) (let* ((orig (ly:grob-original grob)) (siblings (if (ly:grob? orig) (ly:spanner-broken-into orig) '())) (offset-first (if (number? (car offsets)) offsets (car offsets))) (neg-ofs-first (map (lambda (x) (* -1 x)) offset-first)) (offset-last (if (number? (car offsets)) offsets (cadr offsets)))) (if (and (>= (length siblings) 2) (eq? (car siblings) grob)) (let* ((cp (ly:grob-property grob 'control-points)) (ofs-left (append (take offset-last 4) '(0 0 0 0))) (cp-modified (add-offsets (add-offsets cp neg-ofs-first) ofs-left))) (ly:grob-set-property! grob 'control-points cp-modified))) (if (and (>= (length siblings) 2) (eq? (cadr siblings) grob)) (let* ((cp (ly:grob-property grob 'control-points)) (ofs-right (append '(0 0 0 0) (drop offset-last 4))) (cp-modified (add-offsets (add-offsets cp neg-ofs-first) ofs-right))) (ly:grob-set-property! grob 'control-points cp-modified))))) \new Score \with { \remove "Bar_number_engraver" } { \relative c' { \key bes \major \once \override Staff.TimeSignature.stencil = ##f \stemUp \slurUp es'4^\markup { "default" } ( as8 bes b4 e,4 | a,4 e4 b c ) | \bar "||" \break \shapeSlur #'((0 -2 0 2 0 0 0 -1) (0 0 0 0 0 2 0 3)) es'4^\markup "\\shapeSlur #'((0 -2 0 2 0 0 0 -1) (0 0 0 0 0 2 0 3))" ( as8 bes b4 e,4 | a,4 e4 b c ) | \bar "||" \break es'4^\markup \column { "default" "(with break)" } ( as8 bes b4 e,4 | \break a,4 e4 b c ) | \bar "||" \break \shapeSlur #'((0 -2 0 2 0 0 0 -1) (0 0 0 0 0 2 0 3)) es'4^\markup \column { "\\shapeSlur #'((0 -2 0 2 0 0 0 -1) (0 0 0 0 0 2 0 3))" "(with break)" } ( as8 bes b4 e,4 | \break a,4 e4 b c ) | \bar "||" \break r1 } }
段の切れ目の不自然さは解消できた。
ただ、段が変わる時と変わらない時とでスラーの形がそもそも違うので、両方のオフセットを別々に指定する機能も実装した。
(2024/11/03 作成)