Fix #311986: handle duplicate voltas (repeat58)

Fixed initial voltas having the same start crash
Also handles overlapping voltas by splitting them into non-overlapping voltas with cross-section repeatlists
This commit is contained in:
jeetee 2020-11-04 02:14:40 +01:00 committed by Igor Korsukov
parent e8fb60429e
commit ef4f173842
9 changed files with 2319 additions and 73 deletions

View file

@ -21,7 +21,7 @@
#include "types.h"
#include "volta.h"
#include <stack>
#include <list>
#include <utility> // std::pair
namespace Ms {
@ -266,7 +266,7 @@ void RepeatList::flatten()
do {
s->addMeasure(m);
m = m->nextMeasure();
}while (m);
} while (m);
push_back(s);
_expanded = false;
@ -307,6 +307,14 @@ public:
repeatCount = (type == RepeatListElementType::REPEAT_START) ? 1 : 0;
}
~RepeatListElement()
{
// Voltas are cloned elements, we need to cleanup ourselves
if (repeatListElementType == RepeatListElementType::VOLTA_START) {
delete element;
}
}
int getRepeatCount() const { return repeatCount; }
void addToRepeatCount(int add) { repeatCount += add; }
};
@ -318,7 +326,6 @@ public:
void RepeatList::collectRepeatListElements()
{
QList<RepeatListElement*>* sectionRLElements = new QList<RepeatListElement*>();
auto spannerIt = _score->spanner().cbegin();
// Clear out previous listing
for (QList<RepeatListElement*>* srle : _rlElements) {
@ -338,97 +345,165 @@ void RepeatList::collectRepeatListElements()
sectionRLElements->push_back(startFromRepeatMeasure);
// Also trace down the final actual measure of this section (in case a frame follows)
MeasureBase* sectionEndMeasureBase = nullptr;
// Used to track the actual end of a volta
std::stack<Volta const*> voltaStack;
// Used to track voltas; overlappings and real endings
Volta* volta;
std::list<Volta*> preProcessedVoltas;
// We only care about Volta within the spanner types, so forward the iterator to the first one
while ((spannerIt != _score->spanner().cend()) && !(((*spannerIt).second)->isVolta())) {
++spannerIt;
// Voltas might overlap (duplicate entries on multiple staves or "real" overlaps)
// so we will pre-process them into cloned versions that handle those overlaps.
// This assumes that spanners are ordered from first to last tick-wise
for (const auto& spannerEntry : _score->spanner()) {
if ((spannerEntry.second)->isVolta()) {
volta = toVolta(spannerEntry.second)->clone();
if (preProcessedVoltas.empty()) { // First entry
preProcessedVoltas.push_back(volta);
} else { // Compare
std::list<Volta*> voltasToMerge;
// List all overlapping voltas
while ((!preProcessedVoltas.empty())
&& (volta->startMeasure()->tick() <= preProcessedVoltas.back()->endMeasure()->tick())
) {
voltasToMerge.push_back(preProcessedVoltas.back());
preProcessedVoltas.pop_back();
}
while (!voltasToMerge.empty()) {
// We'll have to shorten the already stored volta and split its remainder for merging
Volta* remainder = voltasToMerge.back()->clone();
if (volta->startMeasure() != remainder->startMeasure()) {
// First part is not empty
voltasToMerge.back()->setEndElement(volta->startMeasure()->prevMeasure());
remainder->setStartElement(volta->startMeasure());
// Store it
preProcessedVoltas.push_back(voltasToMerge.back());
} //else {
// New volta and existing one start at the same moment, there is no first part, only a remainder
//}
voltasToMerge.pop_back();
// remainder and volta now have the same start point
// Compare the end points and make remainder end first
if (volta->endMeasure()->tick() < remainder->endMeasure()->tick()) {
Volta* swap = volta;
volta = remainder;
remainder = swap;
}
// Cross-section of the repeatList
std::list<int> endings = remainder->endings().toStdList();
endings.remove_if([&volta](const int& ending) {
return !(volta->hasEnding(ending));
});
remainder->setEndings(QList<int>::fromStdList(endings));
// Split and merge done
preProcessedVoltas.push_back(remainder);
if (volta->endMeasure() != remainder->endMeasure()) {
// volta extends past the end of remainder -> move its startpoint after remainder
volta->setStartElement(remainder->endMeasure()->nextMeasure());
} else {
// volta matched remainder endpoint, nothing left to merge from
preProcessedVoltas.splice(preProcessedVoltas.cend(), voltasToMerge);
delete volta;
volta = nullptr;
}
} // !voltasToMerge.empty()
if (volta != nullptr) {
preProcessedVoltas.push_back(volta);
}
}
} // spanner->isVolta
}
volta = nullptr;
for (; mb; mb = mb->next()) {
if (mb->isMeasure()) {
sectionEndMeasureBase = mb; // ending measure of section is the most recently encountered actual Measure
sectionEndMeasureBase = mb; // ending measure of section is the most recently encountered actual Measure
// Volta ?
if ((spannerIt != _score->spanner().cend()) && (toVolta((*spannerIt).second)->startMeasure() == mb)) {
if (!voltaStack.empty()) {
//if (voltaStack.top()->endMeasure()->tick() < mb->tick()) {
if ((!preProcessedVoltas.empty()) && (preProcessedVoltas.front()->startMeasure() == mb)) {
if (volta != nullptr) {
//if (volta->endMeasure()->tick() < mb->tick()) {
// The previous volta was supposed to end before us (open volta case) -> insert the end
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END, voltaStack.top(),
toMeasure(mb->prevMeasure())));
voltaStack.pop();
// }
//else { // Overlapping voltas }
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END,
volta, toMeasure(mb->prevMeasure())));
// volta = nullptr; // No need, replaced immediately further down
//} else {
// Overlapping voltas; this should not happen as preProcessedVoltas should've dealt with this already
//}
}
// Now insert the start of the current volta
voltaStack.push(toVolta((*spannerIt).second));
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_START, (*spannerIt).second, toMeasure(mb)));
// Forward iterator to next volta
do {
++spannerIt;
} while ((spannerIt != _score->spanner().cend()) && !(((*spannerIt).second)->isVolta()));
volta = preProcessedVoltas.front();
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_START,
volta, toMeasure(mb)));
// Look for start of next volta
preProcessedVoltas.pop_front();
}
// Start
if (mb->repeatStart()) {
if (!voltaStack.empty()) {
if (voltaStack.top()->startMeasure() != toMeasure(mb)) {
if (volta != nullptr) {
if (volta->startMeasure() != toMeasure(mb)) {
// Volta and Start repeat are not on the same measure
// assume the previous volta was supposed to end before us (open volta case) -> insert the end
// Warning: This might "break" a volta prematurely if its explicit notated end is later than this point
// Consider splitting the volta or ignoring this repeat all together
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END, voltaStack.top(),
toMeasure(mb->prevMeasure())));
voltaStack.pop();
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END,
volta, toMeasure(mb->prevMeasure())));
volta = nullptr;
}
//else { // Volta and Start Repeat coincide on the same measure, see test::repeat56.mscx }
}
startFromRepeatMeasure = new RepeatListElement(RepeatListElementType::REPEAT_START, mb, toMeasure(mb));
startFromRepeatMeasure = new RepeatListElement(RepeatListElementType::REPEAT_START,
mb, toMeasure(mb));
sectionRLElements->push_back(startFromRepeatMeasure);
}
// Jumps and Markers
for (Element* e : mb->el()) {
if (e->isJump()) {
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::JUMP, e, toMeasure(mb)));
if (!voltaStack.empty()) {
if (voltaStack.top()->endMeasure()->tick() <= mb->tick()) {
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::JUMP,
e, toMeasure(mb)));
if (volta != nullptr) {
if (volta->endMeasure()->tick() <= mb->tick()) {
// The previous volta was supposed to end before us (open volta case) -> insert the end
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END, voltaStack.top(),
toMeasure(mb)));
voltaStack.pop();
}
//else { // Volta is spanning past this jump instruction }
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END,
volta, toMeasure(mb)));
volta = nullptr;
} //else { // Volta is spanning past this jump instruction }
}
} else if (e->isMarker()) {
RepeatListElement* markerRLE = new RepeatListElement(RepeatListElementType::MARKER, e, toMeasure(mb));
RepeatListElement* markerRLE = new RepeatListElement(RepeatListElementType::MARKER,
e, toMeasure(mb));
// There may be multiple markers in the same measure and there is no guarantee we're reading
// them from left to right. The only way available to guess their order is to look at their
// text alignment and order them left to right
// At the same time, we should ensure Markers are evaluated before Jumps
Align markerRLEalignmentH
= static_cast<Align>(static_cast<char>(toMarker(e)->align()) & static_cast<char>(Align::HMASK));
Align markerRLEalignmentH = static_cast<Align>(
static_cast<char>(toMarker(e)->align()) & static_cast<char>(Align::HMASK)
);
auto insertionIt = sectionRLElements->end() - 1;
while ((*insertionIt)->measure == markerRLE->measure) {
bool markerShouldGoBefore = false;
if (((*insertionIt)->repeatListElementType == RepeatListElementType::MARKER)
&& (markerRLEalignmentH != Align::RIGHT) // We can be the end when right aligned
&& (markerRLEalignmentH != Align::RIGHT) // We can be the end when right aligned
) {
Align storedMarkerAlignmentH
= static_cast<Align>(static_cast<char>(toMarker((*insertionIt)->element)->align())
& static_cast<char>(Align::HMASK));
Align storedMarkerAlignmentH = static_cast<Align>(
static_cast<char>(toMarker((*insertionIt)->element)->align())
& static_cast<char>(Align::HMASK)
);
if (markerRLEalignmentH == Align::HCENTER) {
markerShouldGoBefore = (storedMarkerAlignmentH == Align::RIGHT);
} else { //(markerRLEalignmentH == Align::LEFT)
} else { //(markerRLEalignmentH == Align::LEFT)
markerShouldGoBefore = (storedMarkerAlignmentH != Align::LEFT);
}
}
if (markerShouldGoBefore
|| ((*insertionIt)->repeatListElementType == RepeatListElementType::JUMP)
) {
// Decrease position - this should always be possible as the list always starts with a REPEAT_START element
// Decrease position
// This should always be possible as the list always starts with a REPEAT_START element
Q_ASSERT(insertionIt != sectionRLElements->begin());
--insertionIt;
} else { // Found location after which we should go
} else {
// Found location after which we should go
break;
}
}
@ -438,42 +513,51 @@ void RepeatList::collectRepeatListElements()
}
// End
if (mb->repeatEnd()) {
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::REPEAT_END, mb, toMeasure(mb)));
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::REPEAT_END,
mb, toMeasure(mb)));
if (startFromRepeatMeasure != nullptr) {
startFromRepeatMeasure->addToRepeatCount(toMeasure(mb)->repeatCount() - 1);
}
if (!voltaStack.empty()) {
//if (voltaStack.top()->endMeasure()->tick() < mb->tick()) {
if (volta != nullptr) {
//if (volta->endMeasure()->tick() < mb->tick()) {
// The previous volta was supposed to end before us (open volta case) -> insert the end
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END, voltaStack.top(), toMeasure(mb)));
voltaStack.pop();
// }
//else { // Volta is spanning over this end repeat, consider splitting the volta or ignoring this repeat all together }
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END,
volta, toMeasure(mb)));
volta = nullptr;
//} else {
// // Volta is spanning over this end repeat, consider splitting the volta
// // or ignoring this repeat all together
//}
}
}
// Volta end
if (!voltaStack.empty()
&& (voltaStack.top()->endMeasure()->tick() == mb->tick())
&& (voltaStack.top()->getProperty(Pid::END_HOOK_TYPE).value<HookType>() != HookType::NONE)) {
if ((volta != nullptr)
&& (volta->endMeasure()->tick() == mb->tick())
&& (volta->getProperty(Pid::END_HOOK_TYPE).value<HookType>() != HookType::NONE)
) {
// end of closed volta
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END, voltaStack.top(), toMeasure(mb)));
voltaStack.pop();
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END,
volta, toMeasure(mb)));
volta = nullptr;
}
}
// Section break (or end of score)
if (mb->sectionBreak() || !mb->nextMeasure()) {
if (sectionEndMeasureBase != nullptr) {
if (!voltaStack.empty()) {
//if (voltaStack.top()->endMeasure()->tick() < mb->tick()) {
if (volta != nullptr) {
//if (volta->endMeasure()->tick() < mb->tick()) {
// The previous volta was supposed to end before us (open volta case) -> insert the end
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END, voltaStack.top(), toMeasure(mb)));
voltaStack.pop();
// }
//else { // Volta is spanning over this section break, consider splitting the volta and adding it again at the start of the next section }
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::VOLTA_END,
volta, toMeasure(mb)));
volta = nullptr;
//} else {
// // Volta is spanning over this section break, consider splitting the volta
// // and adding it again at the start of the next section
//}
}
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::SECTION_BREAK, mb,
toMeasure(sectionEndMeasureBase)));
sectionEndMeasureBase = nullptr; // reset to indicate not having found the end for the next section
sectionRLElements->push_back(new RepeatListElement(RepeatListElementType::SECTION_BREAK,
mb, toMeasure(sectionEndMeasureBase)));
sectionEndMeasureBase = nullptr; // reset to indicate not having found the end for the next section
// store section
_rlElements.push_back(sectionRLElements);
}
@ -482,14 +566,15 @@ void RepeatList::collectRepeatListElements()
sectionRLElements = new QList<RepeatListElement*>();
// First measure of a section/score is always used as a reference REPEAT_START point
// even if it doesn't have a start repeat
startFromRepeatMeasure
= new RepeatListElement(RepeatListElementType::REPEAT_START, mb->nextMeasure(), toMeasure(mb->nextMeasure()));
startFromRepeatMeasure = new RepeatListElement(RepeatListElementType::REPEAT_START,
mb->nextMeasure(), toMeasure(mb->nextMeasure()));
sectionRLElements->push_back(startFromRepeatMeasure);
// Loop will forward one measureBase, so return one now
// this logic aids in skipping multiple frames between sections
mb = mb->nextMeasure()->prev();
} else {
break; // no more measures -> done
// no more measures -> done
break;
}
}
}
@ -822,7 +907,7 @@ void RepeatList::unwind()
QList<RepeatListElement*>::const_iterator findRepeatIt = repeatListElementIt;
do {
--findRepeatIt;
}while ((*findRepeatIt) != startRepeatReference);
} while ((*findRepeatIt) != startRepeatReference);
++findRepeatIt; // Start volta analysis past this start repeat
Volta const* voltaReference = nullptr;
int processedRepeatCount = 1;
@ -890,7 +975,7 @@ void RepeatList::unwind()
rs->addMeasure((*repeatListElementIt)->measure);
continueAt.first = _rlElements.cend(); // Clear this reference - processed
} else { // Nowhere to go to, break out of this section loop and onto the next section
} else { // Nowhere to go to, break out of this section loop and onto the next section
repeatListElementIt = (*sectionIt)->cend();
continue;
}

View file

@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat58</text>
</Text>
<Text>
<style>Subtitle</style>
<text>duplicate volta - single staff</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1,2, 1, 3, 4,5, 4, 6,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"></font><b><font face="FreeSerif"></font> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>2</endRepeat>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1.</beginText>
<endings>1</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-6.5"/>
<off2 x="0" y="0"/>
</Segment>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<startRepeat/>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>2</endRepeat>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1.</beginText>
<endings>1</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
</Staff>
</Score>
</museScore>

View file

@ -0,0 +1,545 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Part>
<Staff id="2">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
<bracket type="1" span="2" col="0"/>
<barLineSpan>1</barLineSpan>
</Staff>
<Staff id="3">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
<defaultClef>F</defaultClef>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>150</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="sforzatoStaccato">
<velocity>150</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="marcatoStaccato">
<velocity>120</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="marcatoTenuto">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat59</text>
</Text>
<Text>
<style>Subtitle</style>
<text>duplicate volta - multiple instruments</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1,2, 1, 3, 4,5, 4, 6,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"></font><b><font face="FreeSerif"></font> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>2</endRepeat>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1.</beginText>
<endings>1</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<prev>
<location>
<staves>1</staves>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<startRepeat/>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<prev>
<location>
<staves>1</staves>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>2</endRepeat>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1.</beginText>
<endings>1</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<prev>
<location>
<staves>1</staves>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>1</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<prev>
<location>
<staves>1</staves>
<measures>-1</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
</Staff>
<Staff id="2">
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1.</beginText>
<endings>1</endings>
</Volta>
<next>
<location>
<staves>-1</staves>
<measures>1</measures>
</location>
</next>
</Spanner>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<staves>-1</staves>
<measures>1</measures>
</location>
</next>
</Spanner>
<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>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1.</beginText>
<endings>1</endings>
</Volta>
<next>
<location>
<staves>-1</staves>
<measures>1</measures>
</location>
</next>
</Spanner>
<Rest>
<durationType>measure</durationType>
<duration>4/4</duration>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<staves>-1</staves>
<measures>1</measures>
</location>
</next>
</Spanner>
<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="3">
<Measure>
<voice>
<TimeSig>
<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>

View file

@ -0,0 +1,285 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat60</text>
</Text>
<Text>
<style>Subtitle</style>
<text>overlapping voltas - go nuts ;-)</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1,2, 6,7, 1,2,3, 6,7, 1,2,3,4,5,6,7, 1,2,3, 6,7, 1,2, 6,7, 1,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"/><b><font face="FreeSerif"/> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1-5</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-7.5"/>
<off2 x="0" y="0"/>
</Segment>
<endings>1, 2, 3, 4, 5</endings>
</Volta>
<next>
<location>
<measures>5</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<beginText>2-4</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-6.5"/>
<off2 x="0" y="0"/>
</Segment>
<endings>2, 3, 4</endings>
</Volta>
<next>
<location>
<measures>2</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>3.</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-5.5"/>
<off2 x="0" y="0"/>
<minDistance>0.430001</minDistance>
</Segment>
<endings>3</endings>
</Volta>
<next>
<location>
<measures>2</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-2</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-2</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>6</endRepeat>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-5</measures>
</location>
</prev>
</Spanner>
<Spanner type="TextLine">
<TextLine>
<lineVisible>0</lineVisible>
<endText>6x</endText>
<endTextAlign>center,center</endTextAlign>
<lineWidth>0.149991</lineWidth>
</TextLine>
<next>
<location>
<fractions>1/1</fractions>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
<Spanner type="TextLine">
<prev>
<location>
<fractions>-1/1</fractions>
</location>
</prev>
</Spanner>
</voice>
</Measure>
</Staff>
</Score>
</museScore>

View file

@ -0,0 +1,257 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat61</text>
</Text>
<Text>
<style>Subtitle</style>
<text>overlapping voltas - nested</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1,2,3, 6,7, 1,2,3,4,5,6,7, 1,2,3, 6,7, 1,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"></font><b><font face="FreeSerif"></font> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1-3</beginText>
<endings>1, 2, 3</endings>
</Volta>
<next>
<location>
<measures>5</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>2.</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-5.5"/>
<off2 x="0" y="0"/>
<minDistance>0.430001</minDistance>
</Segment>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>2</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-2</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>4</endRepeat>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-5</measures>
</location>
</prev>
</Spanner>
<Spanner type="TextLine">
<TextLine>
<lineVisible>0</lineVisible>
<endText>4x</endText>
<endTextAlign>center,center</endTextAlign>
<lineWidth>0.149991</lineWidth>
</TextLine>
<next>
<location>
<fractions>1/1</fractions>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
<Spanner type="TextLine">
<prev>
<location>
<fractions>-1/1</fractions>
</location>
</prev>
</Spanner>
</voice>
</Measure>
</Staff>
</Score>
</museScore>

View file

@ -0,0 +1,262 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat62</text>
</Text>
<Text>
<style>Subtitle</style>
<text>overlapping voltas - same start</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1, 5,6,7, 1,2,3,4,5,6,7, 1, 5,6,7, 1,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"/><b><font face="FreeSerif"/> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1-3</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-8.5"/>
<off2 x="0" y="0"/>
</Segment>
<endings>1, 2, 3</endings>
</Volta>
<next>
<location>
<measures>5</measures>
</location>
</next>
</Spanner>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>2.</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-5.5"/>
<off2 x="0" y="0"/>
<minDistance>0.390001</minDistance>
</Segment>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>3</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-3</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>4</endRepeat>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-5</measures>
</location>
</prev>
</Spanner>
<Spanner type="TextLine">
<TextLine>
<lineVisible>0</lineVisible>
<endText>4x</endText>
<endTextAlign>center,center</endTextAlign>
<lineWidth>0.149991</lineWidth>
</TextLine>
<next>
<location>
<fractions>1/1</fractions>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
<Spanner type="TextLine">
<prev>
<location>
<fractions>-1/1</fractions>
</location>
</prev>
</Spanner>
</voice>
</Measure>
</Staff>
</Score>
</museScore>

View file

@ -0,0 +1,256 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat63</text>
</Text>
<Text>
<style>Subtitle</style>
<text>overlapping voltas - same end</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1,2,3, 7, 1,2,3,4,5,6,7, 1,2,3, 7, 1,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"/><b><font face="FreeSerif"/> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1-3</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-8.5"/>
<off2 x="0" y="0"/>
</Segment>
<endings>1, 2, 3</endings>
</Volta>
<next>
<location>
<measures>5</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>3</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>4</endRepeat>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-5</measures>
</location>
</prev>
</Spanner>
<Spanner type="Volta">
<prev>
<location>
<measures>-3</measures>
</location>
</prev>
</Spanner>
<Spanner type="TextLine">
<TextLine>
<lineVisible>0</lineVisible>
<endText>4x</endText>
<endTextAlign>center,center</endTextAlign>
<lineWidth>0.149991</lineWidth>
</TextLine>
<next>
<location>
<fractions>1/1</fractions>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
<Spanner type="TextLine">
<prev>
<location>
<fractions>-1/1</fractions>
</location>
</prev>
</Spanner>
</voice>
</Measure>
</Staff>
</Score>
</museScore>

View file

@ -0,0 +1,256 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="3.01">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<showMeasureNumberOne>1</showMeasureNumberOne>
<measureNumberInterval>1</measureNumberInterval>
<measureNumberSystem>0</measureNumberSystem>
<Spatium>1.76389</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="composer"></metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="poet"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Repeat Test</metaTag>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>stdNormal</name>
</StaffType>
</Staff>
<trackName>Piano</trackName>
<Instrument>
<longName>Piano</longName>
<shortName>Pno.</shortName>
<trackName>Piano</trackName>
<minPitchP>21</minPitchP>
<maxPitchP>108</maxPitchP>
<minPitchA>21</minPitchA>
<maxPitchA>108</maxPitchA>
<instrumentId>keyboard.piano</instrumentId>
<clef staff="2">F</clef>
<Articulation>
<velocity>100</velocity>
<gateTime>95</gateTime>
</Articulation>
<Articulation name="staccatissimo">
<velocity>100</velocity>
<gateTime>33</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="portato">
<velocity>100</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="marcato">
<velocity>120</velocity>
<gateTime>67</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="0"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<bottomGap>1</bottomGap>
<Text>
<style>Title</style>
<text>repeat64</text>
</Text>
<Text>
<style>Subtitle</style>
<text>overlapping voltas</text>
</Text>
</VBox>
<TBox>
<height>1</height>
<topGap>0</topGap>
<leftMargin>1</leftMargin>
<rightMargin>1</rightMargin>
<topMargin>1</topMargin>
<bottomMargin>1</bottomMargin>
<Text>
<style>Frame</style>
<text>1,2,3, 7, 1,2,3,4,5,6,7, 1,2,3, 7, 1,7
</text>
</Text>
</TBox>
<Measure>
<voice>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Tempo>
<tempo>6.66667</tempo>
<followText>1</followText>
<text><b></b><font face="ScoreText"/><b><font face="FreeSerif"/> = 400</b></text>
</Tempo>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>1-3</beginText>
<Segment>
<subtype>0</subtype>
<offset x="0" y="-8.5"/>
<off2 x="0" y="0"/>
</Segment>
<endings>1, 2, 3</endings>
</Volta>
<next>
<location>
<measures>3</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<Volta>
<endHookType>1</endHookType>
<beginText>2.</beginText>
<endings>2</endings>
</Volta>
<next>
<location>
<measures>3</measures>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>65</pitch>
<tpc>13</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-3</measures>
</location>
</prev>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>67</pitch>
<tpc>15</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>71</pitch>
<tpc>19</tpc>
</Note>
</Chord>
</voice>
</Measure>
<Measure>
<endRepeat>4</endRepeat>
<voice>
<Spanner type="Volta">
<prev>
<location>
<measures>-3</measures>
</location>
</prev>
</Spanner>
<Spanner type="TextLine">
<TextLine>
<lineVisible>0</lineVisible>
<endText>4x</endText>
<endTextAlign>center,center</endTextAlign>
<lineWidth>0.149991</lineWidth>
</TextLine>
<next>
<location>
<fractions>1/1</fractions>
</location>
</next>
</Spanner>
<Chord>
<durationType>whole</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
<Spanner type="TextLine">
<prev>
<location>
<fractions>-1/1</fractions>
</location>
</prev>
</Spanner>
</voice>
</Measure>
</Staff>
</Score>
</museScore>

View file

@ -114,6 +114,14 @@ private slots:
void repeat56() { repeat("repeat56.mscx", "1;2;3;4; 2; 5;6;7; 5;6;7;8"); } // start of volta and start repeat on same measure
void repeat57() { repeat("repeat57.mscx", "1;2;3"); } // no repeat, skip volta until section end, relates to #274690
void repeat58() { repeat("repeat58.mscx", "1;2; 1; 3;4;5; 4; 6;7"); } // duplicate voltas #311986 - single instrument
void repeat59() { repeat("repeat59.mscx", "1;2; 1; 3;4;5; 4; 6;7"); } // duplicate voltas #311986 - multiple instruments
void repeat60() { repeat("repeat60.mscx", "1;2;6;7; 1;2;3;6;7; 1;2;3;4;5;6;7; 1;2;3;6;7; 1;2;6;7; 1;7"); } // overlapping voltas
void repeat61() { repeat("repeat61.mscx", "1;2;3;6;7; 1;2;3;4;5;6;7; 1;2;3;6;7; 1;7"); } // overlapping voltas - nested
void repeat62() { repeat("repeat62.mscx", "1;5;6;7; 1;2;3;4;5;6;7; 1;5;6;7; 1;7"); } // overlapping voltas - same start
void repeat63() { repeat("repeat63.mscx", "1;2;3;7; 1;2;3;4;5;6;7; 1;2;3;7; 1;7"); } // overlapping voltas - same end
void repeat64() { repeat("repeat64.mscx", "1;2;3;7; 1;2;3;4;5;6;7; 1;2;3;7; 1;7"); } // overlapping voltas
};
//---------------------------------------------------------