void assignKeyListToStaff(const KeyList &kl, Staff *staff) { Score* score = staff->score(); const int track = staff->idx() * VOICES; Key pkey = Key::C; for (auto it = kl.begin(); it != kl.end(); ++it) { const int tick = it->first; Key key = it->second.key(); if ((key == Key::C) && (key == pkey)) // dont insert uneccessary C key continue; pkey = key; KeySig* ks = new KeySig(score); ks->setTrack(track); ks->setGenerated(false); ks->setKey(key); ks->setMag(staff->mag()); Measure* m = score->tick2measure(tick); Segment* seg = m->getSegment(ks, tick); seg->add(ks); } }
void MTrack::convertTrack(const Fraction &lastTick) { Score* score = staff->score(); int key = 0; // TODO-LIB findKey(mtrack, score->sigmap()); int track = staff->idx() * VOICES; int voices = VOICES; for (int voice = 0; voice < voices; ++voice) { // startChordTick is onTime value of all simultaneous notes // chords here are consist of notes with equal durations // several chords may have the same onTime value Fraction startChordTick; QList<MidiChord> midiChords; for (auto it = chords.begin(); it != chords.end();) { const Fraction &nextChordTick = it->first; const MidiChord& midiChord = it->second; if (midiChord.voice != voice) { ++it; continue; } processPendingNotes(midiChords, voice, startChordTick, nextChordTick); // now 'midiChords' list is empty // so - fill it: // collect all midiChords on current tick position startChordTick = nextChordTick; // debug for (;it != chords.end(); ++it) { const MidiChord& midiChord = it->second; if (it->first != startChordTick) break; if (midiChord.voice != voice) continue; midiChords.append(midiChord); } if (midiChords.isEmpty()) break; } // process last chords at the end of the score processPendingNotes(midiChords, voice, startChordTick, lastTick); } createTuplets(track, score); KeyList* km = staff->keymap(); if (!hasKey && !mtrack->drumTrack()) { KeySigEvent ks; ks.setAccidentalType(key); (*km)[0] = ks; } for (auto it = km->begin(); it != km->end(); ++it) { int tick = it->first; KeySigEvent key = it->second; KeySig* ks = new KeySig(score); ks->setTrack(track); ks->setGenerated(false); ks->setKeySigEvent(key); ks->setMag(staff->mag()); Measure* m = score->tick2measure(tick); Segment* seg = m->getSegment(ks, tick); seg->add(ks); } #if 0 // TODO ClefList* cl = staff->clefList(); for (ciClefEvent i = cl->begin(); i != cl->end(); ++i) { int tick = i.key(); Clef* clef = new Clef(score); clef->setClefType(i.value()); clef->setTrack(track); clef->setGenerated(false); clef->setMag(staff->mag()); Measure* m = score->tick2measure(tick); Segment* seg = m->getSegment(clef, tick); seg->add(clef); } #endif }