Skip to content

[4.7] Sort percussion notes before reading chord parentheses#33925

Merged
mike-spa merged 1 commit into
musescore:4.7from
miiizen:33912-percNoteParen
Jun 24, 2026
Merged

[4.7] Sort percussion notes before reading chord parentheses#33925
mike-spa merged 1 commit into
musescore:4.7from
miiizen:33912-percNoteParen

Conversation

@miiizen

@miiizen miiizen commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Resolves: #33912

When writing to file, we store the note for which a parenthesis applies as an index of m_notes in Chord. This isn't reliable on file read for percussion, as lines haven't been calculated yet. Fortunately, we have enough information to sort the notes by the time we come to read chord parentheses.

I think in 5.0, we should store links to these notes as EIDs which will always be reliable.

@zacjansheski

Copy link
Copy Markdown
Contributor

Tested on MacOS Tahoe 26.2, Windows 11, Ubuntu 22.04.3. Approved
#33912 FIXED

@miiizen miiizen changed the title Sort percussion notes before reading chord parentheses [4.7] Sort percussion notes before reading chord parentheses Jun 24, 2026
@mike-spa mike-spa merged commit 337d2d4 into musescore:4.7 Jun 24, 2026
12 of 14 checks passed
@Jojo-Schmitz

Jojo-Schmitz commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Ignoring the unit test failure?

Causes the same unit test failures in #33946, #33942, #33943 and 33947


void TRead::readNoteParenGroup(Chord* ch, XmlReader& e, ReadContext& ctx)
{
StaffGroup staffGroup = ctx.staff(ch->staffIdx())->staffTypeForElement(ch)->group();

@Jojo-Schmitz Jojo-Schmitz Jun 25, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Address sanitizer fails here

14: ==19952==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000a38 (pc 0x55c2453a4e41 bp 0x7ffc523b8650 sp 0x7ffc523b8640 T0)
14: ==19952==The signal is caused by a READ memory access.
14: ==19952==Hint: address points to the zero page.
14:     #0 0x55c2453a4e41 in std::_Rb_tree<int, std::pair<int const, mu::engraving::StaffType>, std::_Select1st<std::pair<int const, mu::engraving::StaffType> >, std::less<int>, std::allocator<std::pair<int const, mu::engraving::StaffType> > >::empty() const /usr/include/c++/10/bits/stl_tree.h:1037
14:     #1 0x55c2453a0f83 in std::map<int, mu::engraving::StaffType, std::less<int>, std::allocator<std::pair<int const, mu::engraving::StaffType> > >::empty() const /usr/include/c++/10/bits/stl_map.h:466
14:     #2 0x55c245419bc9 in mu::engraving::StaffTypeList::uniqueStaffType() const /home/runner/work/MuseScore/MuseScore/src/engraving/dom/stafftypelist.h:45
14:     #3 0x55c245405fd5 in mu::engraving::Staff::staffTypeForElement(mu::engraving::EngravingItem const*) const /home/runner/work/MuseScore/MuseScore/src/engraving/dom/staff.cpp:1250
14:     #4 0x55c245e748e9 in mu::engraving::read460::TRead::readNoteParenGroup(mu::engraving::Chord*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:3839
14:     #5 0x55c245e6704c in mu::engraving::read460::TRead::readProperties(mu::engraving::Chord*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:2561
14:     #6 0x55c245e65f08 in mu::engraving::read460::TRead::read(mu::engraving::Chord*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:2452
14:     #7 0x55c245e60483 in mu::engraving::read460::TRead::readProperties(mu::engraving::Ornament*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:1924
14:     #8 0x55c245e60104 in mu::engraving::read460::TRead::read(mu::engraving::Ornament*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:1901
14:     #9 0x55c245e7e5a6 in mu::engraving::read460::TRead::read(mu::engraving::Trill*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:4630
14:     #10 0x55c245e4a8b1 in mu::engraving::read460::TRead::readItem(mu::engraving::EngravingItem*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:337
14:     #11 0x55c245e89445 in mu::engraving::read460::ConnectorInfoReader::read() ../src/engraving/rw/read460/connectorinforeader.cpp:110
14:     #12 0x55c245e8a143 in mu::engraving::read460::ConnectorInfoReader::readConnector(std::shared_ptr<mu::engraving::read460::ConnectorInfoReader>, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/connectorinforeader.cpp:196
14:     #13 0x55c245e7f70b in mu::engraving::read460::TRead::readSpanner(mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&, mu::engraving::Score*, unsigned long) ../src/engraving/rw/read460/tread.cpp:4704
14:     #14 0x55c244ee7674 in mu::engraving::read460::Read460::pasteStaff(mu::engraving::XmlReader&, mu::engraving::Segment*, unsigned long, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/rw/read460/read460.cpp:637
14:     #15 0x55c2455176ea in mu::engraving::Score::pasteStaff(mu::engraving::XmlReader&, mu::engraving::Segment*, unsigned long, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/dom/paste.cpp:78
14:     #16 0x55c245523bc9 in mu::engraving::Score::cmdPasteStaffList(muse::ByteArray&, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/dom/paste.cpp:664
14:     #17 0x55c24552057a in mu::engraving::Score::cmdPaste(mu::engraving::IMimeData const*, mu::engraving::MuseScoreView*, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/dom/paste.cpp:514
14:     #18 0x55c24383ac85 in Engraving_CopyPasteTests_copypasteparts_Test::TestBody() ../src/engraving/tests/copypaste_tests.cpp:800
14:     #19 0x55c2462404cc in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2664
14:     #20 0x55c246230fcc in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2700
14:     #21 0x55c2461dda8f in testing::Test::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2739
14:     #22 0x55c2461df08e in testing::TestInfo::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2885
14:     #23 0x55c2461e0238 in testing::TestSuite::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:3063
14:     #24 0x55c246207731 in testing::internal::UnitTestImpl::RunAllTests() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:6054
14:     #25 0x55c24624307e in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2664
14:     #26 0x55c246233b71 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2700
14:     #27 0x55c2462035bc in testing::UnitTest::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:5594
14:     #28 0x55c2435dc19b in RUN_ALL_TESTS() (/home/runner/work/MuseScore/MuseScore/build.debug/src/engraving/tests/engraving_tests+0x84219b)
14:     #29 0x55c2435dbace in main ../src/framework/testing/gmain.cpp:86
14:     #30 0x7f5bfa229d8f  (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f)
14:     #31 0x7f5bfa229e3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f)
14:     #32 0x55c2435dae94 in _start (/home/runner/work/MuseScore/MuseScore/build.debug/src/engraving/tests/engraving_tests+0x840e94)
14: 
14: AddressSanitizer can not provide additional info.
14: SUMMARY: AddressSanitizer: SEGV /usr/include/c++/10/bits/stl_tree.h:1037 in std::_Rb_tree<int, std::pair<int const, mu::engraving::StaffType>, std::_Select1st<std::pair<int const, mu::engraving::StaffType> >, std::less<int>, std::allocator<std::pair<int const, mu::engraving::StaffType> > >::empty() const
14: ==19952==ABORTING

@miiizen

miiizen commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in #33940

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Notehead parentheses 'jump' between notes on percussion instruments upon saving and reopening

4 participants