[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: End pedal optionally with text.
From: |
Kieren MacMillan |
Subject: |
Re: End pedal optionally with text. |
Date: |
Sat, 2 Oct 2021 13:14:31 -0400 |
Hi Andy,
> Optionally, it would be nice to follow it with something like:
> Ped. __________________/\ con ped.
Below, I’ve attached what I use.
Notes:
1. It’s pretty old code, so there’s probably a better way nowadays…
2. It could (and should) be abstracted so that the “sim” is a parameter, rather
than hard-coded.
Hope this helps!
Kieren.
________________
pedalSim =
\override Staff.PianoPedalBracket.stencil =
#(lambda (grob)
(let* (;; have we been split?
(orig (ly:grob-original grob))
;; if yes, get the split pieces (our siblings)
(siblings (if (ly:grob? orig)
(ly:spanner-broken-into orig)
'())))
;; Modify the unbroken grob-stencil or the first part of the broken
;; grob-stencil.
(if (or (null? siblings)
(and (>= (length siblings) 2)
(eq? (car siblings) grob)))
(let* (;; Get the default-stencil and its x-dimension and x-length.
(stil (ly:piano-pedal-bracket::print grob))
(stil-x-extent (ly:stencil-extent stil X))
(stil-x-length (interval-length stil-x-extent))
;; Create a stencil to be added to the default-stencil.
;; Gets its x-dimension and x-length.
(sim-stil
(grob-interpret-markup grob
(markup #:fontsize -1 #:hspace 0.75 #:raise -0.05 #:italic
"sim.")))
(sim-stil-x-extent (ly:stencil-extent sim-stil X))
(sim-stil-x-length (interval-length sim-stil-x-extent))
(thickness (max (layout-line-thickness grob) 0.1))
;; The value to shorten the default-stencil from the right side.
;; 0.8 will shorten about 80%.
;; Hard-coded, could be turned into a music-function.
(amount 0.6))
;; Print a warning if the length of the default-stencil would not
;; warrant a sufficient output.
(if (> sim-stil-x-length stil-x-length)
(ly:warning "PianoPedalBracket is too short"))
;; Shorten the default-stencil.
(ly:grob-set-property!
grob
'shorten-pair
(cons 0 (* amount stil-x-length)))
;; Calculate the final stencil.
(let* (;; Get the shortened (default-)stencil
;; and its y-dimension.
(shortened-stil (ly:piano-pedal-bracket::print grob))
(shortened-stil-y-ext (ly:stencil-extent shortened-stil Y))
;; Modify the sim-stil to gain a little gap to the left and
;; enlarge it downwards a little (otherwise the stencil-whiteout
;; will not work sufficient.
(new-sim-stil
(ly:make-stencil
(ly:stencil-expr sim-stil)
(interval-widen sim-stil-x-extent (* 2 thickness))
(cons (- (car shortened-stil-y-ext) thickness)
(cdr shortened-stil-y-ext)))))
(ly:stencil-add
shortened-stil
(ly:stencil-translate-axis
(stencil-whiteout-box new-sim-stil)
(* (- 1 amount) (- stil-x-length sim-stil-x-length))
X))))
;; TODO:
;; Is there any need to return #f explicitly?
;; Deleting it seems to make no difference.
;#f
)))