Jump to content

Center text below hairpin dynamics: Difference between revisions

From LilyPond wiki
mNo edit summary
mNo edit summary
 
Line 9: Line 9:
     \once \override Voice.Hairpin.after-line-breaking =  
     \once \override Voice.Hairpin.after-line-breaking =  
       #(lambda (grob)
       #(lambda (grob)
        (let* ((stencil (ly:hairpin::print grob))
        (let* ((stencil (ly:hairpin::print grob))
              (par-y (ly:grob-parent grob Y))
                (par-y (ly:grob-parent grob Y))
              (dir (ly:grob-property par-y 'direction))
                (dir (ly:grob-property par-y 'direction))
              (staff-line-thickness
                (staff-line-thickness
                 (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness))
                 (ly:output-def-lookup (ly:grob-layout grob)
              (new-stencil (ly:stencil-aligned-to
                                      'line-thickness))
                (ly:stencil-combine-at-edge
                (new-stencil
                (ly:stencil-aligned-to
                  (ly:stencil-combine-at-edge
                   (ly:stencil-aligned-to stencil X CENTER)
                   (ly:stencil-aligned-to stencil X CENTER)
                   Y dir
                   Y dir
                   (ly:stencil-aligned-to
                   (ly:stencil-aligned-to
                    (grob-interpret-markup
                    (grob-interpret-markup
                      grob
                    grob
                      (make-fontsize-markup
                    (make-fontsize-markup
                        (magnification->font-size
                      (magnification->font-size
                          (+ (ly:staff-symbol-staff-space grob)
                      (+ (ly:staff-symbol-staff-space grob)
                              (/ staff-line-thickness 2)))
                          (/ staff-line-thickness 2)))
                          text)) X CENTER))
                      text))
                X LEFT))
                    X CENTER))
              (staff-space (ly:output-def-lookup
                  X LEFT))
                (staff-space (ly:output-def-lookup
                 (ly:grob-layout grob) 'staff-space))
                 (ly:grob-layout grob) 'staff-space))
              (par-x (ly:grob-parent grob X))
                (par-x (ly:grob-parent grob X))
              (dyn-text (grob::has-interface par-x 'dynamic-text-interface))
                (dyn-text (grob::has-interface par-x
              (dyn-text-stencil-x-length
                                              'dynamic-text-interface))
                (dyn-text-stencil-x-length
                 (if dyn-text
                 (if dyn-text
                  (interval-length  
                    (interval-length  
                    (ly:stencil-extent (ly:grob-property par-x 'stencil) X))
                      (ly:stencil-extent
                  0))
                      (ly:grob-property par-x 'stencil) X))
              (x-shift  
                    0))
                 (if dyn-text  
                (x-shift  
                  (-  
                 (if dyn-text (- (+ staff-space dyn-text-stencil-x-length)
                    (+ staff-space dyn-text-stencil-x-length)
                                (* 0.5 staff-line-thickness))
                    (* 0.5 staff-line-thickness)) 0)))
                    0)))
 
          (ly:grob-set-property! grob 'Y-offset 0)
        (ly:grob-set-property! grob 'Y-offset 0)
          (ly:grob-set-property! grob
        (ly:grob-set-property! grob 'stencil  
                                  'stencil (ly:stencil-translate-axis
          (ly:stencil-translate-axis
                                            new-stencil
            new-stencil
                                            x-shift X))))
            x-shift X))))
   #})
   #})


hairpinMolto =  
hairpinMolto = \hairpinWithCenteredText \markup { \italic molto }
\hairpinWithCenteredText \markup { \italic molto }
hairpinMore = \hairpinWithCenteredText \markup { \larger moltissimo }
 
hairpinMore =  
\hairpinWithCenteredText \markup { \larger moltissimo }


\relative c' {
\relative c' {
   \hairpinMolto
   \hairpinMolto c2\< c\f
  c2\< c\f
   \hairpinMore c2\ppppp\< c\f
   \hairpinMore
  c2\ppppp\< c\f
   \break
   \break
   \hairpinMolto
   \hairpinMolto c2^\< c\f
  c2^\< c\f
   \hairpinMore c2\ppppp\< c\f
   \hairpinMore
  c2\ppppp\< c\f
}
}
</lilypond>
</lilypond>

Latest revision as of 08:41, 28 December 2025

This example provides a function to typeset a hairpin (de)crescendo with some additional text below it, such as “molto” or “poco”. The added text will change the direction according to the direction of the hairpin. The Hairpin is aligned to a DynamicText grob.

The example also illustrates how to modify the way an object is normally printed, using some Scheme code.

\version "2.24"

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))
                (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))
                (staff-space (ly:output-def-lookup
                 (ly:grob-layout grob) 'staff-space))
                (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 moltissimo }

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