Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
925fcca
Guitar dives
mike-spa Nov 19, 2025
9d33bdc
Updates
mike-spa Dec 5, 2025
40f66fa
Rebase correction
mike-spa Dec 11, 2025
6ad701f
Add parenthesis on end not when full release
mike-spa Dec 11, 2025
671ee95
Fix fretting not updated on transpose
mike-spa Dec 11, 2025
ff3542a
Fix position of return point
mike-spa Dec 11, 2025
7800551
Fix direction of dive interval number
mike-spa Dec 11, 2025
8585ba9
Improve logic for force-show parenthesized fret
mike-spa Dec 11, 2025
8c685c7
Don't enter grace bend when entering dive on grace note
mike-spa Dec 11, 2025
d403068
Improve position of scoop
mike-spa Dec 11, 2025
45ec88c
Improve layout when crossing system
mike-spa Dec 11, 2025
d7a0756
Only one dive line on TAB staves
mike-spa Dec 11, 2025
b9a69dd
Rename style page
mike-spa Dec 11, 2025
39fc369
Fix error for horizontal collision checks
mike-spa Dec 12, 2025
c95b849
Limit searching for previous bend segment to same sytem
mike-spa Dec 12, 2025
499fcdc
Scoop corrections
mike-spa Dec 12, 2025
ef1678e
Fix vibrato line issues
mike-spa Dec 12, 2025
f1b9701
Fix string not refretted when has octave line
mike-spa Dec 12, 2025
3e8d7bc
Show parenthesised fret when dive continues at start of system
mike-spa Dec 12, 2025
389bbf1
Predive correction
mike-spa Dec 12, 2025
834fbbd
Fix interactions when deleting pre-bend and undo
mike-spa Dec 12, 2025
44793e4
Rename text style to "Bends and Dives"
mike-spa Dec 15, 2025
714f6be
Allow inserting only one dip per chord
mike-spa Dec 15, 2025
90c0309
Vibrato line ignore bend in skyline
mike-spa Dec 15, 2025
e69668b
Allow edit line style for Hold
mike-spa Dec 15, 2025
eae5911
Don't layout hold line if not top note in tab
mike-spa Dec 15, 2025
eadf424
codestyle
mike-spa Dec 15, 2025
04579e5
Fix utests
mike-spa Dec 15, 2025
b4f2847
Code review fixes
mike-spa Dec 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/engraving/compat/midi/compatmidirenderinternal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ static bool shouldProceedBend(const Note* note)
const Note* baseNote = bendFor->startNoteOfChain();

const GuitarBend* firstBend = baseNote->bendFor();
if (firstBend && firstBend->type() == GuitarBendType::PRE_BEND) {
if (firstBend && firstBend->bendType() == GuitarBendType::PRE_BEND) {
const Note* nextNote = firstBend->endNote();
if (nextNote) {
baseNote = nextNote;
Expand Down Expand Up @@ -382,7 +382,7 @@ static std::unordered_map<const Note*, int> getGraceNoteBendDurations(const Note
const Note* bendStartNote = nullptr;
std::unordered_set<const Note*> currentNotes;

if (note->bendFor() && note->bendFor()->type() == GuitarBendType::SLIGHT_BEND) {
if (note->bendFor() && note->bendFor()->bendType() == GuitarBendType::SLIGHT_BEND) {
return {};
}

Expand Down Expand Up @@ -455,7 +455,7 @@ static void collectGuitarBend(const Note* note,
int quarterOffsetFromStartNote = 0;
int currentQuarterTones = 0;

if (note->bendFor()->type() == GuitarBendType::GRACE_NOTE_BEND) {
if (note->bendFor()->bendType() == GuitarBendType::GRACE_NOTE_BEND) {
curPitchBendSegmentStart -= graceOffset;
}

Expand Down Expand Up @@ -823,7 +823,7 @@ static void collectNote(EventsHolder& events, const Note* note, const CollectNot
}

// skipping the notes which are connected by bends
if (bendBack && bendBack->type() != GuitarBendType::PRE_BEND && i == 0) {
if (bendBack && bendBack->bendType() != GuitarBendType::PRE_BEND && i == 0) {
continue;
}

Expand Down Expand Up @@ -1087,7 +1087,7 @@ void CompatMidiRendererInternal::collectGraceBeforeChordEvents(Chord* chord, Cho
for (Chord* c : grChords) {
for (const Note* note : c->notes()) {
GuitarBend* bendFor = note->bendFor();
if (bendFor && bendFor->type() == GuitarBendType::PRE_BEND) {
if (bendFor && bendFor->bendType() == GuitarBendType::PRE_BEND) {
continue;
}

Expand All @@ -1096,7 +1096,7 @@ void CompatMidiRendererInternal::collectGraceBeforeChordEvents(Chord* chord, Cho
params.velocityMultiplier = veloMultiplier;
params.tickOffset = tickOffset;

bool isGraceBend = (note->bendFor() && note->bendFor()->type() == GuitarBendType::GRACE_NOTE_BEND);
bool isGraceBend = (note->bendFor() && note->bendFor()->bendType() == GuitarBendType::GRACE_NOTE_BEND);
if (prevChord) {
params.previousChordTicks = prevChord->actualTicks().ticks();
}
Expand Down
5 changes: 5 additions & 0 deletions src/engraving/dom/actionicon.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ enum class ActionIconType : signed char {
GRACE_NOTE_BEND,
SLIGHT_BEND,

DIVE,
PRE_DIVE,
DIP,
SCOOP,

NOTE_ANCHORED_LINE,

SYSTEM_LOCK,
Expand Down
56 changes: 3 additions & 53 deletions src/engraving/dom/chord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2215,7 +2215,8 @@ bool Chord::isPreBendOrGraceBendStart() const

for (const Note* note : m_notes) {
GuitarBend* gb = note->bendFor();
if (gb && (gb->type() == GuitarBendType::PRE_BEND || gb->type() == GuitarBendType::GRACE_NOTE_BEND)) {
if (gb && (gb->bendType() == GuitarBendType::PRE_BEND || gb->bendType() == GuitarBendType::GRACE_NOTE_BEND
|| gb->bendType() == GuitarBendType::PRE_DIVE)) {
return true;
}
}
Expand All @@ -2231,65 +2232,14 @@ bool Chord::isGraceBendEnd() const

for (const Note* note : m_notes) {
GuitarBend* bendBack = note->bendBack();
if (bendBack && bendBack->type() == GuitarBendType::GRACE_NOTE_BEND) {
if (bendBack && bendBack->bendType() == GuitarBendType::GRACE_NOTE_BEND) {
return true;
}
}

return false;
}

bool Chord::preOrGraceBendSpacingExceptionInTab() const
{
if (!staffType()->isTabStaff() || !isGrace()) {
return false;
}

std::vector<GuitarBend*> bends;
for (Note* note : m_notes) {
GuitarBend* bendFor = note->bendFor();
if (bendFor) {
GuitarBendType bendType = bendFor->type();
if (bendType == GuitarBendType::PRE_BEND || bendType == GuitarBendType::GRACE_NOTE_BEND) {
bends.push_back(bendFor);
break;
}
}
}

if (bends.empty() || bends.size() < m_notes.size()) {
return false;
}

Chord* endChord = bends.front()->endNote()->chord();
if (!endChord) {
return false;
}

GuitarBendType type = bends.front()->type();
for (GuitarBend* gb : bends) {
if (gb->type() != type || (gb->endNote() && gb->endNote()->chord() != endChord)) {
return false;
}
}

if (type == GuitarBendType::PRE_BEND) {
return true;
}

for (Note* note : endChord->notes()) {
GuitarBend* bendBack = note->bendBack();
if (bendBack) {
Note* startNote = bendBack->startNote();
if (!startNote || startNote->chord() != this) {
return false;
}
}
}

return bends.size() < endChord->notes().size();
}

void Chord::setIsTrillCueNote(bool v)
{
m_isTrillCueNote = v;
Expand Down
1 change: 0 additions & 1 deletion src/engraving/dom/chord.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,6 @@ class Chord final : public ChordRest

bool isPreBendOrGraceBendStart() const;
bool isGraceBendEnd() const;
bool preOrGraceBendSpacingExceptionInTab() const;

bool isTrillCueNote() const { return m_isTrillCueNote; }
void setIsTrillCueNote(bool v);
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/editcapo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ void EditCapo::applyCapoTranspose(int startTick, int endTick, UpdateCtx& ctx)
update(note, ctx);
}
if (const GuitarBend* bend = note->bendFor(); bend) {
if (GuitarBendType::BEND == bend->type()) {
if (GuitarBendType::BEND == bend->bendType()) {
Note* startNote = bend->startNote();
Note* endNote = bend->endNote();
const StringData* stringData = ctx.stringData;
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/engravingobject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ bool EngravingObject::isSLineSegment() const
return isHairpinSegment() || isOttavaSegment() || isPedalSegment()
|| isTrillSegment() || isVoltaSegment() || isTextLineSegment()
|| isGlissandoSegment() || isLetRingSegment() || isVibratoSegment() || isPalmMuteSegment()
|| isGradualTempoChangeSegment();
|| isGradualTempoChangeSegment() || isWhammyBarSegment();
}

//---------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/excerpt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1621,7 +1621,7 @@ void Excerpt::cloneStaff2(Staff* srcStaff, Staff* dstStaff, const Fraction& star
nn->addSpannerBack(newBend);
}
GuitarBend* bendFor = on->bendFor();
if (bendFor && bendFor->type() == GuitarBendType::SLIGHT_BEND) {
if (bendFor && bendFor->bendType() == GuitarBendType::SLIGHT_BEND) {
// Because slight bends aren't detected as "bendBack"
GuitarBend* newBend = toGuitarBend(bendFor->linkedClone());
newBend->setScore(score);
Expand Down
Loading
Loading