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.

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?

I think this feature is very important, because the default arrow is really
too small...

Best,
P

On Thu, Dec 5, 2019 at 9:52 PM Thomas Morley <[email protected]>
wrote:

> Am Do., 5. Dez. 2019 um 20:56 Uhr schrieb Thomas Morley
> <[email protected]>:
> >
> > Am Do., 5. Dez. 2019 um 20:46 Uhr schrieb Thomas Morley
> > <[email protected]>:
> > >
> > > Am Do., 5. Dez. 2019 um 20:01 Uhr schrieb Thomas Morley
> > > <[email protected]>:
> > > >
> > > > Am Do., 5. Dez. 2019 um 19:02 Uhr schrieb Thomas Morley
> > > > <[email protected]>:
> > > > >
> > > > > Am Do., 5. Dez. 2019 um 18:17 Uhr schrieb Thomas Morley
> > > > > <[email protected]>:
> > > > > >
> > > > > > Am Do., 5. Dez. 2019 um 17:57 Uhr schrieb Paolo Prete <
> [email protected]>:
> > > > > > >
> > > > > > >
> > > > > > > Hi Thomas.
> > > > > > > Yes, I'm interested. I could not find any snippet for that,
> nor a corresponding property for "Arpeggio" in the "Lilypond Internals
> Reference"
> > > > > > > Thanks.
> > > > > > >
> > > > > > > Il giovedì 5 dicembre 2019, 16:22:12 GMT, Thomas Morley <
> [email protected]> ha scritto:
> > > > > > >
> > > > > > >
> > > > > > > Am Do., 5. Dez. 2019 um 15:07 Uhr schrieb Paolo Pr <
> [email protected]>:
> > > > > > >
> > > > > > > >
> > > > > > > > (I re-post this because it seems that mails from Yahoo
> services, like some of my previous posts, are filtered as spam)
> > > > > > > >
> > > > > > > > Hello,
> > > > > > > >
> > > > > > > > how can I modify the size of the arrow of an
> \arpeggioArrowUp/Down object?
> > > > > > > >
> > > > > > > > Thanks
> > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > > There is no builtin method to do so.
> > > > > > > You could create your own stencil, though.
> > > > > > >
> > > > > > > Interested in learning howto?
> > > > > > >
> > > > > > >
> > > > > > > Cheers,
> > > > > > >   Harm
> > > > > > >
> > > > > > >
> > > > > >
> > > > > > Ok :)
> > > > > > So what do we want?
> > > > > > While applying \arpeggioArrowUp we want the usual arpeggio, but
> the
> > > > > > added arrow-head should be sized as we want.
> > > > > >
> > > > > > Alas, as soon as we set \arpeggioArrowUp the default is there.
> > > > > > Mmhh, what exactly does \arpeggioArrowUp?
> > > > > > Looking into property-init.ly (found by some search-functions
> of your
> > > > > > editor or some grepping):
> > > > > >
> > > > > > arpeggioArrowUp = {
> > > > > >   \revert Arpeggio.stencil
> > > > > >   \revert Arpeggio.X-extent
> > > > > >   \override Arpeggio.arpeggio-direction = #UP
> > > > > > }
> > > > > >
> > > > > > Interesting is arpeggio-direction, looks like it triggers the
> arrowed arpeggio.
> > > > > > Let's proof:
> > > > > >
> > > > > > {
> > > > > >   \arpeggioArrowUp
> > > > > >   R1
> > > > > >   \override Arpeggio.arpeggio-direction = #'()
> > > > > >   <b d' f' b'>\arpeggio
> > > > > > }
> > > > > >
> > > > > > And indeed the arrow-head is gone.
> > > > > >
> > > > > > Now we can recreate the _default_-stencil explicitely, using the
> > > > > > default-stencil, found in IR.
> > > > > > I.e. the procedure ly:arpeggio::print
> > > > > > NB, although we've set \arpeggioArrowUp
> > > > > >
> > > > > > {
> > > > > >   \arpeggioArrowUp
> > > > > >   R1
> > > > > >   \override Arpeggio.arpeggio-direction = #'()
> > > > > >   \override Arpeggio.stencil =
> > > > > >   #(lambda (grob)
> > > > > >      (ly:arpeggio::print grob))
> > > > > >   <b d' f' b'>\arpeggio
> > > > > > }
> > > > > >
> > > > > > Let us put the arpeggio-direction into the stencil-override for
> conveniance:
> > > > > >
> > > > > > {
> > > > > >   \arpeggioArrowUp
> > > > > >   R1
> > > > > >   \override Arpeggio.stencil =
> > > > > >   #(lambda (grob)
> > > > > >      (ly:grob-set-property! grob 'arpeggio-direction '())
> > > > > >      (ly:arpeggio::print grob))
> > > > > >   <b d' f' b'>\arpeggio
> > > > > > }
> > > > > >
> > > > > > Now we only need to add a suitable arrowhead to the stencil and
> are done.
> > > > > >
> > > > > >
> > > > > > So I need a little break, I'm cooking right now ;)
> > > > > >
> > > > > >
> > > > > > Cheers,
> > > > > >   Harm
> > > > >
> > > > > Now let's care about the arrow-head.
> > > > > Probably you noticed the arrow-heads in A.8 "The Emmentaler font"
> of NR:
> > > > > "scripts.arpeggio.arrow.1" and "scripts.arpeggio.arrow.M1"
> > > > >
> > > > > Likely it's best to select the arrow-head depending on the
> direction, with
> > > > >
> > > > >   (format #f
> > > > >     "scripts.arpeggio.arrow.~a1"
> > > > >     (if (negative? arp-dir)
> > > > >         "M"
> > > > >         ""))
> > > > >
> > > > > where arp-dir is the arpeggio-direction, i.e. for no we disregard
> what
> > > > > I said earlier.
> > > > >
> > > > > Now we have the glyph and we need to look it up in the font.
> > > > > Ok, so we need to get the font.
> > > > >
> > > > > Maybe you stumbled across ly:grob-default-font already, with this
> one
> > > > > we get the font.
> > > > > Now we can lookup, using ly:font-get-glyph.
> > > > >
> > > > > ly:grob-default-font and ly:font-get-glyph can be found in IR.
> > > > > To learn how to use them you will need to look throuw our
> source-code, though.
> > > > > I don't know much examples for it.
> > > > >
> > > > > Disregarding the arpeggio, only putting out the arrow-head it
> makes for:
> > > > >
> > > > >
> > > > > myArpeggio =
> > > > >   \override Arpeggio.stencil =
> > > > >   #(lambda (grob)
> > > > >     (let* ((arp-dir (ly:grob-property grob 'arpeggio-direction))
> > > > >            (arrow-glyph
> > > > >              (format #f
> > > > >                "scripts.arpeggio.arrow.~a1"
> > > > >                (if (negative? arp-dir)
> > > > >                    "M"
> > > > >                    ""))))
> > > > >
> > > > >      (ly:font-get-glyph (ly:grob-default-font grob) arrow-glyph)))
> > > > >
> > > > > {
> > > > >   \arpeggioArrowUp
> > > > >   \myArpeggio
> > > > >   <b d' f' b'>\arpeggio
> > > > >
> > > > >
> > > > >   \arpeggioArrowDown
> > > > >   \myArpeggio
> > > > >   <b d' f' b'>\arpeggio
> > > > > }
> > > > >
> > > > > Now we've created single arrow-heads depending on the direction.
> > > > >
> > > > >
> > > > > TODO:
> > > > > Adjust size of the arrow-heads
> > > > > Move them to the place where they should be
> > > > > Combine it with the usual trill-like arpeggio-line
> > > > >
> > > > >
> > > > > Laters,
> > > > >   Harm
> > > >
> > > > Next steps: move the arrow-heads correctly/combine with arpeggio-line
> > > >
> > > > For better debugging I colored the arrows red.
> > > > To move them correctly we need the y-ext of the arpeggio-stencil.
> > > > If arppeggio-direction is up we can use the cdr of the
> arpeggio-stencil.
> > > > But if arppeggio-direction is down (car stil-y-ext) is not
> sufficient,
> > > > we need to take the y-ext of the arrow into account as well.
> > > > Move is done with ly:stencil-translate-axis.
> > > > Finally simply add them with ly:stencil-add.
> > > >
> > > > myArpeggio =
> > > >   \override Arpeggio.stencil =
> > > >   #(lambda (grob)
> > > >     (let* ((arp-dir (ly:grob-property grob 'arpeggio-direction))
> > > >            (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))
> > > >            (red-arrow (stencil-with-color arrow-head-stil red))
> > > >            (red-arrow-y-ext (ly:stencil-extent red-arrow Y)))
> > > >
> > > >       (ly:grob-set-property! grob 'arpeggio-direction '())
> > > >
> > > >       (let* ((stil (ly:arpeggio::print grob))
> > > >              (stil-y-ext (ly:stencil-extent stil Y)))
> > > >
> > > >         (ly:stencil-add
> > > >           (ly:stencil-translate-axis
> > > >             red-arrow
> > > >             (if (negative? arp-dir)
> > > >                 (- (car stil-y-ext) (interval-length
> red-arrow-y-ext))
> > > >                 (cdr stil-y-ext))
> > > >             Y)
> > > >           stil))))
> > > >
> > > > {
> > > >   \arpeggioArrowUp
> > > >   \myArpeggio
> > > >   <b d' f' b'>\arpeggio
> > > >
> > > >
> > > >   \arpeggioArrowDown
> > > >   \myArpeggio
> > > >   <b d' f' b'>\arpeggio
> > > > }
> > > >
> > > > TODO Resize the arrow-head
> > > >
> > > >
> > > > Cheers,
> > > >   Harm
> > >
> > > In my last mail I actually sort of recreated the arrowed
> arpeggio-stencil.
> > > This is fine, because no we can start manipulating it.
> > > Let's try to scale up the arrows a bit, using ly:stencil-scale, see IR.
> > >
> > >
> > > myArpeggio =
> > >   \override Arpeggio.stencil =
> > >   #(lambda (grob)
> > >     (let* ((arp-dir (ly:grob-property grob 'arpeggio-direction))
> > >            (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))
> > >            (red-arrow
> > >              (ly:stencil-scale
> > >                (stencil-with-color arrow-head-stil red)
> > >                1.5 1.5))
> > >            (red-arrow-y-ext (ly:stencil-extent red-arrow Y)))
> > >
> > >       (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)))
> > >         (ly:stencil-add
> > >           (ly:stencil-translate-axis
> > >             red-arrow
> > >             (if (negative? arp-dir)
> > >                 (- (car stil-y-ext) (interval-length red-arrow-y-ext))
> > >                 (cdr stil-y-ext))
> > >             Y)
> > >           stil))))
> > >
> > > {
> > >   \arpeggioArrowUp
> > >   \myArpeggio
> > >   <b d' f' b'>\arpeggio
> > >
> > >
> > >   \arpeggioArrowDown
> > >   \myArpeggio
> > >   <b d' f' b'>\arpeggio
> > > }
> > >
> > >
> > > Though, now the arrow-head is a little off regarding x-axis.
> > >
> > > We need to compensate, best to move him back where he belongs by half
> > > the difference of arpeggio and arrow-stils widths.
> > > Thus we switch from ly:stencil-translate-axis to ly:stencil-translate
> > > expecting a pair for x/y.
> > >
> > > Makes for:
> > >
> > > myArpeggio =
> > >   \override Arpeggio.stencil =
> > >   #(lambda (grob)
> > >     (let* ((arp-dir (ly:grob-property grob 'arpeggio-direction))
> > >            (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))
> > >            (red-arrow
> > >              (ly:stencil-scale (stencil-with-color arrow-head-stil
> > > red) 1.5 1.5))
> > >            (red-arrow-y-ext (ly:stencil-extent red-arrow Y))
> > >            (red-arrow-x-ext (ly:stencil-extent red-arrow X)))
> > >
> > >       (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)))
> > >         (ly:stencil-add
> > >           (ly:stencil-translate
> > >             red-arrow
> > >             (if (negative? arp-dir)
> > >                 (cons
> > >                  (/
> > >                   (- (interval-length stil-x-ext)
> > >                      (interval-length red-arrow-x-ext)
> > >                      )
> > >                   2)
> > >                   (- (car stil-y-ext) (interval-length
> red-arrow-y-ext)))
> > >                 (cons
> > >                  (/
> > >                   (- (interval-length stil-x-ext)
> > >                      (interval-length red-arrow-x-ext)
> > >                      )
> > >                   2)
> > >                   (cdr stil-y-ext))))
> > >           stil))))
> > >
> > > {
> > >   \arpeggioArrowUp
> > >   \myArpeggio
> > >   <b d' f' b'>\arpeggio
> > >
> > >
> > >   \arpeggioArrowDown
> > >   \myArpeggio
> > >   <b d' f' b'>\arpeggio
> > > }
> > >
> > > TODO
> > > - remove the color
> > > - probably transform the override into a music-function, then the now
> hardcoded
> > >   scaling value is more conveniant settable.
> >
> > I forgot, sometimes the arpeggio is to tall now.
> > Probably add an override for 'positions or something like
> > \offset positions #'(1 . 0) Arpeggio
> > or
> > tackle 'positions directly in myArpeggio
> >
> > >
> > > Shouldn't be hard from here, please ask if something isn't clear.
> > >
> > > Ofcourse you need to test all with real world examples. Some bugs may
> > > raise their head...
> > >
> > > NB if the scaling value is too high, then the output will be always
> poor.
> > > If you really need a huge arrow-head, we would need to construct it
> > > from scratch, not looking into the font.
> > >
> > >
> > > Tutorial closed for now lol
> > >
> > > Best,
> > >   Harm
>
> Tackling the TODOs:
>
> biggerArrow =
> #(define-music-function (scale)(number?)
> #{
>   \override Arpeggio.stencil =
>   #(lambda (grob)
>     (let* ((arp-dir (ly:grob-property grob 'arpeggio-direction))
>            (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))
>            (red-arrow
>              (ly:stencil-scale arrow-head-stil scale scale))
>            (red-arrow-y-ext (ly:stencil-extent red-arrow Y))
>            (red-arrow-x-ext (ly:stencil-extent red-arrow X))
>            (pos (ly:grob-property grob 'positions)))
>
>       (ly:grob-set-property! grob 'positions
>         (if (positive? arp-dir)
>             (cons (car pos) (- (cdr pos) (interval-length
> red-arrow-x-ext)))
>             (cons (+ (car pos) (interval-length red-arrow-x-ext)) (cdr
> pos))))
>
>       (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)))
>         (ly:stencil-add
>           (ly:stencil-translate
>             red-arrow
>             (if (negative? arp-dir)
>                 (cons
>                  (/
>                   (- (interval-length stil-x-ext)
>                      (interval-length red-arrow-x-ext))
>                   2)
>                   (- (car stil-y-ext) (interval-length red-arrow-y-ext)))
>                 (cons
>                  (/
>                   (- (interval-length stil-x-ext)
>                      (interval-length red-arrow-x-ext))
>                   2)
>                   (cdr stil-y-ext))))
>           stil))))
> #})
>
> {
>   \arpeggioArrowUp
>   \biggerArrow 1.2
>   <b d' f' b'>\arpeggio
>
>   \arpeggioArrowDown
>
>   \biggerArrow 1.2
>   <b d' f' b'>\arpeggio
> }
>
> Best,
>   Harm
>

Reply via email to