Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: musescore/MuseScore
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: a7b16490fac9
Choose a base ref
...
head repository: musescore/MuseScore
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 06e4170672d5
Choose a head ref
  • 6 commits
  • 6 files changed
  • 2 contributors

Commits on Jan 11, 2015

  1. Copy the full SHA
    a37c4e7 View commit details
  2. Copy the full SHA
    a4664a5 View commit details
  3. Copy the full SHA
    905f8b0 View commit details
  4. Copy the full SHA
    547bee8 View commit details
  5. Copy the full SHA
    774aa11 View commit details

Commits on Jan 12, 2015

  1. Merge pull request #1620 from trig-ger/midi_pickup_bar

    More fine pickup measure recognition for some cases
    wschweer committed Jan 12, 2015
    Copy the full SHA
    06e4170 View commit details
143 changes: 117 additions & 26 deletions mscore/importmidi/importmidi.cpp
Original file line number Diff line number Diff line change
@@ -959,37 +959,114 @@ void createInstruments(Score *score, QList<MTrack> &tracks)
}
}

void createMeasures(ReducedFraction &lastTick, Score *score)
bool isPickupWithLessTimeSig(const Fraction &firstBarTimeSig, const Fraction &secondBarTimeSig)
{
int bars, beat, tick;
score->sigmap()->tickValues(lastTick.ticks(), &bars, &beat, &tick);
return firstBarTimeSig < secondBarTimeSig;
}

bool isPickupWithGreaterTimeSig(
const Fraction &firstBarTimeSig,
const Fraction &secondBarTimeSig,
const ReducedFraction &firstTick)
{
return firstBarTimeSig == secondBarTimeSig * 2
&& firstBarTimeSig.numerator() % 3 != 0
&& firstTick > ReducedFraction(0, 1);
}

// search for pickup measure only if next 3 bars have equal time signatures
bool areNextBarsEqual(const Score *score, int barCount)
{
const int baseBarTick = score->sigmap()->bar2tick(1, 0);
const Fraction baseTimeSig = score->sigmap()->timesig(baseBarTick).timesig();

const int equalTimeSigCount = 3;
for (int i = 2; i <= equalTimeSigCount - 1 && i < barCount; ++i) {
const int barTick = score->sigmap()->bar2tick(i, 0);
const Fraction timeSig = score->sigmap()->timesig(barTick).timesig();
if (timeSig != baseTimeSig)
return false;
}
return true;
}

void tryCreatePickupMeasure(
const ReducedFraction &firstTick,
Score *score,
int *begBarIndex,
int *barCount)
{
const int firstBarTick = score->sigmap()->bar2tick(0, 0);
const int secondBarTick = score->sigmap()->bar2tick(1, 0);
const Fraction firstTimeSig = score->sigmap()->timesig(firstBarTick).timesig();
const Fraction secondTimeSig = score->sigmap()->timesig(secondBarTick).timesig();

if (isPickupWithLessTimeSig(firstTimeSig, secondTimeSig)) {
Measure* pickup = new Measure(score);
pickup->setTick(firstBarTick);
pickup->setNo(0);
pickup->setIrregular(true);
pickup->setTimesig(secondTimeSig); // nominal time signature
pickup->setLen(firstTimeSig); // actual length
score->measures()->add(pickup);
*begBarIndex = 1;
}
else if (isPickupWithGreaterTimeSig(firstTimeSig, secondTimeSig, firstTick)) {
// split measure into 2 equal measures
// but for simplicity don't treat first bar as a pickup measure:
// leave its actual length equal to nominal length
++(*barCount);

score->sigmap()->add(firstBarTick, secondTimeSig);

Measure* firstBar = new Measure(score);
firstBar->setTick(firstBarTick);
firstBar->setNo(0);
firstBar->setTimesig(secondTimeSig);
firstBar->setLen(secondTimeSig);
score->measures()->add(firstBar);

Measure* secondBar = new Measure(score);
secondBar->setTick(firstBarTick + secondTimeSig.ticks());
secondBar->setNo(1);
secondBar->setTimesig(secondTimeSig);
secondBar->setLen(secondTimeSig);
score->measures()->add(secondBar);

*begBarIndex = 2;
}
}

void createMeasures(const ReducedFraction &firstTick, ReducedFraction &lastTick, Score *score)
{
int barCount, beat, tick;
score->sigmap()->tickValues(lastTick.ticks(), &barCount, &beat, &tick);
if (beat > 0 || tick > 0)
++bars; // convert bar index to number of bars
++barCount; // convert bar index to number of bars

const auto& opers = preferences.midiImportOperations;
const bool pickupMeasure = opers.data()->trackOpers.searchPickupMeasure.value();
auto &data = *preferences.midiImportOperations.data();
if (data.processingsOfOpenedFile == 0) {
if (!areNextBarsEqual(score, barCount))
data.trackOpers.searchPickupMeasure.setValue(false);
}

const bool tryDetectPickupMeasure = data.trackOpers.searchPickupMeasure.value();
int begBarIndex = 0;

for (int i = 0; i < bars; ++i) {
Measure* measure = new Measure(score);
if (tryDetectPickupMeasure && barCount > 1)
tryCreatePickupMeasure(firstTick, score, &begBarIndex, &barCount);

for (int i = begBarIndex; i < barCount; ++i) {
Measure* m = new Measure(score);
const int tick = score->sigmap()->bar2tick(i, 0);
measure->setTick(tick);
measure->setNo(i);
const Fraction ts = score->sigmap()->timesig(tick).timesig();
Fraction nominalTs = ts;

if (pickupMeasure && i == 0 && bars > 1) {
const int secondBarIndex = 1;
const int secondBarTick = score->sigmap()->bar2tick(secondBarIndex, 0);
Fraction secondTs(score->sigmap()->timesig(secondBarTick).timesig());
if (ts < secondTs) { // the first measure is a pickup measure
nominalTs = secondTs;
measure->setIrregular(true);
}
}
measure->setTimesig(nominalTs);
measure->setLen(ts);
score->measures()->add(measure);
m->setTick(tick);
m->setNo(i);
const Fraction timeSig = score->sigmap()->timesig(tick).timesig();
m->setTimesig(timeSig);
m->setLen(timeSig);
score->measures()->add(m);
}

const Measure *m = score->lastMeasure();
if (m) {
score->fixTicks();
@@ -1167,6 +1244,18 @@ void setLeftRightHandSplit(const std::multimap<int, MTrack> &tracks)
}
}

ReducedFraction findFirstChordTick(const QList<MTrack> &tracks)
{
ReducedFraction minTick(-1, 1);
for (const auto &track: tracks) {
for (const auto &chord: track.chords) {
if (minTick == ReducedFraction(-1, 1) || chord.first < minTick)
minTick = chord.first;
}
}
return minTick;
}

void convertMidi(Score *score, const MidiFile *mf)
{
ReducedFraction lastTick;
@@ -1236,7 +1325,9 @@ void convertMidi(Score *score, const MidiFile *mf)
findInstrumentsForAllTracks(trackList);
createInstruments(score, trackList);
MidiDrum::setStaffBracketForDrums(trackList);
createMeasures(lastTick, score);

const auto firstTick = findFirstChordTick(trackList);
createMeasures(firstTick, lastTick, score);
createNotes(lastTick, trackList, mf->midiType());
createTimeSignatures(score);
score->connectTies();
Binary file added mtest/importmidi/pickup_long.mid
Binary file not shown.
179 changes: 179 additions & 0 deletions mtest/importmidi/pickup_long.mscx
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="2.00">
<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"></metaTag>
<PageList>
</PageList>
<Part>
<Staff id="1">
<StaffType group="pitched">
</StaffType>
</Staff>
<trackName>French Horn</trackName>
<Instrument>
<longName pos="0">French Horn</longName>
<shortName pos="0">F Hn.</shortName>
<trackName>Horn in F</trackName>
<minPitchP>31</minPitchP>
<maxPitchP>77</maxPitchP>
<minPitchA>41</minPitchA>
<maxPitchA>69</maxPitchA>
<transposeDiatonic>-4</transposeDiatonic>
<transposeChromatic>-7</transposeChromatic>
<instrumentId>brass.french-horn</instrumentId>
<Articulation>
<velocity>100</velocity>
<gateTime>100</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="60"/>
</Channel>
</Instrument>
</Part>
<Staff id="1">
<Measure number="1">
<KeySig>
<accidental>-1</accidental>
</KeySig>
<TimeSig>
<sigN>4</sigN>
<sigD>4</sigD>
<showCourtesySig>1</showCourtesySig>
</TimeSig>
<Rest>
<durationType>half</durationType>
</Rest>
<Rest>
<durationType>quarter</durationType>
</Rest>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>57</pitch>
<tpc>17</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
</Measure>
<Measure number="2">
<Chord>
<durationType>half</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>60</pitch>
<tpc>14</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>62</pitch>
<tpc>16</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
</Measure>
<Measure number="3">
<Chord>
<durationType>half</durationType>
<Note>
<pitch>58</pitch>
<tpc>12</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>53</pitch>
<tpc>13</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
<Chord>
<durationType>quarter</durationType>
<Note>
<pitch>58</pitch>
<tpc>12</tpc>
<velocity>100</velocity>
<veloType>user</veloType>
</Note>
</Chord>
</Measure>
</Staff>
</Score>
</museScore>
Binary file added mtest/importmidi/pickup_turn_off.mid
Binary file not shown.
Loading