Line data Source code
1 : #ifndef MU_IMPORTEXPORT_GPNOTE_H
2 : #define MU_IMPORTEXPORT_GPNOTE_H
3 :
4 : #include <unordered_set>
5 : #include <memory>
6 : #include <bitset>
7 :
8 : #include <global/types/string.h>
9 :
10 : #include "inoteproperty.h"
11 :
12 : namespace mu::iex::guitarpro {
13 : class GPNote
14 : {
15 : public:
16 : enum class TieType {
17 : None, Start, Mediate, End
18 : };
19 : enum class VibratoType {
20 : None, Slight, Wide
21 : };
22 : enum class Ornament {
23 : None, LowerMordent, UpperMordent, InvertedTurn, Turn
24 : };
25 : enum class HammerOn {
26 : None, Start, End
27 : };
28 :
29 : enum class PickScrape {
30 : None, Down, Up
31 : };
32 :
33 : struct Harmonic {
34 : enum class Type {
35 : None, Natural, Artificial, Pinch, Tap, Semi, FeedBack, Types
36 : };
37 : float fret{ 0 };
38 : Type type{ Type::None };
39 :
40 49 : static bool isArtificial(Type type)
41 : {
42 : return type == Type::Artificial
43 23 : || type == Type::Pinch
44 21 : || type == Type::Tap
45 18 : || type == Type::Semi
46 72 : || type == Type::FeedBack;
47 : }
48 : };
49 : struct MidiPitch {
50 : int midi{ -1 };
51 : int string{ -1 };
52 : int fret{ -1 };
53 : int octave{ -1 };
54 : int tone{ 0 };
55 : int element{ 0 };
56 : int variation{ -1 };
57 : };
58 : struct Bend {
59 : float destinationOffset{ -1 };
60 : float destinationValue{ -1 };
61 : float middleOffset1{ -1 };
62 : float middleOffset2{ -1 };
63 : float middleValue{ -1 };
64 : float originOffset{ -1 };
65 : float originValue{ -1 };
66 2214 : bool isEmpty() const
67 : {
68 2214 : return destinationValue == -1
69 2022 : && destinationOffset == -1
70 2022 : && middleValue == -1
71 2022 : && middleOffset1 == -1
72 2022 : && middleOffset2 == -1
73 2022 : && originOffset == -1
74 4236 : && originValue == -1;
75 : }
76 : };
77 : struct Trill {
78 : int auxillaryFret{ -1 };
79 : int speed{ -1 };
80 : };
81 :
82 1340 : void addProperties(std::unordered_set<std::unique_ptr<INoteProperty> >&& pr) { _properties.swap(pr); }
83 131 : void setTieType(GPNote::TieType t) { _tie = t; }
84 :
85 995 : void setMidi(int m) { _midiPitch.midi = m; }
86 : int midi() const { return _midiPitch.midi; }
87 1329 : void setString(int s) { _midiPitch.string = s; }
88 : int string() const { return _midiPitch.string; }
89 1329 : void setFret(int f) { _midiPitch.fret = f; }
90 : int fret() const { return _midiPitch.fret; }
91 11 : void setOctave(int o) { _midiPitch.octave = o; }
92 11 : void setTone(int t) { _midiPitch.tone = t; }
93 0 : void setVariation(int t) { _midiPitch.variation = t; }
94 0 : void setElement(int t) { _midiPitch.element = t; }
95 :
96 1038 : void setAccidental(int acc) { _accidental = acc; }
97 2030 : int accidental() const { return _accidental; }
98 :
99 41 : void setHarmonicFret(float f) { _harmonic.fret = f; }
100 41 : void setHarmonicType(Harmonic::Type t) { _harmonic.type = t; }
101 2321 : const Harmonic& harmonic() const { return _harmonic; }
102 :
103 8 : void setLetRing(bool lr) { _letRing = lr; }
104 2030 : bool letRing() const { return _letRing; }
105 :
106 3 : void setPalmMute(bool pm) { _palmMuted = pm; }
107 2030 : bool palmMute() const { return _palmMuted; }
108 :
109 4478 : const MidiPitch& midiPitch() const { return _midiPitch; }
110 2411 : TieType tieType() const { return _tie; }
111 :
112 94 : void setBend(std::unique_ptr<Bend>&& b) { _bend.swap(b); }
113 2232 : const Bend* bend() const { return _bend.get(); }
114 :
115 2 : void setGhostNote(bool b) { _ghostNote = b; }
116 2030 : bool ghostNote() const { return _ghostNote; }
117 :
118 9 : void setMute(bool m) { _muted = m; }
119 : //! muted = dead note
120 2030 : bool muted() const { return _muted; }
121 :
122 2 : void setRightHandTapping(bool t) { _rightHandTapping = t; }
123 2030 : bool rightHandTapping() const { return _rightHandTapping; }
124 :
125 0 : void setLeftHandTapped(bool v) { _leftHandTapped = v; }
126 2030 : bool leftHandTapped() const { return _leftHandTapped; }
127 :
128 6 : void setAccent(const std::bitset<4>& b) { _accent = b; }
129 2084 : const std::bitset<4>& accents() const { return _accent; }
130 :
131 44 : void setSlides(const std::bitset<6>& s) { _slides = s; }
132 2514 : const std::bitset<6>& slides() const { return _slides; }
133 :
134 12 : void setLeftFingering(const muse::String& ch) { _leftFingering = ch; }
135 2064 : const muse::String& leftFingering() const { return _leftFingering; }
136 :
137 10 : void setRightFingering(const muse::String& ch) { _rightFingering = ch; }
138 2050 : const muse::String& rightFingering() const { return _rightFingering; }
139 :
140 0 : void setShowStringNumber(bool show) { m_showStringNumber = show; }
141 2030 : bool showStringNumber() const { return m_showStringNumber; }
142 :
143 9 : void setVibratoType(VibratoType v) { _vibrato = v; }
144 2039 : VibratoType vibratoType() const { return _vibrato; }
145 :
146 2 : void setTrillFret(int fr) { _trill.auxillaryFret = fr; }
147 2 : void setTrillSpeed(int tr) { _trill.speed = tr; }
148 2030 : Trill trill() const { return _trill; }
149 :
150 8 : void setOrnament(Ornament o) { _ornament = o; }
151 2038 : Ornament ornament() const { return _ornament; }
152 :
153 35 : void setHammerOn(HammerOn h) { _hammer = h; }
154 2030 : HammerOn hammerOn() const { return _hammer; }
155 :
156 1 : void setPickScrape(PickScrape p) { _pickScrape = p; }
157 2030 : PickScrape pickScrape() const { return _pickScrape; }
158 :
159 1340 : void setId(int id) { _id = id; }
160 : int id() const { return _id; }
161 :
162 : const std::unordered_set<std::unique_ptr<INoteProperty> >& properties() const { return _properties; }
163 : static constexpr int invalidAccidental = -10;
164 :
165 : private:
166 : int _id{ -1 };
167 : TieType _tie{ TieType::None };
168 : std::unordered_set<std::unique_ptr<INoteProperty> > _properties;
169 : MidiPitch _midiPitch;
170 :
171 : int _accidental = invalidAccidental;
172 : Harmonic _harmonic;
173 : std::unique_ptr<Bend> _bend;
174 : bool _letRing{ false };
175 : bool _palmMuted{ false };
176 : bool _ghostNote{ false };
177 : bool _muted{ false };
178 : //[0] - staccato, [1] - unknown, [2] - heavily accidental, [3] - accidental
179 : std::bitset<4> _accent{ 0 };
180 : //[0] shifSlide, [1] - legatoSlide, [2] - slideDownWard, [3] - slidewUpWard, [4] - slideInFormBelow, [5] - slideInFormAbove,
181 : std::bitset<6> _slides{ 0 };
182 : muse::String _leftFingering;
183 : muse::String _rightFingering;
184 : VibratoType _vibrato{ VibratoType::None };
185 : Trill _trill;
186 : Ornament _ornament{ Ornament::None };
187 : bool _rightHandTapping = false;
188 : bool _leftHandTapped = false;
189 : HammerOn _hammer{ HammerOn::None };
190 : PickScrape _pickScrape{ PickScrape::None };
191 : bool m_showStringNumber = false;
192 : };
193 : } // namespace mu::iex::guitarpro
194 :
195 : #endif // MU_IMPORTEXPORT_GPNOTE_H
|