bug-lilypond
[Top][All Lists]
Advanced

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

Feature request: some way of manually breaking slurs, ties and lyric ext


From: Ben Rudiak-Gould
Subject: Feature request: some way of manually breaking slurs, ties and lyric extenders
Date: Mon, 10 Dec 2012 22:24:29 -0800

I'd like to set rounds/catches in a part-parallel format, as seen
here, for example:

    http://hdl.handle.net/2027/wu.89008759938?urlappend=%3Bseq=81

This format is standard in books of rounds/catches at least back to
the 1800s, and it has obvious advantages (essentially the same as the
advantages of publishing anything in this format) so I think it's
worth adding support to LilyPond.

The difficulty is that sometimes slurs and other spanners extend
across part boundaries. There's no way to tell LilyPond that a spanner
started in one voice ends in another (and at an earlier time).

I've tried to work around this by inserting dummy systems with dummy
notes before and after the real systems and setting
keepAliveInterfaces = #'() to coerce Hara_kiri_engraver into deleting
them. This doesn't work very well: among other things, the deleted
systems seem to still influence vertical spacing, first-system indent
and ragged-last don't work, and there's no apparent way to append an
extra measure to the end of the last line as is sometimes needed. I
know there are other ways to tweak the output, but I don't want to
just approximate the right shape; I want LilyPond to use all of the
heuristics it already uses when breaking spanners so that I get
beautiful output without manual intervention. (Yes, I'm spoiled. But
also, there are a lot of rounds.)

There's a similar problem with spanners extending into repeat
alternatives. It would be nice to have a general solution there too
(\repeatTie only covers the simplest cases).

I have a few ideas:

1. Add context properties instructing spanners to draw themselves as
though they continue to the left/right even though, as far as LilyPond
is concerned, they don't.

   << { c' \override Slur.continueRight = ##t e'() }
      { \override Slur.continueLeft = ##t g'( c'') } >>

Based on my very limited understanding I think this would be easy to
implement. I'm not sure how it would work with ties and lyric
extenders -- maybe you'd need to introduce \tieRight, \tieLeft
(=\repeatTie), \lyricHyphenRight, etc. You'd need
\lyricHyphenLeftRight as well since sometimes a melisma spans an
entire part. Another problem is that since LilyPond doesn't know which
grobs are related to which, it can't ensure they're concave in the
same direction (and whatever else it does).

2. Introduce a note-like object with a similar effect:

   << { c' e'( \offscreen) }
      { \offscreen( g' c'') } >>

This works uniformly with all sorts of spanners, but I'm worried that
it would be harder to implement (?).

3. As above but give names to the breaks so that LilyPond understands
the relationship:

   << { c' \override Slur.continueTo = "x" e'() }
      { \override Slur.continueFrom = "x" g'( c'') } >>

   << { c' e'( \offscreen "x") }
      { \offscreen "x"( g' c'') } >>

Ideally, \alternative would automagically rewrite

    c'( \alternative { d') } { e') }

to something like

    c'( \offscreen "x" d') \offscreen "x"( e')

where "x" is a unique name, so that the syntax that people expect to
work actually does work. I'm not sure this could be made to work in
all cases, though. ~ and \! are tricky and \times is obviously
impossible.

4. Introduce some way for a voice to actually "fork" (at repeat
alternatives) or move backward in time (for rounds). I think this is
the most correct solution, but it would probably be hard.

Can anyone comment on the feasibility of any of this?

Thanks,

-- Ben



reply via email to

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