Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Köbi am Samstag, 10. September 2016, 14:00

Titel: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: Köbi am Samstag, 10. September 2016, 14:00
Da ich ich letztes mal so prompt Antwort erhalten habe  :-) , erlaube ich mir weiter zu fragen: In einem Menuett ist das Trio in einer anderen Tonart geschrieben. Üblich ist es, am Schluss des Trios für das da capo den Tonartwechsel anzuzeigen. Wie mache ich das?

\version "2.19.47"

\relative c' {
  \time 3/4

  \tempo Menuett
  \key d \major
  \repeat volta 2 { d2. } \break
  \repeat volta 2 { d2. } \break

  \tempo Trio
  \key g \major
  \repeat volta 2 { g2. } \break
  \repeat volta 2 { g2. }

  \key d \major
}

Mit dem "\key d \major" am Schluss schaffe ich es zwar, die Vorzeichen anzuzeigen, aber die Notenlinien fehlen :-(
Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: harm6 am Samstag, 10. September 2016, 14:32
Hi,

versuch mal:

\version "2.19.47"

\relative c' {
  \time 3/4

  \override Staff.StaffSymbol.break-align-symbols =
    #'(time-signature key-signature staff-bar break-alignment)
  \tempo Menuett
  \key d \major
  \repeat volta 2 { d2. } \break
  \repeat volta 2 { d2. } \break

  \tempo Trio
  \key g \major
  \repeat volta 2 { g2. } \break
  \repeat volta 2 { g2. }

  \key d \major
}

Diskussion hier:
http://lists.gnu.org/archive/html/lilypond-devel/2015-04/msg00067.html (http://lists.gnu.org/archive/html/lilypond-devel/2015-04/msg00067.html)

HTH,
  Harm
Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: Köbi am Samstag, 10. September 2016, 15:53
Danke Harm! Funktioniert im Beispiel wie gewünscht. "In echt" habe ich noch ein \transpose. Da überleben die Linien leider nicht:

\version "2.19.47"

\transpose g f

\relative c' {
  \time 3/4

  \override Staff.StaffSymbol.break-align-symbols =
    #'(time-signature key-signature staff-bar break-alignment)

  \tempo Menuett
  \key d \major
  \repeat volta 2 { d2. } \break
  \repeat volta 2 { d2. } \break

  \tempo Trio
  \key g \major
  \repeat volta 2 { g2. } \break
  \repeat volta 2 { g2. }

  \key d \major
}

Da staunt der Laie und der Fachmann wundert sich?
Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: harm6 am Samstag, 10. September 2016, 18:04
Was hier passiert ist nicht sooo verwunderlich.

Der override für StaffSymbol.break-align-symbols arbeitet die gegebene Liste, (time-signature key-signature staff-bar break-alignment), von links nach rechts ab. Und beim ersten gefundenen grob weiß das StaffSymbol, daß es hier aufhören soll. Jedoch wird infolge des transponierens aus D-Dur C-Dur. Welches aber gar keine Vorzeichen im Sinne einer KeySignature hat. Stattdessen müssen aber die Vorzeichen der vorangegangenen Tonart aufgehoben werden, es entsteht dann ein KeyCancellation-grob.
Um hier etwas weiter zu kommen muß man dieses also in die Liste aufnehmen, der override lautet dann:

  \override Staff.StaffSymbol.break-align-symbols =
    #'(time-signature key-cancellation key-signature staff-bar break-alignment)

Das ist aber nur die halbe Miete, denn der Staff bricht unmittelbar und ohne jegliches padding oder dergleichen am rechten Rand der KeyCancellation ab, unschön.

Das kann man in diesem Fall zwar fixen mit:

  \once \override Staff.KeyCancellation.X-extent = #'(0 . 1.17)
  \once \override Staff.KeyCancellation.space-alist.right-edge =
     #'(extra-space . 0)

aber für jede andere Tonart oder Transposition sind wieder andere Werte zu ermitteln, noch unschöner  :(

Vielleicht fällt mir noch was besseres ein.


Gruß,
  Harm
Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: harm6 am Samstag, 10. September 2016, 20:37
Zitat von: harm
Vielleicht fällt mir noch was besseres ein.

Also, was wirklich überzeugendes habe ich nicht gefunden.
Der Code unten funktioniert zwar bei dem kleinen Beispiel es würde mich aber in keiner Weise überraschen, wenn Du bald etwas findest wo's doch krachen geht ...

Nichtsdestotrotz, hier mein Machwerk:

\version "2.19.47"

eolCorrection = {
  \override Staff.StaffSymbol.break-align-symbols =
    #'(time-signature key-cancellation key-signature staff-bar break-alignment)
   
  \override Staff.KeySignature.space-alist.right-edge = #'(extra-space . 0)
  \override Staff.Clef.space-alist.right-edge = #'(extra-space . 0)
  \override Staff.KeyCancellation.space-alist.right-edge = #'(extra-space . 0)
  \override Staff.BarLine.space-alist.right-edge = #'(extra-space . 0)
  \override Staff.Clef.space-alist.right-edge = #'(extra-space . 0)
 
  \override Score.BreakAlignment.after-line-breaking =
  #(lambda (grob)
    (let ((break-dir (ly:item-break-dir grob)))
      (if (= break-dir -1)
          (let* ((break-align-elts
                   (ly:grob-array->list (ly:grob-object grob 'elements)))
                 (break-align-group-list
                   (filter
                     (lambda (g)
                       (grob::has-interface g 'break-aligned-interface))
                     break-align-elts))
                 (break-align-group-list-elts
                   (append-map
                     (lambda (g)
                       (ly:grob-array->list (ly:grob-object g 'elements)))
                     break-align-group-list))
                 (not-empty-stil-grobs
                   (filter
                     (lambda (g)
                       (not (ly:stencil-empty? (ly:grob-property g 'stencil))))
                     break-align-group-list-elts))
                 (lisp-names
                   (map
                     (lambda (g)
                       (if (eq? (grob::name g) 'BarLine)
                           'staff-bar
                           (ly:camel-case->lisp-identifier (grob::name g))))
                     not-empty-stil-grobs))
                 (eol-break-align-orders
                   (vector-ref (ly:grob-property grob 'break-align-orders) 0))
                 (list-pos
                   (map
                     (lambda (lisp-name b-a-grob)
                       (cons
                         (length (member lisp-name eol-break-align-orders))
                         b-a-grob))
                     lisp-names
                     not-empty-stil-grobs))
                 (sorted-grobs
                   (sort
                     list-pos
                     (lambda (p q)
                       (> (car p) (car q)))))
                 (last-in-staff-grob
                   (cdr (last sorted-grobs)))
                 (last-grob-right-edge-space
                   (cdr
                     (assoc-get 'right-edge
                       (assoc-get 'space-alist
                         (reverse
                           (ly:grob-basic-properties last-in-staff-grob)))))))
            (ly:grob-translate-axis! grob (- last-grob-right-edge-space) X)
            (ly:grob-set-property! grob 'positioning-done #t)))))
}
           
\transpose g f

\relative c' {
  \time 3/4
  \eolCorrection
   
  \repeat volta 2 { d2. } \break
  \repeat volta 2 { d2. } \break

  \tempo Trio
  \key g \major
  \repeat volta 2 { g2. } \break
  \repeat volta 2 { g2. }
 
  \key d \major
}

Gruß,
  Harm
Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: Köbi am Sonntag, 11. September 2016, 22:14
Hallo Harm

Vielen Dank, jetzt funktioniert's! Nur, wie sollen das Normalsterbliche handhaben können... Immerhin, mein Problem ist gelöst und so lange ich hier so guten Support erhalte, kann ich mit Lilypond arbeiten ;-)

Gruss
Köbi
Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: harm6 am Sonntag, 11. September 2016, 22:48
Tatsächlich ist dieses Verhalten recht neu und mit dem Fix für issue 660 in 2.19.16 eingeführt worden.
https://sourceforge.net/p/testlilyissues/issues/660/ (https://sourceforge.net/p/testlilyissues/issues/660/)

Falls Du dort nachliest, so wirst Du gute Gründe für den patch finden.
Der override für 'break-align-symbols funktioniert ja auch einerseits wie gewünscht, andererseits reißt das StaffSymbol doch ein kleines bißchen zu früh ab.
Diese kleine bißchen hat zu meinem ausufernden Workaround-Code geführt...

Somit halte ich dieses issue für nicht vollständig gelöst und werde einen bug-report absetzen (falls ich dran denke). Auch sollte der override für 'break-align-symbols dokumentiert werden.

Zitat
Nur, wie sollen das Normalsterbliche handhaben können...

Die Handhabung sollte kein Problem sein, oder doch?

Um die Lösung fürs Problem zu erhalten gibts ja (unter anderen) dieses Forum. ;)

Gruß,
  Harm

Titel: Re: Erzwungene Anzeige eines Tonartwechsel am Satzende
Beitrag von: Manuela am Montag, 12. September 2016, 07:41
Um die Lösung fürs Problem zu erhalten gibts ja (unter anderen) dieses Forum. ;)

Ohne dieses Forum und deine Hilfe (und die etlicher anderer) hätte ich schon längst den Hut drauf gehaut  :D ;)