Skip to content

Commit

Permalink
Add support for triple sharp and triple flat
Browse files Browse the repository at this point in the history
  • Loading branch information
mattmcclinch authored and Jojo-Schmitz committed Oct 24, 2020
1 parent 2a7fcf0 commit f9a1d48
Show file tree
Hide file tree
Showing 14 changed files with 110 additions and 91 deletions.
16 changes: 8 additions & 8 deletions importexport/musicxml/musicxmlsupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,8 +407,8 @@ QString accSymId2MxmlString(const SymId id)
case SymId::accidentalArrowDown: s = "arrow-down"; break;
case SymId::accidentalArrowUp: s = "arrow-up"; break;

//case SymId::accidentalTripleSharp: s = "triple-sharp"; break;
//case SymId::accidentalTripleFlat: s = "triple-flat"; break;
case SymId::accidentalTripleSharp: s = "triple-sharp"; break;
case SymId::accidentalTripleFlat: s = "triple-flat"; break;

case SymId::accidentalKucukMucennebSharp: s = "slash-quarter-sharp"; break;
case SymId::accidentalBuyukMucennebSharp: s = "slash-sharp"; break;
Expand Down Expand Up @@ -470,8 +470,8 @@ SymId mxmlString2accSymId(const QString mxmlName)
map["arrow-down"] = SymId::accidentalArrowDown;
map["arrow-up"] = SymId::accidentalArrowUp;

//map["triple-sharp"] = SymId::accidentalTripleSharp;
//map["triple-flat"] = SymId::accidentalTripleFlat;
map["triple-sharp"] = SymId::accidentalTripleSharp;
map["triple-flat"] = SymId::accidentalTripleFlat;

map["slash-quarter-sharp"] = SymId::accidentalKucukMucennebSharp;
map["slash-sharp"] = SymId::accidentalBuyukMucennebSharp;
Expand Down Expand Up @@ -538,8 +538,8 @@ QString accidentalType2MxmlString(const AccidentalType type)
case AccidentalType::ARROW_DOWN: s = "arrow-down"; break;
case AccidentalType::ARROW_UP: s = "arrow-up"; break;

//case AccidentalType::SHARP3: s = "triple-sharp"; break;
//case AccidentalType::FLAT3: s = "triple-flat"; break;
case AccidentalType::SHARP3: s = "triple-sharp"; break;
case AccidentalType::FLAT3: s = "triple-flat"; break;

case AccidentalType::SHARP_SLASH3: s = "slash-quarter-sharp"; break;
case AccidentalType::SHARP_SLASH2: s = "slash-sharp"; break;
Expand Down Expand Up @@ -605,8 +605,8 @@ AccidentalType mxmlString2accidentalType(const QString mxmlName)
map["arrow-down"] = AccidentalType::ARROW_DOWN;
map["arrow-up"] = AccidentalType::ARROW_UP;

//map["triple-sharp"] = AccidentalType::SHARP3;
//map["triple-flat"] = AccidentalType::FLAT3;
map["triple-sharp"] = AccidentalType::SHARP3;
map["triple-flat"] = AccidentalType::FLAT3;

map["slash-quarter-sharp"] = AccidentalType::SHARP_SLASH3; // MIRRORED_FLAT_SLASH; ?
map["slash-sharp"] = AccidentalType::SHARP_SLASH2; // SHARP_SLASH; ?
Expand Down
6 changes: 4 additions & 2 deletions libmscore/accidental.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ static Acc accList[] = {
Acc(AccidentalVal::SHARP, 0, SymId::accidentalSharp), // SHARP
Acc(AccidentalVal::SHARP2, 0, SymId::accidentalDoubleSharp), // SHARP2
Acc(AccidentalVal::FLAT2, 0, SymId::accidentalDoubleFlat), // FLAT2
//Acc(AccidentalVal::SHARP3, 0, SymId::accidentalTripleSharp), // SHARP3
//Acc(AccidentalVal::FLAT3, 0, SymId::accidentalTripleFlat), // FLAT3
Acc(AccidentalVal::SHARP3, 0, SymId::accidentalTripleSharp), // SHARP3
Acc(AccidentalVal::FLAT3, 0, SymId::accidentalTripleFlat), // FLAT3
Acc(AccidentalVal::FLAT, 0, SymId::accidentalNaturalFlat), // NATURAL_FLAT
Acc(AccidentalVal::SHARP, 0, SymId::accidentalNaturalSharp), // NATURAL_SHARP
Acc(AccidentalVal::SHARP2, 0, SymId::accidentalSharpSharp), // SHARP_SHARP
Expand Down Expand Up @@ -420,8 +420,10 @@ AccidentalType Accidental::value2subtype(AccidentalVal v)
case AccidentalVal::NATURAL: return AccidentalType::NONE;
case AccidentalVal::SHARP: return AccidentalType::SHARP;
case AccidentalVal::SHARP2: return AccidentalType::SHARP2;
case AccidentalVal::SHARP3: return AccidentalType::SHARP3;
case AccidentalVal::FLAT: return AccidentalType::FLAT;
case AccidentalVal::FLAT2: return AccidentalType::FLAT2;
case AccidentalVal::FLAT3: return AccidentalType::FLAT3;
default:
qFatal("value2subtype: illegal accidental val %d", int(v));
}
Expand Down
2 changes: 1 addition & 1 deletion libmscore/accidental.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ class Accidental final : public Element {
static const char* subtype2name(AccidentalType);
static AccidentalType value2subtype(AccidentalVal);
static AccidentalType name2subtype(const QString&);
static bool isMicrotonal(AccidentalType t) { return t > AccidentalType::FLAT2; }
static bool isMicrotonal(AccidentalType t) { return t > AccidentalType::FLAT3; }

QString accessibleInfo() const override;
};
Expand Down
4 changes: 2 additions & 2 deletions libmscore/ambitus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ void Ambitus::layout()
if (_topTpc - int(key) >= 13 && _topTpc - int(key) <= 19)
accidType = AccidentalType::NONE;
else {
AccidentalVal accidVal = AccidentalVal( (_topTpc - Tpc::TPC_MIN) / TPC_DELTA_SEMITONE - 2 );
AccidentalVal accidVal = tpc2alter(_topTpc);
accidType = Accidental::value2subtype(accidVal);
if (accidType == AccidentalType::NONE)
accidType = AccidentalType::NATURAL;
Expand All @@ -362,7 +362,7 @@ void Ambitus::layout()
if (_bottomTpc - int(key) >= 13 && _bottomTpc - int(key) <= 19)
accidType = AccidentalType::NONE;
else {
AccidentalVal accidVal = AccidentalVal( (_bottomTpc - Tpc::TPC_MIN) / TPC_DELTA_SEMITONE - 2 );
AccidentalVal accidVal = tpc2alter(_topTpc);
accidType = Accidental::value2subtype(accidVal);
if (accidType == AccidentalType::NONE)
accidType = AccidentalType::NATURAL;
Expand Down
6 changes: 1 addition & 5 deletions libmscore/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3846,12 +3846,8 @@ void Score::cmdAddPitch(const EditData& ed, int note, bool addFlag, bool insert)
if (addFlag && el && el->isNote()) {
Chord* chord = toNote(el)->chord();
Note* n = chord->upNote();
octave = n->epitch() / 12;
int tpc = n->tpc();
if (tpc == Tpc::TPC_C_BB || tpc == Tpc::TPC_C_B)
++octave;
else if (tpc == Tpc::TPC_B_S || tpc == Tpc::TPC_B_SS)
--octave;
octave = (n->epitch() - int(tpc2alter(tpc))) / PITCH_DELTA_OCTAVE;
if (note <= tpc2step(tpc))
octave++;
}
Expand Down
2 changes: 1 addition & 1 deletion libmscore/harmony.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1628,7 +1628,7 @@ void Harmony::render(const QList<RenderAction>& renderList, qreal& x, qreal& y,
}
else if (a.type == RenderAction::RenderActionType::NOTE) {
QString c;
int acc;
AccidentalVal acc;
if (tpcIsValid(tpc))
tpc2name(tpc, noteSpelling, noteCase, c, acc);
else if (_function.size() > 0)
Expand Down
18 changes: 9 additions & 9 deletions libmscore/key.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ AccidentalVal AccidentalState::accidentalVal(int line, bool &error) const
error = true;
return AccidentalVal::NATURAL;
}
return AccidentalVal((state[line] & 0x0f) - 2);
return AccidentalVal((state[line] & 0x0f) + int(AccidentalVal::MIN));
}

//---------------------------------------------------------
Expand All @@ -198,15 +198,15 @@ AccidentalVal AccidentalState::accidentalVal(int line, bool &error) const

void AccidentalState::init(Key key)
{
memset(state, 2, MAX_ACC_STATE);
memset(state, int(AccidentalVal::MAX), MAX_ACC_STATE);
if (key > 0) {
for (int i = 0; i < int(key); ++i) {
int idx = tpc2step(20 + i);
for (int octave = 0; octave < (11 * 7); octave += 7) {
int j = idx + octave;
if (j >= MAX_ACC_STATE)
break;
state[j] = 1 + 2;
state[j] = 1 - int(AccidentalVal::MIN);
}
}
}
Expand All @@ -217,7 +217,7 @@ void AccidentalState::init(Key key)
int j = idx + octave ;
if (j >= MAX_ACC_STATE)
break;
state[j] = -1 + 2;
state[j] = -1 - int(AccidentalVal::MIN);
}
}
}
Expand All @@ -230,7 +230,7 @@ void AccidentalState::init(Key key)
void AccidentalState::init(const KeySigEvent& keySig, ClefType clef)
{
if (keySig.custom()) {
memset(state, 2, MAX_ACC_STATE);
memset(state, int(AccidentalVal::MAX), MAX_ACC_STATE);
for (const KeySym& s : keySig.keySymbols()) {
AccidentalVal a = sym2accidentalVal(s.sym);
int line = int(s.spos.y() * 2);
Expand All @@ -239,7 +239,7 @@ void AccidentalState::init(const KeySigEvent& keySig, ClefType clef)
int i = idx + octave ;
if (i >= MAX_ACC_STATE)
break;
state[i] = int(a) + 2;
state[i] = int(a) - int(AccidentalVal::MIN);
}
}
}
Expand All @@ -255,7 +255,7 @@ void AccidentalState::init(const KeySigEvent& keySig, ClefType clef)
AccidentalVal AccidentalState::accidentalVal(int line) const
{
Q_ASSERT(line >= MIN_ACC_STATE && line < MAX_ACC_STATE);
return AccidentalVal((state[line] & 0x0f) - 2);
return AccidentalVal((state[line] & 0x0f) + int(AccidentalVal::MIN));
}

//---------------------------------------------------------
Expand All @@ -276,8 +276,8 @@ void AccidentalState::setAccidentalVal(int line, AccidentalVal val, bool tieCont
{
Q_ASSERT(line >= MIN_ACC_STATE && line < MAX_ACC_STATE);
// casts needed to work around a bug in Xcode 4.2 on Mac, see #25910
Q_ASSERT(int(val) >= int(AccidentalVal::FLAT2) && int(val) <= int(AccidentalVal::SHARP2));
state[line] = (int(val) + 2) | (tieContext ? TIE_CONTEXT : 0);
Q_ASSERT(int(val) >= int(AccidentalVal::MIN) && int(val) <= int(AccidentalVal::MAX));
state[line] = (int(val) - int(AccidentalVal::MIN)) | (tieContext ? TIE_CONTEXT : 0);
}
}

6 changes: 5 additions & 1 deletion libmscore/mscore.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,15 @@ enum class SelectType : char {
//---------------------------------------------------------

enum class AccidentalVal : signed char {
SHARP3 = 3,
SHARP2 = 2,
SHARP = 1,
NATURAL = 0,
FLAT = -1,
FLAT2 = -2
FLAT2 = -2,
FLAT3 = -3,
MIN = FLAT3,
MAX = SHARP3
};

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

0 comments on commit f9a1d48

Please sign in to comment.