Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MusicXML] export staff line details #26472

Merged
merged 4 commits into from
Feb 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -7898,7 +7898,11 @@ static void writeStaffDetails(XmlWriter& xml, const Part* part)
for (size_t i = 0; i < staves; i++) {
Staff* st = part->staff(i);
const double mag = st->staffMag(Fraction(0, 1));
if (st->lines(Fraction(0, 1)) != 5 || st->isTabStaff(Fraction(0, 1)) || !muse::RealIsEqual(mag, 1.0) || !st->show()) {
const Color lineColor = st->color(Fraction(0, 1));
const bool invis = st->isLinesInvisible(Fraction(0, 1));
const bool needsLineDetails = invis || lineColor != engravingConfiguration()->defaultColor();
if (st->lines(Fraction(0, 1)) != 5 || st->isTabStaff(Fraction(0, 1)) || !muse::RealIsEqual(mag, 1.0)
|| !st->show() || needsLineDetails) {
XmlWriter::Attributes attributes;
if (staves > 1) {
attributes.push_back({ "number", i + 1 });
Expand All @@ -7913,6 +7917,19 @@ static void writeStaffDetails(XmlWriter& xml, const Part* part)
}

xml.tag("staff-lines", st->lines(Fraction(0, 1)));
if (needsLineDetails) {
for (int lineIdx = 0; lineIdx < st->lines(Fraction(0, 1)); ++lineIdx) {
String ld = String(u"line-detail line=\"%1\"").arg(lineIdx + 1);
if (lineColor != engravingConfiguration()->defaultColor()) {
ld += String(u" color=\"%1\"").arg(String::fromStdString(lineColor.toString()));
}
if (invis) {
ld += u" print-object=\"no\"";
}
xml.tagRaw(ld);
}
}

if (st->isTabStaff(Fraction(0, 1)) && instrument->stringData()) {
std::vector<instrString> l = instrument->stringData()->stringList();
for (size_t ii = 0; ii < l.size(); ii++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<open>1</open>
<metaTag name="arranger"></metaTag>
<metaTag name="audioComUrl"></metaTag>
<metaTag name="composer">Composer / arranger</metaTag>
Expand Down Expand Up @@ -144,9 +143,6 @@
</VBox>
<Measure>
<voice>
<KeySig>
<concertKey>0</concertKey>
</KeySig>
<TimeSig>
<sigN>5</sigN>
<sigD>4</sigD>
Expand Down
4 changes: 0 additions & 4 deletions src/importexport/musicxml/tests/data/testInvisibleNote.mscx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<open>1</open>
<metaTag name="arranger"></metaTag>
<metaTag name="audioComUrl"></metaTag>
<metaTag name="composer">Composer / arranger</metaTag>
Expand Down Expand Up @@ -112,9 +111,6 @@
</VBox>
<Measure>
<voice>
<KeySig>
<concertKey>0</concertKey>
</KeySig>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
Expand Down
271 changes: 271 additions & 0 deletions src/importexport/musicxml/tests/data/testLineDetails.mscx
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="4.40">
<programVersion>4.4.0</programVersion>
<programRevision></programRevision>
<Score>
<Division>480</Division>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="audioComUrl"></metaTag>
<metaTag name="composer">K. Rettinghaus</metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="creationDate">2025-02-11</metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="sourceRevisionId"></metaTag>
<metaTag name="subtitle"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Staff line details</metaTag>
<Order id="orchestra">
<name>Orchestra</name>
<instrument id="flute">
<family id="flutes">Flutes</family>
</instrument>
<instrument id="oboe">
<family id="oboes">Oboes</family>
</instrument>
<section id="woodwind" brackets="true" barLineSpan="true" thinBrackets="true">
<family>flutes</family>
<family>oboes</family>
<family>clarinets</family>
<family>saxophones</family>
<family>bassoons</family>
<unsorted group="woodwinds"/>
</section>
<section id="brass" brackets="true" barLineSpan="true" thinBrackets="true">
<family>horns</family>
<family>trumpets</family>
<family>cornets</family>
<family>flugelhorns</family>
<family>trombones</family>
<family>tubas</family>
<unsorted group="brass"/>
</section>
<section id="timpani" brackets="true" barLineSpan="true" thinBrackets="true">
<family>timpani</family>
</section>
<section id="percussion" brackets="true" barLineSpan="true" thinBrackets="true">
<family>keyboard-percussion</family>
<unsorted group="pitched-percussion"/>
<family>drums</family>
<family>unpitched-metal-percussion</family>
<family>unpitched-wooden-percussion</family>
<family>other-percussion</family>
<unsorted group="unpitched-percussion"/>
</section>
<family>keyboards</family>
<family>harps</family>
<family>organs</family>
<family>synths</family>
<unsorted/>
<soloists/>
<section id="voices" brackets="true" barLineSpan="false" thinBrackets="true">
<family>voices</family>
<family>voice-groups</family>
</section>
<section id="strings" brackets="true" barLineSpan="true" thinBrackets="true">
<family>orchestral-strings</family>
</section>
</Order>
<Part id="1">
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
<invisible>1</invisible>
</StaffType>
<invisible>1</invisible>
<bracket type="0" span="2" col="0" visible="1"/>
<barLineSpan>1</barLineSpan>
</Staff>
<trackName>Flute</trackName>
<preferSharpFlat>none</preferSharpFlat>
<Instrument id="flute">
<longName>Flute</longName>
<shortName>Fl.</shortName>
<trackName>Flute</trackName>
<minPitchP>59</minPitchP>
<maxPitchP>98</maxPitchP>
<minPitchA>60</minPitchA>
<maxPitchA>93</maxPitchA>
<instrumentId>wind.flutes.flute</instrumentId>
<Channel>
<program value="73"/>
<synti>Fluid</synti>
</Channel>
</Instrument>
</Part>
<Part id="2">
<Staff id="2">
<StaffType group="pitched">
<name>stdNormal</name>
<lines>4</lines>
<color r="255" g="38" b="0" a="255"/>
</StaffType>
<color r="255" g="38" b="0" a="255"/>
</Staff>
<trackName>Oboe</trackName>
<preferSharpFlat>none</preferSharpFlat>
<Instrument id="oboe">
<longName>Oboe</longName>
<shortName>Ob.</shortName>
<trackName>Oboe</trackName>
<minPitchP>58</minPitchP>
<maxPitchP>96</maxPitchP>
<minPitchA>58</minPitchA>
<maxPitchA>87</maxPitchA>
<instrumentId>wind.reed.oboe</instrumentId>
<Channel>
<program value="68"/>
<synti>Fluid</synti>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<Text>
<style>title</style>
<text>Untitled score</text>
</Text>
<Text>
<style>subtitle</style>
<text>Subtitle</text>
</Text>
<Text>
<style>composer</style>
<text>Composer / arranger</text>
</Text>
</VBox>
<Measure>
<voice>
<TimeSig>
<offset x="1.5" y="0"/>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
</Staff>
<Staff id="2">
<Measure>
<voice>
<TimeSig>
<offset x="1.5" y="0"/>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
</Staff>
</Score>
</museScore>
Loading
Loading