Balken: Neigung adjustieren? Balkenbrechung bei Zeilenumbruch [gelöst]

Begonnen von ValidUserName, Mittwoch, 28. März 2018, 23:18

« vorheriges - nächstes »

ValidUserName

Moin,

nur eine allgemeine Frage, zu der ich partout nichts passendes im Handbuch finden kann: Ist es möglich die Neigung von Notenbalken manuell anzupassen? Insbesondere: Ist es möglich Lilypond dazu zu bringen, takübergreifende Balken bei einem Zeilenumbruch so zu behandeln, als handele es sich tatsächlich um eine durchgehenden Balken, also mit gleicher Steigung und Ausrichtung innerhalb der Notenlinien an beiden Enden?

Minimalbeispiel dazu: Sagen wir, ich habe Figuren der folgenden Art:
\version "2.19.64"

\score {
  \new Staff \relative {
    \time 3/4
    \clef "bass"
      \override Beam.breakable = ##t
      \tuplet 7/6 { a,8[ c e a c] } \tuplet 7/6 2. { b[ f |
      a, d f a d] b[ e, |
      \break
      a, e' a c e] } \tuplet 7/6 { e[ a, |
      g e' f d e g, f] } |
  }
}

Nun möchte ich beipielsweise den zweiten Balken dahingehend ändern, dass dieser leicht ansteigend ist. Desweiteren soll der Balken von Takt 2 nach Takt 3 so aussehen, als wäre hier tatsächlich nur zwischen den Takten ein sauberer Trennschnitt erfolgt.

harm6

Wenn Du in die IR unter Beam nachschaust findest Du diverse einstellbare properties. Manche davon haben durchaus Einfluß auf die Neigung oder allgemeiner gesprochen die Positionierung des Beams. 'positions ist das property welches wahrscheinlich immer anwendbar und am einfachsten anzugehen ist.
Du könntest also
\override Beam.positions = #'(-2 . -3)
verwenden und das Zahlenpaar der aktuellen Situation anpassen.
Allerdings würde am Zeilenumbruch ein etwas aufwändigeres Coding nötig sein, um zwei Zahlenpaare (vor/nach dem Zeilenumbruch) zu übergeben.
Um diese Schwierigkeit zu vereinfachen hat David Nalesnik `alterBroken' entwickelt, Syntax:
\alterBroken positions #'((-4 . -3.5) (-3.5 . -2.5))  Beam
Man hat aber immer noch das Problem die Zahlenpaare von Grund auf zu erraten.
Das kann man mit `offset', ebenfalls von David Nalesnik, leichter haben. Hier wird von den default-Werten ausgegangen und die übergebenen Werte hinzuaddiert, Syntax:
\offset positions #'(0 . 1) Beam
\offset positions #'((-3 . -0.5) (0.5 . -2)) Beam
(Der zweite Wert gilt für den Beam nach dem Zeilenumbruch.

`alterBroken' und `offset' haben allerdings Einschränkungen, sie funktionieren nicht für jedes property eines jeden grobs.
Insoweit sollte man die fundamentale Syntax, d.h. \override was-auch-immer, nicht aus dem Blick verlieren und vielleicht auch mal das Coding am Zeilenumbruch nachlesen und verstehen lernen.
http://lilypond.org/doc/v2.19/Documentation/extending/difficult-tweaks
Das ist hier allerdings nicht nötig.

Aber hier Dein Beispiel mit verschiedenen Möglichkeiten:


\version "2.19.64"

\score {
  \new Staff \relative {
    \time 3/4
    \clef "bass"
      \override Beam.breakable = ##t
      \tuplet 7/6 { a,8[ c e a c] }
      \once \offset positions #'(0 . 1) Beam
      \tuplet 7/6 2. { b[ f |
      a, d f a d]
      \alterBroken positions #'((-4 . -3.5) (-3.5 . -2.5))  Beam
      %\once \offset positions #'((-3 . -0.5) (0.5 . -2)) Beam
      b[ e, |
      \break
      a, e' a c e] }
      \once \override Beam.positions = #'(-2 . -3)
      \tuplet 7/6 { e[ a, |
      g e' f d e g, f] } |
  }
}


HTH,
  Harm

ValidUserName

Wie genau sind denn die Zahlenwerte überhaupt zu lesen, also welche Maßeinheit und mit welchem Bezugspunkt?

Gäbe es auch eine flexiblere Möglichkeit für den Zeilenumbruch. In meinem  Beispiel habe ich den Umbruch der Einfachheit helber einfach erzwungen, aber im tatsächlichen Notentext könnte dieser sich in Folge von Formatierungs- und Textänderungen noch verschieben. Es wäre toll wenn es möglich wäre das Umbruchverhalten ganz allgemein so umzuschreiben, dass dabei ein sauberer Bruch rauskommt.

harm6

ZitatWie genau sind denn die Zahlenwerte überhaupt zu lesen, also welche Maßeinheit und mit welchem Bezugspunkt?

Referenzpunkt ist die 0-Linie des Notensystems, im üblichen System mit 5 Linien also die Mittellinie.
Maßeinheit ist hier staff-space.

ZitatGäbe es auch eine flexiblere Möglichkeit für den Zeilenumbruch. In meinem  Beispiel habe ich den Umbruch der Einfachheit helber einfach erzwungen, aber im tatsächlichen Notentext könnte dieser sich in Folge von Formatierungs- und Textänderungen noch verschieben. Es wäre toll wenn es möglich wäre das Umbruchverhalten ganz allgemein so umzuschreiben, dass dabei ein sauberer Bruch rauskommt.

Was als "sauber" zu bezeichnen ist, unterliegt durchaus dem Wandel der Zeit und dem persönlichen Geschmack ;)

Ich habe aber noch ein bißchen weiter geforscht.
Per default ist Beam.positions als `beam::place-broken-parts-individually' gesetzt. So auch nachzulesen in der IR.
Es gibt aber auch:
`beam::align-with-broken-parts'
`beam::slope-like-broken-parts'
Kodiert in output-lib.scm
Ein Beispiel ist leider nur in den Regression-Tests zu finden, ansonsten ist es undokumentiert :(
http://lilypond.org/doc/v2.19/input/regression/collated-files.html
Such nach `beam-broken-classic.ly'

`beam::align-with-broken-parts' könnte sein wonach Du suchst.


\version "2.19.64"

\score {
  \new Staff \relative {
    \time 3/4
    \clef "bass"
      \override Beam.positions = #beam::align-with-broken-parts
      %\override Beam.positions = #beam::slope-like-broken-parts
      \override Beam.breakable = ##t
      \tuplet 7/6 { a,8[ c e a c] } \tuplet 7/6 2. { b[ f |
      a, d f a d] b[ e, |
      \break
      a, e' a c e] } \tuplet 7/6 { e[ a, |
      g e' f d e g, f] } |
  }
}


Gruß,
  Harm

ValidUserName

\override Beam.positions = #beam::align-with-broken-parts
      %\override Beam.positions = #beam::slope-like-broken-parts

...sind schon mal sehr hilfreich, was den Zeilenumbruch angeht.
Was die slope-Anpassung angeht werde ich noch ein bischen rumbasteln. Gibt es irgendwo eine Dokumentation dazu, wie Lilypond standardmäßig die Balkenposition ermittelt?

harm6

ZitatGibt es irgendwo eine Dokumentation dazu, wie Lilypond standardmäßig die Balkenposition ermittelt?

Nicht das ich wüßte.

Mir ist allerdings auch nicht klar wo und wie LilyPonds default (bzw. die bereits erwähnten positions-procedures) nicht Deinen Wünschen entspricht.

Nichtsdestotrotz: das Thema ist sehr komplex. Du wirst den source-code lesen müssen.

Neben den bereits erwähnten scheme-Definitionen wird die Hauptarbeit in C++ gemacht:
beam.cc                     
beaming-pattern.cc
beam-collision-engraver.cc 
beam-performer.cc
beam-engraver.cc           
beam-quanting.cc

Insbesondere beam-quanting.cc scheint die meiste Relevanz zum Thema zu haben.
Allerdings erfordert jeder Eingriff hier, daß Du LilyPond selbst aus dem repository kompilierst.
Ich kann Dir da nicht helfen, C++ kann ich nicht.

Gruß,
  Harm


ValidUserName

Na, dann werde ich mir wohl irgendwann einmal de Source Code vornehmen müssen (einfach nur aus Interesse, nicht weil ich das ganze gleich ändern wollte. Dafür müsste ich's ja eh erst einmal verstehen...).