Autor Thema: Hairpin minimum-length  (Gelesen 1975 mal)

ewipond

  • Member
Hairpin minimum-length
« am: Mittwoch, 14. Dezember 2011, 21:16 »
Hallo,

ich habe gerade eine Partitur mit vielen Hairpins direkt nach einer Dynamikangabe, also zum Beispiel: c4 \ppp \> und zum Teil geraten die Gabeln zu kurz, wenn die Dynamik mehrere Zeichen hat.
Die Idee war dann die Hairpins mit \override Hairpin #'minimum-length = #6 zu verlängern. Offenbar wird aber dabei die Länge der Dynamik dazugerechnet und die Funktion wirkt sich sehr unterschiedlich aus, je nach Zeichenanzahl der Dynamik.

Ist das Absicht oder ein bug?

Das Beispiel gibt eine Warnung aus, obwohl 'minimum-length auf #6 verlängert ist (Standard ist 2, glaube ich ).
\version "2.15.21"

\new Staff \relative c'{

\override Hairpin #'minimum-length = #6
c4 c c c \ffff \>     c \! c \> c\! c 
}



Beste Grüße

harm6

  • Member
Re: Hairpin minimum-length
« Antwort #1 am: Mittwoch, 14. Dezember 2011, 23:19 »
Hallo,

ich denke es handelt sich um beabsichtigtes Verhalten. Wenn die Länge des DynamicText nicht eingerechnet wäre, so wäre die Länge der Hairpin zwar konstant, aber der Abstand zwischen den Noten je nach Länge des DynamicText zu unterschiedlich. Ich vermute mal, man mußte sich zwischen dem einen oder dem anderen entscheiden. Ich persönlich kann gut damit leben.

Um in Deinem Beispiel zu einem besseren Ergebnis zu kommen, muß man dann ein wenig mehr Raum an die entsprechenden Stellen einbauen.
  • Bei aufeinander folgenden Noten, die durch einen Taktstrich getrennt sind reicht wahrscheinlich schon:
    \override Hairpin #'to-barline = ##f
    (denn der Taktstrich fordert ja etwas Platz, diesen Platz könnte man noch durch \override Staff.BarLine #'X-extent = #'(x1 . x2) erweitern)
  • Im dritten Takt habe ich dem ganzen Takt zu etwas mehr Raum verholfen.
  • Im vierten Takt nur einer Note.

\version "2.15.20"
\new Staff \relative c'{
\override Hairpin #'minimum-length = #6
\override Hairpin #'to-barline = ##f
c4 c c c \ffff \>
c \! c c c
\override Score.SpacingSpanner #'spacing-increment = #2.5
\newSpacingSection
c c\ffff \> c\! c
\revert Score.SpacingSpanner #'spacing-increment
\newSpacingSection
c c\ffff \>
\once \override Stem #'X-extent = #'(-4 . 0)
c\! c
}

HTH,
  Harm

ewipond

  • Member
Re: Hairpin minimum-length
« Antwort #2 am: Donnerstag, 15. Dezember 2011, 16:21 »
Danke für deine Antwort - das Argument mit den Notenabständen macht schon Sinn, aber wenn sich die \overrides häufen, kommt man schon mal auf die Idee eine Abkürzung zu nehmen...

Ein ähnlicher Fall sind ja die Dynamikangaben selber: bei mehr als einem Zeichen kollidieren diese am Anfang eines Taktes gerne mit dem Taktstrich (innerhalb einer Intrumentengruppe, wenn die Taktstriche durchgezogen sind).

Dehalb einmal ganz allgemein gefragt:
Würde es einen Weg geben, (im layout-block?) Bedingungen zu formulieren, nach denen dann z.B BarLine #'X-extent vergrößert wird, um keine Kollision zuzulassen?
Oder, dass der Hairpin #'minimum-extent erweitert wird, falls es eine 'zu-kurz' Warnung gibt. Also so eine Art relatives Layout.

Oder ist das paradox, weil jede Bedingung mehr Stress an anderer Stelle erzeugt?


by the way : die Funktion, die Du im Thread 'Legatobogen horizontal ausdehnen' geschrieben hast geht auch mit Hairpins - es war mir bisher nicht bekannt, wie man die Endpunkte getrennt voneinander so einfach verschieben kann. Hier die geguttenbergte Version:

Besten Dank


\version "2.15.21"

extendHairpin =
#(define-music-function (parser location x) (pair?)

#{
        \once  \override Hairpin #'stencil = #(lambda (grob)
(let* ((hairpin-stencil (ly:hairpin::print grob))
       (hairpin-ext (ly:stencil-extent hairpin-stencil X))
       (hairpin-length (interval-length hairpin-ext))
       (new-hairpin-length (+ hairpin-length (- (cdr x)(car x))))
       (scale-factor (/ new-hairpin-length hairpin-length))
       (new-hairpin-stencil (ly:stencil-scale hairpin-stencil scale-factor 1))
       (new-hairpin-ext (ly:stencil-extent new-hairpin-stencil X))
;;        (new-hairpin-length (interval-length new-hairpin-ext))
       (x-corr (- (car hairpin-ext) (car new-hairpin-ext)))
       (x-shift (car x))
       )
       
(begin
  (newline)
  (display hairpin-ext)(newline)
  (display hairpin-length)(newline)
  (display new-hairpin-ext)(newline)
  (display new-hairpin-length)
  (ly:stencil-translate-axis
     new-hairpin-stencil
     (+ x-corr x-shift)
     X)
     )
   ))
#})
\paper{indent=30\mm}
\relative c'' {
        \set Staff.instrumentName = "extendHairpin"
   % Der Anfangspunkt des Hairpins soll um 2 Staffspaces nach links,
   % der Endpunkt um 2 nach rechts verschoben werden:
   r  \extendHairpin #'(-2 . 2) f  \< f   r  f f \! r  f
}



ewipond

  • Member
Re: Hairpin minimum-length
« Antwort #3 am: Freitag, 16. Dezember 2011, 23:18 »
sorry, ich muß mich hier mal korrigieren, was Kollisionen von Dynamikzeichen mit Taktstrichen angeht:

Die haben standardmäßg keine Ausdehnung  DynamicText #'extra-spacing-width = #'(+inf.0 . -inf.0) und kollidieren deshalb. Wenn man diesen Wert auf Null setzt #'extra-spacing-width = #'(0.0 . 0.0) gibt's auch keine Kollisionen mehr.

Ich wußte das mal und hab's wieder vergessen - soviel zur persönlichen Lernkurve...

harm6

  • Member
Re: Hairpin minimum-length
« Antwort #4 am: Samstag, 17. Dezember 2011, 00:59 »
Hallo Ewald,

1. extendHairpin

Zitat
by the way : die Funktion, die Du im Thread 'Legatobogen horizontal ausdehnen' geschrieben hast geht auch mit Hairpins ...

diese Funktion wurde allerdings von Enternix geschrieben, ich hab' nur geringfügig assistiert.

Zitat
... geguttenbergte Version
lol

Wenn ich aber so über Deine extendHairpin-Funktion nachdenke, so will es mir vorkommen, als ob das skalieren eines stencil mittels ly:stencil-scale hier besonders gut funktioniert. (Natürlich kann man jeden stencil so behandeln, es wird aber nur selten zu sinnvollen Ergebnissen führen)

2. Kollision von Dynamik/Taktstrich

Zitat
sorry, ich muß mich hier mal korrigieren, was Kollisionen von Dynamikzeichen mit Taktstrichen angeht:

Die haben standardmäßg keine Ausdehnung  DynamicText #'extra-spacing-width = #'(+inf.0 . -inf.0) und kollidieren deshalb. Wenn man diesen Wert auf Null setzt #'extra-spacing-width = #'(0.0 . 0.0) gibt's auch keine Kollisionen mehr.

Um hier absolut präzise zu sei, so hat der DynamicText sehr wohl eine Ausdehnung in x-Richtung (ly:grob-extent) aber das grob-property 'extra-spacing-width ist '(+inf.0 . -inf.0).

Um das zu veranschaulichen habe ich mal ein Test-Funktion geschrieben:

\version "2.14.2"
%\version "2.15.21"

#(define (x-length-of-grob grob)
  (let* ((sys (ly:grob-system grob))
         (width (ly:grob-property grob 'extra-spacing-width))
         (extent (ly:grob-extent grob sys X))
         (grob-length (interval-length (ly:grob-extent grob sys X)))
         )
  (newline)(newline)
  (display "extra-spacing-width____________")(display width)
  (newline)
  (display "extent_________________________")(display extent)
  (newline)
  (display "grob-length____________________")(display grob-length)
  (newline)
  ))
 
\relative c' {
        \override DynamicText #'after-line-breaking = #x-length-of-grob
        c\ffff
}

Im log erscheint in diesem Fall dann:

extra-spacing-width____________(+inf.0 . -inf.0)
extent_________________________(18.1719421123399 . 23.2706759706076)
grob-length____________________5.09873385826771

Zitat
Ich wußte das mal und hab's wieder vergessen - soviel zur persönlichen Lernkurve...

Naja, wenn Du das vergessen hast, dann muß ich gestehen, daß ich mich Dir angeschlossen hatte.
Und ich hatte mir schon ein paar Gedanken gemacht, wie man das Problem angehen könnte...

Zitat
Wenn man diesen Wert auf Null setzt #'extra-spacing-width = #'(0.0 . 0.0) gibt's auch keine Kollisionen mehr.

Darf ich das dann als erledigt betrachten?

Gruß,
  Harm

ewipond

  • Member
Re: Hairpin minimum-length
« Antwort #5 am: Sonntag, 18. Dezember 2011, 02:21 »
Ja klar - die nächste Frage kommt bestiimmt!.

Aber erst mal vielen Dank für die sehr, sehr hilfreichen Antworten.

Beste Grüße
Ewald