Hello.
The following code uses a (very, very, very helpful) function that Harm wrote some months ago.
Unfortunately, it causes a compiler's error if the size of the arrow is too big (in the following snippet the error is obtained when the size (my-scale) is >= 2).
Harm (or anyone else), please can you fix it if possible?
Many thanks,
Best,
P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.19.84"
biggerArrow =
#(define-music-function (scale)(number?)
"Returns an override for @code{Arpeggio.stencil}, with arrow-heads scaled by
@var{scale}"
#{
\override Arpeggio.stencil =
#(lambda (grob)
(let* ((arp-dir (ly:grob-property grob 'arpeggio-direction)))
;; If 'arpeggio-direction is unset use default-stencil
(if (null? arp-dir)
(ly:arpeggio::print grob)
(let* ((arrow-glyph
(format #f
"scripts.arpeggio.arrow.~a1"
(if (negative? arp-dir) "M" "")))
(font (ly:grob-default-font grob))
(arrow-head-stil (ly:font-get-glyph font arrow-glyph))
(arrow (ly:stencil-scale arrow-head-stil scale scale))
(arrow-y-ext (ly:stencil-extent arrow Y))
(arrow-x-ext (ly:stencil-extent arrow X))
(arrow-width (interval-length arrow-x-ext))
(pos (ly:grob-property grob 'positions)))
;; 'positions modified to reflect the height of the arrow-head
(ly:grob-set-property! grob 'positions
(if (positive? arp-dir)
(cons (car pos) (- (cdr pos) arrow-width))
(cons (+ (car pos) arrow-width) (cdr pos))))
;; unset 'arpeggio-direction to get the default trill-line stencil
(ly:grob-set-property! grob 'arpeggio-direction '())
(let* ((stil (ly:arpeggio::print grob))
(stil-y-ext (ly:stencil-extent stil Y))
(stil-x-ext (ly:stencil-extent stil X))
(stil-width (interval-length stil-x-ext))
;; A scaled arrow-head will be slightly off, find the value
;; to compensate for x-axis, before adding it to the
;; arpeggio-line
(scale-compensate-x (/ (- stil-width arrow-width) 2))
(new-stil
(ly:stencil-add
(ly:stencil-translate
arrow
(cons
scale-compensate-x
(if (negative? arp-dir)
;; For a down pointing arrow, it's top will be at
;; arpeggio-line-bottom, move by it's height to
;; let the arrow-basis match with the line-bottom
(- (car stil-y-ext)
(interval-length arrow-y-ext))
(cdr stil-y-ext))))
stil)))
;; We need to adjust 'X-extent to reflect the enlarged arrow,
;; in order to avoid spacing issues
(ly:grob-set-property! grob 'X-extent
(interval-widen
(ly:arpeggio::width grob)
(* scale-compensate-x -2)))
;; Do we need to resize the stencil? For now commented
;(ly:make-stencil
; (ly:stencil-expr new-stil)
; (interval-widen stil-x-ext (* scale-compensate-x -2))
; (ly:stencil-extent new-stil Y))
new-stil
)))))
#})
%% enlarged
my-scale = 1.5
{
\arpeggioArrowUp
\biggerArrow \my-scale
<c' e' g'>\arpeggio
}