• Willkommen im Forum „Archiviertes Lilypond Forum (2017)“.
 

Dies ist das Archiv des alten Forums (bis März 2017). Das aktuelle Forum ist unter lilypondforum.de zu finden.
This is the archive of the old forum (until March 2017). You can find the current forum at lilypondforum.de.

Hauptmenü

StaffGroup mit Mark_engraver

Begonnen von fugenkomponist, Mittwoch, 12. August 2015, 17:50

Vorheriges Thema - Nächstes Thema

fugenkomponist

Hallo,

ich möchte ähnlich wie in Snippet 434 den Mark_engraver aus dem Score nehmen, aber nicht in den Staff, sondern in die StaffGroup schieben. Das tut auch erstmal (pro StaffGroup gibts ne mark), aber die marks stehen alle ganz oben über dem kompletten Score. Soll das so oder ist das ein Bug? Und was kann ich dagegen tun?\version "2.19.24"
\language "deutsch"

melody = \relative {
  c'1
  \mark \default
  c
}

\score {
  <<
    \new StaffGroup {
      \new Staff {
        \melody
      }
    }
    \new StaffGroup {
      \new Staff {
        \melody
      }
    }
  >>
  \layout {
    \context {
      \Score
      \remove Mark_engraver
      \remove Staff_collecting_engraver
    }
    \context {
      \StaffGroup
      \consists Mark_engraver
      \consists Staff_collecting_engraver
    }
  }
}
Ich hab übrigens keine Ahnung, was genau der Staff_collecting_engraver ist und tut. Er scheint auf das Ergebnis keinen Einfluss (mehr) zu haben, auch nicht auf das (richtige) Ergebnis im Original-Snippet.

Edit: In der IR steht zum MarkEngraver witzigerweise
ZitatIf moving this engraver to a different context, Staff_collecting_engraver must move along, otherwise all marks end up on the same Y location.
Was ja offensichtlich nicht stimmt (es ist weder notwendig (Staff) noch hinreichend (StaffGroup), den Staff_collecting_engraver mitzunehmen).


harm6

Zitat von: fugenkomponist
Ist ein Bug.

Dort wird u.a. auch
  \override RehearsalMark.after-line-breaking = #'()
erwähnt.

Hilft Dir das?

Gruß,
  Harm

fugenkomponist

Danke für den Hinweis. Ich hab tatsächlich auch den Beitrag überflogen, aber irgendwie nur aufs Fazit gewartet, und ,,use MarkLine context" gesehen ... Das gefiel mir aber nicht, weil das so viel Handarbeit ist ;)

Die Lösung mit\override RehearsalMark.after-line-breaking = #'()hat tatsächlich den dort erwähnten Nachteil: RehearsalMarks (und MetronomeMarks) kollidieren mit allem und jedem (insbesondere Violinschlüsseln am Zeilenanfang). Man kann das aber mit nem höheren 'padding-Wert ausbügeln, wenn einen dieser größere Abstand in der Zeilenmitte nicht stört (oder man kümmert sich darum, wenn die Zeilenumbrüche endgültig feststehen, per \once \override und \tag #'score). Dann muss man nur noch schauen, dass der Abstand zwischen den StaffGroups groß genug wird, um Platz zu lassen (das sollte auch irgendwie machbar sein, ich muss jetzt aber erstmal los und probier das später aus).\version "2.19.24"
\language "deutsch"

melody = \relative {
  c'1
  \mark \default
  c
  \tempo 8 = 40
  g
  \break \mark \default
  c
  \break \tempo 4 = 80
  f,
}

\score {
  <<
    \new StaffGroup <<
      \new Staff {
        \melody
      }
      \new Staff {
        \melody
      }
    >>
    \new StaffGroup <<
      \new Staff {
        \melody
      }
      \new Staff {
        \melody
      }
    >>
  >>
  \layout {
    \context {
      \Score
      \remove Mark_engraver
      \remove Metronome_mark_engraver
      % Don't remove Staff_collecting_engraver if f. e. BarNumbers stay at Score context.
    }
    \context {
      \StaffGroup
      \consists Mark_engraver
      \consists Metronome_mark_engraver
      \consists Staff_collecting_engraver
      \override RehearsalMark.after-line-breaking = #'()
      \override MetronomeMark.after-line-breaking = #'()
      % This isn't ideal: RehearsalMarks' and MetronomeMarks' collision detection doesn't work anymore.
      % 0.8 would be enough for most cases except above a treble clef.
      \override RehearsalMark.padding = 2
    }
  }
}

fugenkomponist

Zitat von: fugenkomponist am Donnerstag, 13. August 2015, 09:12Man kann das aber mit nem höheren 'padding-Wert ausbügeln, wenn einen dieser größere Abstand in der Zeilenmitte nicht stört (oder man kümmert sich darum, wenn die Zeilenumbrüche endgültig feststehen, per \once \override und \tag #'score).
Dieser Thread (der leider aus irgendeinem Grund ohne Antwort geblieben ist) hat mich auf die Idee gebracht, after-line-breaking nicht ganz leer zu lassen, sondern darin RehearsalMarks am Zeilenanfang mit einem padding zu versehen. Das geht nun davon aus, dass man immer nen Violinschlüssel hat, falls nicht, kann man aber per \once \override wieder after-line-breaking auf #'() setzen. (Mit Piccolo/Flöte, Horn, 1. Geige als oberste Zeilen in StaffGroups im Symphonieorchester ist das ja auch relativ unwahrscheinlich; wenn man nun RemoveEmptyStaves verwendet, müssten immerhin Flöten, Oboen, Klarinetten bzw. Hörner, Trompeten bzw. beide Geigenstimmen nichts haben oder Hörner im Baßschlüssel spielen.)

Schön wärs natürlich, wenn man irgendwie in after-line-breaking auf die StaffGroup und die enthaltenen Staffs zugreifen könnte; hab schon probiert, stavesFound aus dem Staff_collecting_engraver irgendwie dafür zu verwenden, aber der gibt mir nicht die Kontexte, sondern die StaffSymbols (also kann ich nicht auf die context-property clefGlyph zugreifen).

ZitatDann muss man nur noch schauen, dass der Abstand zwischen den StaffGroups groß genug wird, um Platz zu lassen.
Das kann man erreichen mit einem
\override StaffGroup.StaffGrouper.staffgroup-staff-spacing ...
Dieses regelt den Abstand unter einer StaffGroup zum nächsten Staff.

Im Anhang beide Änderungen in Aktion.