Thanks, everyone, for the detailed explanations and the proposed solution!

-Ahanu


On Sat, May 28, 2022 at 7:28 AM David Kastrup <[email protected]> wrote:

> Lukas-Fabian Moser <[email protected]> writes:
>
> > Hi Ahanu,
> >
> >> In lilypond 2.20.0, I was able to use "afterGrace" like this:
> >>
> >>     \version "2.20.0"
> >>     \language "english"
> >>     \relative c' { d2 \afterGrace 4 { cs16 d } }
> >>
> >> However, this now presents an error: "warning: \afterGrace exceeds
> >> duration of main argument". Running ly-convert does not fix it.
> >>
> >> If I change "\aftergrace 4" to "\aftergrace d4", it works
> >> fine. However, I have multiple documents written with the
> >> aforementioned syntax, and it would take a long time to fix them
> >> manually. Any suggestions?
> >
> > Actually, the example you posted gives a different warning because you
> > reduced it "too much".
> >
> > Here's what happens: \afterGrace accepts an optional argument
> > indicating the amount of time (as a fraction of the main note) after
> > which the grace should appear.
> >
> > In 2.20, this was defined via:
> >
> > #(define-music-function (fraction main grace) ((fraction?) ly:music?
> >  ly:music?) ...
> >
> > LilyPond now sees that 4 is not a fraction?, hence assumes no
> > "fraction" was given, and interprets 4 as ly:music? yielding the
> > "main" note. Then, { cs16 d } becomes the "grace" part, as intended by
> > you.
> >
> > In 2.22, the definition was changed to:
> >
> > #(define-music-function (fraction main grace) ((scale?) ly:music?
> >  ly:music?) ...
> >
> > Now scale? is defined (in c++.scm) as
> >
> > (define-public (scale? x)
> >   (or (and (rational? x) (exact? x) (not (negative? x)))
> >       (fraction? x)
> >       (and (ly:moment? x) (scale? (ly:moment-main x)))))
> >
> > meaning: A scale? can be
> > - a fraction?
> > - an non-negative exact rational number
> > - a LilyPond moment whose main part is in turn a scale?.
> >
> > This is fulfilled by 4, hence in your call to \afterGrace 4  { cs16 d },
> > ... 4 is taken to be the afterGrace "fraction" (and in recent
> > versions, there is the warning, added by me, that this fraction is
> > larger than 1)
> > ... { cs16 d } is taken to be the "main" note
> > ... whatever comes after is taken to be the "main" note (since in your
> > minimal example, nothing comes after this, compilation fails
> > completely).
> >
> > I'm not sure about David Kastrup's rationale for allowing a scale? as
> > an afterGraceFraction, but if anybody is aware about the implications
> > his changes might have for LilyPond's syntax, it's him.
> > https://gitlab.com/lilypond/lilypond/-/issues/5327
> >
> https://gitlab.com/lilypond/lilypond/-/commit/027538606b016afb643555d654cefaee94dfb424
>
> The respective commit is
>
> commit 027538606b016afb643555d654cefaee94dfb424
> Author: David Kastrup <[email protected]>
> Date:   Wed May 23 19:08:31 2018 +0200
>
>     Issue 5327/4: Let \afterGrace and \scaleDurations take a scale
>
>     That's more versatile than allowing just a fraction as a pair
>     as previously.
>
> "More versatile" means that you previously could use 3/4 but could not
> use #3/4 or the equivalent ##e.75 .  Those are acceptable as scale
> factors for durations like 1 * ##e.75 (and naturally also 1 * 4) so it
> seemed like it would make for a more natural specification of the
> (optional) scale factor to allow the predicate scale? here as well.
>
> It does have semantic conflict with the 2.20(?) feature of having
> isolated durations register as notes.
>
> Which was accepted as a music function argument only with
>
> commit 1d9fc4b1512eb69a28677890dc26658c3552c6cd
> Author: David Kastrup <[email protected]>
> Date:   Thu Feb 25 19:36:20 2016 +0100
>
>     Issue 4779: Accept isolated durations as music function arguments
>
> (later than the original feature) because I was queasy about the
> implications but it appeared that it was more confusing when this did
> not work.
>
> So it's a case of an emergent ambiguity that seemed like the lesser
> drawback and compatibility/coherence headache compared to not going
> ahead.
>
> For the optional argument of \afterGrace, there would be some incentive
> in case of a duration to interpret it as a duration rather than as a
> scale factor.  That would, however, make this different from either what
> \afterGraceFraction accepts, or what its name insinuates.  Also it would
> make the predicate scale? be an inadequate description of what the
> argument's type is which would functionally be
> non-duration-scale-or-duration? which of course has the exact same
> implementation.
>
> In short, a maze of conflicting considerations in the context of
> creating versatile and uniform behavior leading to a so-so outcome.
>
> --
> David Kastrup
>

Reply via email to