Thank you, all clear!

On Sun, Dec 12, 2021 at 1:07 PM Jean Abou Samra <j...@abou-samra.fr> wrote:

> Le 12/12/2021 à 12:53, Paolo Prete a écrit :
> > Hello,
> >
> > I'm trying to set the font-name for a hairpin with centered text later
> > in the score, and not in the definition of the function.
> > However, my attempt, in the snippet below, doesn't work. How can I fix
> > this?
> >
> > Thanks,
> > P
> >
> > %%%%%
> > hairpinWithCenteredText =
> > #(define-music-function (text) (markup?)
> >   #{
> >     \once \override Score.Hairpin.after-line-breaking =
> >       #(lambda (grob)
> >         (let* ((stencil (ly:hairpin::print grob))
> >                (par-y (ly:grob-parent grob Y))
> >                (dir (ly:grob-property par-y 'direction))
> >                (new-stencil (ly:stencil-aligned-to
> >                  (ly:stencil-combine-at-edge
> >                    (ly:stencil-aligned-to stencil X CENTER)
> >                    Y dir
> >                    (ly:stencil-aligned-to
> >                      (grob-interpret-markup grob text) X CENTER))
> >                  X LEFT))
> >                (staff-space (ly:output-def-lookup
> >                  (ly:grob-layout grob) 'staff-space))
> >                (staff-line-thickness
> >                  (ly:output-def-lookup (ly:grob-layout grob)
> > 'line-thickness))
> >                (par-x (ly:grob-parent grob X))
> >                (dyn-text (grob::has-interface par-x
> > 'dynamic-text-interface))
> >                (dyn-text-stencil-x-length
> >                  (if dyn-text
> >                    (interval-length
> >                      (ly:stencil-extent (ly:grob-property par-x
> > 'stencil) X))
> >                    0))
> >                (x-shift
> >                  (if dyn-text
> >                    (-
> >                      (+ staff-space dyn-text-stencil-x-length)
> >                      (* 0.5 staff-line-thickness)) 0)))
> >
> >         (ly:grob-set-property! grob 'Y-offset 0)
> >         (ly:grob-set-property! grob 'stencil
> >            (ly:stencil-translate-axis
> >             new-stencil
> >             x-shift X))))
> >   #})
> >
> > #(define textFontName "Liberation Sans, Italic")
> >
> > hairpinPoco = {
> >   \once \override Score.DynamicLineSpanner.staff-padding = 2
> >   \hairpinWithCenteredText \markup { \override #(cons 'font-name
> > textFontName) \abs-fontsize #6 poco }
> > }
> >
> > {
> >
> > % The following command doesn't change the font name...
> > #(set! textFontName "Liberation Sans")
> > \hairpinPoco c'4\< c' c' c'\!
> >
> > }
>
>
>
> This is exactly the same as, in almost every language,
>
> a = "Liberation Sans, Italic"
> b = some_operation(a)
> a = "Liberation Sans"
>
> b is fixed at the time you define it. You're
> not using textFontName in a function, you
> just put its value in hairpinPoco. Once
> evaluated, hairpinPoco no longer depends
> on textFontName. Also, LilyPond does not
> process the score linearly in one pass. At
> the time at which the font name is retrieved,
> the music of the whole score has long been
> parsed, so it comes after your #(set! ...),
> but also after any other #(set! ...)s coming
> after the hairpin you want to customize.
> How about:
>
> \version "2.22.1"
>
> hairpinWithCenteredText =
> #(define-music-function (text) (markup?)
>    #{
>      \once \override Score.Hairpin.after-line-breaking =
>        #(lambda (grob)
>          (let* ((stencil (ly:hairpin::print grob))
>                 (par-y (ly:grob-parent grob Y))
>                 (dir (ly:grob-property par-y 'direction))
>                 (new-stencil (ly:stencil-aligned-to
>                   (ly:stencil-combine-at-edge
>                     (ly:stencil-aligned-to stencil X CENTER)
>                     Y dir
>                     (ly:stencil-aligned-to
>                       (grob-interpret-markup grob text) X CENTER))
>                   X LEFT))
>                 (staff-space (ly:output-def-lookup
>                   (ly:grob-layout grob) 'staff-space))
>                 (staff-line-thickness
>                   (ly:output-def-lookup (ly:grob-layout grob)
> 'line-thickness))
>                 (par-x (ly:grob-parent grob X))
>                 (dyn-text (grob::has-interface par-x
> 'dynamic-text-interface))
>                 (dyn-text-stencil-x-length
>                   (if dyn-text
>                     (interval-length
>                       (ly:stencil-extent (ly:grob-property par-x
> 'stencil) X))
>                     0))
>                 (x-shift
>                   (if dyn-text
>                     (-
>                       (+ staff-space dyn-text-stencil-x-length)
>                       (* 0.5 staff-line-thickness)) 0)))
>
>          (ly:grob-set-property! grob 'Y-offset 0)
>          (ly:grob-set-property! grob 'stencil
>             (ly:stencil-translate-axis
>              new-stencil
>              x-shift X))))
>    #})
>
>
> hairpinPoco = {
>    \once \override Score.DynamicLineSpanner.staff-padding = 2
>    \hairpinWithCenteredText \markup \abs-fontsize #6 poco
> }
>
> \layout {
>    \context {
>      \Score
>      \override Hairpin.font-name = "Liberation Sans, Italic"
>    }
> }
>
> {
>    \hairpinPoco c'4\< c' c' c'\!
>    \once \override Hairpin.font-name = "Liberation Sans"
>    \hairpinPoco c'4\< c' c' c'\!
> }
>
>
>
> Regards,
> Jean
>

Reply via email to