]> git.donarmstrong.com Git - lilypond.git/blobdiff - Documentation/snippets/center-text-below-hairpin-dynamics.ly
Imported Upstream version 2.18.0
[lilypond.git] / Documentation / snippets / center-text-below-hairpin-dynamics.ly
index 4f2eb369260787696decd0d6ee9f53c3e4c1ea79..67e197227006f1dd368930a9ea1b8545ab881f3c 100644 (file)
@@ -4,7 +4,7 @@
 %% and then run scripts/auxiliar/makelsr.py
 %%
 %% This file is in the public domain.
-\version "2.16.0"
+\version "2.17.6"
 
 \header {
   lsrtags = "expressive-marks, really-cool, scheme-language, text"
@@ -12,6 +12,9 @@
   texidoc = "
 This example provides a function to typeset a hairpin (de)crescendo
 with some additional text below it, such as @qq{molto} or @qq{poco}.
+The added text will change the direction according to the direction of
+the hairpin. The Hairpin is aligned to DynamicText.
+
 The example also illustrates how to modify the way an object is
 normally printed, using some Scheme code.
 
@@ -19,21 +22,49 @@ normally printed, using some Scheme code.
   doctitle = "Center text below hairpin dynamics"
 } % begin verbatim
 
-
 hairpinWithCenteredText =
 #(define-music-function (parser location text) (markup?)
 #{
-  \override Voice.Hairpin #'stencil = #(lambda (grob)
-    (ly:stencil-aligned-to
-     (ly:stencil-combine-at-edge
-      (ly:stencil-aligned-to (ly:hairpin::print grob) X CENTER)
-      Y DOWN
-      (ly:stencil-aligned-to (grob-interpret-markup grob text) X CENTER))
-     X LEFT))
+  \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))
+             (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)))
+
+      (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 }
+hairpinMolto =
+\hairpinWithCenteredText \markup { \italic molto }
+
+hairpinMore =
+\hairpinWithCenteredText \markup { \larger moltissimo }
 
 \layout { ragged-right = ##f }
 
@@ -41,5 +72,10 @@ hairpinMore = \hairpinWithCenteredText \markup { \larger moltissimo }
   \hairpinMolto
   c2\< c\f
   \hairpinMore
-  c2\< c\f
+  c2\ppppp\< c\f
+  \break
+  \hairpinMolto
+  c2^\< c\f
+  \hairpinMore
+  c2\ppppp\< c\f
 }