This commit is contained in:
ws 2014-06-05 11:37:21 +02:00
parent 29015d4782
commit 9a6d909a29
18 changed files with 112 additions and 149 deletions

View file

@ -23,11 +23,11 @@ namespace Ms {
// KeySigEvent
//---------------------------------------------------------
KeySigEvent::KeySigEvent(int at)
KeySigEvent::KeySigEvent(int key)
{
_accidentalType = at;
Q_ASSERT(key >= -7 && key <= 7);
_accidentalType = key;
_invalid = false;
enforceLimits();
}
//---------------------------------------------------------
@ -125,21 +125,19 @@ bool KeySigEvent::operator!=(const KeySigEvent& e) const
// preset lines list with accidentals for given key
//---------------------------------------------------------
void AccidentalState::init(const KeySigEvent& ks)
void AccidentalState::init(int key)
{
int type = ks.accidentalType();
memset(state, 2, 74);
for (int octave = 0; octave < 11; ++octave) {
if (type > 0) {
for (int i = 0; i < type; ++i) {
if (key > 0) {
for (int i = 0; i < key; ++i) {
int idx = tpc2step(20 + i) + octave * 7;
if (idx < 74)
state[idx] = 1 + 2;
}
}
else {
for (int i = 0; i > type; --i) {
for (int i = 0; i > key; --i) {
int idx = tpc2step(12 + i) + octave * 7;
if (idx < 74)
state[idx] = -1 + 2;

View file

@ -48,7 +48,7 @@ class KeySigEvent {
public:
KeySigEvent() {}
KeySigEvent(int at);
KeySigEvent(int key);
bool isValid() const { return !_invalid; }
bool operator==(const KeySigEvent& e) const;
@ -77,7 +77,7 @@ class AccidentalState {
public:
AccidentalState() {}
void init(const KeySigEvent&);
void init(int key);
AccidentalVal accidentalVal(int line) const {
Q_ASSERT(line >= 0 && line < 75);
return AccidentalVal((state[line] & 0x0f) - 2);

View file

@ -289,12 +289,12 @@ Element* KeySig::drop(const DropData& data)
if (data.modifiers & Qt::ControlModifier) {
// apply only to this stave
if (k != keySigEvent())
score()->undoChangeKeySig(staff(), tick(), k);
score()->undoChangeKeySig(staff(), tick(), k.accidentalType());
}
else {
// apply to all staves:
foreach(Staff* s, score()->staves())
score()->undoChangeKeySig(s, tick(), k);
score()->undoChangeKeySig(s, tick(), k.accidentalType());
}
return this;
}
@ -303,9 +303,11 @@ Element* KeySig::drop(const DropData& data)
// setKey
//---------------------------------------------------------
void KeySig::setKey(int sig)
void KeySig::setKey(int key)
{
setKeySigEvent(KeySigEvent(sig));
KeySigEvent e;
e.setAccidentalType(key);
setKeySigEvent(e);
}
//---------------------------------------------------------

View file

@ -1452,7 +1452,8 @@ void Score::addSystemHeader(Measure* m, bool isFirstSystem)
// we assume that keysigs and clefs are only in the first
// track (voice 0) of a staff
const KeySigEvent& keyIdx = staff->key(tick);
KeySigEvent keyIdx;
keyIdx.setAccidentalType(staff->key(tick));
for (Segment* seg = m->first(); seg; seg = seg->next()) {
// search only up to the first ChordRest
@ -1474,9 +1475,8 @@ void Score::addSystemHeader(Measure* m, bool isFirstSystem)
break;
}
}
bool needKeysig = /* !staff->isTabStaff() // keep key sigs in TABs: TABs themselves should hide them
&& */ keyIdx.isValid()
&& (isFirstSystem || styleB(StyleIdx::genKeysig));
bool needKeysig = // keep key sigs in TABs: TABs themselves should hide them
isFirstSystem || styleB(StyleIdx::genKeysig);
if (needKeysig && !keysig && keyIdx.accidentalType()) {
//
@ -2589,8 +2589,8 @@ QList<System*> Score::layoutSystemRow(qreal rowWidth, bool isFirstSystem, bool u
Staff* staff = _staves[staffIdx];
showCourtesySig = false;
KeySigEvent key1 = staff->key(tick - 1);
KeySigEvent key2 = staff->key(tick);
int key1 = staff->key(tick - 1);
int key2 = staff->key(tick);
if (styleB(StyleIdx::genCourtesyKeysig) && (key1 != key2)) {
// locate a key sig. in next measure and, if found,
// check if it has court. sig turned off
@ -2606,19 +2606,19 @@ QList<System*> Score::layoutSystemRow(qreal rowWidth, bool isFirstSystem, bool u
hasCourtesyKeysig = true;
s = m->undoGetSegment(SegmentType::KeySigAnnounce, tick);
KeySig* ks = static_cast<KeySig*>(s->element(track));
KeySigEvent ksv(key2);
if (!ks) {
ks = new KeySig(this);
ks->setKeySigEvent(ksv);
ks->setKey(key2);
ks->setTrack(track);
ks->setGenerated(true);
ks->setParent(s);
undoAddElement(ks);
}
else if (ks->keySigEvent() != ksv) {
undo(new ChangeKeySig(ks, ksv,
ks->showCourtesy() /*, ks->showNaturals()*/));
else if (ks->key() != key2) {
KeySigEvent ke = ks->keySigEvent();
ke.setAccidentalType(key2);
undo(new ChangeKeySig(ks, ke, ks->showCourtesy()));
}
// change bar line to qreal bar line
// m->setEndBarLineType(BarLineType::DOUBLE, true); // this caused issue #12918

View file

@ -1394,12 +1394,12 @@ qDebug("drop staffList");
if (data.modifiers & Qt::ControlModifier) {
// apply only to this stave
score()->undoChangeKeySig(staff, tick(), k);
score()->undoChangeKeySig(staff, tick(), k.accidentalType());
}
else {
// apply to all staves:
foreach(Staff* s, score()->staves())
score()->undoChangeKeySig(s, tick(), k);
score()->undoChangeKeySig(s, tick(), k.accidentalType());
}
break;

View file

@ -1058,8 +1058,8 @@ void Note::read(XmlReader& e)
_tpc[0] = Tpc::TPC_INVALID;
}
if (!tpcIsValid(_tpc[0]) && !tpcIsValid(_tpc[1])) {
KeySigEvent key = (staff() && chord()) ? staff()->key(chord()->tick()) : KeySigEvent();
int tpc = pitch2tpc(_pitch, key.accidentalType(), Prefer::NEAREST);
int key = (staff() && chord()) ? staff()->key(chord()->tick()) : 0;
int tpc = pitch2tpc(_pitch, key, Prefer::NEAREST);
if (concertPitch())
_tpc[0] = tpc;
else
@ -1622,8 +1622,8 @@ void Note::layout10(AccidentalState* as)
acci = _accidental->accidentalType();
if (acci == Accidental::AccidentalType::SHARP || acci == Accidental::AccidentalType::FLAT) {
// TODO - what about double flat and double sharp?
KeySigEvent key = (staff() && chord()) ? staff()->key(chord()->tick()) : KeySigEvent();
int ntpc = pitch2tpc(epitch(), key.accidentalType(), acci == Accidental::AccidentalType::SHARP ? Prefer::SHARPS : Prefer::FLATS);
int key = (staff() && chord()) ? staff()->key(chord()->tick()) : 0;
int ntpc = pitch2tpc(epitch(), key, acci == Accidental::AccidentalType::SHARP ? Prefer::SHARPS : Prefer::FLATS);
if (ntpc != tpc()) {
//not true: qDebug("note at %d has wrong tpc: %d, expected %d, acci %d", chord()->tick(), tpc(), ntpc, acci);
// setColor(QColor(255, 0, 0));

View file

@ -250,24 +250,6 @@ void Part::setMidiChannel(int) const
void Part::setInstrument(const Instrument& i, int tick)
{
_instrList.setInstrument(i, tick);
#if 0
//CHECK: ??
if (!_score->styleB(StyleIdx::concertPitch) && i.transpose().chromatic) {
foreach(Staff* staff, _staves) {
if (staff->staffType()->group() != StaffGroup::PERCUSSION)
_score->cmdTransposeStaff(staff->idx(), i.transpose(), false);
}
}
if (!_score->styleB(StyleIdx::concertPitch) && i.transpose().chromatic) {
foreach(Staff* staff, _staves) {
Interval iv(i.transpose());
iv.flip();
if (staff->staffType()->group() != StaffGroup::PERCUSSION)
_score->cmdTransposeStaff(staff->idx(), iv, false);
}
}
#endif
}
//---------------------------------------------------------

View file

@ -522,7 +522,6 @@ Score::FileError Score::read114(XmlReader& e)
qDebug("read114: Key tick %d", tick);
continue;
}
KeySigEvent ke = i->second;
Measure* m = tick2measure(tick);
if (!m) //empty score
break;
@ -530,6 +529,8 @@ Score::FileError Score::read114(XmlReader& e)
if (seg->element(track))
static_cast<KeySig*>(seg->element(track))->setGenerated(false);
else {
KeySigEvent ke;
ke.setAccidentalType(i->second);
KeySig* ks = keySigFactory(ke);
if (ks) {
ks->setParent(seg);

View file

@ -2426,25 +2426,25 @@ void Score::adjustKeySigs(int sidx, int eidx, KeyList km)
{
for (int staffIdx = sidx; staffIdx < eidx; ++staffIdx) {
Staff* staff = _staves[staffIdx];
if(!staff->isDrumStaff()) {
if (staff->isDrumStaff())
continue;
for (auto i = km.begin(); i != km.end(); ++i) {
int tick = i->first;
Measure* measure = tick2measure(tick);
KeySigEvent oKey = i->second;
KeySigEvent nKey = oKey;
int oKey = i->second;
int nKey = oKey;
int diff = -staff->part()->instr()->transpose().chromatic;
if (diff != 0 && !styleB(StyleIdx::concertPitch))
nKey.setAccidentalType(transposeKey(nKey.accidentalType(), diff));
staff->setKey(tick, nKey.accidentalType());
nKey = transposeKey(nKey, diff);
staff->setKey(tick, nKey);
KeySig* keysig = new KeySig(this);
keysig->setTrack(staffIdx * VOICES);
keysig->setKeySigEvent(nKey);
keysig->setKey(nKey);
Segment* s = measure->getSegment(keysig, tick);
s->add(keysig);
}
}
}
}
//---------------------------------------------------------
// cmdRemoveStaff

View file

@ -517,7 +517,7 @@ class Score : public QObject {
void undoChangeTuning(Note*, qreal);
void undoChangePageFormat(PageFormat*, qreal spatium, int);
void undoChangeUserMirror(Note*, DirectionH);
void undoChangeKeySig(Staff* ostaff, int tick, KeySigEvent st);
void undoChangeKeySig(Staff* ostaff, int tick, int key);
void undoChangeClef(Staff* ostaff, Segment*, ClefType st);
void undoChangeBarLine(Measure* m, BarLineType);
void undoChangeProperty(Element*, P_ID, const QVariant&, PropertyStyle ps = PropertyStyle::NOSTYLE);
@ -725,7 +725,6 @@ class Score : public QObject {
void rebuildMidiMapping();
void updateChannel();
void cmdTransposeStaff(int staffIdx, Interval, bool useDoubleSharpsFlats);
void cmdConcertPitchChanged(bool, bool /*useSharpsFlats*/);
void setTempomap(TempoMap* tm);

View file

@ -206,41 +206,6 @@ int transposeTpcDiatonicByKey(int tpc, int steps, int key, bool keepAlteredDegre
return newTpc;
}
//---------------------------------------------------------
// transposeStaff
//---------------------------------------------------------
void Score::cmdTransposeStaff(int staffIdx, Interval interval, bool useDoubleSharpsFlats)
{
if (staff(staffIdx)->staffType()->group() == StaffGroup::PERCUSSION)
return;
int startTrack = staffIdx * VOICES;
int endTrack = startTrack + VOICES;
transposeKeys(staffIdx, staffIdx+1, 0, lastSegment()->tick(), interval);
for (Segment* segment = firstSegment(); segment; segment = segment->next1()) {
for (int st = startTrack; st < endTrack; ++st) {
Element* e = segment->element(st);
if (!e || e->type() != ElementType::CHORD)
continue;
Chord* chord = static_cast<Chord*>(e);
QList<Note*> nl = chord->notes();
foreach(Note* n, nl)
transpose(n, interval, useDoubleSharpsFlats);
}
foreach (Element* e, segment->annotations()) {
if ((e->type() != ElementType::HARMONY) || (e->track() < startTrack) || (e->track() >= endTrack))
continue;
Harmony* h = static_cast<Harmony*>(e);
int rootTpc = transposeTpc(h->rootTpc(), interval, false);
int baseTpc = transposeTpc(h->baseTpc(), interval, false);
undoTransposeHarmony(h, rootTpc, baseTpc);
}
}
}
//---------------------------------------------------------
// transpose
//---------------------------------------------------------
@ -263,7 +228,7 @@ void Score::transpose(Note* n, Interval interval, bool useDoubleSharpsFlats)
// transpose
//---------------------------------------------------------
void Score::transpose(TransposeMode mode, TransposeDirection direction, int transposeKey,
void Score::transpose(TransposeMode mode, TransposeDirection direction, int trKey,
int transposeInterval, bool trKeys, bool transposeChordNames, bool useDoubleSharpsFlats)
{
bool rangeSelection = selection().isRange();
@ -275,14 +240,13 @@ void Score::transpose(TransposeMode mode, TransposeDirection direction, int tran
}
Staff* st = staff(startStaffIdx);
// KeyList* km = staff(startStaffIdx)->keys();
Interval interval;
if (mode != TransposeMode::DIATONICALLY) {
if (mode == TransposeMode::BY_KEY) {
// calculate interval from "transpose by key"
int oKey = st->key(startTick);
interval = keydiff2Interval(oKey, transposeKey, direction);
interval = keydiff2Interval(oKey, trKey, direction);
}
else {
interval = intervalList[transposeInterval];
@ -341,7 +305,9 @@ void Score::transpose(TransposeMode mode, TransposeDirection direction, int tran
else if ((e->type() == ElementType::KEYSIG) && mode != TransposeMode::DIATONICALLY && trKeys) {
KeySig* ks = static_cast<KeySig*>(e);
int key = st->key(ks->tick());
undo(new ChangeKeySig(ks, KeySigEvent(key), ks->showCourtesy()));
KeySigEvent ke = ks->keySigEvent();
ke.setAccidentalType(key);
undo(new ChangeKeySig(ks, ke, ks->showCourtesy()));
}
}
return;
@ -375,13 +341,17 @@ void Score::transpose(TransposeMode mode, TransposeDirection direction, int tran
tracks.append(idx + i);
}
for (Segment* segment = _selection.startSegment(); segment && segment != _selection.endSegment(); segment = segment->next1()) {
Segment* s1 = _selection.startSegment();
Segment* s2 = _selection.endSegment();
for (Segment* segment = s1; segment && segment != s2; segment = segment->next1()) {
for (int st : tracks) {
if (staff(st/VOICES)->staffType()->group() == StaffGroup::PERCUSSION)
continue;
Element* e = segment->element(st);
if (!e || e->type() != ElementType::CHORD)
if (!e)
continue;
if (e->type() == ElementType::CHORD) {
Chord* chord = static_cast<Chord*>(e);
QList<Note*> nl = chord->notes();
for (Note* n : nl) {
@ -399,6 +369,14 @@ void Score::transpose(TransposeMode mode, TransposeDirection direction, int tran
}
}
}
else if (e->type() == ElementType::KEYSIG && trKeys && mode != TransposeMode::DIATONICALLY) {
KeySig* ks = static_cast<KeySig*>(e);
int nKey = transposeKey(ks->key(), interval);
KeySigEvent ke = ks->keySigEvent();
ke.setAccidentalType(nKey);
undo(new ChangeKeySig(ks, ke, ks->showCourtesy()));
}
}
if (transposeChordNames) {
foreach (Element* e, segment->annotations()) {
if ((e->type() != ElementType::HARMONY) || (!tracks.contains(e->track())))
@ -421,10 +399,6 @@ void Score::transpose(TransposeMode mode, TransposeDirection direction, int tran
}
}
}
if (trKeys && mode != TransposeMode::DIATONICALLY) {
transposeKeys(_selection.staffStart(), _selection.staffEnd(),
_selection.tickStart(), _selection.tickEnd(), interval);
}
}
//---------------------------------------------------------
@ -448,7 +422,9 @@ void Score::transposeKeys(int staffStart, int staffEnd, int tickStart, int tickE
if (ks) {
int key = st->key(s->tick());
int nKey = transposeKey(key, interval);
undo(new ChangeKeySig(ks, KeySigEvent(nKey), ks->showCourtesy()));
KeySigEvent ke;
ke.setAccidentalType(nKey);
undo(new ChangeKeySig(ks, ke, ks->showCourtesy()));
}
}
}

View file

@ -417,7 +417,7 @@ void Score::undoChangePitch(Note* note, int pitch, int tpc1, int tpc2)
// undoChangeKeySig
//---------------------------------------------------------
void Score::undoChangeKeySig(Staff* ostaff, int tick, KeySigEvent st)
void Score::undoChangeKeySig(Staff* ostaff, int tick, int key)
{
KeySig* lks = 0;
foreach (Staff* staff, ostaff->staffList()) {
@ -435,17 +435,19 @@ void Score::undoChangeKeySig(Staff* ostaff, int tick, KeySigEvent st)
int diff = -staff->part()->instr()->transpose().chromatic;
if (diff && !score->styleB(StyleIdx::concertPitch))
st.setAccidentalType(transposeKey(st.accidentalType(), diff));
key = transposeKey(key, diff);
if (ks) {
ks->undoChangeProperty(P_ID::GENERATED, false);
undo(new ChangeKeySig(ks, st, ks->showCourtesy()));
KeySigEvent kse = ks->keySigEvent();
kse.setAccidentalType(key);
undo(new ChangeKeySig(ks, kse, ks->showCourtesy()));
}
else {
KeySig* nks = new KeySig(score);
nks->setParent(s);
nks->setTrack(track);
nks->setKeySigEvent(st);
nks->setKey(key);
undo(new AddElement(nks));
if (lks)
lks->linkTo(nks);
@ -465,8 +467,11 @@ void Score::undoChangeKeySig(Staff* ostaff, int tick, KeySigEvent st)
continue;
if (!ks->generated())
break;
if (ks->keySigEvent() != st)
undo(new ChangeKeySig(ks, st, ks->showCourtesy()));
if (ks->key() != key) {
KeySigEvent kse = ks->keySigEvent();
kse.setAccidentalType(key);
undo(new ChangeKeySig(ks, kse, ks->showCourtesy()));
}
}
}
}

View file

@ -533,7 +533,7 @@ Score::FileError importBB(Score* score, const QString& name)
staff->setKey(tick, bb.key());
KeySig* keysig = new KeySig(score);
keysig->setTrack((score->staffIdx(staff->part()) + staff->rstaff()) * VOICES);
keysig->setKeySigEvent(KeySigEvent(bb.key()));
keysig->setKey(bb.key());
Measure* mks = score->tick2measure(tick);
Segment* sks = mks->getSegment(keysig, tick);
sks->add(keysig);

View file

@ -498,11 +498,11 @@ void MTrack::createKeys(int accidentalType)
}
for (auto it = km->begin(); it != km->end(); ++it) {
const int tick = it->first;
const KeySigEvent &key = it->second;
int key = it->second;
KeySig* ks = new KeySig(score);
ks->setTrack(track);
ks->setGenerated(false);
ks->setKeySigEvent(key);
ks->setKey(key);
ks->setMag(staff->mag());
Measure* m = score->tick2measure(tick);
Segment* seg = m->getSegment(ks, tick);

View file

@ -779,7 +779,7 @@ void OveToMScore::convertSignatures(){
KeySig* keysig = new KeySig(score_);
keysig->setTrack((staffCount+j) * VOICES);
keysig->setKeySigEvent(KeySigEvent(keyValue));
keysig->setKey(keyValue);
Segment* s = measure->getSegment(keysig, tick);
s->add(keysig);

View file

@ -2296,7 +2296,7 @@ Measure* MusicXml::xmlMeasure(Part* part, QDomElement e, int number, Fraction me
// Check for "superfluous" accidentals to mark them as USER accidentals.
// The candiadates list courtAccNotes is ordered voice after voice. Check it here segment after segment.
AccidentalState currAcc;
currAcc.init(currKeySig->keySigEvent());
currAcc.init(currKeySig->keySigEvent().accidentalType());
SegmentType st = SegmentType::ChordRest;
for (Ms::Segment* segment = measure->first(st); segment; segment = segment->next(st)) {
for (int track = 0; track < staves * VOICES; ++track) {
@ -3239,8 +3239,8 @@ void MusicXml::xmlAttributes(Measure* measure, int staff, QDomElement e, KeySig*
int staves = score->staff(staff)->part()->nstaves();
// apply to all staves in part
for (int i = 0; i < staves; ++i) {
KeySigEvent oldkey = score->staff(staffIdx+i)->key(tick);
if (oldkey != key) {
int oldkey = score->staff(staffIdx+i)->key(tick);
if (oldkey != key.accidentalType()) {
// new key differs from key in effect at this tick
KeySig* keysig = new KeySig(score);
keysig->setTrack((staffIdx + i) * VOICES);
@ -3256,8 +3256,8 @@ void MusicXml::xmlAttributes(Measure* measure, int staff, QDomElement e, KeySig*
//
// apply key to staff(staffIdx) only
//
KeySigEvent oldkey = score->staff(staffIdx)->key(tick);
if (oldkey != key) {
int oldkey = score->staff(staffIdx)->key(tick);
if (oldkey != key.accidentalType()) {
// new key differs from key in effect at this tick
KeySig* keysig = new KeySig(score);
keysig->setTrack(staffIdx * VOICES);

View file

@ -896,8 +896,8 @@ void MuseScore::editInstrList()
int interval = firstStaff->part()->instr()->transpose().chromatic;
for (auto i = tmpKeymap.begin(); i != tmpKeymap.end(); ++i) {
int tick = i->first;
KeySigEvent oKey = i->second;
tmpKeymap[tick] = transposeKey(oKey.accidentalType(), interval);
int oKey = i->second;
tmpKeymap[tick] = transposeKey(oKey, interval);
}
}

View file

@ -200,16 +200,16 @@ Palette* MuseScore::newKeySigPalette()
for (int i = 0; i < 7; ++i) {
KeySig* k = new KeySig(gscore);
k->setKeySigEvent(KeySigEvent(i+1));
k->setKey(i + 1);
sp->append(k, keyNames[i*2]);
}
for (int i = -7; i < 0; ++i) {
KeySig* k = new KeySig(gscore);
k->setKeySigEvent(KeySigEvent(i));
k->setKey(i);
sp->append(k, keyNames[(7 + i) * 2 + 1]);
}
KeySig* k = new KeySig(gscore);
k->setKeySigEvent(KeySigEvent(0));
k->setKey(0);
sp->append(k, keyNames[14]);
return sp;
}