lilypond-user
[Top][All Lists]
Advanced

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

Re: Spacing lyrics to avoid visible bar lines only


From: Thomas Morley
Subject: Re: Spacing lyrics to avoid visible bar lines only
Date: Thu, 1 Nov 2018 00:12:53 +0100

Am Mi., 31. Okt. 2018 um 18:11 Uhr schrieb joelhamme <address@hidden>:
>
> My fellow singers in choir have been asking me to improve the visual chunking
> of choir staves. They wanted to have closed bar lines on the right edge of
> each choir staff.
>
> Adding the `Span_bar_engraver` to `ChoirStaff` adds a lot of clutter and
> results in collisions with the lyrics, which is particularly unappealing
> with thick repeat bars. This can be quickly fixed by adding `Bar_engraver`
> to `Lyrics` and hiding them as described in ^[notation lyrics].
>
> However, for aesthetical reasons I prefer removing all span bars, except
> non-defaults and single bar bars at the end of each line. So this would
> leave all repeats and double bar lines but no single bars unless there's a
> line break, much like ^[semi choir staff snippet]
>
> I've found a way to do this, except that there's some spacing issue with the
> lyrics at single bars that aren't even shown. In choir staves, lyrics can
> move below a bar line to take up the available space, which leaves a more
> pleasing appearance and saves space on the page. Sadly, I could either make
> the lyrics avoid all bar lines or not at all, but not only the ones that are
> actually shown.
>
> To the point:
> I would like to make the lyrics avoid some span bars while not avoiding the
> bar lines I've omitted using a call back.
>
> To illustrate I've compiled a somewhat minimal example using long words to
> trigger some collisions. For convenience I've also uploaded it to
> ^[lilybin].
>
> <http://lilypond.1069038.n5.nabble.com/file/t5727/lyrics-spacing.png>
>
> ```lilypond
> \version "2.18.2"
>
> link = {
>   \once \override Score.RehearsalMark.self-alignment-X = #LEFT
>   \mark \markup \normalsize {
>         \with-url #"http://lilybin.com/wmw4xx/6"; "http://lilybin.com/wmw4xx/6";
>   }
> }
>
> redspn = \once \override Score.SpanBar.color = #red
> grnbar = \once \override Score.BarLine.color = #green
>
> notes = {
>   \link
>   c1 \redspn | \repeat volta 2 { c | c \grnbar | c } | c | c | c \bar "|."
> }
>
> words = \lyricmode {
>   Breathes | \markup { \with-color #red breathes } |
>   br | \markup { \with-color #green breathes } |
>   breathes | br | breathes |
> }
>
> \score {
>   \new ChoirStaff <<
>     \new Staff \relative c'' \notes \addlyrics \words
>     \new Staff \relative c'' \notes
>   >>
>
>   \layout {
>     indent = 0
>     \context { \ChoirStaff
>       \consists "Span_bar_engraver"
>       \override BarLine.after-line-breaking =
>         #(lambda (grob)
>           (if
>             (and (= 0 (ly:item-break-dir grob))
>                  (string=? (ly:grob-property grob 'glyph-name) "|") )
>             (ly:grob-set-property! grob 'allow-span-bar #f)))
>     }
>
>         % \context { \Lyrics
>     % \consists "Bar_engraver"
>     % \hide BarLine
>     % \override BarLine.after-line-breaking =
>     %   #(lambda (grob)
>     %     (if
>     %       (and (= 0 (ly:item-break-dir grob)))
>     %            (string=? (ly:grob-property grob 'glyph-name) "|")
>     %       (ly:grob-set-property! grob 'stencil #f))
>     %   )
>     % }
>   }
> }
> ```
>
> The red colour indicates an unacceptable collision, whereas the green colour
> indicates the desired loose spacing under bars that are not spanned across
> staves. The commented-out section removes the relevant bar line stencils
> from the lyrics, but fails to loosen the spacing where there are no longer
> any bars to avoid.
>
> Can I conditionally add bar lines to lyrics without otherwise affecting
> their spacing?
>
> Sorry this got so long, any help would be much appreciated.
>
> Cheers,
> Joel
>
> [notation lyrics]:
> http://lilypond.org/doc/v2.19/Documentation/notation/techniques-specific-to-lyrics#placing-syllables-horizontally
> [semi choir staff snippet]: http://lsr.di.unimi.it/LSR/Item?id=299
> [lilybin]: http://lilybin.com/wmw4xx/6

How about:

\version "2.18.2"

%% srfi-1 is not present inside \layout (needed for 'every')
%% Thus defined at toplevel
#(define set-extra-spacing-height-for-span-bars
  (lambda (grob)
    (let* ((pap-col (ly:item-get-column grob))
           (nmpc (ly:grob-object pap-col 'left-neighbor))
           (nmpc-elts-array (ly:grob-object nmpc 'elements))
           (nmpc-elts-ls (if (ly:grob-array? nmpc-elts-array)
                   (ly:grob-array->list nmpc-elts-array)
                   '()))
           (sp-bl
             (filter
               (lambda (g) (grob::has-interface g 'span-bar-interface))
               nmpc-elts-ls))
           (sp-bl-glyphs
              (map (lambda (g) (ly:grob-property g 'glyph-name)) sp-bl)))
     (if (every (lambda (gl) (not (string=? "|" gl))) sp-bl-glyphs)
         '(-inf.0 . +inf.0)
         '(0 . 0)))))



link = {
  \once \override Score.RehearsalMark.self-alignment-X = #LEFT
  \mark \markup \normalsize {
        \with-url #"http://lilybin.com/wmw4xx/6"; "http://lilybin.com/wmw4xx/6";
  }
}

redspn = \once \override Score.SpanBar.color = #red
grnbar = \once \override Score.BarLine.color = #green

notes = {
  \link
  c1 \redspn | \repeat volta 2 { c | c \grnbar | c } | c | c | c \bar "|."
}

words = \lyricmode {
  Breathes | \markup { \with-color #red breathes } |
  br | \markup { \with-color #green breathes } |
  breathes | br | breathes |
}

\score {
  \new ChoirStaff <<
    \new Staff \relative c'' \notes \addlyrics \words
    \new Staff \relative c'' \notes
  >>

  \layout {
    indent = 0
    \context {
      \ChoirStaff
      \consists "Span_bar_engraver"
      \override BarLine.allow-span-bar =
        #(lambda (grob)
           (if (or (= -1 (ly:item-break-dir grob))
                   (not (string=? (ly:grob-property grob 'glyph-name) "|")))
               #t
               #f))
    }
     \context {
       \Lyrics
       \override LyricText.extra-spacing-height =
         #set-extra-spacing-height-for-span-bars
     }
  }
}



Cheers,
  Harm



reply via email to

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