diff --git a/libmscore/cmd.cpp b/libmscore/cmd.cpp index 4a3be8f622bd..cd44a3a322f6 100644 --- a/libmscore/cmd.cpp +++ b/libmscore/cmd.cpp @@ -384,9 +384,12 @@ qDebug("add pitch %d %d", pitch, addFlag); Note* n = addNote(chord, pitch); setLayoutAll(false); setLayout(chord->measure()); - moveToNextInputPos(); return n; } + if (_is.moveBeforeAdding()) + moveToNextInputPos(); + else + _is.setMoveBeforeAdding(true); expandVoice(); // insert note @@ -444,7 +447,6 @@ qDebug("add pitch %d %d", pitch, addFlag); qDebug("addPitch: cannot find slur note"); setLayoutAll(true); } - moveToNextInputPos(); return note; } @@ -1573,7 +1575,9 @@ bool Score::processMidiInput() startCmd(); cmdActive = true; } - n = addPitch(ev.pitch, ev.chord); + Note* n2 = addPitch(ev.pitch, ev.chord); + if (n2) + n = n2; } } if (cmdActive) { diff --git a/libmscore/input.cpp b/libmscore/input.cpp index dc2ea04946e1..856fea999d66 100644 --- a/libmscore/input.cpp +++ b/libmscore/input.cpp @@ -32,6 +32,7 @@ InputState::InputState() : _segment(0), _string(VISUAL_STRING_NONE), _repitchMode(false), + _moveBeforeAdding(false), rest(false), pitch(72), noteType(NOTE_NORMAL), diff --git a/libmscore/input.h b/libmscore/input.h index 6649e0eee658..d8c93411e394 100644 --- a/libmscore/input.h +++ b/libmscore/input.h @@ -34,6 +34,7 @@ class InputState { Segment* _segment; // current segment int _string; // visual string selected for input (TAB staves only) bool _repitchMode; + bool _moveBeforeAdding; public: bool rest; // rest mode @@ -70,6 +71,9 @@ class InputState { bool repitchMode() const { return _repitchMode; } void setRepitchMode(bool val) { _repitchMode = val; } + bool moveBeforeAdding() const { return _moveBeforeAdding; } + void setMoveBeforeAdding(bool val) { _moveBeforeAdding = val; } + StaffGroup staffGroup() const; }; diff --git a/libmscore/score.cpp b/libmscore/score.cpp index dd8b733e9344..cc509379fbc3 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -2705,6 +2705,7 @@ void Score::setInputState(Element* e) e = static_cast(e)->upNote(); _is.setDrumNote(-1); + _is.setMoveBeforeAdding(false); // _is.setDrumset(0); if (e->type() == Element::NOTE) { Note* note = static_cast(e); diff --git a/mscore/scoreview.cpp b/mscore/scoreview.cpp index 0b1613407686..11617701b020 100644 --- a/mscore/scoreview.cpp +++ b/mscore/scoreview.cpp @@ -3501,7 +3501,9 @@ void ScoreView::adjustCanvasPosition(const Element* el, bool playBack) } const Measure* m; - if (el->type() == Element::NOTE) + if (!el) + return; + else if (el->type() == Element::NOTE) m = static_cast(el)->chord()->measure(); else if (el->type() == Element::REST) m = static_cast(el)->measure();