Skip to content

Commit

Permalink
Merge pull request #26793 from Jojo-Schmitz/4.5.0-ports
Browse files Browse the repository at this point in the history
4.5.0 Backports (foreign ones)
  • Loading branch information
cbjeukendrup authored Feb 27, 2025
2 parents b611c32 + d340532 commit b05197f
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 34 deletions.
5 changes: 4 additions & 1 deletion src/appshell/view/appmenumodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,10 @@ MenuItemList AppMenuModel::makePluginsItems()
MenuItemList pluginsWithoutCategories;
for (const Manifest& m : enabledExtensions) {
std::string categoryStr = m.category.toStdString();
if (muse::contains(categories, categoryStr)) {
if (!categoryStr.empty()) {
if (!muse::contains(categories, categoryStr)) {
categories[categoryStr] = TranslatableString("extensions", m.category);
}
MenuItemList& items = categoriesMap[categoryStr];
addMenuItems(items, m);
} else {
Expand Down
4 changes: 4 additions & 0 deletions src/engraving/rw/read206/read206.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,10 @@ void Read206::readTextStyle206(MStyle* style, XmlReader& e, ReadContext& ctx, st
ts = textStyle(ss);
}
for (const auto& i : *ts) {
if (ctx.shouldSkipProperty(i.pid)) {
continue;
}

PropertyValue value;
if (i.sid == Sid::NOSTYLE) {
break;
Expand Down
10 changes: 5 additions & 5 deletions src/framework/global/serialization/xmlstreamreader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ static std::pair<XMLNode*, XmlStreamReader::TokenType> resolveNode(XMLNode* curr
}

XMLNode* sibling = currentNode->NextSibling();
if (!sibling || sibling->ToElement() || sibling->ToText()) {
if (!sibling || sibling->ToElement() || sibling->ToText() || sibling->ToComment()) {
return { currentNode, XmlStreamReader::TokenType::EndElement };
}
}
Expand Down Expand Up @@ -474,11 +474,11 @@ double XmlStreamReader::readDouble(bool* ok)

int64_t XmlStreamReader::lineNumber() const
{
if (!m_xml->doc.Error() && m_xml->node) {
return m_xml->node->GetLineNum();
int64_t lineNum = m_xml->doc.ErrorLineNum();
if (lineNum == 0 && m_xml->node) {
lineNum = m_xml->node->GetLineNum();
}

return m_xml->doc.ErrorLineNum();
return lineNum;
}

int64_t XmlStreamReader::columnNumber() const
Expand Down
31 changes: 30 additions & 1 deletion src/importexport/midi/internal/midiexport/exportmidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "engraving/dom/masterscore.h"
#include "engraving/dom/note.h"
#include "engraving/dom/part.h"
#include "engraving/dom/rehearsalmark.h"
#include "engraving/dom/repeatlist.h"
#include "engraving/dom/sig.h"
#include "engraving/dom/staff.h"
Expand Down Expand Up @@ -372,12 +373,13 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
}
}

// Export lyrics
// Export lyrics and RehearsalMarks as Meta events
for (const RepeatSegment* rs : m_score->repeatList()) {
int startTick = rs->tick;
int endTick = startTick + rs->len();
int tickOffset = rs->utick - rs->tick;

// export Lyrics
SegmentType st = SegmentType::ChordRest;
for (Segment* seg = rs->firstMeasure()->first(st); seg && seg->tick().ticks() < endTick; seg = seg->next1(st)) {
for (track_idx_t i = part->startTrack(); i < part->endTrack(); ++i) {
Expand All @@ -402,6 +404,33 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
}
}
}

// export RehearsalMarks only for first track
if (staffIdx == 0) {
for (Segment* seg = rs->firstMeasure()->first(Segment::CHORD_REST_OR_TIME_TICK_TYPE);
seg && seg->tick().ticks() < endTick;
seg = seg->next1(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) {
for (EngravingItem* e : seg->annotations()) {
if (e->isRehearsalMark()) {
RehearsalMark* r = toRehearsalMark(e);
muse::ByteArray rText = r->plainText().toUtf8();
size_t len = rText.size() + 1;
unsigned char* data = new unsigned char[len];

memcpy(data, rText.constData(), len);

MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_MARKER);
ev.setEData(data);
ev.setLen(static_cast<int>(len));

int tick = r->segment()->tick().ticks() + tickOffset;
track.insert(CompatMidiRender::tick(context, tick), ev);
}
}
}
}
}
++staffIdx;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3112,6 +3112,8 @@ static std::vector<String> symIdToArtic(const SymId sid)
return { u"staccato" };
break;

case SymId::articStaccatissimoAbove:
case SymId::articStaccatissimoBelow:
case SymId::articStaccatissimoWedgeAbove:
case SymId::articStaccatissimoWedgeBelow:
return { u"staccatissimo" };
Expand Down Expand Up @@ -3182,8 +3184,6 @@ static std::vector<String> symIdToArtic(const SymId sid)
return { u"tenuto", u"accent" };
break;

case SymId::articStaccatissimoAbove:
case SymId::articStaccatissimoBelow:
case SymId::articStaccatissimoStrokeAbove:
case SymId::articStaccatissimoStrokeBelow:
return { u"spiccato" };
Expand Down Expand Up @@ -3488,6 +3488,7 @@ static void writeBreathMark(const Breath* const breath, XmlWriter& xml, Notation
}
}
tagName += color2xml(breath);
tagName += ExportMusicXml::positioningAttributes(breath);
if (breath->placement() == PlacementV::BELOW) {
tagName += u" placement=\"below\"";
} else if (ExportMusicXml::configuration()->exportMu3Compat()) {
Expand Down Expand Up @@ -3548,6 +3549,7 @@ void ExportMusicXml::chordAttributes(Chord* chord, Notations& notations, Technic
}
}
mxmlArtic += color2xml(a);
mxmlArtic += ExportMusicXml::positioningAttributes(a);

notations.tag(m_xml, a);
articulations.tag(m_xml);
Expand Down Expand Up @@ -4086,6 +4088,7 @@ static void writeFingering(XmlWriter& xml, Notations& notations, Technical& tech
attr += fontStyleToXML(static_cast<FontStyle>(f->getProperty(Pid::FONT_STYLE).toInt()), false);
}
attr += color2xml(f);
attr += ExportMusicXml::positioningAttributes(f);

if (f->textStyleType() == TextStyleType::RH_GUITAR_FINGERING) {
xml.tagRaw(u"pluck" + attr, t);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1286,6 +1286,9 @@ Err MusicXmlParserPass1::parse()

if (!found) {
m_logger->logError(u"this is not a MusicXML score-partwise file, node <score-partwise> not found", &m_e);
if (!m_e.errorString().isEmpty()) {
m_errors += errorStringWithLocation(m_e.lineNumber(), m_e.columnNumber(), m_e.errorString()) + '\n';
}
return Err::FileBadFormat;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1394,8 +1394,8 @@ static bool convertArticulationToSymId(const String& mxmlName, SymId& id)
{ u"staccato", SymId::articStaccatoAbove },
{ u"tenuto", SymId::articTenutoAbove },
{ u"detached-legato", SymId::articTenutoStaccatoAbove },
{ u"staccatissimo", SymId::articStaccatissimoWedgeAbove },
{ u"spiccato", SymId::articStaccatissimoAbove },
{ u"staccatissimo", SymId::articStaccatissimoAbove },
{ u"spiccato", SymId::articStaccatissimoStrokeAbove },
{ u"stress", SymId::articStressAbove },
{ u"unstress", SymId::articUnstressAbove },
{ u"soft-accent", SymId::articSoftAccentAbove },
Expand Down Expand Up @@ -3062,7 +3062,7 @@ void MusicXmlParserPass2::staffDetails(const String& partId, Measure* measure)

staff_idx_t staffIdx = m_score->staffIdx(part) + n;

StringData* t = new StringData;
StringData stringData;
String visible = m_e.attribute("print-object");
String spacing = m_e.attribute("print-spacing");
if (visible == "no") {
Expand Down Expand Up @@ -3096,15 +3096,13 @@ void MusicXmlParserPass2::staffDetails(const String& partId, Measure* measure)
// save staff lines for later
staffLines = m_e.readInt();
// for a TAB staff also resize the string table and init with zeroes
if (t) {
if (0 < staffLines) {
t->stringList() = std::vector<instrString>(staffLines);
} else {
m_logger->logError(String(u"illegal staff-lines %1").arg(staffLines), &m_e);
}
if (0 < staffLines) {
stringData.stringList() = std::vector<instrString>(staffLines);
} else {
m_logger->logError(String(u"illegal staff-lines %1").arg(staffLines), &m_e);
}
} else if (m_e.name() == "staff-tuning") {
staffTuning(t);
staffTuning(&stringData);
} else if (m_e.name() == "staff-size") {
const double val = m_e.readDouble() / 100;
m_score->staff(staffIdx)->setProperty(Pid::MAG, val);
Expand All @@ -3117,20 +3115,18 @@ void MusicXmlParserPass2::staffDetails(const String& partId, Measure* measure)
setStaffLines(m_score, staffIdx, staffLines);
}

if (t) {
Instrument* i = part->instrument();
if (m_score->staff(staffIdx)->isTabStaff(Fraction(0, 1))) {
if (i->stringData()->frets() == 0) {
t->setFrets(25);
} else {
t->setFrets(i->stringData()->frets());
}
}
if (t->strings() > 0) {
i->setStringData(*t);
Instrument* i = part->instrument();
if (m_score->staff(staffIdx)->isTabStaff(Fraction(0, 1))) {
if (i->stringData()->frets() == 0) {
stringData.setFrets(25);
} else {
m_logger->logError(u"trying to change string data (not supported)", &m_e);
stringData.setFrets(i->stringData()->frets());
}
if (stringData.strings() > 0) {
i->setStringData(stringData);
}
} else if (stringData.strings() > 0) {
m_logger->logError(u"trying to change string data for non-TAB staff (not supported)", &m_e);
}
}

Expand Down Expand Up @@ -6879,9 +6875,13 @@ Note* MusicXmlParserPass2::note(const String& partId,
isSingleDrumset = instrument->drumset() && instruments.size() == 1;
// begin allocation
if (rest) {
const int track = msTrack + msVoice;
cr = addRest(m_score, measure, noteStartTime, track, msMove,
duration, dura);
if (!grace) {
const int track = msTrack + msVoice;
cr = addRest(m_score, measure, noteStartTime, track, msMove,
duration, dura);
} else {
LOGD("ignoring grace rest");
}
} else {
if (!grace) {
// regular note
Expand Down

0 comments on commit b05197f

Please sign in to comment.