Skip to content

Commit

Permalink
Fix GH#22313: Set correct stem direction on pasting notes on a drum s…
Browse files Browse the repository at this point in the history
…tave

Backport of musescore#22575

x
  • Loading branch information
miiizen authored and Jojo-Schmitz committed Apr 25, 2024
1 parent ff7f31e commit 8cf0c40
Show file tree
Hide file tree
Showing 7 changed files with 867 additions and 30 deletions.
10 changes: 10 additions & 0 deletions libmscore/note.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1858,6 +1858,7 @@ Element* Note::drop(EditData& data)
{
// calculate correct transposed tpc
Note* n = toNote(e);
const Segment* segment = ch->segment();
Interval v = part()->instrument(ch->tick())->transpose();
v.flip();
n->setTpc2(Ms::transposeTpc(n->tpc1(), v, true));
Expand All @@ -1868,6 +1869,15 @@ Element* 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();
Direction stemDirection = Direction::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
45 changes: 26 additions & 19 deletions libmscore/paste.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,30 @@
// the file LICENCE.GPL
//=============================================================================

#include "score.h"

#include "rest.h"
#include "staff.h"
#include "measure.h"
#include "harmony.h"
#include "fret.h"
#include "breath.h"
#include "articulation.h"
#include "beam.h"
#include "breath.h"
#include "chord.h"
#include "drumset.h"
#include "fret.h"
#include "figuredbass.h"
#include "ottava.h"
#include "part.h"
#include "lyrics.h"
#include "hairpin.h"
#include "harmony.h"
#include "image.h"
#include "lyrics.h"
#include "measure.h"
#include "repeat.h"
#include "rest.h"
#include "score.h"
#include "sig.h"
#include "staff.h"
#include "part.h"
#include "tie.h"
#include "timesig.h"
#include "tremolo.h"
#include "tuplet.h"
#include "utils.h"
#include "xml.h"
#include "image.h"
#include "repeat.h"
#include "chord.h"
#include "tremolo.h"
#include "slur.h"
#include "articulation.h"
#include "sig.h"

namespace Ms {

Expand Down Expand Up @@ -1006,8 +1004,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();
Direction stemDirection = Direction::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, Direction::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 mtest/libmscore/copypaste/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 8cf0c40

Please sign in to comment.