Re: quoting percent repeats

2023-05-18 Thread Jean Abou Samra
Le jeudi 18 mai 2023 à 13:10 -0400, Dan Eble a écrit :
> P.S. Include a regression test in your merge request. :)

If this deserves a regression test, wouldn't it deserve a ticket?




signature.asc
Description: This is a digitally signed message part


Re: quoting percent repeats

2023-05-18 Thread Dan Eble
On May 18, 2023, at 08:47, Valentin Petzel  wrote:
> 
> Essentially it checks: Do we start at the begin of a measure, and if so, does 
> or repeated music take exactly one or two measures?

I've dropped the user list from this thread.

I suggest looking at Percent_repeat_iterator::create_contexts().  There is code 
that reads context properties.

Next, read the comment on Music_iterator::create_contexts().  This is the 
salient point:

// Think twice before reading context properties here.  Other iterators'
// process () methods may run after this call and before this iterator's
// process () method runs (and may change the context properties).

Therefore, try deferring the Percent_repeat_iterator's initialization that 
depends on context properties until the first call to process().

You are right that quoting on the whole does not smell sweet, and I don't have 
time now to list the remaining problems I see, but taking the above action 
might mitigate the problem at hand.
— 
Dan

P.S. Include a regression test in your merge request. :)




Re: quoting percent repeats

2023-05-18 Thread Valentin Petzel
Hello Paul,

while I’m not entirely sure what is going on there it seems like the iterator 
for quoted music is messing with the logic of the iterator for percent 
repeated music. This is done not by the engraver, but by the iterator. 
Basically the iterator decides on whether to create PercentReapeat, 
DoublePercentRepeat or RepeatSlash by determining whether the repeated music 
as well as the first repeat starts on the start of a measure (that is, main 
part of measure position > 0) and if the current measure is by 1 (Percent) or 
by 2 (Double Percent) higher than the starting measure.

Essentially it checks: Do we start at the begin of a measure, and if so, does 
or repeated music take exactly one or two measures?

Here this check seems to fail, so Lilypond defaults to Repeat slashes.

I’ve added some debug output to the code in question, which returned that in 
fact the measure position is always 0 and the internal bar number unset for 
the quoted music. This seems to imply that in the quoted case the music stream 
is iterated all at the beginning.

###
Upon further investigation (sorry, I’m not motivated enough to reword the 
above): It seems like the quoted music is in fact iterated during addQuote.

So this means we have two conflicting assumptions there: The percent repeat 
iterator assumes that it may depend on the current timing position, while the 
quoting system assumes that this is not done.

This particular problem should be solvable by shifting the decision of what 
type of repeat to create into the engraver rather than the iterator. But on 
more general terms I think this is a problem of the quoting system, as we do 
have more than just this one iterator that depend on timing information, such 
as grace notes, which cause similar problems:

anotes = \fixed c' {
   \time 2/4 \grace { a'8 b' } a'2
}
\addQuote qa \anotes

bnotes = \absolute{ \time 2/4 \quoteDuring qa s2 }
\score{ << \anotes \bnotes >> }

So the proper solution would be to actually change the mechanism of how 
quoting works, so that the quoted music is only iterated at the correct time. 
Maybe we could for example have quoted musics be iterated, but broadcasted to 
a special "sink", and the quoted music iterator would then simply take the 
events thus produced and broadcast them to the relevant contexts. This could 
even keep track of spanner events to keep track of currently active spanners, 
and handle situations like this:

anotes = \fixed c' {
   a2( a a a)
}
\addQuote qa \anotes

bnotes = \absolute{ a'1 \quoteDuring qa s1 }
\score{ << \anotes \bnotes >> }

I’ll CC this to devel for discussion.

Cheers,
 Valentin

Am Dienstag, 16. Mai 2023, 07:54:42 CEST schrieb Paul Scott:
> I asked about this 3 years and I don't remember getting a workable answer:
> 
> I would expect the two voices in the following MWE to have the same
> simple percent signs.  Is there a way get the expected result?
> 
> \version "2.25.4"
> 
> anotes = \fixed c' {
>\time 2/4 \repeat percent 2 { a2 } \repeat percent 2 { a16( g f g a8) b }
> }
> \addQuote qa \anotes
> 
> bnotes = \absolute{ \time 2/4 \quoteDuring qa s2*4 }
> 
> \score{ << \anotes \bnotes >> }
> 
> TIA,
> 
> Paul



signature.asc
Description: This is a digitally signed message part.