https://codereview.appspot.com/557500043
This will automatically tackle all kinds of not-yet resolved positioning problems caused by the current French beaming implementation.
As this is quite a radical and complete re-design of the LilyPond's current French beaming approach, I've decided to open up this issue because a general French beaming overhaul can not be associated with individual bug-related issues.
The only difference between standard and French beaming should be that French "inner group" stems will not pass through all the beams. That's all! It's as easy as this!
Unfortunately, all that Elaine Gould has to say about French beaming is: "don't do it!".
The current approach to generally shorten French stems from the very beginning causes many follow-up positioning problems that have to be remedied later-on in many different places by neutralizing this deviation somehow.
Tuplet numbers (w/o tuplet bracktes) have already been dealt with, but many other problems stil remain.
I'll attach an Old French Beaming Comparison PDF demonstrating a full-range test of all kinds of French beaming cases produced by the current implementation (2.19.84, but the output is identical to 2.20 and current 2.21). They are erroneous (i.e. deviating from standard beaming) in most of the cases - please have a look!
Standard and French beaming side-by-side so that all the deviations can easily be spotted.
Prerequisite: a new stem-interface property "french-correction" (pun intended).
After uploading my patch to Rietveld, I'll attach another PDF, showing how the new French beaming functionality will deal with all these cases.
Cheers,
Torsten
PS: New French Beaming Comparison PDF attached.
Diff:
Issue 5788: New French Beamimg Approach
Completely new approach to French beaming.
This will automatically tackle all kinds of not-yet resolved positioning
problems caused by the current French beaming implementation.
==========
BASIC IDEA
==========
Hypothesis: The only difference between standard and French beaming
is that French "inner group" stems will not pass through
all the beams.
THAT'S ALL! Nothing else about it!
The current approach to generally shorten French stems from the very
beginning causes many follow-up positioning problems that have to
be remedied later-on in many different places by neutralizing this
deviation somehow.
Tuplet numbers (w/o tuplet brackets) have already been dealt with, but
many other problems still remain.
GENERAL SOLUTION (in short)
beaming at all (quite radical, but extremely helpful)
the standard beaming case
has to be shortened by the appropriate amount.
GENERAL SOLUTION (more detailed)
stem lenghts throughout for all calculations so that everything exactly
matches the standard beaming case automatically.
calculations in several ways:
correctly for standard length beams and there's no need at all for
introducing more and more exceptions for French beams
articulations, fingerings, text scripts and they must behave
as if all the stems had standard length (property unchanged!) for
vertical positioning of grobs aligned to the stem ends.
becomes relevant.
So only the ly:stem::pring function will actually need to know
about the new french-correction property, using (standard) "length"
property minus new "french-correction" property.
=============
MODIFICATIONS
=============
Mention that French beaming will now exactly behave like standard
beaming in all beam positionings and all articulation, fingering,
etc. placements will now be identical to the standard beaming case.
Show an example comparing standard/French beaming (w/o displaying
the coding, though. It's just about demonstrating the (now) exactly
matching positioning.
(existing) regression file. One beam positioning flaw (too far away
from the noteheads) can already be seen in the current test cases,
but I've added a few more examples containing exceptionally critical cases.
Introduce new property "french-correction"
Additional Real parameter for set_stem_positions to pass over
french_correction in order to be able to leave standard stem length
untouched and set both property "length" and "french-correction".
unaltered (i.e. "unfrenched") stem length
of the Stem
(for printing the correctly shortened stem)
Add new property "french-correction" to the interface
New struct Beam_stem_length
containing stem_y_ (as before, but unaltered by French beaming)
plus a french_correction_ containing the Frech beaming stem length
delta.
Boolean parameter "french" replaced by int value french_count
for passing over the individual number of beam translations the
stem has to be shortened by (if applicable;
0 for standard beaming or standard-length outer group French beams).
Junk (now) obsolete French beaming special treatment
respecting beam_translation and feather_factor
french_correction via new struc Beam_stem_length
Slices of the stem's beaming property
Call Stem::set_stem_positions now with an additional parameter
so that finally, both of the Stem properties "length" and
new "french-correction" can be set.
modified: lily/beam-quanting.cc
Junk (now) obsolete French beaming special treatment
a single Real value
REMARK: French beaming is irrelevant (and even obstructive) for beam
quanting (i.e. positioning) and so this feature is deliberately not
being used and when calling calc_stem_y, french_count 0 is being
passed over in any case to suppress unnecessary calculations.
modified: lily/tuplet-number.cc
Completely junk (now) obsolete French beaming special treatment,
no exceptions are needed anymore.
=========
IMPORTANT:
=========
All hitherto unresolved placement issues (articulations, fingerings, etc.)
caused by French beaming are automatically remedied by this completely
new French beaming approach, as we are using standard beam lenghts
throughout for all calculations, callbacks, positionings, minimum-length
rules, and so forth...
Cheers,
Torsten
https://codereview.appspot.com/557500043
Diff:
Diff:
Passes make, make check and a full make doc - comments on Rietveld
reg test diffs
Not taking into account the newly added examples in
input/regression/beam-french.ly
both regression files dealing with French beaming clearly show intentional deviations.
And, most importantly, the reg test difss prove that the new French beaming mechanism does not impair standard beaming.
So: "All's Well That Ends Well" [Shakespeare about stems]
Patch on countdown for Feb 28th
Changes applied following the reviewers' comments
https://codereview.appspot.com/557500043
Following Werner's suggesition, I added a new regression file directly comparing French beaming to standard beaming so that any deviation from standard will immediately catch one's eye.
When playing around with it, I was utterly surprised to find that in the original implementation, slurs didn't work, either.
Please find the reg test example attached (with old and new French beaming)
Final property name: french-beaming-stem-adjustment
https://codereview.appspot.com/557500043
This fails make
Blimey, in the final renaming (patch set 3) a semicolon at the end of a statement just vanished into thin air without me noticing.
How very embarrassing, sorry for that!
missing semicolon at end of statement (ahem...)
https://codereview.appspot.com/557500043
Passes make, make check and a full make doc - comments on Rietveld
Reg test diffs attached
Patch on countdown for March 3rd
Patch counted down - please push.
Patch formatted against current master attached.
Please push it for me.
Thanks,
Torsten
Pushed to staging (with a somewhat exuberant commit message) as
commit cf714372e43703b6a76e2abcfacbda912f66d662
Author: Torsten Hämmerle torsten.haemmerle@web.de
Date: Tue Feb 18 22:22:42 2020 +0100