lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Changing the size of the arpeggio's arrow


From: Paolo Prete
Subject: Changing the size of the arpeggio's arrow
Date: Wed, 22 Apr 2020 01:56:52 +0200

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
}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]