Skip to content

Commit

Permalink
Merge pull request #1073 from BartlomiejLewandowski/12960-paste-two-v…
Browse files Browse the repository at this point in the history
…oice

Staff paste with multiple voices
  • Loading branch information
wschweer committed Jul 30, 2014
2 parents 742bbc7 + cf658a2 commit bf7cca7
Show file tree
Hide file tree
Showing 7 changed files with 502 additions and 7 deletions.
19 changes: 15 additions & 4 deletions libmscore/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -721,15 +721,27 @@ Fraction Score::makeGap(Segment* segment, int track, const Fraction& _sd, Tuplet
// - do not stop at measure end
//---------------------------------------------------------

bool Score::makeGap1(int tick, int staffIdx, Fraction len)
bool Score::makeGap1(int tick, int staffIdx, Fraction len, int voices)
{
ChordRest* cr = 0;
Segment* seg = tick2segment(tick, true, Segment::Type::ChordRest);
if (!seg) {
qDebug("1:makeGap1: no segment at %d", tick);
return false;
}
int track = staffIdx * VOICES;
int strack = staffIdx * VOICES;
for (int track = strack; track < strack + 4; track++) {
if (!(voices & (1 << (track-strack))))
continue;
bool result = makeGapVoice(seg, track, len, tick);
if(track == strack && !result)
return false;
}
return true;
}

bool Score::makeGapVoice(Segment* seg, int track, Fraction len, int tick)
{
ChordRest* cr = 0;
cr = static_cast<ChordRest*>(seg->element(track));
if (!cr) {
// check if we are in the middle of a chord/rest
Expand All @@ -755,7 +767,6 @@ bool Score::makeGap1(int tick, int staffIdx, Fraction len)
return false;
}
if (seg1->element(track)) {
tick = seg1->tick();
cr = static_cast<ChordRest*>(seg1->element(track));
break;
}
Expand Down
3 changes: 2 additions & 1 deletion libmscore/paste.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ bool Score::pasteStaff(XmlReader& e, Segment* dst, int staffIdx)
e.setTransposeDiatonic(0);

int srcStaffIdx = e.attribute("id", "0").toInt();
int voices = e.attribute("voices","0").toInt();
int dstStaffIdx = srcStaffIdx - srcStaffStart + dstStaffStart;

if (dstStaffIdx >= nstaves()) {
Expand All @@ -93,7 +94,7 @@ bool Score::pasteStaff(XmlReader& e, Segment* dst, int staffIdx)
int tick = e.readInt();
e.initTick(tick);
int shift = tick - tickStart;
if (makeGap && !makeGap1(dstTick + shift, dstStaffIdx, Fraction::fromTicks(tickLen - shift))) {
if (makeGap && !makeGap1(dstTick + shift, dstStaffIdx, Fraction::fromTicks(tickLen - shift), voices)) {
qDebug("cannot make gap in staff %d at tick %d", dstStaffIdx, dstTick + shift);
done = true; // break main loop, cannot make gap
break;
Expand Down
3 changes: 2 additions & 1 deletion libmscore/score.h
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,8 @@ class Score : public QObject {
void changeCRlen(ChordRest* cr, const TDuration&);

Fraction makeGap(Segment*, int track, const Fraction&, Tuplet*, bool keepChord = false);
bool makeGap1(int tick, int staffIdx, Fraction len);
bool makeGap1(int tick, int staffIdx, Fraction len, int voices);
bool makeGapVoice(Segment* seg, int track, Fraction len, int tick);

Rest* addRest(int tick, int track, TDuration, Tuplet*);
Rest* addRest(Segment* seg, int track, TDuration d, Tuplet*);
Expand Down
18 changes: 17 additions & 1 deletion libmscore/select.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,16 @@ QByteArray Selection::mimeData() const
return a;
}


bool hasElementInTrack(Segment* startSeg, Segment* endSeg, int track)
{
for (Segment* seg = startSeg; seg != endSeg; seg = seg->next1MM()) {
if (seg->element(track))
return true;
}
return false;
}

//---------------------------------------------------------
// staffMimeData
//---------------------------------------------------------
Expand All @@ -605,9 +615,15 @@ QByteArray Selection::staffMimeData() const
Segment* seg2 = _endSegment;

for (int staffIdx = staffStart(); staffIdx < staffEnd(); ++staffIdx) {
xml.stag(QString("Staff id=\"%1\"").arg(staffIdx));
int startTrack = staffIdx * VOICES;
int endTrack = startTrack + VOICES;

int voices = 0;
for(int voice = 0; voice < 4; voice++) {
voices |= hasElementInTrack(seg1, seg2, startTrack + voice) << voice;
}
xml.stag(QString("Staff id=\"%1\" voices=\"%2\"").arg(staffIdx).arg(voices));

Staff* staff = score()->staff(staffIdx);
Part* part = staff->part();
Interval interval = part->instr(seg1->tick())->transpose();
Expand Down
221 changes: 221 additions & 0 deletions mtest/libmscore/copypaste/copypaste13-ref.mscx
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="1.24">
<Score>
<LayerTag id="0" tag="default"></LayerTag>
<currentLayer>0</currentLayer>
<Division>480</Division>
<Style>
<page-layout>
<page-height>1683.78</page-height>
<page-width>1190.55</page-width>
<page-margins type="even">
<left-margin>56.6929</left-margin>
<right-margin>56.6929</right-margin>
<top-margin>56.6929</top-margin>
<bottom-margin>113.386</bottom-margin>
</page-margins>
<page-margins type="odd">
<left-margin>56.6929</left-margin>
<right-margin>56.6929</right-margin>
<top-margin>56.6929</top-margin>
<bottom-margin>113.386</bottom-margin>
</page-margins>
</page-layout>
<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">voice-paste1</metaTag>
<PageList>
<Page>
<System>
</System>
<System>
</System>
</Page>
</PageList>
<Part>
<Staff id="1">
<StaffType group="pitched">
<name>Standard</name>
</StaffType>
<bracket type="-1" span="0"/>
</Staff>
<trackName>Violin</trackName>
<Instrument>
<longName pos="0">Violin</longName>
<shortName pos="0">Vln.</shortName>
<trackName>Violin</trackName>
<minPitchP>55</minPitchP>
<maxPitchP>103</maxPitchP>
<minPitchA>55</minPitchA>
<maxPitchA>88</maxPitchA>
<StringData>
<frets>24</frets>
<string>55</string>
<string>62</string>
<string>69</string>
<string>76</string>
</StringData>
<Articulation>
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="staccato">
<velocity>100</velocity>
<gateTime>50</gateTime>
</Articulation>
<Articulation name="tenuto">
<velocity>100</velocity>
<gateTime>100</gateTime>
</Articulation>
<Articulation name="sforzato">
<velocity>120</velocity>
<gateTime>100</gateTime>
</Articulation>
<Channel>
<program value="40"/>
</Channel>
<Channel name="pizzicato">
<program value="45"/>
</Channel>
<Channel name="tremolo">
<program value="44"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<Text>
<style>Title</style>
<text>voice-paste1</text>
</Text>
</VBox>
<Measure number="1">
<Clef>
<concertClefType>G</concertClefType>
<transposingClefType>G</transposingClefType>
</Clef>
<KeySig>
<accidental>0</accidental>
</KeySig>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
<showCourtesySig>1</showCourtesySig>
</TimeSig>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>76</pitch>
<tpc>18</tpc>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>79</pitch>
<tpc>15</tpc>
</Note>
</Chord>
<Rest>
<durationType>half</durationType>
</Rest>
<BarLine>
<subtype>normal</subtype>
<span>1</span>
</BarLine>
<tick>0</tick>
<Rest>
<track>1</track>
<durationType>half</durationType>
</Rest>
<Rest>
<track>1</track>
<durationType>half</durationType>
</Rest>
</Measure>
<Measure number="2">
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>72</pitch>
<tpc>14</tpc>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>76</pitch>
<tpc>18</tpc>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>79</pitch>
<tpc>15</tpc>
</Note>
</Chord>
<Rest>
<durationType>quarter</durationType>
</Rest>
<BarLine>
<subtype>normal</subtype>
<span>1</span>
</BarLine>
<tick>1920</tick>
<Chord>
<track>1</track>
<durationType>quarter</durationType>
<Note>
<track>1</track>
<pitch>64</pitch>
<tpc>18</tpc>
</Note>
</Chord>
<Rest>
<track>1</track>
<durationType>half</durationType>
</Rest>
<Rest>
<track>1</track>
<durationType>quarter</durationType>
</Rest>
</Measure>
<Measure number="3">
<Rest>
<durationType>measure</durationType>
<duration z="4" n="4"/>
</Rest>
<BarLine>
<subtype>normal</subtype>
<span>1</span>
</BarLine>
</Measure>
<Measure number="4">
<Rest>
<durationType>measure</durationType>
<duration z="4" n="4"/>
</Rest>
<BarLine>
<subtype>end</subtype>
<span>1</span>
</BarLine>
</Measure>
</Staff>
</Score>
</museScore>
Loading

0 comments on commit bf7cca7

Please sign in to comment.