\version "2.18.0"
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR %% Store the following until
%LSR %% %% end of include file
%LSR %% as splitStaffBarLine-1.0.ily.
%LSR %% To use it in your projects, write
%LSR %% \include "splitStaffBarLine-1.0.ily"
%LSR %% to define the commands described below.
%LSR %%
%LSR %% Cheers,
%LSR %% Alexander
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR %% splitStaffBarLine
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR %% Version 1.0
%LSR %% 2009, Alexander Kobel (www.a-kobel.de)
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR %% Defines the
%LSR %% \splitStaffBarLine
%LSR %% command, which adds arrows in north-east and south-east
%LSR %% directions at a bar line, to denote that several voices
%LSR %% sharing a staff will each continue on a staff of their own in
%LSR %% the next system.
%LSR %% Automatically inserts a break at this position, otherwise
%LSR %% the symbol does not make any sense.
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR %% As a side-effect, defines the markup command
%LSR %% \arrow-at-angle
%LSR %% as a helper function, which draws an arrow of length
%LSR %% at an angle of (in degrees).
%LSR %% If = #t, the arrowhead is filled.
%LSR %% Internally uses the fontsize and thickness properties, as
%LSR %% \arrow-head and \draw-line do.
%LSR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%LSR
%LSR
%LSR %% This should also work with older version, probably up
%LSR %% to <= 2.10. Please report if this is the case.
%{ Original snippet :
#(define-markup-command (arrow-at-angle layout props angle-deg length fill)
(number? number? boolean?)
(let* (
;; PI-OVER-180 and degrees->radians are taken from flag-styles.scm
(PI-OVER-180 (/ (atan 1 1) 45))
(degrees->radians (lambda (degrees) (* degrees PI-OVER-180)))
(angle-rad (degrees->radians angle-deg))
(target-x (* length (cos angle-rad)))
(target-y (* length (sin angle-rad))))
(interpret-markup layout props
(markup
#:translate (cons (/ target-x 2) (/ target-y 2))
#:rotate angle-deg
#:translate (cons (/ length -2) 0)
#:concat (#:draw-line (cons length 0)
#:arrow-head X RIGHT fill)))))
splitStaffBarLineMarkup = \markup \with-dimensions #'(0 . 0) #'(0 . 0) {
\combine
\arrow-at-angle #45 #(sqrt 8) ##f
\arrow-at-angle #-45 #(sqrt 8) ##f
}
splitStaffBarLine = {
\once \override Staff.BarLine.stencil =
#(lambda (grob)
(ly:stencil-combine-at-edge
(ly:bar-line::print grob)
X RIGHT
(grob-interpret-markup grob splitStaffBarLineMarkup)
0))
\break
}
\paper {
ragged-right = ##t
short-indent = 5\mm
}
\score {
<<
\new ChoirStaff <<
\new Staff \with { instrumentName = #"High I + II" } {
<<
\repeat unfold 4 f''1
\\
\repeat unfold 4 d''1
>>
\splitStaffBarLine
}
\new Staff \with { instrumentName = #"Low" } {
<<
\repeat unfold 4 b'1
\\
\repeat unfold 4 g'1
>>
}
\new Staff \with { shortInstrumentName = #"H I" } {
R1*4
\repeat unfold 2 { r4 f''2 r4 } \repeat unfold 2 e''1
}
\new Staff \with { shortInstrumentName = #"H II" } {
R1*4
\repeat unfold 4 b'2 \repeat unfold 2 c''1
}
\new Staff \with { shortInstrumentName = #"L" } {
R1*4
<<
\repeat unfold 4 g'1
\\
\repeat unfold 4 c'1
>>
}
>>
>>
\layout {
\context {
\Staff \RemoveEmptyStaves
\override VerticalAxisGroup.remove-first = ##t
}
}
}
%}
%%%%% Updated & uppgraded snippet %%%%%%%%%%%%%%%%%
%%%%% made by Pierre P. Schneider (v.2.18 - 2014)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TODO : fix arrows translation when key changes
#(define-markup-command (arrow-at-angle layout props angle-deg length fill)
(number? number? boolean?)
(let* (
(PI-OVER-180 (/ (atan 1 1) 34))
(degrees->radians (lambda (degrees) (* degrees PI-OVER-180)))
(angle-rad (degrees->radians angle-deg))
(target-x (* length (cos angle-rad)))
(target-y (* length (sin angle-rad))))
(interpret-markup layout props
(markup
#:translate (cons (/ target-x 2) (/ target-y 2))
#:rotate angle-deg
#:translate (cons (/ length -2) 0)
#:concat (#:draw-line (cons length 0)
#:arrow-head X RIGHT fill)))))
splitStaffBarLine = {
\once \override Staff.BarLine.stencil =
#(lambda (grob)
(ly:stencil-combine-at-edge
(ly:bar-line::print grob)
X RIGHT
(grob-interpret-markup grob #{
\markup\with-dimensions #'(0 . 0) #'(0 . 0) {
%%%%%%%% to be fixed when key changes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\translate #'(5.95 . .14)\arrow-at-angle #45 #(sqrt 8) ##t
\translate #'(5.35 . -.13)\arrow-at-angle #-45 #(sqrt 8) ##t }#})
0))
\break
}
convDownStaffBarLine = {
\once \override Staff.BarLine.stencil =
#(lambda (grob)
(ly:stencil-combine-at-edge
(ly:bar-line::print grob)
X RIGHT
(grob-interpret-markup grob #{
\markup\with-dimensions #'(0 . 0) #'(0 . 0) {
%%%%%%%% to be fixed when key changes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\translate #'(5.3 . -.13)\arrow-at-angle #-45 #(sqrt 8) ##t }#})
0))
\break
}
convUpStaffBarLine = {
\once \override Staff.BarLine.stencil =
#(lambda (grob)
(ly:stencil-combine-at-edge
(ly:bar-line::print grob)
X RIGHT
(grob-interpret-markup grob #{
\markup\with-dimensions #'(0 . 0) #'(0 . 0) {
%%%%%%%% to be fixed when key changes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\translate #'(5.28 . .14)\arrow-at-angle #45 #(sqrt 8) ##t }#})
0))
\break
}
\paper {
short-indent = 5\mm
left-margin = 15\mm
line-width = 100\mm
}
\score {
<<
\new ChoirStaff <<
\new Staff
\with {
instrumentName = #"H I + H II"
} {
\key f\minor
<<
\repeat unfold 4 f''1
\\
\repeat unfold 4 des''1
>>
\key f\major
\splitStaffBarLine
}
\new Staff \with { instrumentName = #"Low" } {
\key f\minor
<<
\repeat unfold 4 bes'1
\\
\repeat unfold 4 g'1
>>
\key f\major
}
\new Staff \with { shortInstrumentName = #"I" } {
\key f \major
R1*4
\repeat unfold 2 { r4 f''2 r4 } \repeat unfold 2 e''1
\key f\minor
\convDownStaffBarLine
}
\new Staff \with { shortInstrumentName = #"II" } {
\key f \major
R1*4
\repeat unfold 4 bes'2 \repeat unfold 2 c''1
\key f\minor
\convUpStaffBarLine
}
\new Staff \with { shortInstrumentName = #"L" } {
\key f\major
R1*4
<<
\repeat unfold 4 g'1
\\
\repeat unfold 4 c'1
>>
\key f\minor
}
\new Staff
\with {
shortInstrumentName = #"I+II"
} {
\key f\minor
R1*8
<<
\repeat unfold 4 f''1
\\
\repeat unfold 4 des''1
>>
}
\new Staff \with { shortInstrumentName = #"L" } {
\key f\minor
R1*8
<<
\repeat unfold 4 bes'1
\\
\repeat unfold 4 g'1
>>
}
>>
>>
\layout {
\context {
\Staff \RemoveEmptyStaves
\override VerticalAxisGroup #'remove-first = ##t
}
}
}