Hallo Jonas,
ich denke, der Grund für den unbrauchbaren Output liegt darin, daß der 'stencil-override zu früh im Verarbeitungsprozeß erfolgt. Insoweit wird der original-stencil zu Grunde gelegt. Aber durch den vor die Hairpin gestellten 'DynamicText erkennt LilyPond erst später, daß die Ausdehnung der Hairpin verändert werden muß.
Zur Illustration: Im folgenden Beispiel hat die Hairpin der zweiten Zeile einen veränderten Ausgangspunkt.
\paper {
indent = 0
}
\relative c' {
\override Score.TimeSignature #'stencil = ##f
c2\< d\! \break
c\fffff\< d\!
}
-> Anhang hairpin-start.png
Wenn man aber statt des 'stencil-property das 'after-line-breaking-property benutzt scheint es zu funktionieren.
Allerdings mußte ich noch eine Verschiebung in X-Achse programmieren um die Ausdehnung des 'DynamicText auszugleichen.
Darüber hinaus habe ich noch zwei (hoffentlich) nützliche features eingebaut:
Die eigentliche Hairpin ist mit den anderen dynamischen Zeichen wieder vertikal synchronisiert.
Der Zusatztext wird je nach dem ob die Hairpin über oder unter das System gesetzt wird auch über oder unter die Hairpin angefügt.
Der line-break inmitten der Hairpin liefert allerdings nach wie vor ein schlechtes Egebnis.
\version "2.16.0"
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))
(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:staff-symbol-staff-space grob))
(staff-line-thickness (ly:staff-symbol-line-thickness grob))
(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 \center-column {
\italic molto,
"and I said:"
""
\translate #'(0 . 2) \scale #'(2 . 1) \fontsize #4 "\"MOLTO\""
}
hairpinMore =
\hairpinWithCenteredText \markup { \larger moltissimo }
\paper {
line-width = 120
indent = 0
}
\relative c' {
\hairpinMore
c2.\< c4\fffff
\break s1 \break
\hairpinMore
c2.^\< c4\fffff
\break s1 \break
\hairpinMolto
c2.\ppppp\< c4\!
\break s1 \break
\hairpinMolto
c2.\ppppp^\< c4\!
% bad line-break, see:
% \break s1 \break
%
% \hairpinMolto
% c,2.\< c4
%
% \break s1 \break
%
% c2. c4\!
}
-> Anhang hairpin-with-centered-text.png
Von der Verwendung von
http://lsr.dsi.unimi.it/LSR/Item?id=771 rate ich ab, zumindest in Kombination mit dem Code von
http://lilypond.org/doc/v2.16/Documentation/snippets/text, denn in beiden files wird der 'stencil überschrieben, da fürchte ich überraschende Ergebnisse.
Siehe auch die Diskussion
hier (zum LSR-snippet).
Dort gibt es auch Hinweise wie der line-break zu verbessern wäre.
HTH,
Harm