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
\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
Danke Harm. Ich hatte gehofft, es geht einfacher.
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
Danke Harm, das klappt gut.
Unter "einfach" hatte ich gemeint, dass es einen Context gibt, der genau das macht, was ich wollte.
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
Danke, Harm. Ist vll. schlauer, einen extra Context zu definieren ;)