全音符のトレモロにフェルマータをつける

 「全音符のトレモロ」の続きです。フェルマータで伸ばした音をトレモロにするとき、フェルマータは普通トレモロの真ん中に書きますよね。

 これはなかなか大変なのです。トレモロの線(連桁)をいじって、フェルマータの記号を書き加える、という方法が報告されています(https://lists.gnu.org/archive/html/lilypond-user/2018-02/msg00584.html)。「全音符のトレモロ」と合わせて、下のようなコードになりました。最初の define は、every 関数を定義するためのものです。新しめの Lilypond だと定義されているようだけど、私が使っている 2.12 では定義されていません。

#(define (every pred xs) (if (null? xs) #t (let ((val (pred (car xs)))) (if (or (not val) (null? (cdr xs))) val (every pred (cdr xs)))))) tweakWholeNoteTremoloWithFermata = #(define-music-function (parser location yoff)(pair?) #{ \once \override Beam #'gap = #1.3 \once \override Beam #'extra-offset = #(cons 0 (car $yoff)) \once \override Beam #'stencil = #(lambda (grob) (let* ((pos (ly:grob-property grob 'positions)) (left-stem (ly:spanner-bound grob LEFT)) (right-stem (ly:spanner-bound grob RIGHT)) (all-stems? (every (lambda (g) (grob::has-interface g 'stem-interface)) (list left-stem right-stem)))) (ly:grob-set-property! grob 'positions (cons (car pos) (+ (cdr pos) (cdr $yoff)))) (let ((sys (ly:grob-system grob)) (beam-stil (ly:beam::print grob))) (if all-stems? (ly:stencil-combine-at-edge beam-stil Y UP (ly:stencil-translate-axis (ly:stencil-aligned-to (grob-interpret-markup grob (markup #:musicglyph "scripts.ufermata")) X CENTER) (/ (- (ly:grob-relative-coordinate right-stem sys X) (ly:grob-relative-coordinate left-stem sys X)) 2) X) 0.5) beam-stil)))) #})

 下のように使います。

\relative c'' { \tweakWholeNoteTremoloWithFermata #'(6 . -2) \repeat tremolo 8 { c16 c, } }

 なお、全音符でないトレモロでも、オフセットを両方ゼロにすれば流用できます。

\relative c'' { \tweakWholeNoteTremoloWithFermata #'(0 . 0) \repeat tremolo 8 { c32 c, } }

(2022/08/08 作成)