lilypond-user
[Top][All Lists]
Advanced

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

Re: applying a tweak or callback to an \after-ed grob


From: David Kastrup
Subject: Re: applying a tweak or callback to an \after-ed grob
Date: Sat, 08 Oct 2016 20:02:03 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux)

Kieren MacMillan <address@hidden> writes:

> Hi all,
>
> I’ve been using David K’s lovely \after function (which should, IMO, be 
> polished up and rolled into the distro!) to great effect in my recent 
> engravings.
>
> However, I’m having difficulty figuring out how to apply tweaks to the grobs 
> that are \after-ed.
> For example, see the snippet included below.
>
> Any hints would be appreciated.
>
> Thanks,
> Kieren.
>
> ________________________
>
> %%%  SNIPPET BEGINS
> \version "2.19"
>
> \paper { ragged-right = ##f }
>
> hairpinWithCenteredText =
> #(define-music-function (parser location text) (markup?)
>    #{
>      \once \override Voice.Hairpin.after-line-breaking =

[...]

That's not a tweak.

_That's_ a tweak:

%%%  SNIPPET BEGINS
\version "2.19"

\paper { ragged-right = ##f }

hairpinWithCenteredText =
#(define-event-function (parser location text ev) (markup? ly:event?)
   #{
     -\tweak 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))
               (grob-name (lambda (x) (assq-ref (ly:grob-property x 'meta) 
'name)))
               (par-x (ly:grob-parent grob X))
               (dyn-text (eq? (grob-name par-x) 'DynamicText ))
               (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))
               (original (ly:grob-original grob))
               (pieces (if (ly:grob? original)
                           (ly:spanner-broken-into original)
                           '())))

          (ly:grob-set-property! grob 'Y-offset 0) ;; ensure correct alignment
          (ly:grob-set-property! grob 'stencil
            (ly:stencil-translate-axis
             (if (or (null? pieces)
                     (and (pair? pieces)
                          (eq? grob (car pieces))))
                 new-stencil
                 stencil)
             x-shift X))))
   #ev
   #})

hairpinPoco = \hairpinWithCenteredText \markup \italic poco \etc

after =
#(define-music-function (parser location t e m)
     (ly:duration? ly:music? ly:music?)
     #{
         \context Bottom <<
             #m
             { \skip $t <> -\tweak extra-spacing-width #empty-interval $e }
         >>
     #})

test = {
     g1\hairpinPoco\< g\!
     \after 2 \hairpinPoco\< g1 g\!
}

\score { \test }
%%%  SNIPPET ENDS

-- 
David Kastrup

reply via email to

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