lilypond-user
[Top][All Lists]
Advanced

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

Re: Scheme: help with "Center text below hairpin dynamics"


From: David Stephen Grant
Subject: Re: Scheme: help with "Center text below hairpin dynamics"
Date: Wed, 27 Jan 2021 23:20:43 +0100

Many thanks for this! For my case the hairpin-attached text will have
a different size to other text anyway, so a slight difference is
perfectly fine.

Best,
David

On Wed, 27 Jan 2021 at 22:59, Thomas Morley <thomasmorley65@gmail.com> wrote:
>
> Am Mi., 27. Jan. 2021 um 21:32 Uhr schrieb David Stephen Grant
> <david@davidgrant.no>:
> >
> > Hi all,
> >
> > For "Center text below hairpin dynamics" in the LSR
> > (http://lsr.di.unimi.it/LSR/Snippet?id=233) I'd like the text to scale
> > with the staff size for ossia staves. Does anyone have any pointers?
> >
> > hairpinWithCenteredText =
> > #(define-music-function (parser location text) (markup?)
> >   #{
> >     \once \override Voice.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))
> >                (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))
> >                (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))
> >                (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 =
> > \hairpinWithCenteredText \markup { \fontsize #-1 "poco" }
> >
> > music = {
> >   \hairpinPoco
> >   c'4 \< e' f' g' \!
> > }
> >
> > \score {
> >   <<
> >     \new Staff \with {
> >       fontSize = #-5
> >       \override StaffSymbol.staff-space = #(magstep -5)
> >     } \music
> >     \new Staff \music
> >   >>
> > }
> >
>
> Hi David,
>
> below does a fairly good job.
> Alas, it's not perfect: The added TextScript does not have exactly the
> same size as the text added text to the hairpin and I have no clue why
> not ...
>
> hairpinWithCenteredText =
> #(define-music-function (parser location text) (markup?)
>   #{
>     \once \override Voice.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))
>                (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))
>                (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
>                        (make-fontsize-markup
>                          (magnification->font-size
>                            (+ (ly:staff-symbol-staff-space grob)
>                               (/ staff-line-thickness 2)))
>                            text)) X CENTER))
>                  X LEFT))
>                (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 =
> \hairpinWithCenteredText \markup { \fontsize #-1 "poco" }
>
> music = {
>   \hairpinPoco
>   c'4 \<_"poco" e' f' g' \!
> }
>
> val = #-5
>
> \score {
>   <<
>     \new Staff \with {
>       fontSize = \val
>       \override StaffSymbol.staff-space = #(magstep val)
>     } \music
>     \new Staff \music
>   >>
> }
>
> Cheers,
>   Harm



-- 
David Stephen Grant
david@davidgrant.no
www.davidgrant.no
Phone: (+47) 918 14 276



reply via email to

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