Skip to content

Commit

Permalink
[Command] Octave shift for note-entry
Browse files Browse the repository at this point in the history
  • Loading branch information
worldwideweary committed Sep 30, 2024
1 parent cb5510b commit 1996a4d
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 31 deletions.
67 changes: 41 additions & 26 deletions libmscore/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -603,8 +603,10 @@ void Score::cmdAddInterval(int val, const std::vector<Note*>& nl)
}
}
}
else { // octave:
forceAccidental = true;
else {
// Special case for Octave -
// Guarantee an accidental when explicitly existing on current note (including natural signs)
forceAccidental = (on->accidentalType() != AccidentalType::NONE);
Interval interval(7, 12);
if (val < 0)
interval.flip();
Expand Down Expand Up @@ -1579,6 +1581,9 @@ void Score::upDown(bool up, UpDownMode mode)
int newPitch = pitch; // default to unchanged
int string = oNote->string();
int fret = oNote->fret();
auto accidentalType = oNote->accidentalType();
bool hasTie = (oNote->tieBack() || oNote->tieFor());
bool manuallyAppliedAccidental = false;

StaffGroup staffGroup = staff->staffType(oNote->chord()->tick())->group();
// if not tab, check for instrument instead of staffType (for pitched to unpitched instrument changes)
Expand All @@ -1600,7 +1605,8 @@ void Score::upDown(bool up, UpDownMode mode)
{
const StringData* stringData = part->instrument(tick)->stringData();
switch (mode) {
case UpDownMode::OCTAVE: // move same note to next string, if possible
case UpDownMode::OCTAVE: // fallthrough
case UpDownMode::OCTAVE_QUICK: // move same note to next string, if possible
{
const StaffType* stt = staff->staffType(tick);
string = stt->physStringToVisual(string);
Expand Down Expand Up @@ -1649,7 +1655,8 @@ void Score::upDown(bool up, UpDownMode mode)
break;
case StaffGroup::STANDARD:
switch (mode) {
case UpDownMode::OCTAVE:
case UpDownMode::OCTAVE: // fallthrough
case UpDownMode::OCTAVE_QUICK:
if (up) {
if (pitch < 116)
newPitch = pitch + 12;
Expand Down Expand Up @@ -1708,15 +1715,28 @@ void Score::upDown(bool up, UpDownMode mode)
// unless it's an octave change
// in this case courtesy accidentals are preserved
// because they're now harder to be re-entered due to the revised note-input workflow
if (mode != UpDownMode::OCTAVE) {
if (mode != UpDownMode::OCTAVE && mode != UpDownMode::OCTAVE_QUICK) {
auto l = oNote->linkList();
for (ScoreElement* e : qAsConst(l)) {
Note* ln = toNote(e);
if (ln->accidental())
undo(new RemoveElement(ln->accidental()));
}
}
undoChangePitch(oNote, newPitch, newTpc1, newTpc2);
if (mode == UpDownMode::OCTAVE_QUICK && !hasTie && !selection().isRange()) {
// This style of octave-shifting will guarantee the exact explicit accidental-type
// as it was before shifting - useful for transcribing in note-entry.
startCmd();
setPlayNote(false);
undoChangePitch(oNote, newPitch, newTpc1, newTpc2);
endCmd();
startCmd();
changeAccidental(oNote, accidentalType);
endCmd();
manuallyAppliedAccidental = true;
}
// Chromatic / Diatonic / Standard Octave:
else undoChangePitch(oNote, newPitch, newTpc1, newTpc2);
}

// store fret change only if undoChangePitch has not been called,
Expand All @@ -1738,7 +1758,8 @@ void Score::upDown(bool up, UpDownMode mode)
}

// play new note with velocity 80 for 0.3 sec:
setPlayNote(true);
if (!manuallyAppliedAccidental)
setPlayNote(true);
}
setSelectionChanged(true);
}
Expand Down Expand Up @@ -1817,6 +1838,7 @@ void Score::toggleAccidental(AccidentalType at, const EditData& ed)
if (noteEntryMode()) {
_is.setAccidentalType(at);
_is.setRest(false);
setPlayNote(false);
}
else {
if (selection().isNone()) {
Expand Down Expand Up @@ -3791,29 +3813,20 @@ void Score::cmdTimeDelete()
}

//---------------------------------------------------------
// cmdPitchUpOctave
//---------------------------------------------------------

void Score::cmdPitchUpOctave()
{
Element* el = selection().element();
if (el && (el->isArticulation() || el->isTextBase()))
el->undoChangeProperty(Pid::OFFSET, el->offset() + QPointF(0.0, -MScore::nudgeStep10 * el->spatium()), PropertyFlags::UNSTYLED);
else
upDown(true, UpDownMode::OCTAVE);
}

//---------------------------------------------------------
// cmdPitchDownOctave
// cmdPitchUpDownOctave
//---------------------------------------------------------

void Score::cmdPitchDownOctave()
void Score::cmdPitchUpDownOctave(Direction dir, bool noteEntry)
{
signed int sign = (dir == Direction::DOWN ? +1 : -1);
Element* el = selection().element();
auto x = 0.0;
auto y = sign * MScore::nudgeStep10 * el->spatium();
bool up = (dir == Direction::UP);
if (el && (el->isArticulation() || el->isTextBase()))
el->undoChangeProperty(Pid::OFFSET, el->offset() + QPointF(0.0, MScore::nudgeStep10 * el->spatium()), PropertyFlags::UNSTYLED);
el->undoChangeProperty(Pid::OFFSET, el->offset() + QPointF(x, y), PropertyFlags::UNSTYLED);
else
upDown(false, UpDownMode::OCTAVE);
upDown(up, UpDownMode::OCTAVE, noteEntry);
}

//---------------------------------------------------------
Expand Down Expand Up @@ -4633,8 +4646,10 @@ void Score::cmd(const QAction* a, EditData& ed)
{ "pitch-up", [](Score* cs, EditData&){ cs->cmdPitchUp(); }},
{ "pitch-down", [](Score* cs, EditData&){ cs->cmdPitchDown(); }},
{ "time-delete", [](Score* cs, EditData&){ cs->cmdTimeDelete(); }},
{ "pitch-up-octave", [](Score* cs, EditData&){ cs->cmdPitchUpOctave(); }},
{ "pitch-down-octave", [](Score* cs, EditData&){ cs->cmdPitchDownOctave(); }},
{ "pitch-up-octave", [](Score* cs, EditData&){ cs->cmdPitchUpDownOctave(Direction::UP, false); }},
{ "pitch-down-octave", [](Score* cs, EditData&){ cs->cmdPitchUpDownOctave(Direction::DOWN, false); }},
{ "pitch-up-octave-quick", [](Score* cs, EditData&){ cs->cmdPitchUpDownOctave(Direction::UP, true); }},
{ "pitch-down-octave-quick", [](Score* cs, EditData&){ cs->cmdPitchUpDownOctave(Direction::DOWN, true); }},
{ "pad-note-increase", [](Score* cs, EditData& ed){ cs->cmdPadNoteIncreaseTAB(ed); }},
{ "pad-note-decrease", [](Score* cs, EditData& ed){ cs->cmdPadNoteDecreaseTAB(ed); }},
{ "pad-note-increase-TAB", [](Score* cs, EditData& ed){ cs->cmdPadNoteIncreaseTAB(ed); }},
Expand Down
2 changes: 1 addition & 1 deletion libmscore/mscore.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ enum class KeySigNatural : char {
//---------------------------------------------------------

enum class UpDownMode : char {
CHROMATIC, OCTAVE, DIATONIC
CHROMATIC, OCTAVE, DIATONIC, OCTAVE_QUICK
};

//---------------------------------------------------------
Expand Down
4 changes: 3 additions & 1 deletion libmscore/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2935,8 +2935,10 @@ void Score::padToggle(Pad p, const EditData& ed)
}
}

if (noteEntryMode())
if (noteEntryMode()) {
setPlayNote(false);
return;
}

std::vector<ChordRest*> crs;
std::list<Element*> elementsToSelect;
Expand Down
5 changes: 2 additions & 3 deletions libmscore/score.h
Original file line number Diff line number Diff line change
Expand Up @@ -567,8 +567,7 @@ class Score : public QObject, public ScoreElement {
void createGraceNotesPlayEvents(const Fraction& tick, Chord* chord, int& ontime, int& trailtime);
void cmdPitchUp();
void cmdPitchDown();
void cmdPitchUpOctave();
void cmdPitchDownOctave();
void cmdPitchUpDownOctave(Direction dir, bool noteEntry);
void cmdPadNoteIncreaseTAB(const EditData& ed);
void cmdPadNoteDecreaseTAB(const EditData& ed);
void cmdToggleMmrest();
Expand Down Expand Up @@ -715,7 +714,7 @@ class Score : public QObject, public ScoreElement {
std::vector<Rest*> setRests(const Fraction& tick, int track, const Fraction&, bool useDots, Tuplet* tuplet,
bool useFullMeasureRest = true);

void upDown(bool up, UpDownMode);
void upDown(bool up, UpDownMode, bool noteEntry=false);
void upDownDelta(int pitchDelta);
ChordRest* searchNote(const Fraction& tick, int track) const;

Expand Down
20 changes: 20 additions & 0 deletions mscore/shortcut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,16 @@ Shortcut Shortcut::_sc[] = {
Icons::Invalid_ICON,
Qt::WindowShortcut
},
{
MsWidget::SCORE_TAB,
STATE_NORMAL | STATE_NOTE_ENTRY,
"pitch-up-octave-quick"
QT_TRANSLATE_NOOP("action","Up Octave (disregard previous alterations)"),
QT_TRANSLATE_NOOP("action","Pitch up octave (disregard previous alterations)"),
QT_TRANSLATE_NOOP("action","Pitch up by an octave (disregard previous alterations) or move text or articulation up"),
Icons::Invalid_ICON,
Qt::WindowShortcut
},
{
MsWidget::SCORE_TAB,
STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
Expand Down Expand Up @@ -934,6 +944,16 @@ Shortcut Shortcut::_sc[] = {
Qt::WindowShortcut,
ShortcutFlags::A_CMD
},
{
MsWidget::SCORE_TAB,
STATE_NORMAL | STATE_NOTE_ENTRY,
"pitch-down-octave-quick"
QT_TRANSLATE_NOOP("action","Down Octave (disregard previous alterations)"),
QT_TRANSLATE_NOOP("action","Pitch down octave (disregard previous alterations)"),
QT_TRANSLATE_NOOP("action","Pitch down by an octave (disregard previous alterations) or move text or articulation down"),
Icons::Invalid_ICON,
Qt::WindowShortcut
},
{
MsWidget::SCORE_TAB,
STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
Expand Down

0 comments on commit 1996a4d

Please sign in to comment.