From 3461e9d2c7a4a9e7b1c03f9bbcfe345e93d3481b Mon Sep 17 00:00:00 2001 From: worldwideweary Date: Tue, 27 Apr 2021 11:13:30 +0200 Subject: [PATCH] Fix #316504: Import Fretboard Diagrams Corrections Duplicate of #7455, resp. backport of #8014 --- importexport/musicxml/importmxmlpass2.cpp | 5 ++- libmscore/fret.cpp | 42 +++++++++++------------ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/importexport/musicxml/importmxmlpass2.cpp b/importexport/musicxml/importmxmlpass2.cpp index 125769af3e2c2..9c2b2460ed1e4 100644 --- a/importexport/musicxml/importmxmlpass2.cpp +++ b/importexport/musicxml/importmxmlpass2.cpp @@ -4939,8 +4939,11 @@ FretDiagram* MusicXMLParserPass2::frame() if (string > 0) { if (fret == 0) fd->setMarker(actualString, FretMarkerType::CIRCLE); - else if (fret > 0) + else if (fret > 0) { + if (fd->marker(actualString).mtype == FretMarkerType::CROSS) + fd->setMarker(actualString, FretMarkerType::NONE); fd->setDot(actualString, fret, true); + } } else _logger->logError(QString("FretDiagram::readMusicXML: illegal frame-note string %1").arg(string), &_e); diff --git a/libmscore/fret.cpp b/libmscore/fret.cpp index 4ed273b43b3c0..745a91acc0e3f 100644 --- a/libmscore/fret.cpp +++ b/libmscore/fret.cpp @@ -273,7 +273,7 @@ void FretDiagram::init(StringData* stringData, Chord* chord) if (stringData->convertPitch(note->pitch(), chord->staff(), chord->segment()->tick(), &string, &fret)) setDot(string, fret); } - _maxFrets = stringData->frets(); + _frets = stringData->frets(); } else _maxFrets = 6; @@ -1290,27 +1290,27 @@ void FretDiagram::writeMusicXML(XmlWriter& xml) const xml.tag("fret", "0"); xml.etag(); } - else { - // Write dots - for (auto const& d : dot(i)) { - if (!d.exists()) - continue; - xml.stag("frame-note"); - xml.tag("string", mxmlString); - xml.tag("fret", d.fret); - // TODO: write fingerings - - // Also write barre if it starts at this dot - if (std::find(bStarts.begin(), bStarts.end(), d.fret) != bStarts.end()) { - xml.tagE("barre type=\"start\""); - bStarts.erase(std::remove(bStarts.begin(), bStarts.end(), d.fret), bStarts.end()); - } - if (std::find(bEnds.begin(), bEnds.end(), d.fret) != bEnds.end()) { - xml.tagE("barre type=\"stop\""); - bEnds.erase(std::remove(bEnds.begin(), bEnds.end(), d.fret), bEnds.end()); - } - xml.etag(); + + // Markers may exists alongside with dots + // Write dots + for (auto const& d : dot(i)) { + if (!d.exists()) + continue; + xml.stag("frame-note"); + xml.tag("string", mxmlString); + xml.tag("fret", d.fret); + // TODO: write fingerings + + // Also write barre if it starts at this dot + if (std::find(bStarts.begin(), bStarts.end(), d.fret) != bStarts.end()) { + xml.tagE("barre type=\"start\""); + bStarts.erase(std::remove(bStarts.begin(), bStarts.end(), d.fret), bStarts.end()); + } + if (std::find(bEnds.begin(), bEnds.end(), d.fret) != bEnds.end()) { + xml.tagE("barre type=\"stop\""); + bEnds.erase(std::remove(bEnds.begin(), bEnds.end(), d.fret), bEnds.end()); } + xml.etag(); } // Write unwritten barres