Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Manuela am Freitag, 9. August 2019, 18:10

Titel: StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: Manuela am Freitag, 9. August 2019, 18:10
Hi, ich möchte, dass die Taktlinien nur am Zeilenende bzw. bei Wiederholungslinien durchgezogen werden. StaffGroup zieht die Taktlinien immer durch, ChoirStaff nie. Gibt es eine (relativ) einfache Variante, die beide Varianten kombiniert? Wenn es zu kompliziert ist, lasse ich es bleiben und nehme StaffGroup
Titel: Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: harm6 am Freitag, 9. August 2019, 20:38

\version "2.19.83"

#(define my-repeat-bar-glyph-list
  '(":|.:"
    ":..:"
    ":|.|:"
    ":.|.:"
    ":|."
    ".|:"
    "[|:"
    ":|]"
    ":|][|:"
    ".|:-||"
    ":|.S"
    "S.|:"
    "|."
    ;; add more?
    ))
   
#(define restrict-span-bars
;; print SpanBar only at line-break abd for repeats
  (lambda (grob)
    (let* ((break-dir (ly:item-break-dir grob))
           (glyph (ly:grob-property grob 'glyph)))
      (if (or (not (zero? break-dir))
              (member glyph my-repeat-bar-glyph-list))
          (ly:grob-set-property! grob 'allow-span-bar #t)
          (ly:grob-set-property! grob 'allow-span-bar #f)))))
         
\layout {
  \context {
    \Staff
    \override BarLine.after-line-breaking = #restrict-span-bars
  }
}

mus =
{ \repeat unfold 10 { \repeat volta 2 { b1 b b b } b b b } \bar "|." }

\new StaffGroup <<
  \new Staff \mus
  \new Staff \mus
>>


sollte funktionieren.


Gruß,
  Harm
Titel: Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: Manuela am Samstag, 10. August 2019, 06:40
Danke Harm. Ich hatte gehofft, es geht einfacher.
Titel: Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: harm6 am Samstag, 10. August 2019, 10:28
Eigentlich ist das einfach.

Die Bedingung lautet: Ziehe SpanBars beim Zeilenumbruch und für bestimmte (repeat-)BarLine-Typen, sonst nie.
Das habe ich einfach nach scheme übersetzt.

Natürlich muß man prüfen, ob ein Zeilenumbruch vorliegt. Geschieht mittels ly:item-break-dir (und deshalb wird das Ganze am Schluß auch 'after-line-breaking aufgerufen.)

Und man muß prüfen, ob die aktuelle BarLine eine "repeat-bar-line" ist.
Diese werden per default mittels der context-properties doubleRepeatType, startRepeatType , endRepeatType festgelegt.
Allerdings hat man in einem einfachen grob-override keinen Zugriff auf context-properties, das geht nur mit bestimmten Verfahren, u.a. mit einem custom-engraver. Das würde die Sache komplexer machen.
Auch kann es ja passieren, daß der user eine repeat-bar-line manuell setzt, die nicht den defaults enspricht, dafür müßte man also sowieso eine Liste solcher BarLine-Typen erstellen und verarbeiten.
Also hab' ich das mit dem engraver gelassen mich auf den grob-override beschränkt.

Ich sehe nicht wie es einfacher gehen könnte ...


Gruß,
  Harm
Titel: Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: Manuela am Samstag, 10. August 2019, 14:13
Danke Harm, das klappt gut.

Unter "einfach" hatte ich gemeint, dass es einen Context gibt, der genau das macht, was ich wollte.
Titel: Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: harm6 am Samstag, 10. August 2019, 21:36
Einen default-context dafür gibt es nicht, Du kannst Dir aber einen bauen. Führt zu:


#(define my-repeat-bar-glyph-list
  '(":|.:"
    ":..:"
    ":|.|:"
    ":.|.:"
    ":|."
    ".|:"
    "[|:"
    ":|]"
    ":|][|:"
    ".|:-||"
    ":|.S"
    "S.|:"
    "|."
    ;; add more?
    ))
   
#(define restrict-span-bars
;; print SpanBar only at line-break abd for repeats
  (lambda (grob)
    (let* ((break-dir (ly:item-break-dir grob))
           (glyph (ly:grob-property grob 'glyph)))
      (if (or (not (zero? break-dir))
              (member glyph my-repeat-bar-glyph-list))
          (ly:grob-set-property! grob 'allow-span-bar #t)
          (ly:grob-set-property! grob 'allow-span-bar #f)))))
 
\layout {
  \context {
    \StaffGroup
    \name "MyContext"
    \alias "StaffGroup"
    \override BarLine.after-line-breaking = #restrict-span-bars
  }
  \context {
    \Score
    \accepts "MyContext"
  }
}

mus =
{ \repeat unfold 10 { \repeat volta 2 { b1 b b b } b b b } \bar "|." }

\new MyContext <<
  \new Staff \mus
  \new Staff \mus
>>


"MyContext" kann man noch passender benennen ;)

Gruß,
  Harm
Titel: Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
Beitrag von: Manuela am Sonntag, 11. August 2019, 09:35
Danke, Harm. Ist vll. schlauer, einen extra Context zu definieren  ;)