Autor Thema: StaffGroup ohne durchgezogene Barlines im Zeileninnern  (Gelesen 60 mal)

Manuela

  • Sr. Member
  • ****
  • Beiträge: 333
    • Manuelas Wiki
StaffGroup ohne durchgezogene Barlines im Zeileninnern
« 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
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

  • Hero Member
  • *****
  • Beiträge: 555
Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
« Antwort #1 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

Manuela

  • Sr. Member
  • ****
  • Beiträge: 333
    • Manuelas Wiki
Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
« Antwort #2 am: Samstag, 10. August 2019, 06:40 »
Danke Harm. Ich hatte gehofft, es geht einfacher.
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

  • Hero Member
  • *****
  • Beiträge: 555
Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
« Antwort #3 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

Manuela

  • Sr. Member
  • ****
  • Beiträge: 333
    • Manuelas Wiki
Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
« Antwort #4 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.
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

  • Hero Member
  • *****
  • Beiträge: 555
Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
« Antwort #5 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

Manuela

  • Sr. Member
  • ****
  • Beiträge: 333
    • Manuelas Wiki
Antw:StaffGroup ohne durchgezogene Barlines im Zeileninnern
« Antwort #6 am: Sonntag, 11. August 2019, 09:35 »
Danke, Harm. Ist vll. schlauer, einen extra Context zu definieren  ;)
Danke für eure Hilfe
viele Grüße
-- Manuela