diff --git a/mscore/importmidi.cpp b/mscore/importmidi.cpp index 46a3538f3737..524d4d74877b 100644 --- a/mscore/importmidi.cpp +++ b/mscore/importmidi.cpp @@ -164,7 +164,7 @@ void quantizeAllTracks(std::multimap &tracks, } } const auto basicQuant = Quantize::quantValueToFraction( - opers.data()->trackOpers.quantValue.defaultValue()); + opers.data()->trackOpers.quantValue.value(mtrack.indexOfOperation)); MChord::setBarIndexes(mtrack.chords, basicQuant, lastTick, sigmap); MidiTuplet::findAllTuplets(mtrack.tuplets, mtrack.chords, sigmap, lastTick, basicQuant); @@ -716,14 +716,10 @@ void createInstruments(Score *score, QList &tracks) for (int idx = 0; idx < ntracks; ++idx) { MTrack& track = tracks[idx]; Part* part = new Part(score); - Staff* s = new Staff(score); - s->setPart(part); - part->insertStaff(s, 0); - score->staves().push_back(s); - track.staff = s; if (track.mtrack->drumTrack()) { - s->setStaffType(StaffType::preset(StaffTypes::PERC_DEFAULT)); + part->setStaves(1); + part->staff(0)->setStaffType(StaffType::preset(StaffTypes::PERC_DEFAULT)); part->instr()->setDrumset(smDrumset); part->instr()->setUseDrumset(DrumsetKind::DEFAULT_DRUMS); } @@ -732,17 +728,20 @@ void createInstruments(Score *score, QList &tracks) && isGrandStaff(tracks[idx], tracks[idx + 1])) { // assume that the current track and the next track // form a piano part - s->setBracket(0, BracketType::BRACE); - s->setBracketSpan(0, 2); + part->setStaves(2); + part->staff(0)->setBracket(0, BracketType::BRACE); + part->staff(0)->setBracketSpan(0, 2); - Staff* ss = new Staff(score); - ss->setPart(part); - part->insertStaff(ss, 1); - score->staves().push_back(ss); ++idx; - tracks[idx].staff = ss; + tracks[idx].staff = part->staff(1); + } + else { + part->setStaves(1); } } + + track.staff = part->staff(0); + part->staves()->front()->setBarLineSpan(part->nstaves()); score->appendPart(part); } } diff --git a/mscore/importmidi_model.cpp b/mscore/importmidi_model.cpp index 3b87e7cfacd1..de7a121f1e7a 100644 --- a/mscore/importmidi_model.cpp +++ b/mscore/importmidi_model.cpp @@ -810,13 +810,19 @@ Qt::ItemFlags TracksModel::itemFlags(int row, int col) const const int trackIndex = trackIndexFromRow(row); if (_columns[col]->isVisible(trackIndex)) { - if (_columns[col]->value(0).type() == QVariant::Bool) + if (_columns[col]->value(0).type() == QVariant::Bool) { flags |= Qt::ItemIsUserCheckable; - else if (_columns[col]->isEditable() - && editableSingleTrack(trackIndex, col)) { - QVariant value = _columns[col]->value(0); - if (value.type() != QVariant::Bool) // not checkboxes + } + else { + if (trackIndex == -1) { flags |= Qt::ItemIsEditable; + } + else if (_columns[col]->isEditable() + && editableSingleTrack(trackIndex, col)) { + QVariant value = _columns[col]->value(0); + if (value.type() != QVariant::Bool) // not checkboxes + flags |= Qt::ItemIsEditable; + } } } return flags; @@ -831,13 +837,18 @@ Qt::ItemFlags TracksModel::flags(const QModelIndex &index) const const int trackIndex = trackIndexFromRow(index.row()); if (trackIndex == -1) { // all tracks row - for (int i = 0; i < _trackCount; ++i) { - const auto newFlags = itemFlags(rowFromTrackIndex(i), index.column()); - if (newFlags) { - flags |= newFlags; - break; + if (!_columns[index.column()]->isForAllTracksOnly()) { + for (int i = 0; i < _trackCount; ++i) { + const auto newFlags = itemFlags(rowFromTrackIndex(i), index.column()); + if (newFlags) { + flags |= newFlags; + break; + } } } + else { + flags |= itemFlags(index.row(), index.column()); + } } else { flags |= itemFlags(index.row(), index.column()); @@ -897,8 +908,10 @@ bool TracksModel::setData(const QModelIndex &index, const QVariant &value, int / QVariant TracksModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (section < 0 || section >= (int)_columns.size()) + if ((orientation == Qt::Vertical && !isRowValid(section)) + || (orientation == Qt::Horizontal && !isColumnValid(section))) { return QVariant(); + } if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (!_columns.empty()) { @@ -922,9 +935,14 @@ bool TracksModel::isTrackIndexValid(int trackIndex) const return trackIndex >= -1 && trackIndex < _trackCount; } +bool TracksModel::isRowValid(int row) const + { + return row >= 0 && ((_trackCount == 1) ? row < _trackCount : row <= _trackCount); + } + bool TracksModel::isColumnValid(int column) const { - return (column >= 0 && column < (int)_columns.size()); + return column >= 0 && column < (int)_columns.size(); } } // namespace Ms diff --git a/mscore/importmidi_model.h b/mscore/importmidi_model.h index 66725ca15a0d..896a2c5d5f54 100644 --- a/mscore/importmidi_model.h +++ b/mscore/importmidi_model.h @@ -41,6 +41,7 @@ class TracksModel : public QAbstractTableModel private: bool isTrackIndexValid(int trackIndex) const; + bool isRowValid(int row) const; bool isColumnValid(int column) const; void forceRowDataChanged(int row); void forceColumnDataChanged(int col); diff --git a/mscore/importmidi_tuplet_filter.cpp b/mscore/importmidi_tuplet_filter.cpp index fdeeed0edb7a..5cc67be6e44a 100644 --- a/mscore/importmidi_tuplet_filter.cpp +++ b/mscore/importmidi_tuplet_filter.cpp @@ -664,7 +664,7 @@ std::vector findBestTuplets( void removeExtraTuplets(std::vector &tuplets) { - const size_t MAX_TUPLETS = 23; // found empirically + const size_t MAX_TUPLETS = 17; // found empirically if (tuplets.size() <= MAX_TUPLETS) return; diff --git a/mtest/importmidi/m1.mscx b/mtest/importmidi/m1.mscx index 28bf1e8d5871..0c97596a3bcd 100644 --- a/mtest/importmidi/m1.mscx +++ b/mtest/importmidi/m1.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/m2.mscx b/mtest/importmidi/m2.mscx index d58dcccc8cc7..f9037398b444 100644 --- a/mtest/importmidi/m2.mscx +++ b/mtest/importmidi/m2.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/m3.mscx b/mtest/importmidi/m3.mscx index b5c913f7cc79..02066f12c151 100644 --- a/mtest/importmidi/m3.mscx +++ b/mtest/importmidi/m3.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/m4.mscx b/mtest/importmidi/m4.mscx index 3f7e210978c5..524976fbb489 100644 --- a/mtest/importmidi/m4.mscx +++ b/mtest/importmidi/m4.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/m5.mscx b/mtest/importmidi/m5.mscx index 28bf1e8d5871..0c97596a3bcd 100644 --- a/mtest/importmidi/m5.mscx +++ b/mtest/importmidi/m5.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/split_2_melodies.mscx b/mtest/importmidi/split_2_melodies.mscx index 8b069268b571..4044de49bf8f 100644 --- a/mtest/importmidi/split_2_melodies.mscx +++ b/mtest/importmidi/split_2_melodies.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/split_acid.mscx b/mtest/importmidi/split_acid.mscx index 5e087f3d778e..45c34a10b011 100644 --- a/mtest/importmidi/split_acid.mscx +++ b/mtest/importmidi/split_acid.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/split_nontuplet.mscx b/mtest/importmidi/split_nontuplet.mscx index 84b92a3ff467..3241e59e2a47 100644 --- a/mtest/importmidi/split_nontuplet.mscx +++ b/mtest/importmidi/split_nontuplet.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/split_octave.mscx b/mtest/importmidi/split_octave.mscx index 782241cce408..721f71098537 100644 --- a/mtest/importmidi/split_octave.mscx +++ b/mtest/importmidi/split_octave.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/split_tuplet.mscx b/mtest/importmidi/split_tuplet.mscx index 5041316656d7..d7119bb33344 100644 --- a/mtest/importmidi/split_tuplet.mscx +++ b/mtest/importmidi/split_tuplet.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/tuplet_5_5_tuplets_rests.mscx b/mtest/importmidi/tuplet_5_5_tuplets_rests.mscx index a425e32717d7..2d0c2b393d9c 100644 --- a/mtest/importmidi/tuplet_5_5_tuplets_rests.mscx +++ b/mtest/importmidi/tuplet_5_5_tuplets_rests.mscx @@ -45,6 +45,7 @@ + 2 diff --git a/mtest/importmidi/tuplet_triplets_mixed.mscx b/mtest/importmidi/tuplet_triplets_mixed.mscx index 30907da448bb..f6aa3047e114 100644 --- a/mtest/importmidi/tuplet_triplets_mixed.mscx +++ b/mtest/importmidi/tuplet_triplets_mixed.mscx @@ -45,6 +45,7 @@ + 2