Skip to content

Commit

Permalink
Set correct stem direction on pasting notes on a drum stave
Browse files Browse the repository at this point in the history
  • Loading branch information
miiizen committed Apr 25, 2024
1 parent 6c210c8 commit cf4576f
Show file tree
Hide file tree
Showing 7 changed files with 843 additions and 1 deletion.
10 changes: 10 additions & 0 deletions src/engraving/dom/note.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1876,6 +1876,7 @@ EngravingItem* Note::drop(EditData& data)
{
// calculate correct transposed tpc
Note* n = toNote(e);
const Segment* segment = ch->segment();
Interval v = staff()->transpose(ch->tick());
v.flip();
n->setTpc2(mu::engraving::transposeTpc(n->tpc1(), v, true));
Expand All @@ -1886,6 +1887,15 @@ EngravingItem* Note::drop(EditData& data)
n->tieBack()->setEndNote(n);
this->setTieBack(nullptr);
}
// Set correct stem direction for drum staves
const StaffGroup staffGroup = st->staffType(segment->tick())->group();
DirectionV stemDirection = DirectionV::AUTO;
if (staffGroup == StaffGroup::PERCUSSION) {
const Drumset* ds = st->part()->instrument(segment->tick())->drumset();
stemDirection = ds->stemDirection(n->noteVal().pitch);
}
ch->setStemDirection(stemDirection);

score()->undoRemoveElement(this);
score()->undoAddElement(n);
return n;
Expand Down
11 changes: 10 additions & 1 deletion src/engraving/dom/paste.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,17 @@ static Note* prepareTarget(ChordRest* target, Note* with, const Fraction& durati
Measure* m = segment->measure()->mmRestFirst();
segment = m->findSegment(SegmentType::ChordRest, m->tick());
}

const Staff* staff = target->staff();
const StaffGroup staffGroup = staff->staffType(segment->tick())->group();
DirectionV stemDirection = DirectionV::AUTO;
if (staffGroup == StaffGroup::PERCUSSION) {
const Drumset* ds = staff->part()->instrument(segment->tick())->drumset();
stemDirection = ds->stemDirection(with->noteVal().pitch);
}

segment = target->score()->setNoteRest(segment, target->track(),
with->noteVal(), duration, DirectionV::AUTO, false, {}, false, &target->score()->inputState());
with->noteVal(), duration, stemDirection, false, {}, false, &target->score()->inputState());
return toChord(segment->nextChordRest(target->track()))->upNote();
}

Expand Down
187 changes: 187 additions & 0 deletions src/engraving/tests/copypaste_data/copypasteNote12-ref.mscx
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="4.40">
<Score>
<Division>480</Division>
<Style>
<Spatium>1.74978</Spatium>
</Style>
<showInvisible>1</showInvisible>
<showUnprintable>1</showUnprintable>
<showFrames>1</showFrames>
<showMargins>0</showMargins>
<metaTag name="arranger"></metaTag>
<metaTag name="audioComUrl"></metaTag>
<metaTag name="composer">Composer / arranger</metaTag>
<metaTag name="copyright"></metaTag>
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="source"></metaTag>
<metaTag name="sourceRevisionId"></metaTag>
<metaTag name="subtitle">Subtitle</metaTag>
<metaTag name="translator"></metaTag>
<metaTag name="workNumber"></metaTag>
<metaTag name="workTitle">Untitled score</metaTag>
<Order id="orchestra">
<name>Orchestra</name>
<instrument id="snare-drum">
<family id="drums">Drums</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="percussion">
<name>perc1Line</name>
<lines>1</lines>
<keysig>0</keysig>
</StaffType>
<defaultClef>PERC</defaultClef>
</Staff>
<trackName>Snare Drum</trackName>
<Instrument id="snare-drum">
<longName>Snare Drum</longName>
<shortName>SD</shortName>
<trackName>Snare Drum</trackName>
<instrumentId>drum.snare-drum</instrumentId>
<useDrumset>1</useDrumset>
<Drum pitch="37">
<head>cross</head>
<line>0</line>
<voice>0</voice>
<name>Side Stick</name>
<stem>1</stem>
<shortcut>A</shortcut>
</Drum>
<Drum pitch="38">
<head>normal</head>
<line>0</line>
<voice>0</voice>
<name>Snare</name>
<stem>1</stem>
<shortcut>B</shortcut>
</Drum>
<clef>PERC</clef>
<Channel>
<controller ctrl="0" value="1"/>
<controller ctrl="32" value="0"/>
<program value="48"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<VBox>
<height>10</height>
<Text>
<style>title</style>
<text>Test</text>
</Text>
<Text>
<style>subtitle</style>
<text>Copy-Paste</text>
</Text>
</VBox>
<Measure>
<voice>
<KeySig>
<custom>1</custom>
<mode>none</mode>
</KeySig>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
</TimeSig>
<Chord>
<durationType>quarter</durationType>
<StemDirection>up</StemDirection>
<Note>
<pitch>38</pitch>
<tpc>16</tpc>
</Note>
</Chord>
<Rest>
<durationType>quarter</durationType>
</Rest>
<Rest>
<durationType>half</durationType>
</Rest>
</voice>
</Measure>
<Measure>
<voice>
<Chord>
<durationType>quarter</durationType>
<StemDirection>up</StemDirection>
<Note>
<pitch>38</pitch>
<tpc>16</tpc>
</Note>
</Chord>
<Rest>
<durationType>quarter</durationType>
</Rest>
<Rest>
<durationType>half</durationType>
</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

0 comments on commit cf4576f

Please sign in to comment.