MuseScore  3.4
Music composition and notation
importmidi_chord.h
Go to the documentation of this file.
1 #ifndef IMPORTMIDI_CHORD_H
2 #define IMPORTMIDI_CHORD_H
3 
4 #include "importmidi_fraction.h"
5 #include "importmidi_tuplet.h"
6 
7 #include <map>
8 
9 
10 namespace Ms {
11 
12 class Tie;
13 class TimeSigMap;
14 
15 class MidiNote {
16  public:
17  int pitch;
18  int velo;
20  Tie* tie = nullptr;
21  bool staccato = false;
22  bool isInTuplet = false;
23  // for offTime quantization
24  std::multimap<ReducedFraction, MidiTuplet::TupletData>::iterator tuplet;
25  // for notation simplification - final quant value
26  ReducedFraction offTimeQuant = ReducedFraction(-1, 1); // invalid by default
27  // to assign lyrics
29  };
30 
31 class MidiChord {
32  public:
33  int voice = 0;
34  QList<MidiNote> notes;
35  bool isInTuplet = false;
36  int barIndex = -1;
37  // for onTime quantization
38  std::multimap<ReducedFraction, MidiTuplet::TupletData>::iterator tuplet;
39 
40  bool isStaccato() const
41  {
42  for (const auto &note: notes)
43  if (note.staccato)
44  return true;
45  return false;
46  }
47  };
48 
49 class MTrack;
50 
51 namespace MChord {
52 
53 bool isGrandStaffProgram(int program);
54 
55 std::multimap<ReducedFraction, MidiChord>::iterator
56 findFirstChordInRange(std::multimap<ReducedFraction, MidiChord> &chords,
57  const ReducedFraction &startRangeTick,
58  const ReducedFraction &endRangeTick);
59 
60 std::multimap<ReducedFraction, MidiChord>::const_iterator
61 findFirstChordInRange(const std::multimap<ReducedFraction, MidiChord> &chords,
62  const ReducedFraction &startRangeTick,
63  const ReducedFraction &endRangeTick);
64 
65 template <typename Iter>
66 Iter findFirstChordInRange(const ReducedFraction &startRangeTick,
67  const ReducedFraction &endRangeTick,
68  const Iter &startChordIt,
69  const Iter &endChordIt)
70  {
71  auto it = startChordIt;
72  for (; it != endChordIt; ++it) {
73  if (it->first >= startRangeTick) {
74  if (it->first >= endRangeTick)
75  it = endChordIt;
76  break;
77  }
78  }
79  return it;
80  }
81 
82 template <typename Iter>
83 Iter findEndChordInRange(const ReducedFraction &endRangeTick,
84  const Iter &startChordIt,
85  const Iter &endChordIt)
86  {
87  auto it = startChordIt;
88  for (; it != endChordIt; ++it) {
89  if (it->first >= endRangeTick)
90  break;
91  }
92  return it;
93  }
94 
95 ReducedFraction minNoteOffTime(const QList<MidiNote> &notes);
96 ReducedFraction maxNoteOffTime(const QList<MidiNote> &notes);
97 ReducedFraction minNoteLen(const std::pair<const ReducedFraction, MidiChord> &chord);
98 ReducedFraction maxNoteLen(const std::pair<const ReducedFraction, MidiChord> &chord);
99 
102  const QList<MidiChord> &midiChords,
103  const ReducedFraction &length);
104 void sortNotesByPitch(std::multimap<ReducedFraction, MidiChord> &chords);
105 void sortNotesByLength(std::multimap<ReducedFraction, MidiChord> &chords);
106 
107 void collectChords(
108  std::multimap<int, MTrack> &tracks,
109  const ReducedFraction &humanTolCoeff,
110  const ReducedFraction &nonHumanTolCoeff);
111 
112 void collectChords(
113  MTrack &track,
114  const ReducedFraction &humanTolCoeff,
115  const ReducedFraction &nonHumanTolCoeff);
116 
117 void removeOverlappingNotes(std::multimap<int, MTrack> &tracks);
118 void mergeChordsWithEqualOnTimeAndVoice(std::multimap<int, MTrack> &tracks);
119 void splitUnequalChords(std::multimap<int, MTrack> &tracks);
120 int chordAveragePitch(const QList<MidiNote> &notes, int beg, int end);
121 int chordAveragePitch(const QList<MidiNote> &notes);
122 
123 ReducedFraction findMaxChordLength(const std::multimap<ReducedFraction, MidiChord> &chords);
124 
125 std::vector<std::multimap<ReducedFraction, MidiChord>::const_iterator>
127  int voice,
128  const ReducedFraction &onTime,
129  const ReducedFraction &offTime,
130  const std::multimap<ReducedFraction, MidiChord> &chords,
131  const ReducedFraction &maxChordLength);
132 
133 void setBarIndexes(
134  std::multimap<ReducedFraction, MidiChord> &chords,
135  const ReducedFraction &basicQuant,
136  const ReducedFraction &lastTick, const TimeSigMap *sigmap);
137 
138 #ifdef QT_DEBUG
139 
140 bool areOnTimeValuesDifferent(const std::multimap<ReducedFraction, MidiChord> &chords);
141 bool areBarIndexesSuccessive(const std::multimap<ReducedFraction, MidiChord> &chords);
142 bool areNotesLongEnough(const std::multimap<ReducedFraction, MidiChord> &chords);
143 bool isLastTickValid(const ReducedFraction &lastTick,
144  const std::multimap<ReducedFraction, MidiChord> &chords);
145 bool isLastTickValid(const ReducedFraction &lastTick,
146  const std::multimap<int, MTrack> &tracks);
147 bool areBarIndexesSet(const std::multimap<ReducedFraction, MidiChord> &chords);
148 
149 #endif
150 
151 } // namespace MChord
152 } // namespace Ms
153 
154 
155 #endif // IMPORTMIDI_CHORD_H
void removeOverlappingNotes(QList< MidiNote > &notes)
Definition: importmidi_chord.cpp:106
Definition: importmidi_chord.h:31
bool isInTuplet
Definition: importmidi_chord.h:22
ReducedFraction maxNoteLen(const std::pair< const ReducedFraction, MidiChord > &chord)
Definition: importmidi_chord.cpp:100
void splitUnequalChords(std::multimap< int, MTrack > &tracks)
Definition: importmidi_chord.cpp:437
bool staccato
Definition: importmidi_chord.h:21
Definition: importmidi_chord.h:15
Iter findFirstChordInRange(const ReducedFraction &startRangeTick, const ReducedFraction &endRangeTick, const Iter &startChordIt, const Iter &endChordIt)
Definition: importmidi_chord.h:66
int chordAveragePitch(const QList< MidiNote > &notes, int beg, int end)
Definition: importmidi_chord.cpp:516
ReducedFraction origOnTime
Definition: importmidi_chord.h:28
void collectChords(std::multimap< int, MTrack > &tracks, const ReducedFraction &humanTolCoeff, const ReducedFraction &nonHumanTolCoeff)
Definition: importmidi_chord.cpp:289
int velo
Definition: importmidi_chord.h:18
ReducedFraction minNoteOffTime(const QList< MidiNote > &notes)
Definition: importmidi_chord.cpp:71
bool isStaccato() const
Definition: importmidi_chord.h:40
Tie * tie
Definition: importmidi_chord.h:20
ReducedFraction findMaxChordLength(const std::multimap< ReducedFraction, MidiChord > &chords)
Definition: importmidi_chord.cpp:539
void sortNotesByLength(std::multimap< ReducedFraction, MidiChord > &chords)
Definition: importmidi_chord.cpp:417
std::multimap< ReducedFraction, MidiTuplet::TupletData >::iterator tuplet
Definition: importmidi_chord.h:24
bool isGrandStaffProgram(int program)
Definition: importmidi_chord.cpp:17
Definition: aeolus.cpp:26
void sortNotesByPitch(std::multimap< ReducedFraction, MidiChord > &chords)
Definition: importmidi_chord.cpp:401
ReducedFraction offTime
Definition: importmidi_chord.h:19
ReducedFraction minNoteLen(const std::pair< const ReducedFraction, MidiChord > &chord)
Definition: importmidi_chord.cpp:94
void mergeChordsWithEqualOnTimeAndVoice(std::multimap< int, MTrack > &tracks)
Definition: importmidi_chord.cpp:487
int pitch
Definition: importmidi_chord.h:17
a Tie has a Note as startElement/endElement
Definition: tie.h:60
QList< MidiNote > notes
Definition: importmidi_chord.h:34
Iter findEndChordInRange(const ReducedFraction &endRangeTick, const Iter &startChordIt, const Iter &endChordIt)
Definition: importmidi_chord.h:83
Definition: importmidi_inner.h:71
Definition: importmidi_fraction.h:9
ReducedFraction findMinDuration(const ReducedFraction &onTime, const QList< MidiChord > &midiChords, const ReducedFraction &length)
Definition: importmidi_chord.cpp:472
void setBarIndexes(std::multimap< ReducedFraction, MidiChord > &chords, const ReducedFraction &basicQuant, const ReducedFraction &lastTick, const TimeSigMap *sigmap)
Definition: importmidi_chord.cpp:586
ReducedFraction offTimeQuant
Definition: importmidi_chord.h:26
Definition: sig.h:127
std::vector< std::multimap< ReducedFraction, MidiChord >::const_iterator > findChordsForTimeRange(int voice, const ReducedFraction &onTime, const ReducedFraction &offTime, const std::multimap< ReducedFraction, MidiChord > &chords, const ReducedFraction &maxChordLength)
Definition: importmidi_chord.cpp:552
ReducedFraction maxNoteOffTime(const QList< MidiNote > &notes)
Definition: importmidi_chord.cpp:84
const ReducedFraction & minAllowedDuration()
Definition: importmidi_chord.cpp:65
std::multimap< ReducedFraction, MidiTuplet::TupletData >::iterator tuplet
Definition: importmidi_chord.h:38