Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: fugenkomponist am Dienstag, 8. Januar 2013, 19:00

Titel: \RemoveEmptyStaves auf StaffGroups statt einzelne Staffs anwenden
Beitrag von: fugenkomponist am Dienstag, 8. Januar 2013, 19:00
Hallo,

gibt es irgendeine Möglichkeit, \RemoveEmptystaves nur auf ganze StaffGroups anzuwenden, also z. B. Flöten nicht auszublenden, wenn die Oboen spielen etc.?
\version "2.16.1"

\score {
  <<
    \new StaffGroup <<
      \new Staff {
        R1*10 \break
        R1*10
      }
      \new Staff {
        R1*20
      }
    >>
    \new StaffGroup <<
      \new Staff {
        R1*20
      }
      \new Staff {
        R1*10
        c'1 R1*9
      }
    >>
  >>
  \layout {
    \context {
      \Staff \RemoveEmptyStaves % ich hätte hier gerne StaffGroup statt Staff stehen
    }
  }
}
Ein einfaches \layout { \context { \StaffGroup \RemoveEmptyStaves } } lässt lilypond sterben:
GNU LilyPond 2.16.1
»leereStaffGroups.ly« wird verarbeitet
Analysieren...
Interpretation der Musik...Speicherzugriffsfehler (Speicherabzug geschrieben)
Titel: Re: \RemoveEmptyStaves auf StaffGroups statt einzelne Staffs anwenden
Beitrag von: Be-3 am Mittwoch, 9. Januar 2013, 09:12
gibt es irgendeine Möglichkeit, \RemoveEmptystaves nur auf ganze StaffGroups anzuwenden, also z. B. Flöten nicht auszublenden, wenn die Oboen spielen etc.?

Hallo fugenkomponist,

im Prinzip gab es dieses Problem vor ein paar Jahren/Versionen schon mit \PianoStaff. Da wurde gefordert, daß bei einem PianoStaff trotz RemoveEmptyStaves immer beide (bzw. alle) Staves angezeigt werden, sobald mindestens einer nicht leer ist.

Das bedeutet: Mit PianoStaff geht genau das, was Du auch für StaffGroup haben möchtest.
Lösung: entweder Du benutzt einen PianoStaff und änderst die Klammer ab, oder (wie im Beispiel unten), Du schaust nach, was PianoStaff anders macht.
Im wesentlichen geht es um den zu diesem Zweck erfundenen "Keep_alive_together_engraver"-Engraver:

\score {
  <<
    \new StaffGroup <<
      \new Staff {
        R1*10 \break
        R1*10
      }
      \new Staff {
        R1*20
      }
    >>
    \new StaffGroup  <<
      \new Staff {
        R1*20
      }
      \new Staff {
        R1*10
        c'1 R1*9
      }
    >>
  >>
  \layout {
    \context {
      \Staff
      \RemoveEmptyStaves
    }
    \context {
      \StaffGroup
      \consists "Keep_alive_together_engraver"
    }
  }
}

Voilà.

Viele Grüße
Torsten
Titel: Re: \RemoveEmptyStaves auf StaffGroups statt einzelne Staffs anwenden
Beitrag von: fugenkomponist am Mittwoch, 9. Januar 2013, 10:16
Vielen Dank, das ist genau das, was ich brauche. Hab zwar die Diskussion zu Issue 2990 (http://code.google.com/p/lilypond/issues/detail?id=2990) gelesen, da sahs aber nicht so aus, als wär die Lösung so einfach.

Edit: Hm, wenn ich das statt in den \context in einzelne \with-Blöcke packe, kann ich dieses Verhalten für verschiedene Instrumentengruppen individuell einstellen. Sehr schön. (Z. B. will man glaub ich eher nicht, dass die Bratschen nicht drinstehen, wenn sie mal eine Zeile Pause haben, aber ich will auch nicht immer das komplette Schlagwerk mitschleppen, nur weil eine einzelne Pauke ab und zu nen Ton spielt etc.)
Titel: Re: \RemoveEmptyStaves auf StaffGroups statt einzelne Staffs anwenden
Beitrag von: Be-3 am Mittwoch, 9. Januar 2013, 11:24
Vielen Dank, das ist genau das, was ich brauche. Hab zwar die Diskussion zu Issue 2990 (http://code.google.com/p/lilypond/issues/detail?id=2990) gelesen, da sahs aber nicht so aus, als wär die Lösung so einfach.

Oh, das ist ja interessant...
Bei Issue 2990 geht es allerdings letztendlich nicht darum, den Einsatzbereich von \RemoveEmptyStaves auf höhere Gruppenkontexte wie \StaffGroup \ChoirStaff usw. zu erweitern, sondern statt des extrem uneleganten Crashs eine ordentliche Fehlermeldung auszugeben. Diese Änderung wird ab Version 2.17.10 verfügbar sein, hilft aber natürlich funktional bei Deinem Problem nicht weiter.

Das PianoStaff-Problem wurde übrigens in Issue 442 (http://code.google.com/p/lilypond/issues/detail?id=442) behandelt und ab Version 2.13.30 gab es dann wohl den keep_alive_together-Engraver, der dem PianoStaff als Sondervariante des GrandStaff spendiert wurde.

Viele Grüße
Torsten
Titel: Re: \RemoveEmptyStaves auf StaffGroups statt einzelne Staffs anwenden
Beitrag von: fugenkomponist am Freitag, 11. Januar 2013, 10:13
Ja, das ist mir beim Lesen des Issue 2990 dann auch klargeworden, dass es nur darum ging, den Fehler anständig zu behandeln (so bin ich überhaupt das Issue gestoßen, hab mich gewundert, dass LilyPond einfach segfaultet, wenn man das einfach mal mit \RemoveEmptyStaves probiert).
In der NR steht noch nichts über den Keep_alive_together_engraver, oder?
Titel: Re: \RemoveEmptyStaves auf StaffGroups statt einzelne Staffs anwenden
Beitrag von: Be-3 am Freitag, 11. Januar 2013, 10:59
Nein, im NR habe ich auch nichts über den Keep_alive_together-Engraver gefunden. Der wird wohl nur als ein internes technisches Konstrukt gesehen. Bei Klaviersystemen kann man zwischen GrandStaff oder PianoStaff wählen, die sich im wesentlichen durch diesen Engraver unterscheiden: Die Thematik ist schon etwas versteckt, z. B. kann man über den PianoStaff (http://lilypond.org/doc/v2.16/Documentation/internals/pianostaff (http://lilypond.org/doc/v2.16/Documentation/internals/pianostaff)) lesen: "Just like GrandStaff, but the staves are only removed together, never separately."

Ich habe mir (im Bewußtsein, daß PianoStaff sich so verhält, wie Du es auch für StaffGroup wolltest), die Definition von PianoStaff in Datei engraver-init.ly angeschaut und gesehen, daß dieses Verhalten vom Keep_alive_together-Engraver verursacht wird.

Viele Grüße
Torsten