Autor Thema: hairpinWithCenteredText  (Gelesen 2489 mal)

LaLuneNoir

  • Member
hairpinWithCenteredText
« am: Dienstag, 11. September 2012, 17:46 »
Hallo,

lang, lang ist's her, dass ich mal hier war. Kann mittlerweile die meisten Probleme selbst lösen, aber jetzt brauche ich eure Hilfe:

Ich habe folgendes Problem. Hier:
http://lilypond.org/doc/v2.16/Documentation/snippets/text
findet sich der praktische Code zum hinzufügen von Text zu einem Hairpin. Der Code funktioniert aber nur, wenn man links kein Dynamikzeichen hat. Denn sobald links etwas steht, werden linker Rand vom Dynamikzeichen und das Hairpin zusammen linksbündig gesetzt, will sagen übereinander. Hier kurz zur Demonstration:

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))
#})

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

\layout { ragged-right = ##f }

\relative c' {
  \hairpinMolto
  c2\< c\f
  \hairpinMore
  c2\f\< c
}

Alles was ich gemacht habe, ist bei dem zweiten Hairpin (More) das \f von der zweiten auf die erste Note gesetzt zu haben. Das Ergebnis ist leider völlig unbrauchbar. Was muss ich tun???

Vielen Dank für eure Hilfe,

Jonas

ding-dong

  • Member
Re: hairpinWithCenteredText
« Antwort #1 am: Dienstag, 11. September 2012, 22:45 »
hallo

da gibts - in den snippets - noch http://lsr.dsi.unimi.it/LSR/Item?id=771 worin man nicht nur klammern sondern irgendwelchen text links und rechts des hairpin setzen kann!

daraus ergibt sich:
parenthesizedHairpin = \hairpinBetweenText \markup  { \concat {\teeny \dynamic "f" \hspace #1  }} \markup \teeny "………!"
hairpinMolto = \hairpinWithCenteredText \markup { \italic molto }
hairpinMore = \hairpinWithCenteredText \markup { \larger moltissimo }

\relative c' {
  \hairpinMolto
  \parenthesizedHairpin
  c2 \< d
  \hairpinMore
  \parenthesizedHairpin
  e2  \< f \!
}

die reihenfolge  \hairpinMolto   \parenthesizedHairpin scheint dabei noch wichtig

ding-dong

harm6

  • Member
Re: hairpinWithCenteredText
« Antwort #2 am: Mittwoch, 12. September 2012, 01:54 »
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

LaLuneNoir

  • Member
Re: hairpinWithCenteredText
« Antwort #3 am: Mittwoch, 12. September 2012, 12:19 »
Na vielen Dank ihr zwei!!! Genau das habe ich gebraucht! Aber Scheme ist immer noch eine Fremdsprach für mich… irgendwann muss ich mich damit mal beschäftigen. Aber sollte man das, was du, harm6, da gebastelt hast, nicht mal im Handbuch hochladen, statt dem, was es bisher gibt?

Vielen Dank auf jeden Fall

Jonas

harm6

  • Member
Re: hairpinWithCenteredText
« Antwort #4 am: Mittwoch, 12. September 2012, 13:06 »
Hallo Jonas,

Zitat
Aber sollte man das, was du, harm6, da gebastelt hast, nicht mal im Handbuch hochladen, statt dem, was es bisher gibt?

Es gibt hier für mich eine Unklarheit im Verfahren, wie ein fix wie der obige implementiert werden sollte.
Denn das file aus /Documentation/snippets ist eigentlich aus dem LSR und wird einfach übernommen.

Die Frage ist für mich, ob ich das LSR ändern oder einen patch für /Documentation/snippets kreieren soll.

Ich hab' mal auf -devel nachgefragt:
http://lists.gnu.org/archive/html/lilypond-devel/2012-09/msg00526.html

Je nach Antwort werde ich dann vorgehen.


Gruß,
  Harm