Thank you Thomas, now all is perfect and very useful

On Fri, Dec 6, 2019 at 12:05 PM Thomas Morley <[email protected]>
wrote:

> Am Fr., 6. Dez. 2019 um 01:39 Uhr schrieb Paolo Pr <[email protected]>:
> >
> > Thomas,
> >
> > thank you for your help. Unfortunately the snippet produces two errors
> that are visible with a size bigger than 1.2.
> >
> > Have a look at:   http://lilybin.com/y1t45z/1
> >
> > 1)   A collision between the arrow and the notehead that cannot be
> removed properly by overriding  Arpeggio.padding
> > 2) A graphical mismatch between the arrow and the stem
> >
> > About 1), I can't find another property that can fix the issue.
>
> Well, this is indeed a bug. We forgot to adjust X-extent for the
> enlarged stencil.
> Fixed in the code at the bottom of this mail.
> Probably we need to adjust the stencil itself as well. Not sure,
> though. In the code it's commented.
>
> > About 2), Instead of the default symbol, I would use a simple triangle,
> so to avoid any mismatch. Which is the way to add it?
>
> So far it's more due to the changed calculation:
>
> I wrote:
>
> >>                  (/
> >>                   (- (interval-length stil-x-ext)
> >>                      (interval-length red-arrow-x-ext))
> >>                   2)
>
> The lilybin-file reads:
>
>                  (/
>                   (- (interval-length stil-x-ext)
>                      (interval-length red-arrow-x-ext))
>                   10)
>
> Which causes the problem. Go back to `2ยด and all is fine.
>
> If you want another stencil for the arrow-head then the method is
> already demonstrated.
> Get the stencil from the font (there are other arrows available) or
> construct it. Using markup would be the most simple. Add it to the
> default line. Move the arrow accordingly.
> Take care of properties positions and X-extent.
>
> Here the changed code, additionally I did some clean up, avoiding
> multiple calculations of the same things adding comments etc.
>
> 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
>                )))))
> #})
>
> %% default
> {
>   \arpeggioArrowUp
>   <b d' f' b'>4\arpeggio
>
>   \arpeggioArrowDown
>   <b d' f' b'>\arpeggio
>
>   \arpeggioNormal
>   <b d' f' b'>\arpeggio
> }
>
>
> %% enlarged
> my-scale = 2
>
> {
>   \arpeggioArrowUp
>   \biggerArrow \my-scale
>   <b d' f' b'>\arpeggio
>
>   \arpeggioArrowDown
>   \biggerArrow \my-scale
>   <b d' f' b'>\arpeggio
>
>   \arpeggioNormal
>   \biggerArrow \my-scale
>   <b d' f' b'>\arpeggio
> }
>
> Cheers,
>   Harm
>

Reply via email to