Skip to content

Commit

Permalink
Rough MusicXML import (measure containing MeasureRepeat element also …
Browse files Browse the repository at this point in the history
…contains whole rest, i.e. is corrupted)
  • Loading branch information
IsaacWeiss committed Aug 3, 2020
1 parent a3bfbdb commit 21d29e4
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 5 deletions.
43 changes: 39 additions & 4 deletions mu4/domain/importexport/internal/musicxml/importmxmlpass2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "libmscore/lyrics.h"
#include "libmscore/marker.h"
#include "libmscore/measure.h"
#include "libmscore/measurerepeat.h"
#include "libmscore/mscore.h"
#include "libmscore/note.h"
#include "libmscore/part.h"
Expand Down Expand Up @@ -1373,6 +1374,9 @@ void MusicXMLParserPass2::initPartState(const QString& partId)
_figBass = 0;
_multiMeasureRestCount = -1;
_extendedLyrics.init();
_measureRepeatsStarted = false;
_measureRepeatNumMeasures = 0;
_measureRepeatCount = 0;
}

//---------------------------------------------------------
Expand Down Expand Up @@ -1945,8 +1949,7 @@ static void addGraceChordsBefore(Chord* c, GraceChordList& gcl)
Parse the /score-partwise/part/measure node.
*/

void MusicXMLParserPass2::measure(const QString& partId,
const Fraction time)
void MusicXMLParserPass2::measure(const QString& partId, const Fraction time)
{
Q_ASSERT(_e.isStartElement() && _e.name() == "measure");
QString number = _e.attributes().value("number").toString();
Expand Down Expand Up @@ -2114,6 +2117,33 @@ void MusicXMLParserPass2::measure(const QString& partId,
measure->setBreakMultiMeasureRest(true);
}

// measure repeat handling
int staffIdx = _score->staffIdx(part);
if (_measureRepeatsStarted) {
// TODO: delete anything already added to measure
if (_measureRepeatCount == _measureRepeatNumMeasures) {
_measureRepeatCount = 1;
} else {
_measureRepeatCount++;
}

if (((_measureRepeatNumMeasures % 2) && (_measureRepeatCount - 1 == _measureRepeatNumMeasures / 2))
|| (!(_measureRepeatNumMeasures % 2) && (_measureRepeatCount == _measureRepeatNumMeasures / 2))) {
// MeasureRepeat element goes in center measure of group if odd-numbered,
// or last measure of first half of group if even-numbered
MeasureRepeat* mr = new MeasureRepeat(_score);
mr->setNumMeasures(_measureRepeatNumMeasures);
mr->setTrack(staff2track(staffIdx));
Segment* s = measure->getSegment(SegmentType::ChordRest, time + mTime);
s->add(mr);
mr->setDurationType(TDuration::DurationType::V_MEASURE);
mr->setTicks(measure->stretchedLen(_score->staff(staffIdx)));
}
} else {
_measureRepeatCount = 0;
}
measure->setMeasureRepeatCount(_measureRepeatCount, staffIdx);

// prevent tuplets from crossing measure boundaries
resetTuplets(tuplets);

Expand Down Expand Up @@ -2146,7 +2176,7 @@ void MusicXMLParserPass2::attributes(const QString& partId, Measure* measure, co
} else if (_e.name() == "key") {
key(partId, measure, tick);
} else if (_e.name() == "measure-style") {
measureStyle(measure);
measureStyle(partId, measure, tick);
} else if (_e.name() == "staff-details") {
staffDetails(partId);
} else if (_e.name() == "time") {
Expand Down Expand Up @@ -2309,7 +2339,7 @@ void MusicXMLParserPass2::staffTuning(StringData* t)
Initializes the "in multi-measure rest" state
*/

void MusicXMLParserPass2::measureStyle(Measure* measure)
void MusicXMLParserPass2::measureStyle(const QString& partId, Measure* measure, const Fraction& tick)
{
Q_ASSERT(_e.isStartElement() && _e.name() == "measure-style");

Expand All @@ -2323,6 +2353,10 @@ void MusicXMLParserPass2::measureStyle(Measure* measure)
} else {
_logger->logError(QString("multiple-rest %1 not supported").arg(multipleRest), &_e);
}
} else if (_e.name() == "measure-repeat") {
QString startStop = _e.attributes().value("type").toString();
_measureRepeatsStarted = (startStop == "start" ? true : false);
_measureRepeatNumMeasures = _e.readElementText().toInt();
} else {
skipLogCurrElem();
}
Expand Down Expand Up @@ -4400,6 +4434,7 @@ Note* MusicXMLParserPass2::note(const QString& partId,
headGroup = convertNotehead(_e.readElementText());
} else if (_e.name() == "rest") {
rest = true;
// rest = (_measureRepeatCount == 1 ? false : true); // MeasureRepeat replaces rest
mnp.displayStepOctave(_e);
} else if (_e.name() == "staff") {
auto ok = false;
Expand Down
5 changes: 4 additions & 1 deletion mu4/domain/importexport/internal/musicxml/importmxmlpass2.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ class MusicXMLParserPass2
void measChordFlush(/*, ChordRest& currChord */);
void measure(const QString& partId, const Fraction time);
void attributes(const QString& partId, Measure* measure, const Fraction& tick);
void measureStyle(Measure* measure);
void measureStyle(const QString& partId, Measure* measure, const Fraction& tick);
void barline(const QString& partId, Measure* measure, const Fraction& tick);
void key(const QString& partId, Measure* measure, const Fraction& tick);
void clef(const QString& partId, Measure* measure, const Fraction& tick);
Expand Down Expand Up @@ -327,6 +327,9 @@ class MusicXMLParserPass2
FiguredBass* _figBass; ///< Current figured bass element (to attach to next note)
int _multiMeasureRestCount;
MusicXmlLyricsExtend _extendedLyrics; ///< Lyrics with "extend" requiring fixup
bool _measureRepeatsStarted;
int _measureRepeatNumMeasures;
int _measureRepeatCount;
};

//---------------------------------------------------------
Expand Down

0 comments on commit 21d29e4

Please sign in to comment.