Menu

#4509 Enhancement: automatically engrave lyric extenders

Started
None
needs_work
Enhancement
2017-08-24
2015-07-18
Anonymous
No

Originally created by: *anonymous

Originally created by: simon.al...@mail.de

Actually, this is a content vs. presentation issue. The current approach has lyric extenders ‘hardcoded’ within the lyricmode input, whereas often it depends on layout whether I want an extender printed or not:
– In tight horizontal spacing, we might not need an extender, but when spacing is stretched, it might become necessary. This can come through different (page/line) breaking, parallel contexts present only in some editions (part vs. score), Completion_heads_engraver (mensural without barlines/transcription with barlines).
– Long syllables might not need an extender, where short syllables do.
– Often, all voices share the same text, but have extenders in different places. If extenders need not be given explicitly, the lyricmode input code can be reused much easier.

After all, the extenders don’t add any additional meaning, but only serve to improve legibility in such cases where they do.

This would require:
– Recognising the end of a word by absence of a hyphen.
– Comparing printed length of the melisma notes vs. the syllable, likely after line breaking. After all, extenders will never influence horizontal spacing. They might, however, affect vertical spacing. (unless we chose to omit (or shift) the extender in that case?)
– Personally, I think very short extenders shouldn’t be printed. There should be some kind of threshold.
It’s also one of the usecases where a proper representation of a ‘lyric word’ would be helpful, along with issue 2458.

Possibly related:
issue 4098

Version 2.12 had this listed as a Known issue.

https://codereview.appspot.com/313240043 )

1 Attachments

Related

Issues: #2458
Issues: #4098
Issues: #5018

Discussion

<< < 1 2 3 4 5 > >> (Page 4 of 5)
  • Anonymous

    Anonymous - 2017-01-24
    • Needs: -->
    • Patch: new --> review
    • Type: --> Enhancement
     
  • Anonymous

    Anonymous - 2017-01-24

    Passes make, make check and a full make doc.

     
    • Anonymous

      Anonymous - 2017-01-24

      and, forgot to say, that the reg tests diffs are identical to those attached to this tracker.

       
  • Knut Petersen

    Knut Petersen - 2017-01-26

    The last patchsets corrects the problem David pointed out. We should release this now.

     
  • David Kastrup

    David Kastrup - 2017-01-26

    Stupid question (as my browser and Sourceforge are a very bad combination with long issues frequently locking up with Javascript issues): the screenshot of the regtest differences attached directly to the issue description is still reflecting the current state?

    I find it somewhat weird that in the last example, a short extender from one "la" on 4 16th notes is removed while on the next identical phrase a long extender is added.

    Also the extender reaching into a grace note is shortened to before a rest while the next syllable only starts after the grace note. In contrast to the previous version, I don't actually know how to sing that.

    It's somewhat strange that an automatism for adding extenders would show so few changes (almost all of them are explicitly removed or shortened extenders, and the only added extender appears to be in connection with melisma settings). Or do we just have so few relevant examples?

     
    • Alexander Kobel

      Alexander Kobel - 2017-01-26

      Heh, questions that I can actually answer with confidence... ;-) Yes, it's the current state.

      For the "la" on 4, there actually is no melisma - the corresponding note is only the e''4. (Note that both lyric lines are assigned to the middle voice; the first and third staff just contain noise that has nothing to do at all with the lyrics.) Hence, the superfluous stub extender is removed.

      W.r.t. the graces, classical notation rules demand that syllables are not printed below grace notes, but on the main note. I agree that's strange, but that's how it is according to the old school - use your favorite search engine with "lilypond lyrics grace notes" to find samples. There's an includeGraceNotes property to adjust that, but it's not in use in this regtest.
      However, and here it becomes really ridiculous, even with the old version you were supposed to start the third "da" already on the graces. So the extender over the graces used to be extremely misleading, if not plainly wrong. This behavior is configurable (which makes sense if there would be no rest, and the previous syllable should last over the graces).

      And yes, we do have so little relevant examples. We hardly have melismata with lyrics in regtests, and if so, then extenders have been added explicitly to provide a visual cue whether the melisma is recognized.

       
  • Anonymous

    Anonymous - 2017-01-28

    Patch on countdown for Jan 30th.

     
  • Anonymous

    Anonymous - 2017-01-28
    • Description has changed:

    Diff:

    --- old
    +++ new
    @@ -19,3 +19,6 @@
     [issue 4098](#4098)
    
     [Version 2.12](http://lilypond.org/doc/v2.12/Documentation/user/lilypond/Aligning-lyrics-to-a-melody#Multiple-notes-to-one-syllable) had this listed as a Known issue.
    +
    +
    +https://codereview.appspot.com/313240043 )
    
    • Patch: review --> countdown
     

    Related

    Issues: #4098

  • David Kastrup

    David Kastrup - 2017-01-29

    The basic problem I have with this approach is that this patch is doing two things:

    The first is to decide whether the user might want an extender when he did not explicitly ask for it. I am ok with that part. And I think there is input ("" or so) to actually override that decision.

    The second is to decide that the user is no longer allowed to explicitly ask for an extender. That is a consequence of implementing the first half of the issue in a manner where it is impossible to find out whether the user asked explicitly for an extender because extenders are placed in the music expression automatically.

    I am not on board with that approach. Now it is comparatively easy for the extender engraver to look at the process_music stage whether or not there was an explicit extender and take different action depending on that. So there is no real necessity for stopping the music expression from representing the actual input.

    Now this would be a comparatively simple change to your work, except that those commits resulting from the decision not to allow/heed explicit extenders to be input would not be present.

    I would therefore suggest that you push your current work (assuming that it is structured into several commits) to a branch origin/heads/dev/issue4509 or so so that I am able to propose changes which will allow automatic insertion of extenders without messing with manually inserted extenders (apart from the changes in their appearance implied by this patch, but not whether they appear at all).

    This would also make it comparatively easy to use an override for regaining the previous behavior, namely only putting in explicitly requested extenders. This would be beneficial for people wanting to write an Urtext edition having extenders if and only if the original showed them.

     
    • Knut Petersen

      Knut Petersen - 2017-01-29

      I'm sure that you properly studied the patch you are commenting.

      For all those who did not: The following lilypond source demonstrates how to generate only explicitly requested extenders:

      \version "2.19.55"
      
      \paper { ragged-right = ##f  }
      
      noex = { \override LyricExtender.no-extender = ##t }
      ex   = { \once \override LyricExtender.no-extender = ##f }
      
      { 
          \repeat unfold 4 { c''1 2 ~ 2 } \bar "|."
      } 
      \addlyrics { 
          \noex foo -- bar foo --  \ex bar 
          foo -- bar foo -- bar
      }
      
      \layout { }
      
       
      • David Kastrup

        David Kastrup - 2017-01-29

        I'm sure that you properly studied the patch you are commenting.

        For all those who did not: The following lilypond source demonstrates how to generate only explicitly requested extenders:

        Well, I think we can agree that we are not going to require everybody who wants to use LilyPond to study patches rather than the documentation. Those who actually studied the documentation part of the patch would likely use \forceExtender to actually force an explicitly requested extender (which was what I was talking about) though it is not clear how this would interact with the no-extender property without studying the patch. The point was that we already had a user interface for forcing an extender.

        At any rate: is there any problem preventing pushing the branch that this was developed in as refs/heads/dev/issue4509 so that I can take a look at making it accept explicit extender events with the previous syntax?

         
        • Knut Petersen

          Knut Petersen - 2017-01-29

          No, there's no problem to delay the patch for some time if you want to improve it.

           
          • David Kastrup

            David Kastrup - 2017-01-29

            Whether it is an improvement will likely be subject to debate. Making its input and semantics blend smoother with previous behavior and expectations could make a different with regard to its suitability for inclusion into version 2.20. Partly because it would disrupt people's expectations and workflows less, partly because there would be less of a settling time needed for behavior and documentation before one can be reasonably sure that they'll stick around for good.

            I'd like to have a pitch at making this a smoother change without sacrificing its advantages.

             
            • Knut Petersen

              Knut Petersen - 2017-01-29

              I'd like to have a pitch at making this a smoother change without sacrificing its advantages.

              @David: I look forward to see your proposals.

              @pkx166h: I might be stupid, but I vote to give David a chance to present a patchset #10 ...

               
              • David Kastrup

                David Kastrup - 2017-01-29

                Is there an actual branch to work with? Or is the best bet to check in all review diffs in sequence?

                 
                • Alexander Kobel

                  Alexander Kobel - 2017-01-30

                  I guess so. I obviously have a local branch from which I git-cl'ed everything to Rietveld, but I have no write access to any official repo to open a branch. If you have a good suggestion how to hand over that code history entirely, let me know, but it's really nothing more than the diffs there.

                  By the way, looking forward to your improvements.

                   
                  • David Kastrup

                    David Kastrup - 2017-01-30

                    In a branch with an upstream, git send-email should work (assuming that a working Email system is set up). Otherwise, git format-patch and sending of all generated files as attachments.

                    And I would not really call what I want to do "improvement": it's more like trying to provide the same kind of functionality in a manner more conservative of current interfaces and input. I'd really like to have a change in the manner of "to get the previous behavior, use the following settings" rather than "if you have already run convert-ly, the necessary information is gone from your source file anyway".

                     
                    • Alexander Kobel

                      Alexander Kobel - 2017-01-30

                      You've got mail.

                      I wish you would have been in for that discussion a few days earlier, but of course I know and understand the reasons why you're late to the party (and so does everybody else, I'm sure). We already spent some thought about that; e.g., that's why we decided to keep __ around as deprecated rather than purge it completely. Anyway, looking forward to your suggestions. ;-)

                       
                      • David Kastrup

                        David Kastrup - 2017-01-30

                        I wish you would have been in for that discussion a few days earlier, but of course I know and understand the reasons why you're late to the party (and so does everybody else, I'm sure).

                        Well, I was busy with work that was a whole lot better paid while leaving me with rather little room for creative input on the end product. So I try adjusting to the old balance in LilyPond again... Or something.

                        Believe it or not, but my issue 1375 proposal is also about lyrics: I want to finish off the lyricsto in non-Bottom context thing properly, and I need a melisma-translator for that (so that it works equally well in midi and in layout) and that means I need to be able to follow a dynamic set of events (like slur-events and phrasing-slur-events) with spanner-id s over different contexts and that means that I need first class scheme translators (since C++ translators don't allow a variable set of events to listen for). So far, I am at the scheme engraver stage. So that's a very long shot and I have no idea whether it will indeed make it to 2.20 but most of the parts don't involve changes affecting users and their existing input a whole lot.

                        So one can take those as they come and see whether one crosses the threshold of being too disruptive to make it into the next stable release.

                        And this patch, as it stands, crosses that threshold. And I think maybe one could get it below that threshold without having to compromise on the goals it tries to achieve. Or at least split it into a part that can go in now and one that would want to mature in the next stable release cycle.

                        Basically, I see this issue as deciding when and where the 2.20 release branch needs to get split off. In the current form, I'd say it warrants half a year of developer releases for testing and refining its way of interfacing with the user. If it can mostly stick with the old way, that is unneeded since it's no major difference to previously. One can then still bring forward major interface change and have it mature under user feedback in the developer branch if it turns out that extending the old interface is leading to more long-term problems than one wants to carry around permanently.

                         
  • Anonymous

    Anonymous - 2017-01-30

    I am going to leave this on countdown (for now) as it looks like much more discussion is needed by those that know far more than I.

    If this dicussion can be held irrespective of this patch being pushed or not, it has reached 'Push' stage, so if someone more senior than I wants to make that decision then so be it. Else if nothing changes for the next countdown I will put this back to 'needs work'.

     
  • David Kastrup

    David Kastrup - 2017-01-30

    Uh, the dog ate my posting? Another try: the principal work should be just this (trying to get along without no-extender and force-extender properties):

     
    • Alexander Kobel

      Alexander Kobel - 2017-01-31

      Argh, Ctrl-W ate my posting...

      AFAICS, with your patch the LyricExtender engraving routines are called irregardless of the existence of an ExtenderEvent, right? So an ExtenderEvent doesn't have to appear even internally anymore? Sounds like the cleanest approach to me.

      Now, please don't get me wrong on the following. I appreciate that you participate in that issue, and I value your insight on both the architectural and the UI side a lot. I just want to make sure that you are aware of the thoughts we spent on that issue around the turn of the year, and save everybody time and discussions.

      I'm somewhat shivering to hear the you want to "get along without no-extender and force-extender". Are you talking about the internals and/or the UI here?
      no-extender is important in some cases, e.g. to replicate sources without extenders or for special-purpose lyrics (e.g., I'm thinking of functional analysis symbols). 'collapse-length = #+inf.0 should be functionally equivalent, but some people expressed the (reasonable, IMHO) desire that collapse-length should be decoupled from an on-/off-toggle.
      Forced extenders are required for some manual tweaks or, again, special purposes such as lone notes before volta repeats, where an extender into the second repeat bracket needs to be indicated. (BTW, there have been wishes that the mutually exclusive collapse-length and forced-length are not merged into one property.)

      Starting from scratch, I'd opt for translating the __ token to forced extenders. However, a reinterpretation of __ was not well-received. Also, ignoring and deprecating __ for a while leaves lyrics (with manual extenders) compatible between 2.19.55+some and earlier (in particular, 2.18.x) versions.

      Again, all these points have been discussed in a heap of mails on -devel end of 2016. Just to make sure we are on the same page.

       
      • David Kastrup

        David Kastrup - 2017-01-31

        "Alexander Kobel" akobel@users.sf.net writes:

        Argh, Ctrl-W ate my posting...

        Ctrl-Z did not restore it?

        AFAICS, with your patch the LyricExtender engraving routines are
        called irregardless of the existence of an ExtenderEvent, right? So an
        ExtenderEvent doesn't have to appear even internally anymore? Sounds
        like the cleanest approach to me.

        It's cleaner for the representation and it frees actual extenders to
        carry meaning. More importantly, it makes old sources continue to work
        as expected.

        Now, please don't get me wrong on the following. I appreciate that you
        participate in that issue, and I value your insight on both the
        architectural and the UI side a lot. I just want to make sure that you
        are aware of the thoughts we spent on that issue around the turn of
        the year, and save everybody time and discussions.

        Yes, this sucks. I am not proud of it either. The reason I mess like
        that so late in the game is that I'd like a version of this to go into
        2.20, and for that, the interfaces should have stabilized. And nothing
        is more stable like using preexisting interfaces.

        It does not help that right now I am having a fever. That does not
        necessarily make me more coherent and I'll probably have to go back to
        bed soonish.

        I'm somewhat shivering to hear the you want to "get along without
        no-extender and force-extender". Are you talking about the
        internals and/or the UI here?

        In a manner, both, but mainly the UI.

        no-extender is important in some cases, e.g. to replicate sources
        without extenders or for special-purpose lyrics (e.g., I'm thinking of
        functional analysis symbols). 'collapse-length = #+inf.0 should be
        functionally equivalent, but some people expressed the (reasonable,
        IMHO) desire that collapse-length should be decoupled from an
        on-/off-toggle.

        My first thought here was to just use \omit LyricExtender : that would
        have perfectly matched preexisting functionality. However, this
        replaces the stencil with #f and there is no way to resurrect it by
        writing . One would have to write something like \once\undo\omit
        LyricExtender syllable
        and that would suck.

        Setting collapse-length to #+inf.0 would save a property but not a user
        interface. Since no-extender does not actually cause no extender (they
        can still be forced), I'd prefer something like automatic-extenders, a
        property that can be switched off but is on by default.

        However, there is no real point in creating extenders that are known to
        get thrown away: if engravers look for extenders, it would be best if
        the equivalent of no-extenders would stop an extender grob to be created
        at all, again making it easy to recover previous behavior.

        Forced extenders are required for some manual tweaks or, again,
        special purposes such as lone notes before volta repeats, where an
        extender into the second repeat bracket needs to be indicated. (BTW,
        there have been wishes that the mutually exclusive collapse-length
        and forced-length are not merged into one property.)

        I'll have to read up on it.

        Starting from scratch, I'd opt for translating the __ token to
        forced extenders. However, a reinterpretation of __ was not
        well-received.

        It isn't an actual reinterpretation as far as I see it: by setting the
        equivalent of no-extenders you'll get back the previous behavior
        exactly.

        Also, ignoring and deprecating __ for a while leaves lyrics (with
        manual extenders) compatible between 2.19.55+some and earlier (in
        particular, 2.18.x) versions.

        Where do you see any incompatibility in my proposal.

        Again, all these points have been discussed in a heap of mails on
        -devel end of 2016. Just to make sure we are on the same page.

        I'll read up on it. Sorry for this mess.

        --
        David Kastrup

         
        • David Kastrup

          David Kastrup - 2017-01-31

          "David Kastrup" dakas@users.sf.net writes:

          "Alexander Kobel" akobel@users.sf.net writes:

          Forced extenders are required for some manual tweaks or, again,
          special purposes such as lone notes before volta repeats, where an
          extender into the second repeat bracket needs to be indicated. (BTW,
          there have been wishes that the mutually exclusive collapse-length
          and forced-length are not merged into one property.)

          I'll have to read up on it.

          Starting from scratch, I'd opt for translating the __ token to
          forced extenders. However, a reinterpretation of __ was not
          well-received.

          It isn't an actual reinterpretation as far as I see it: by setting the
          equivalent of no-extenders you'll get back the previous behavior
          exactly.

          Also, ignoring and deprecating __ for a while leaves lyrics (with
          manual extenders) compatible between 2.19.55+some and earlier (in
          particular, 2.18.x) versions.

          Where do you see any incompatibility in my proposal.

          Again, all these points have been discussed in a heap of mails on
          -devel end of 2016. Just to make sure we are on the same page.

          I'll read up on it. Sorry for this mess.

          Ok, I read up about half of it. This is embarrassing since Knut's
          original design and thoughts were a lot closer to what I would have
          considered good practice than what he let himself be persuaded to
          change. So I cannot really blame him and others for being miffed at my
          very late start into that issue. When reading those discussions, I go
          somewhat like

          ok, good, ok, bad idea, good, why?, good, what?, well if you do that you
          sort of have to, ok, ok...

          So the problem is that there is really no good way to hook into those
          discussions after the fact and let them converge on something else.
          Particularly when that "something else" was already almost there.

          I'll be able to justify most of my proposals (or step back from them),
          but it's really bad that I made others waste time, effort, planning,
          focus, persuasion on different plans.

          I don't know how to get this back on track in a manner where everybody
          involved feels good about the work he did on this issue.

          --
          David Kastrup

           
          • Alexander Kobel

            Alexander Kobel - 2017-01-31

            Hi David, hi Knut, hi all.

            On 2017-01-31 12:31, David Kastrup wrote:

            "David Kastrup" dakas@users.sf.net dakas@users.sf.net writes:

            "Alexander Kobel" akobel@users.sf.net <mailto:akobel@users.sf.net>
            writes:
            
                Forced extenders are required for some manual tweaks or, again,
                special purposes such as lone notes before volta repeats, where an
                extender into the second repeat bracket needs to be indicated. (BTW,
                there have been wishes that the mutually exclusive |collapse-length|
                and |forced-length| are not merged into one property.)
            
            I'll have to read up on it.
            

            Sure; that's all I wanted to achieve.

                Starting from scratch, I'd opt for translating the |__| token to
                forced extenders. However, a reinterpretation of |__| was not
                well-received.
            
            It isn't an actual reinterpretation as far as I see it: by setting the
            equivalent of no-extenders you'll get back the previous behavior
            exactly.
            

            Ah, okay; I misunderstood your proposal there.

                Also, ignoring and deprecating |__| for a while leaves lyrics (with
                manual extenders) compatible between 2.19.55+some and earlier (in
                particular, 2.18.x) versions.
            
            Where do you see any incompatibility in my proposal.
            

            None (yet); I guess after the earlier discussion about the \tweak ...
            syntax in the snippet, I was misled to think that you want to give a new
            meaning to
            .
            I just want to save you time and make sure that you don't miss some
            design goals of the previous proposal that likely should be considered
            in any new version.

                Again, all these points have been discussed in a heap of mails on
                -devel end of 2016. Just to make sure we are on the same page.
            
            I'll read up on it. Sorry for this mess.
            

            Ok, I read up about half of it. This is embarrassing since Knut's
            original design and thoughts were a lot closer to what I would have
            considered good practice than what he let himself be persuaded to
            change. So I cannot really blame him and others for being miffed at my
            very late start into that issue.

            I can only speak for myself, but I'm not miffed by any means - sorry if
            that's the impression I made. And I assume that I'm #2 after Knut in the
            involvement list for this issue, with some noticeable gap.

            When reading those discussions, I go somewhat like

            ok, good, ok, bad idea, good, why?, good, what?, well if you do that you
            sort of have to, ok, ok...

            So the problem is that there is really no good way to hook into those
            discussions after the fact and let them converge on something else.
            Particularly when that "something else" was already almost there.

            I think I have a fairly good understanding of the user perspective, some
            idea about the implementability, but by no means a clear picture of the
            architectural implications or the long-term trouble that a specific
            choice of implementation might cause. And I definitely know that you are
            the one I trust the most in that regard.

            I'll be able to justify most of my proposals (or step back from them),
            but it's really bad that I made others waste time, effort, planning,
            focus, persuasion on different plans.

            No need to apologize as far as I'm concerned. First, I'm not in a hurry
            here. Second, I trust that you have reasons beyond my horizon, and that
            you're not jumping on the wagon out of sadistic or masochistic motivation.

            I'm happy to offer my help if you want a summary of design goals and/or
            UI considerations that arose during the past weeks. (By the way: also
            via phone, if that's a reasonable option for you.) And I'll try not to
            comment on the backend... ;-)

            I don't know how to get this back on track in a manner where everybody
            involved feels good about the work he did on this issue.

            Don't worry - I hope there's no reason.

            Cheers,
            Alexander

             
<< < 1 2 3 4 5 > >> (Page 4 of 5)