@@ -7248,7 +7248,7 @@ Note* MusicXmlParserPass2::note(const String& partId,
72487248 // handle notations
72497249 if (cr) {
72507250 notations.addToScore (cr, note,
7251- noteStartTime. ticks () , m_slurs, m_glissandi, m_spanners, m_trills, m_ties, m_unstartedTieNotes,
7251+ noteStartTime, m_slurs, m_glissandi, m_spanners, m_trills, m_ties, m_unstartedTieNotes,
72527252 m_unendedTieNotes, arpMap, delayedArps);
72537253
72547254 // if no tie added yet, convert the "tie" into "tied" and add it.
@@ -8187,7 +8187,7 @@ void MusicXmlParserNotations::slur()
81878187// addSlur
81888188// ---------------------------------------------------------
81898189
8190- static void addSlur (const Notation& notation, SlurStack& slurs, ChordRest* cr, Note* note, const int tick,
8190+ static void addSlur (const Notation& notation, SlurStack& slurs, ChordRest* cr, Note* note, const Fraction& tick,
81918191 MusicXmlLogger* logger, const XmlStreamReader* const xmlreader)
81928192{
81938193 int slurNo = notation.attribute (u" number" ).toInt ();
@@ -8212,8 +8212,9 @@ static void addSlur(const Notation& notation, SlurStack& slurs, ChordRest* cr, N
82128212 } else if (slurs[slurNo].isStop ()) {
82138213 // slur start when slur already stopped: wrap up
82148214 Slur* newSlur = slurs[slurNo].slur ();
8215+ slurs[slurNo] = SlurDesc ();
8216+
82158217 if (newSlur->endElement () == cr && note) {
8216- slurs[slurNo] = SlurDesc ();
82178218 delete newSlur;
82188219
82198220 // Slur starts & ends on same chord - add lv instead
@@ -8222,16 +8223,16 @@ static void addSlur(const Notation& notation, SlurStack& slurs, ChordRest* cr, N
82228223 note->score ()->undoAddElement (lvTie);
82238224 return ;
82248225 }
8225- newSlur->setTrack (track);
8226- newSlur->setTick (Fraction::fromTicks (tick));
8227- newSlur->setStartElement (cr);
8228- newSlur->setTick2 (newSlur->endElement ()->tick ());
8229- if (newSlur->ticks ().negative ()) {
8226+ const Fraction tick2 = newSlur->endElement ()->tick ();
8227+ if (tick2 < tick) {
82308228 logger->logError (String (u" slur end is before slur start" ), xmlreader);
8231- slurs[slurNo] = SlurDesc ();
82328229 delete newSlur;
82338230 return ;
82348231 }
8232+ newSlur->setTrack (track);
8233+ newSlur->setTick (tick);
8234+ newSlur->setStartElement (cr);
8235+ newSlur->setTick2 (tick2);
82358236 score->addElement (newSlur);
82368237 } else {
82378238 // slur start for new slur: init
@@ -8251,7 +8252,7 @@ static void addSlur(const Notation& notation, SlurStack& slurs, ChordRest* cr, N
82518252 }
82528253 newSlur->setVisible (notation.visible ());
82538254 colorItem (newSlur, Color::fromString (notation.attribute (u" color" )));
8254- newSlur->setTick (Fraction::fromTicks ( tick) );
8255+ newSlur->setTick (tick);
82558256 newSlur->setStartElement (cr);
82568257 if (configuration ()->importLayout ()) {
82578258 const String orientation = notation.attribute (u" orientation" );
@@ -8274,9 +8275,9 @@ static void addSlur(const Notation& notation, SlurStack& slurs, ChordRest* cr, N
82748275 if (slurs[slurNo].isStart ()) {
82758276 // slur stop when slur already started: wrap up
82768277 Slur* newSlur = slurs[slurNo].slur ();
8278+ slurs[slurNo] = SlurDesc ();
82778279
82788280 if (newSlur->startElement () == cr && note) {
8279- slurs[slurNo] = SlurDesc ();
82808281 delete newSlur;
82818282
82828283 // Slur starts & ends on same chord - add lv instead
@@ -8287,11 +8288,10 @@ static void addSlur(const Notation& notation, SlurStack& slurs, ChordRest* cr, N
82878288 }
82888289
82898290 if (!(cr->isGrace ())) {
8290- newSlur->setTick2 (Fraction::fromTicks ( tick) );
8291+ newSlur->setTick2 (tick);
82918292 newSlur->setTrack2 (track);
82928293 }
82938294 newSlur->setEndElement (cr);
8294- slurs[slurNo] = SlurDesc ();
82958295 score->addElement (newSlur);
82968296 } else if (slurs[slurNo].isStop ()) {
82978297 // slur stop when slur already stopped: report error
@@ -9335,14 +9335,14 @@ void MusicXmlParserNotations::addNotation(const Notation& notation, ChordRest* c
93359335 as in that case note is a nullptr.
93369336 */
93379337
9338- void MusicXmlParserNotations::addToScore (ChordRest* const cr, Note* const note, const int tick, SlurStack& slurs,
9338+ void MusicXmlParserNotations::addToScore (ChordRest* const cr, Note* const note, const Fraction& tick, SlurStack& slurs,
93399339 Glissando* glissandi[MAX_NUMBER_LEVEL ][2 ], MusicXmlSpannerMap& spanners,
93409340 TrillStack& trills, MusicXmlTieMap& ties, std::vector<Note*>& unstartedTieNotes,
93419341 std::vector<Note*>& unendedTieNotes, ArpeggioMap& arpMap,
93429342 DelayedArpMap& delayedArps)
93439343{
93449344 addArpeggio (cr, m_arpeggioType, m_arpeggioNo, m_arpeggioColor, arpMap, delayedArps);
9345- addWavyLine (cr, Fraction::fromTicks ( tick) , m_wavyLineNo, m_wavyLineType, spanners, trills, m_logger, &m_e);
9345+ addWavyLine (cr, tick, m_wavyLineNo, m_wavyLineType, spanners, trills, m_logger, &m_e);
93469346
93479347 for (const Notation& notation : m_notations) {
93489348 if (notation.symId () != SymId::noSym) {
@@ -9367,7 +9367,7 @@ void MusicXmlParserNotations::addToScore(ChordRest* const cr, Note* const note,
93679367 Dynamic* dynamic = Factory::createDynamic (m_score->dummy ()->segment ());
93689368 dynamic->setDynamicType (d);
93699369 colorItem (dynamic, m_dynamicsColor);
9370- m_pass2.addElemOffset (dynamic, cr->track (), m_dynamicsPlacement, cr->measure (), Fraction::fromTicks ( tick) );
9370+ m_pass2.addElemOffset (dynamic, cr->track (), m_dynamicsPlacement, cr->measure (), tick);
93719371 }
93729372}
93739373
0 commit comments