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: Thomas Morley
Subject: Re: Scheme: help with "Center text below hairpin dynamics"
Date: Wed, 27 Jan 2021 22:59:27 +0100

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



reply via email to

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