MeasureReader decides whether a note belongs to a chord by peeking at the next note, and the peek
skips every non-note sibling, including <backup> and <forward>
(src/private/mx/impl/MeasureReader.cpp:189-194). Given
<note>...<duration>4</duration></note>
<backup><duration>4</duration></backup>
<note><chord/>...</note>
the first note is marked isChord and does not advance time (MeasureReader.cpp:427-433). The
backup then moves before the measure start and is clamped to 0 (MeasureReader.cpp:586-590), so
the time positions that follow are wrong. The peek should stop at a <backup> or <forward>.
Related: #425. Found while auditing silent recoveries for #432 (#439).
MeasureReaderdecides whether a note belongs to a chord by peeking at the next note, and the peekskips every non-note sibling, including
<backup>and<forward>(
src/private/mx/impl/MeasureReader.cpp:189-194). Giventhe first note is marked
isChordand does not advance time (MeasureReader.cpp:427-433). Thebackup then moves before the measure start and is clamped to 0 (
MeasureReader.cpp:586-590), sothe time positions that follow are wrong. The peek should stop at a
<backup>or<forward>.Related: #425. Found while auditing silent recoveries for #432 (#439).