Skip to content

Commit

Permalink
Fix #271505: Allow user to set mode along with key signature, part 1
Browse files Browse the repository at this point in the history
MusicXML im- and export of all possible key signatur modes
  • Loading branch information
Jojo-Schmitz committed Apr 18, 2018
1 parent 0603c9d commit 38938f1
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 14 deletions.
9 changes: 8 additions & 1 deletion libmscore/key.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,14 @@ enum class KeyMode {
UNKNOWN = -1,
NONE,
MAJOR,
MINOR
MINOR,
DORIAN,
PHRYGIAN,
LYDIAN,
MIXOLYDIAN,
AEOLIAN,
IONIAN,
LOCRIAN
};

static inline bool operator< (Key a, Key b) { return int(a) < int(b); }
Expand Down
27 changes: 24 additions & 3 deletions libmscore/keysig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,9 +345,16 @@ void KeySig::write(XmlWriter& xml) const
xml.tag("accidental", int(_sig.key()));
}
switch (_sig.mode()) {
case KeyMode::NONE: xml.tag("mode", "none"); break;
case KeyMode::MAJOR: xml.tag("mode", "major"); break;
case KeyMode::MINOR: xml.tag("mode", "minor"); break;
case KeyMode::NONE: xml.tag("mode", "none"); break;
case KeyMode::MAJOR: xml.tag("mode", "major"); break;
case KeyMode::MINOR: xml.tag("mode", "minor"); break;
case KeyMode::DORIAN: xml.tag("mode", "dorian"); break;
case KeyMode::PHRYGIAN: xml.tag("mode", "phrygian"); break;
case KeyMode::LYDIAN: xml.tag("mode", "lydian"); break;
case KeyMode::MIXOLYDIAN: xml.tag("mode", "mixolydian"); break;
case KeyMode::AEOLIAN: xml.tag("mode", "aeolian"); break;
case KeyMode::IONIAN: xml.tag("mode", "ionian"); break;
case KeyMode::LOCRIAN: xml.tag("mode", "locrian"); break;
case KeyMode::UNKNOWN:
default:
;
Expand Down Expand Up @@ -413,6 +420,20 @@ void KeySig::read(XmlReader& e)
_sig.setMode(KeyMode::MAJOR);
else if (m == "minor")
_sig.setMode(KeyMode::MINOR);
else if (m == "dorian")
_sig.setMode(KeyMode::DORIAN);
else if (m == "phrygian")
_sig.setMode(KeyMode::PHRYGIAN);
else if (m == "lydian")
_sig.setMode(KeyMode::LYDIAN);
else if (m == "mixolydian")
_sig.setMode(KeyMode::MIXOLYDIAN);
else if (m == "aeolian")
_sig.setMode(KeyMode::AEOLIAN);
else if (m == "ionian")
_sig.setMode(KeyMode::IONIAN);
else if (m == "locrian")
_sig.setMode(KeyMode::LOCRIAN);
else
_sig.setMode(KeyMode::UNKNOWN);
}
Expand Down
15 changes: 11 additions & 4 deletions mscore/exportxml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1731,10 +1731,17 @@ void ExportMusicXml::keysig(const KeySig* ks, ClefType ct, int staff, bool visib
// traditional key signature
xml.tag("fifths", static_cast<int>(kse.key()));
switch (kse.mode()) {
case KeyMode::NONE: xml.tag("mode", "none"); break;
case KeyMode::MAJOR: xml.tag("mode", "major"); break;
case KeyMode::MINOR: xml.tag("mode", "minor"); break;
case KeyMode::UNKNOWN:
case KeyMode::NONE: xml.tag("mode", "none"); break;
case KeyMode::MAJOR: xml.tag("mode", "major"); break;
case KeyMode::MINOR: xml.tag("mode", "minor"); break;
case KeyMode::DORIAN: xml.tag("mode", "dorian"); break;
case KeyMode::PHRYGIAN: xml.tag("mode", "phrygian"); break;
case KeyMode::LYDIAN: xml.tag("mode", "lydian"); break;
case KeyMode::MIXOLYDIAN: xml.tag("mode", "mixolydian"); break;
case KeyMode::AEOLIAN: xml.tag("mode", "aeolian"); break;
case KeyMode::IONIAN: xml.tag("mode", "ionian"); break;
case KeyMode::LOCRIAN: xml.tag("mode", "locrian"); break;
case KeyMode::UNKNOWN: // fall thru
default:
if (kse.custom())
xml.tag("mode", "none");
Expand Down
23 changes: 17 additions & 6 deletions mscore/importmxmlpass2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3479,15 +3479,26 @@ void MusicXMLParserPass2::key(const QString& partId, Measure* measure, const int
key.setCustom(true);
key.setMode(KeyMode::NONE);
}
else if (m == "major") {
else if (m == "major")
key.setMode(KeyMode::MAJOR);
}
else if (m == "minor") {
else if (m == "minor")
key.setMode(KeyMode::MINOR);
}
else {
else if (m == "dorian")
key.setMode(KeyMode::DORIAN);
else if (m == "phrygian")
key.setMode(KeyMode::PHRYGIAN);
else if (m == "lydian")
key.setMode(KeyMode::LYDIAN);
else if (m == "mixolydian")
key.setMode(KeyMode::MIXOLYDIAN);
else if (m == "aeolian")
key.setMode(KeyMode::AEOLIAN);
else if (m == "ionian")
key.setMode(KeyMode::IONIAN);
else if (m == "locrian")
key.setMode(KeyMode::LOCRIAN);
else
_logger->logError(QString("Unsupported mode '%1'").arg(m), &_e);
}
}
else if (_e.name() == "cancel")
skipLogCurrElem(); // TODO ??
Expand Down

0 comments on commit 38938f1

Please sign in to comment.