Skip to content

Commit

Permalink
Merge pull request #20147 from mike-spa/fixYetMoreBendStuff
Browse files Browse the repository at this point in the history
Yet more bendage
  • Loading branch information
RomanPudashkin committed Nov 23, 2023
2 parents de9dc23 + 965a167 commit 1587787
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 17 deletions.
7 changes: 7 additions & 0 deletions src/engraving/dom/cmd.cpp
Expand Up @@ -839,6 +839,13 @@ Note* Score::setGraceNote(Chord* ch, int pitch, NoteType type, int len)
GuitarBend* Score::addGuitarBend(GuitarBendType type, Note* note, Note* endNote)
{
if (note->isPreBendStart()) {
if (type == GuitarBendType::BEND && note->staffType()->isTabStaff()) {
GuitarBend* preBend = note->bendFor();
Note* mainNote = preBend ? preBend->endNote() : nullptr;
if (mainNote) {
return addGuitarBend(type, mainNote, nullptr);
}
}
return nullptr;
}

Expand Down
20 changes: 20 additions & 0 deletions src/engraving/dom/excerpt.cpp
Expand Up @@ -33,6 +33,7 @@
#include "box.h"
#include "chord.h"
#include "factory.h"
#include "guitarbend.h"
#include "harmony.h"
#include "layoutbreak.h"
#include "linkedobjects.h"
Expand Down Expand Up @@ -1516,6 +1517,25 @@ void Excerpt::cloneStaff2(Staff* srcStaff, Staff* dstStaff, const Fraction& star
LOGD("cloneStaff2: cannot find tie");
}
}
GuitarBend* bendBack = on->bendBack();
Note* newStartNote = bendBack ? toNote(bendBack->startNote()->findLinkedInStaff(dstStaff)) : nullptr;
if (bendBack && newStartNote) {
GuitarBend* newBend = toGuitarBend(bendBack->linkedClone());
newBend->setScore(score);
newBend->setStartElement(newStartNote);
newBend->setEndElement(nn);
newStartNote->addSpannerFor(newBend);
nn->addSpannerBack(newBend);
}
GuitarBend* bendFor = on->bendFor();
if (bendFor && bendFor->type() == GuitarBendType::SLIGHT_BEND) {
// Because slight bends aren't detected as "bendBack"
GuitarBend* newBend = toGuitarBend(bendFor->linkedClone());
newBend->setScore(score);
newBend->setStartElement(nn);
newBend->setEndElement(nn);
nn->addSpannerFor(newBend);
}
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/engraving/dom/score.cpp
Expand Up @@ -1644,6 +1644,9 @@ void Score::removeElement(EngravingItem* element)
if (endNote) {
endNote->setGhost(false);
endNote->setVisible(true);
const StringData* stringData = endNote->part()->stringData(endNote->tick(), endNote->staffIdx());
int endFret = stringData->fret(endNote->pitch(), endNote->string(), endNote->staff());
endNote->undoChangeProperty(Pid::FRET, endFret);
}
break;
}
Expand Down
38 changes: 21 additions & 17 deletions src/inspector/models/notation/bends/bendsettingsmodel.cpp
Expand Up @@ -273,31 +273,35 @@ void BendSettingsModel::setBendCurve(const QVariantList& newBendCurve)

const CurvePoint& endTimePoint = points.at(END_POINT_INDEX);

int bendAmount = curvePitchToBendAmount(endTimePoint.pitch);
int pitch = bendAmount / 2 + bend->startNoteOfChain()->pitch();
QuarterOffset quarterOff = bendAmount % 2 ? QuarterOffset::QUARTER_SHARP : QuarterOffset::NONE;
if (pitch == bend->startNote()->pitch() && quarterOff == QuarterOffset::QUARTER_SHARP) {
// Because a flat second is more readable than a sharp unison
pitch += 1;
quarterOff = QuarterOffset::QUARTER_FLAT;
}

float starTimeFactor = static_cast<float>(points.at(START_POINT_INDEX).time) / CurvePoint::MAX_TIME;
float endTimeFactor = static_cast<float>(endTimePoint.time) / CurvePoint::MAX_TIME;
bool pitchChanged = endTimePoint.pitch != m_bendCurve.at(END_POINT_INDEX).pitch;

beginCommand();

if (!m_releaseBend) {
bend->setEndNotePitch(pitch, quarterOff);
} else {
int oldBendAmount = curvePitchToBendAmount(m_bendCurve[START_POINT_INDEX].pitch);
pitch = bend->startNote()->pitch() - ((oldBendAmount - bendAmount) / 2);
if (pitchChanged) {
int bendAmount = curvePitchToBendAmount(endTimePoint.pitch);
int pitch = bendAmount / 2 + bend->startNoteOfChain()->pitch();
QuarterOffset quarterOff = bendAmount % 2 ? QuarterOffset::QUARTER_SHARP : QuarterOffset::NONE;
if (pitch == bend->startNote()->pitch() && quarterOff == QuarterOffset::QUARTER_SHARP) {
// Because a flat second is more readable than a sharp unison
pitch += 1;
quarterOff = QuarterOffset::QUARTER_FLAT;
}

bend->setEndNotePitch(pitch, quarterOff);
if (!m_releaseBend) {
bend->setEndNotePitch(pitch, quarterOff);
} else {
int oldBendAmount = curvePitchToBendAmount(m_bendCurve[START_POINT_INDEX].pitch);
pitch = bend->startNote()->pitch() - ((oldBendAmount - bendAmount) / 2);

bend->setEndNotePitch(pitch, quarterOff);
}
}

float starTimeFactor = static_cast<float>(points.at(START_POINT_INDEX).time) / CurvePoint::MAX_TIME;
float endTimeFactor = static_cast<float>(endTimePoint.time) / CurvePoint::MAX_TIME;
bend->undoChangeProperty(Pid::BEND_START_TIME_FACTOR, starTimeFactor);
bend->undoChangeProperty(Pid::BEND_END_TIME_FACTOR, endTimeFactor);

endCommand();

updateNotation();
Expand Down

0 comments on commit 1587787

Please sign in to comment.