lilypond-user
[Top][All Lists]
Advanced

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

Re: Shift vertically a text centered on a hairpin


From: Jean Abou Samra
Subject: Re: Shift vertically a text centered on a hairpin
Date: Sun, 12 Dec 2021 15:52:01 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.3.1



Le 12/12/2021 à 15:05, Paolo Prete a écrit :


On Sun, Dec 12, 2021 at 2:56 PM Jean Abou Samra <jean@abou-samra.fr> wrote:



    Le 12/12/2021 à 14:28, Paolo Prete a écrit :
    > Hello,
    >
    > it would be good to have more control on the text centered on a
    hairpin.
    >
    > For example: I can't shift the text vertically, and I think this is
    > useful because sometime the text is too near the hairpin.
    >
    > I tried \lower #offset inside the markup but it doesn't work,
    how can
    > I fix this?
    >
    > Thank you very much!
    >
    > %%%%%
    > hairpinWithCenteredText =
    > #(define-music-function (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))
    >                (new-stencil (ly:stencil-aligned-to
    >                  (ly:stencil-combine-at-edge


    Try replacing this one with ly:stencil-stack.


Do you mean ly:stencil-combine-at-edge replaced with ly:stencil-stack ? I tried it, but the result is the same (with \lower #offset inside the markup)

thanks,

Paolo



What version do you have? This works over here;

\version "2.22.1"

%%%%%
hairpinWithCenteredText =
#(define-music-function (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))
               (new-stencil (ly:stencil-aligned-to
                 (ly:stencil-stack
                   (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))))
  #})

hairpinMolto =
\hairpinWithCenteredText \markup { \italic molto }

hairpinMore =
\hairpinWithCenteredText \markup { \larger \lower #10 moltissimo }

\layout { ragged-right = ##f }

\relative c' {
  \hairpinMolto
  c2\< c\f
  \hairpinMore
  c2\ppppp\< c\f
  \break
  \hairpinMolto
  c2^\< c\f
  \hairpinMore
  c2\ppppp\< c\f
}
%%%%%


Note that ly:stencil-stack will still prevent the stencils
from getting too close, while allowing them to get farther
from each other. I inferred this was not an issue from
you problem statement that "sometimes the text is too
near to the hairpin". If it is, you can use ly:stencil-add,
removing the line with "Y dir", and put \lower in each markup
as appropriate. You can also keep the original code and use
\with-dimensions, or \with-dimension from
https://lists.gnu.org/archive/html/lilypond-user/2020-12/msg00196.html,
to give the "moltissimo" text a different extent
altogether.

\version "2.22.1"

#(define-markup-command
  (with-dimension layout props axis interval markup)
  (number? number-pair? markup?)
  (let* ((sten (interpret-markup layout props markup))
         (xex (ly:stencil-extent sten X))
         (yex (ly:stencil-extent sten Y)))
   (ly:make-stencil
    (ly:stencil-expr sten)
    (if (eq? X axis) interval xex)
    (if (eq? Y axis) interval yex))))

hairpinWithCenteredText =
#(define-music-function (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))
               (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))))
  #})

hairpinMolto =
\hairpinWithCenteredText \markup { \italic molto }

hairpinMore =
\hairpinWithCenteredText \markup { \larger \with-dimension #Y #'(0 . 4) moltissimo }

\layout { ragged-right = ##f }

\relative c' {
  \hairpinMolto
  c2\< c\f
  \hairpinMore
  c2\ppppp\< c\f
  \break
  \hairpinMolto
  c2^\< c\f
  \hairpinMore
  c2\ppppp\< c\f
}
%%%%%

Best,
Jean



reply via email to

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