From 432e14b300bb9c9d29e51c3dd9e7f4c380fb7be2 Mon Sep 17 00:00:00 2001 From: Marc Sabatella Date: Thu, 4 Jun 2015 17:53:47 -0600 Subject: [PATCH] fix #63711: no naturals on change to atonal key signature --- libmscore/key.cpp | 9 ++-- libmscore/key.h | 9 ++++ libmscore/keysig.cpp | 45 ++++++++++++---- libmscore/keysig.h | 1 + libmscore/layout.cpp | 2 +- libmscore/measure.cpp | 2 +- libmscore/score.cpp | 4 +- libmscore/transpose.cpp | 6 +-- libmscore/undo.cpp | 2 +- mscore/debugger/debugger.cpp | 1 + mscore/debugger/keysig.ui | 45 +++++++++------- mscore/exportxml.cpp | 14 +++-- mscore/file.cpp | 6 +-- mscore/importmxmlpass2.cpp | 16 +++++- mscore/importxml.cpp | 17 +++++-- mscore/menus.cpp | 2 + .../keysig/concert-pitch-01-ref.mscx | 48 ++++++++++++++++-- .../keysig/concert-pitch-02-ref.mscx | 48 ++++++++++++++++-- mtest/libmscore/keysig/concert-pitch.mscx | 46 +++++++++++++++-- mtest/libmscore/keysig/tst_keysig.cpp | 1 + vtest/accidental-10-ref.png | Bin 0 -> 11312 bytes vtest/accidental-10.mscz | Bin 0 -> 10238 bytes vtest/gen | 2 +- vtest/gen.bat | 2 +- 24 files changed, 260 insertions(+), 68 deletions(-) create mode 100644 vtest/accidental-10-ref.png create mode 100644 vtest/accidental-10.mscz diff --git a/libmscore/key.cpp b/libmscore/key.cpp index c130c3bc05fe..4aaaf9ccded4 100644 --- a/libmscore/key.cpp +++ b/libmscore/key.cpp @@ -26,6 +26,7 @@ namespace Ms { KeySigEvent::KeySigEvent(const KeySigEvent& k) { _key = k._key; + _mode = k._mode; _custom = k._custom; _keySymbols = k._keySymbols; } @@ -61,7 +62,9 @@ void KeySigEvent::print() const if (!isValid()) qDebug("invalid>"); else { - if (custom()) + if (isAtonal()) + qDebug("atonal>"); + else if (custom()) qDebug("custom>"); else qDebug("accidental %d>", int(_key)); @@ -85,9 +88,9 @@ void KeySigEvent::setKey(Key v) bool KeySigEvent::operator==(const KeySigEvent& e) const { - if (e._custom != _custom) + if (e._custom != _custom || e._mode != _mode) return false; - if (_custom) { + if (_custom && !isAtonal()) { if (e._keySymbols.size() != _keySymbols.size()) return false; for (int i = 0; i < _keySymbols.size(); ++i) { diff --git a/libmscore/key.h b/libmscore/key.h index b05f6bbfd3ad..9c495e5a8b3b 100644 --- a/libmscore/key.h +++ b/libmscore/key.h @@ -35,6 +35,11 @@ enum class Key { DELTA_ENHARMONIC = 12 }; +enum class KeyMode { + UNKNOWN = -1, + NONE, MAJOR, MINOR + }; + static inline bool operator< (Key a, Key b) { return int(a) < int(b); } static inline bool operator> (Key a, Key b) { return int(a) > int(b); } static inline bool operator> (Key a, int b) { return int(a) > b; } @@ -63,6 +68,7 @@ struct KeySym { class KeySigEvent { Key _key { Key::INVALID }; // -7 -> +7 + KeyMode _mode { KeyMode::UNKNOWN }; bool _custom { false }; QList _keySymbols; @@ -78,9 +84,12 @@ class KeySigEvent { void print() const; Key key() const { return _key; } + KeyMode mode() const { return _mode; } + void setMode(KeyMode m) { _mode = m; } bool custom() const { return _custom; } void setCustom(bool val) { _custom = val; _key = Key::C; } bool isValid() const { return _key != Key::INVALID; } + bool isAtonal() const { return _mode == KeyMode::NONE; } void initFromSubtype(int); // for backward compatibility void initLineList(char*); QList& keySymbols() { return _keySymbols; } diff --git a/libmscore/keysig.cpp b/libmscore/keysig.cpp index 6427cb769d34..3a51b030920c 100644 --- a/libmscore/keysig.cpp +++ b/libmscore/keysig.cpp @@ -91,7 +91,7 @@ void KeySig::layout() qreal _spatium = spatium(); setbbox(QRectF()); - if (isCustom()) { + if (isCustom() && !isAtonal()) { for (KeySym& ks: _sig.keySymbols()) { ks.pos = ks.spos * _spatium; addbbox(symBbox(ks.sym).translated(ks.pos)); @@ -252,8 +252,8 @@ void KeySig::draw(QPainter* p) const p->setPen(curColor()); for (const KeySym& ks: _sig.keySymbols()) drawSymbol(ks.sym, p, QPointF(ks.pos.x(), ks.pos.y())); - if (!parent() && isCustom() && _sig.keySymbols().isEmpty()) { - // atonal key signature - draw something for palette + if (!parent() && (isAtonal() || isCustom()) && _sig.keySymbols().isEmpty()) { + // empty custom or atonal key signature - draw something for palette p->setPen(Qt::gray); drawSymbol(SymId::timeSigX, p, QPointF(symWidth(SymId::timeSigX) * -0.5, 2.0 * spatium())); } @@ -322,7 +322,10 @@ void KeySig::write(Xml& xml) const { xml.stag(name()); Element::writeProperties(xml); - if (_sig.custom()) { + if (_sig.isAtonal()) { + xml.tag("custom", 1); + } + else if (_sig.custom()) { xml.tag("custom", 1); for (const KeySym& ks : _sig.keySymbols()) { xml.stag("KeySym"); @@ -334,6 +337,14 @@ void KeySig::write(Xml& xml) const else { 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::UNKNOWN: + default: + ; + } if (!_showCourtesy) xml.tag("showCourtesySig", _showCourtesy); xml.etag(); @@ -387,13 +398,27 @@ void KeySig::read(XmlReader& e) e.readInt(); _sig.setCustom(true); } + else if (tag == "mode") { + QString m(e.readElementText()); + if (m == "none") + _sig.setMode(KeyMode::NONE); + else if (m == "major") + _sig.setMode(KeyMode::MAJOR); + else if (m == "minor") + _sig.setMode(KeyMode::MINOR); + else + _sig.setMode(KeyMode::UNKNOWN); + } else if (tag == "subtype") subtype = e.readInt(); else if (!Element::readProperties(e)) e.unknown(); } + // for backward compatibility if (!_sig.isValid()) - _sig.initFromSubtype(subtype); // for backward compatibility + _sig.initFromSubtype(subtype); + if (_sig.custom() && _sig.keySymbols().isEmpty()) + _sig.setMode(KeyMode::NONE); } //--------------------------------------------------------- @@ -551,12 +576,10 @@ Element* KeySig::prevElement() QString KeySig::accessibleInfo() { QString keySigType; - if (isCustom()) { - if (keySigEvent().keySymbols().isEmpty()) - return QString("%1: %2").arg(Element::accessibleInfo()).arg(qApp->translate("MuseScore", keyNames[15])); - else - return tr("%1: Custom").arg(Element::accessibleInfo()); - } + if (isAtonal()) + return QString("%1: %2").arg(Element::accessibleInfo()).arg(qApp->translate("MuseScore", keyNames[15])); + else if (isCustom()) + return tr("%1: Custom").arg(Element::accessibleInfo()); if (key() == Key::C) return QString("%1: %2").arg(Element::accessibleInfo()).arg(qApp->translate("MuseScore", keyNames[14])); diff --git a/libmscore/keysig.h b/libmscore/keysig.h index ee124414b3ea..91903879ca7a 100644 --- a/libmscore/keysig.h +++ b/libmscore/keysig.h @@ -60,6 +60,7 @@ class KeySig : public Element { //@ -7 (flats) -- +7 (sharps) Q_INVOKABLE Key key() const { return _sig.key(); } bool isCustom() const { return _sig.custom(); } + bool isAtonal() const { return _sig.isAtonal(); } KeySigEvent keySigEvent() const { return _sig; } bool operator==(const KeySig&) const; void changeKeySigEvent(const KeySigEvent&); diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index c1497bd9e5d7..c9e7c3124681 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -1663,7 +1663,7 @@ void Score::addSystemHeader(Measure* m, bool isFirstSystem) bool needKeysig = // keep key sigs in TABs: TABs themselves should hide them isFirstSystem || styleB(StyleIdx::genKeysig); - if (needKeysig && !keysig && ((keyIdx.key() != Key::C) || keyIdx.custom())) { + if (needKeysig && !keysig && ((keyIdx.key() != Key::C) || keyIdx.custom() || keyIdx.isAtonal())) { // // create missing key signature // diff --git a/libmscore/measure.cpp b/libmscore/measure.cpp index 5413ac646fcd..264ea6cfb8dd 100644 --- a/libmscore/measure.cpp +++ b/libmscore/measure.cpp @@ -2113,7 +2113,7 @@ void Measure::read(XmlReader& e, int staffIdx) ks->setTrack(e.track()); ks->read(e); int curTick = e.tick(); - if (!ks->isCustom() && ks->key() == Key::C && curTick == 0) { + if (!ks->isCustom() && !ks->isAtonal() && ks->key() == Key::C && curTick == 0) { // ignore empty key signature qDebug("remove keysig c at tick 0"); delete ks; diff --git a/libmscore/score.cpp b/libmscore/score.cpp index abb9971f33b4..26fc7c014437 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -2446,7 +2446,7 @@ void Score::adjustKeySigs(int sidx, int eidx, KeyList km) KeySigEvent oKey = i->second; KeySigEvent nKey = oKey; int diff = -staff->part()->instrument()->transpose().chromatic; - if (diff != 0 && !styleB(StyleIdx::concertPitch) && !oKey.custom()) + if (diff != 0 && !styleB(StyleIdx::concertPitch) && !oKey.custom() && !oKey.isAtonal()) nKey.setKey(transposeKey(nKey.key(), diff)); staff->setKey(tick, nKey); KeySig* keysig = new KeySig(this); @@ -3767,7 +3767,7 @@ int Score::keysig() for (int staffIdx = 0; staffIdx < nstaves(); ++staffIdx) { Staff* st = staff(staffIdx); Key key = st->key(0); - if (st->staffType()->group() == StaffGroup::PERCUSSION || st->keySigEvent(0).custom()) // ignore percussion and custom key + if (st->staffType()->group() == StaffGroup::PERCUSSION || st->keySigEvent(0).custom() || st->keySigEvent(0).isAtonal()) // ignore percussion and custom / atonal key continue; result = key; int diff = st->part()->instrument()->transpose().chromatic; diff --git a/libmscore/transpose.cpp b/libmscore/transpose.cpp index 02795c6ba9b1..298d96a8274c 100644 --- a/libmscore/transpose.cpp +++ b/libmscore/transpose.cpp @@ -320,7 +320,7 @@ bool Score::transpose(TransposeMode mode, TransposeDirection direction, Key trKe } else if ((e->type() == Element::Type::KEYSIG) && mode != TransposeMode::DIATONICALLY && trKeys) { KeySig* ks = static_cast(e); - if (!ks->isCustom()) { + if (!ks->isCustom() && !ks->isAtonal()) { Key key = st->key(ks->tick()); KeySigEvent ke = ks->keySigEvent(); ke.setKey(key); @@ -403,7 +403,7 @@ bool Score::transpose(TransposeMode mode, TransposeDirection direction, Key trKe QList ll = e->linkList(); for (ScoreElement* e : ll) { KeySig* ks = static_cast(e); - if (!ks->isCustom()) { + if (!ks->isCustom() && !ks->isAtonal()) { Key nKey = transposeKey(ks->key(), interval); KeySigEvent ke = ks->keySigEvent(); ke.setKey(nKey); @@ -488,7 +488,7 @@ void Score::transposeKeys(int staffStart, int staffEnd, int tickStart, int tickE continue; if (s->tick() == 0) createKey = false; - if (!ks->isCustom()) { + if (!ks->isCustom() && !ks->isAtonal()) { Key key = st->key(s->tick()); Key nKey = transposeKey(key, interval); // remove initial C major key signatures diff --git a/libmscore/undo.cpp b/libmscore/undo.cpp index 6e42a8b640c9..a26c225300d7 100644 --- a/libmscore/undo.cpp +++ b/libmscore/undo.cpp @@ -487,7 +487,7 @@ void Score::undoChangeKeySig(Staff* ostaff, int tick, KeySigEvent key) Interval interval = staff->part()->instrument()->transpose(); KeySigEvent nkey = key; bool concertPitch = score->styleB(StyleIdx::concertPitch); - if (interval.chromatic && !concertPitch && !nkey.custom()) { + if (interval.chromatic && !concertPitch && !nkey.custom() && !nkey.isAtonal()) { interval.flip(); nkey.setKey(transposeKey(key.key(), interval)); } diff --git a/mscore/debugger/debugger.cpp b/mscore/debugger/debugger.cpp index eb835225c308..ea6e5bc07f84 100644 --- a/mscore/debugger/debugger.cpp +++ b/mscore/debugger/debugger.cpp @@ -2473,6 +2473,7 @@ void KeySigView::setElement(Element* e) keysig.showCourtesySig->setChecked(ks->showCourtesy()); keysig.accidentalType->setValue(int(ev.key())); keysig.custom->setChecked(ev.custom()); + keysig.atonal->setChecked(ev.isAtonal()); keysig.invalid->setChecked(!ev.isValid()); } diff --git a/mscore/debugger/keysig.ui b/mscore/debugger/keysig.ui index 9b6236daf955..6539f1efa73b 100644 --- a/mscore/debugger/keysig.ui +++ b/mscore/debugger/keysig.ui @@ -7,7 +7,7 @@ 0 0 493 - 131 + 135 @@ -41,13 +41,6 @@ 0 - - - - accidentalType - - - @@ -55,7 +48,7 @@ - + true @@ -68,31 +61,45 @@ - - + + - invalid + naturalType - - + + - naturalType + accidentalType - + + + + showCourtesySig + + + + true - - + + - showCourtesySig + invalid + + + + + + + atonal diff --git a/mscore/exportxml.cpp b/mscore/exportxml.cpp index 9eb175e17a23..2accc8526b6b 100644 --- a/mscore/exportxml.cpp +++ b/mscore/exportxml.cpp @@ -1572,7 +1572,7 @@ void ExportMusicXml::keysig(const KeySigEvent kse, ClefType ct, int staff, bool xml.stag(tg); const QList keysyms = kse.keySymbols(); - if (kse.custom() && keysyms.size() > 0) { + if (kse.custom() && !kse.isAtonal() && keysyms.size() > 0) { // non-traditional key signature // MusicXML order is left-to-right order, while KeySims in keySymbols() @@ -1597,10 +1597,16 @@ void ExportMusicXml::keysig(const KeySigEvent kse, ClefType ct, int staff, bool else { // traditional key signature xml.tag("fifths", static_cast(kse.key())); - if (kse.custom()) - xml.tag("mode", "none"); + 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: + default: + if (kse.custom()) + xml.tag("mode", "none"); + } } - xml.etag(); } diff --git a/mscore/file.cpp b/mscore/file.cpp index a1a02f0594d3..af506a637cbc 100644 --- a/mscore/file.cpp +++ b/mscore/file.cpp @@ -608,12 +608,12 @@ void MuseScore::newFile() // transpose key // KeySigEvent nKey = ks; - if (!nKey.custom() && part->instrument()->transpose().chromatic && !score->styleB(StyleIdx::concertPitch)) { + if (!nKey.custom() && !nKey.isAtonal() && part->instrument()->transpose().chromatic && !score->styleB(StyleIdx::concertPitch)) { int diff = -part->instrument()->transpose().chromatic; nKey.setKey(transposeKey(nKey.key(), diff)); } - // do not create empty, invisible keysig - if (nKey.custom() || nKey.key() != Key::C) { + // do not create empty keysig unless custom or atonal + if (nKey.custom() || nKey.isAtonal() || nKey.key() != Key::C) { staff->setKey(0, nKey); KeySig* keysig = new KeySig(score); keysig->setTrack(staffIdx * VOICES); diff --git a/mscore/importmxmlpass2.cpp b/mscore/importmxmlpass2.cpp index d309e1662cca..138d8441bfe3 100644 --- a/mscore/importmxmlpass2.cpp +++ b/mscore/importmxmlpass2.cpp @@ -3172,7 +3172,7 @@ static void addKey(const KeySigEvent key, const bool printObj, Score* score, Mea { Key oldkey = score->staff(staffIdx)->key(tick); // TODO only if different custom key ? - if (oldkey != key.key() || key.custom()) { + if (oldkey != key.key() || key.custom() || key.isAtonal()) { // new key differs from key in effect at this tick KeySig* keysig = new KeySig(score); keysig->setTrack((staffIdx) * VOICES); @@ -3258,8 +3258,20 @@ void MusicXMLParserPass2::key(const QString& partId, Measure* measure, const int if (_e.name() == "fifths") key.setKey(Key(_e.readElementText().toInt())); else if (_e.name() == "mode") { - if (_e.readElementText() == "none") + QString m = _e.readElementText(); + if (m == "none") { key.setCustom(true); + key.setMode(KeyMode::NONE); + } + else if (m == "major") { + key.setMode(KeyMode::MAJOR); + } + else if (m == "minor") { + key.setMode(KeyMode::MINOR); + } + else { + skipLogCurrElem(); + } } else if (_e.name() == "cancel") skipLogCurrElem(); // TODO ?? diff --git a/mscore/importxml.cpp b/mscore/importxml.cpp index a8be0b959667..701a835f526b 100644 --- a/mscore/importxml.cpp +++ b/mscore/importxml.cpp @@ -3917,10 +3917,19 @@ void MusicXml::xmlAttributes(Measure* measure, int staff, QDomElement e, KeySig* if (ee.tagName() == "fifths") key.setKey(Key(ee.text().toInt())); else if (ee.tagName() == "mode") { - if (ee.text() == "none") + if (ee.text() == "none") { key.setCustom(true); - else + key.setMode(KeyMode::NONE); + } + else if (ee.text() == "major") { + key.setMode(KeyMode::MAJOR); + } + else if (ee.text() == "minor") { + key.setMode(KeyMode::MINOR); + } + else { domNotImplemented(ee); + } } else if (ee.tagName() == "cancel") domNotImplemented(ee); // TODO @@ -3946,7 +3955,7 @@ void MusicXml::xmlAttributes(Measure* measure, int staff, QDomElement e, KeySig* for (int i = 0; i < staves; ++i) { Key oldkey = score->staff(staffIdx+i)->key(tick); // TODO only if different custom key ? - if (oldkey != key.key() || key.custom()) { + if (oldkey != key.key() || key.custom() || key.isAtonal()) { // new key differs from key in effect at this tick KeySig* keysig = new KeySig(score); keysig->setTrack((staffIdx + i) * VOICES); @@ -3964,7 +3973,7 @@ void MusicXml::xmlAttributes(Measure* measure, int staff, QDomElement e, KeySig* // Key oldkey = score->staff(staffIdx)->key(tick); // TODO only if different custom key ? - if (oldkey != key.key() || key.custom()) { + if (oldkey != key.key() || key.custom() || key.isAtonal()) { // new key differs from key in effect at this tick KeySig* keysig = new KeySig(score); keysig->setTrack(staffIdx * VOICES); diff --git a/mscore/menus.cpp b/mscore/menus.cpp index ad4ee50e8231..88d60e67fe3a 100644 --- a/mscore/menus.cpp +++ b/mscore/menus.cpp @@ -253,7 +253,9 @@ Palette* MuseScore::newKeySigPalette(bool basic) if (!basic) { // atonal key signature KeySigEvent nke; + nke.setKey(Key::C); nke.setCustom(true); + nke.setMode(KeyMode::NONE); KeySig* nk = new KeySig(gscore); nk->setKeySigEvent(nke); sp->append(nk, qApp->translate("MuseScore", keyNames[15])); diff --git a/mtest/libmscore/keysig/concert-pitch-01-ref.mscx b/mtest/libmscore/keysig/concert-pitch-01-ref.mscx index 92534a91f2df..8ef7856fd050 100644 --- a/mtest/libmscore/keysig/concert-pitch-01-ref.mscx +++ b/mtest/libmscore/keysig/concert-pitch-01-ref.mscx @@ -41,6 +41,8 @@ + + @@ -163,7 +165,7 @@ - + -4 @@ -172,7 +174,7 @@ - + 0 @@ -180,6 +182,25 @@ measure + + + + -1 + + + measure + + + + + + 1 + none + + + measure + + end 1 @@ -198,7 +219,7 @@ - + -4 @@ -207,7 +228,7 @@ - + 0 @@ -215,6 +236,25 @@ measure + + + + -1 + + + measure + + + + + + 1 + none + + + measure + + end 1 diff --git a/mtest/libmscore/keysig/concert-pitch-02-ref.mscx b/mtest/libmscore/keysig/concert-pitch-02-ref.mscx index 74c185afb64e..cd4ec10b23b1 100644 --- a/mtest/libmscore/keysig/concert-pitch-02-ref.mscx +++ b/mtest/libmscore/keysig/concert-pitch-02-ref.mscx @@ -40,6 +40,8 @@ + + @@ -165,7 +167,7 @@ - + -1 @@ -174,7 +176,7 @@ - + 3 @@ -182,6 +184,25 @@ measure + + + + 2 + + + measure + + + + + + 1 + none + + + measure + + end 1 @@ -203,7 +224,7 @@ - + -2 @@ -212,7 +233,7 @@ - + 2 @@ -220,6 +241,25 @@ measure + + + + 1 + + + measure + + + + + + 1 + none + + + measure + + end 1 diff --git a/mtest/libmscore/keysig/concert-pitch.mscx b/mtest/libmscore/keysig/concert-pitch.mscx index f1a82817c053..cd4ec10b23b1 100644 --- a/mtest/libmscore/keysig/concert-pitch.mscx +++ b/mtest/libmscore/keysig/concert-pitch.mscx @@ -53,8 +53,8 @@ Alto Saxophone - Alto Saxophone - A. Sax. + Alto Saxophone + A. Sax. Alto Saxophone 49 87 @@ -107,8 +107,8 @@ Tenor Saxophone - Tenor Saxophone - T. Sax. + Tenor Saxophone + T. Sax. Tenor Saxophone 44 82 @@ -184,6 +184,25 @@ measure + + + + 2 + + + measure + + + + + + 1 + none + + + measure + + end 1 @@ -222,6 +241,25 @@ measure + + + + 1 + + + measure + + + + + + 1 + none + + + measure + + end 1 diff --git a/mtest/libmscore/keysig/tst_keysig.cpp b/mtest/libmscore/keysig/tst_keysig.cpp index 12469dbd988f..2a82b73b0789 100644 --- a/mtest/libmscore/keysig/tst_keysig.cpp +++ b/mtest/libmscore/keysig/tst_keysig.cpp @@ -112,6 +112,7 @@ void TestKeySig::keysig() void TestKeySig::concertPitch() { Score* score = readScore(DIR + "concert-pitch.mscx"); + score->doLayout(); score->cmdConcertPitchChanged(true, true); QVERIFY(saveCompareScore(score, "concert-pitch-01-test.mscx", DIR + "concert-pitch-01-ref.mscx")); score->cmdConcertPitchChanged(false, true); diff --git a/vtest/accidental-10-ref.png b/vtest/accidental-10-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6b1cc1764fa62851641b966874dc5e91d0941a GIT binary patch literal 11312 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