lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Make shortVocalName attach to lyrics like stanza


From: Jean Abou Samra
Subject: Re: Make shortVocalName attach to lyrics like stanza
Date: Fri, 1 Apr 2022 17:49:59 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0



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
  }
}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]