Le 31/03/2022 à 17:26, Dinh Hoang Tu a écrit :
Hi Jean and all,
I ran into cases when chorus and first verse are continued on first line.
Then with this solution, stanza cannot be changed from chorus to verse
1, or vice versa.
I would appreciate it if it can be archived somehow.
Here's an updated snippet.
Best,
Jean
\version "2.22.2"
sopranoMusic = \relative c'' {
\time 2/4
% verse music
\repeat unfold 10 { c } \break
% chorus music
\repeat unfold 10 { c } \break
\repeat unfold 10 { c }
}
sopranoLyrics = \lyrics {
\set stanza = "CH:"
\repeat unfold 9 { aaaaa }
<<
{
\set stanza = "1." % cannot reset stanza to new value
\repeat unfold 21 { aaa }
}
\new Lyrics = "lyr2" {
\set stanza = "2."
\repeat unfold 20 { aaaa }
}
>>
}
#(define (add-grob-definition grob-name grob-entry)
(set! all-grob-descriptions
(cons ((@@ (lily) completize-grob-entry)
(cons grob-name grob-entry))
all-grob-descriptions)))
#(add-grob-definition
'StanzaNumberSpanner
`((direction . ,LEFT)
(font-series . bold)
(padding . 1.0)
(side-axis . ,X)
(stencil . ,ly:text-interface::print)
(X-offset . ,ly:side-position-interface::x-aligned-side)
(Y-extent . ,grob::always-Y-extent-from-stencil)
(meta . ((class . Spanner)
(interfaces . (font-interface
side-position-interface
stanza-number-interface
text-interface))))))
\layout {
\context {
\Global
\grobdescriptions #all-grob-descriptions
}
\context {
\Score
\remove Stanza_number_align_engraver
\consists
#(lambda (context)
(let ((texts '())
(syllables '()))
(make-engraver
(acknowledgers
((stanza-number-interface engraver grob source-engraver)
(set! texts (cons grob texts)))
((lyric-syllable-interface engraver grob source-engraver)
(set! syllables (cons grob syllables))))
((stop-translation-timestep engraver)
(for-each
(lambda (text)
(for-each
(lambda (syllable)
(ly:pointer-group-interface::add-grob text
'side-support-elements syllable))
syllables))
texts)
(set! syllables '())))))
}
\context {
\Lyrics
\remove Stanza_number_engraver
\consists
#(lambda (context)
(let ((text #f)
(last-stanza #f))
(make-engraver
((process-music engraver)
(let ((stanza (ly:context-property context 'stanza #f)))
(if (and stanza (not (equal? stanza last-stanza)))
(let ((column (ly:context-property context
'currentCommandColumn)))
(set! last-stanza stanza)
(if text
(ly:spanner-set-bound! text RIGHT column))
(set! text (ly:engraver-make-grob engraver
'StanzaNumberSpanner '()))
(ly:grob-set-property! text 'text stanza)
(ly:spanner-set-bound! text LEFT column)))))
((finalize engraver)
(if text
(let ((column (ly:context-property context
'currentCommandColumn)))
(ly:spanner-set-bound! text RIGHT column)))))))
\override StanzaNumberSpanner.horizon-padding = 10000
}
}
\score {
\new ChoirStaff <<
\new Staff <<
\new Voice = soprano \sopranoMusic
\new Lyrics \lyricsto soprano \sopranoLyrics
>>
>>
\layout {
indent = 0
}
}