Autor Thema: StaffGroup mit Mark_engraver  (Gelesen 1890 mal)

fugenkomponist

  • Member
StaffGroup mit Mark_engraver
« am: Mittwoch, 12. August 2015, 17:50 »
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
Zitat
If 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).
« Letzte Änderung: Mittwoch, 12. August 2015, 18:06 von fugenkomponist »

fugenkomponist

  • Member
Re: StaffGroup mit Mark_engraver
« Antwort #1 am: Mittwoch, 12. August 2015, 18:34 »

harm6

  • Member
Re: StaffGroup mit Mark_engraver
« Antwort #2 am: Mittwoch, 12. August 2015, 23:16 »
Zitat von: fugenkomponist
Ist ein Bug.

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

Hilft Dir das?

Gruß,
  Harm

fugenkomponist

  • Member
Re: StaffGroup mit Mark_engraver
« Antwort #3 am: Donnerstag, 13. August 2015, 09:12 »
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

  • Member
Re: StaffGroup mit Mark_engraver
« Antwort #4 am: Donnerstag, 13. August 2015, 13:47 »
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).
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).

Zitat
Dann 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.