Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #pragma once
24 :
25 : #include <vector>
26 :
27 : #include "engravingitem.h"
28 :
29 : namespace mu::engraving {
30 : class Factory;
31 : class Note;
32 : class Transaction;
33 : enum class AccidentalVal : signed char;
34 :
35 : // NOTE: keep this in sync with accList array in accidentals.cpp
36 : enum class AccidentalType : unsigned char {
37 : ///.\{
38 : NONE,
39 : FLAT,
40 : NATURAL,
41 : SHARP,
42 : SHARP2,
43 : FLAT2,
44 : SHARP3,
45 : FLAT3,
46 : NATURAL_FLAT,
47 : NATURAL_SHARP,
48 : SHARP_SHARP,
49 :
50 : // Gould arrow quartertone
51 : FLAT_ARROW_UP,
52 : FLAT_ARROW_DOWN,
53 : NATURAL_ARROW_UP,
54 : NATURAL_ARROW_DOWN,
55 : SHARP_ARROW_UP,
56 : SHARP_ARROW_DOWN,
57 : SHARP2_ARROW_UP,
58 : SHARP2_ARROW_DOWN,
59 : FLAT2_ARROW_UP,
60 : FLAT2_ARROW_DOWN,
61 : ARROW_DOWN,
62 : ARROW_UP,
63 :
64 : // Stein-Zimmermann
65 : MIRRORED_FLAT,
66 : MIRRORED_FLAT2,
67 : SHARP_SLASH,
68 : SHARP_SLASH4,
69 :
70 : // Arel-Ezgi-Uzdilek (AEU)
71 : FLAT_SLASH2,
72 : FLAT_SLASH,
73 : SHARP_SLASH3,
74 : SHARP_SLASH2,
75 :
76 : // Extended Helmholtz-Ellis accidentals (just intonation)
77 : DOUBLE_FLAT_ONE_ARROW_DOWN,
78 : FLAT_ONE_ARROW_DOWN,
79 : NATURAL_ONE_ARROW_DOWN,
80 : SHARP_ONE_ARROW_DOWN,
81 : DOUBLE_SHARP_ONE_ARROW_DOWN,
82 : DOUBLE_FLAT_ONE_ARROW_UP,
83 :
84 : FLAT_ONE_ARROW_UP,
85 : NATURAL_ONE_ARROW_UP,
86 : SHARP_ONE_ARROW_UP,
87 : DOUBLE_SHARP_ONE_ARROW_UP,
88 : DOUBLE_FLAT_TWO_ARROWS_DOWN,
89 : FLAT_TWO_ARROWS_DOWN,
90 :
91 : NATURAL_TWO_ARROWS_DOWN,
92 : SHARP_TWO_ARROWS_DOWN,
93 : DOUBLE_SHARP_TWO_ARROWS_DOWN,
94 : DOUBLE_FLAT_TWO_ARROWS_UP,
95 : FLAT_TWO_ARROWS_UP,
96 : NATURAL_TWO_ARROWS_UP,
97 :
98 : SHARP_TWO_ARROWS_UP,
99 : DOUBLE_SHARP_TWO_ARROWS_UP,
100 : DOUBLE_FLAT_THREE_ARROWS_DOWN,
101 : FLAT_THREE_ARROWS_DOWN,
102 : NATURAL_THREE_ARROWS_DOWN,
103 : SHARP_THREE_ARROWS_DOWN,
104 :
105 : DOUBLE_SHARP_THREE_ARROWS_DOWN,
106 : DOUBLE_FLAT_THREE_ARROWS_UP,
107 : FLAT_THREE_ARROWS_UP,
108 : NATURAL_THREE_ARROWS_UP,
109 : SHARP_THREE_ARROWS_UP,
110 : DOUBLE_SHARP_THREE_ARROWS_UP,
111 :
112 : LOWER_ONE_SEPTIMAL_COMMA,
113 : RAISE_ONE_SEPTIMAL_COMMA,
114 : LOWER_TWO_SEPTIMAL_COMMAS,
115 : RAISE_TWO_SEPTIMAL_COMMAS,
116 : LOWER_ONE_UNDECIMAL_QUARTERTONE,
117 : RAISE_ONE_UNDECIMAL_QUARTERTONE,
118 :
119 : LOWER_ONE_TRIDECIMAL_QUARTERTONE,
120 : RAISE_ONE_TRIDECIMAL_QUARTERTONE,
121 :
122 : DOUBLE_FLAT_EQUAL_TEMPERED,
123 : FLAT_EQUAL_TEMPERED,
124 : NATURAL_EQUAL_TEMPERED,
125 : SHARP_EQUAL_TEMPERED,
126 : DOUBLE_SHARP_EQUAL_TEMPERED,
127 : QUARTER_FLAT_EQUAL_TEMPERED,
128 : QUARTER_SHARP_EQUAL_TEMPERED,
129 :
130 : FLAT_17,
131 : SHARP_17,
132 : FLAT_19,
133 : SHARP_19,
134 : FLAT_23,
135 : SHARP_23,
136 : FLAT_31,
137 : SHARP_31,
138 : FLAT_53,
139 : SHARP_53,
140 : EQUALS_ALMOST,
141 : EQUALS,
142 : TILDE,
143 :
144 : // Persian
145 : SORI,
146 : KORON,
147 :
148 : // Wyschnegradsky
149 : TEN_TWELFTH_FLAT,
150 : TEN_TWELFTH_SHARP,
151 : ELEVEN_TWELFTH_FLAT,
152 : ELEVEN_TWELFTH_SHARP,
153 : ONE_TWELFTH_FLAT,
154 : ONE_TWELFTH_SHARP,
155 : TWO_TWELFTH_FLAT,
156 : TWO_TWELFTH_SHARP,
157 : THREE_TWELFTH_FLAT,
158 : THREE_TWELFTH_SHARP,
159 : FOUR_TWELFTH_FLAT,
160 : FOUR_TWELFTH_SHARP,
161 : FIVE_TWELFTH_FLAT,
162 : FIVE_TWELFTH_SHARP,
163 : SIX_TWELFTH_FLAT,
164 : SIX_TWELFTH_SHARP,
165 : SEVEN_TWELFTH_FLAT,
166 : SEVEN_TWELFTH_SHARP,
167 : EIGHT_TWELFTH_FLAT,
168 : EIGHT_TWELFTH_SHARP,
169 : NINE_TWELFTH_FLAT,
170 : NINE_TWELFTH_SHARP,
171 :
172 : // (Spartan) Sagittal
173 : SAGITTAL_5V7KD,
174 : SAGITTAL_5V7KU,
175 : SAGITTAL_5CD,
176 : SAGITTAL_5CU,
177 : SAGITTAL_7CD,
178 : SAGITTAL_7CU,
179 : SAGITTAL_25SDD,
180 : SAGITTAL_25SDU,
181 : SAGITTAL_35MDD,
182 : SAGITTAL_35MDU,
183 : SAGITTAL_11MDD,
184 : SAGITTAL_11MDU,
185 : SAGITTAL_11LDD,
186 : SAGITTAL_11LDU,
187 : SAGITTAL_35LDD,
188 : SAGITTAL_35LDU,
189 : SAGITTAL_FLAT25SU,
190 : SAGITTAL_SHARP25SD,
191 : SAGITTAL_FLAT7CU,
192 : SAGITTAL_SHARP7CD,
193 : SAGITTAL_FLAT5CU,
194 : SAGITTAL_SHARP5CD,
195 : SAGITTAL_FLAT5V7KU,
196 : SAGITTAL_SHARP5V7KD,
197 : SAGITTAL_FLAT,
198 : SAGITTAL_SHARP,
199 :
200 : // Turkish folk music
201 : ONE_COMMA_FLAT,
202 : ONE_COMMA_SHARP,
203 : TWO_COMMA_FLAT,
204 : TWO_COMMA_SHARP,
205 : THREE_COMMA_FLAT,
206 : THREE_COMMA_SHARP,
207 : FOUR_COMMA_FLAT,
208 : //FOUR_COMMA_SHARP,
209 : FIVE_COMMA_SHARP,
210 :
211 : END
212 : ///\}
213 : };
214 :
215 : //---------------------------------------------------------
216 : // AccidentalBracket
217 : //---------------------------------------------------------
218 :
219 : enum class AccidentalBracket : char {
220 : NONE,
221 : PARENTHESIS,
222 : BRACKET,
223 : BRACE, //! Deprecated; removed from the UI and kept here only for compatibility purposes
224 : };
225 :
226 : //---------------------------------------------------------
227 : // @@ Accidental
228 : // @P role enum (Accidental.AUTO, .USER) (read only)
229 : // @P isSmall bool
230 : //---------------------------------------------------------
231 :
232 : class Accidental final : public EngravingItem
233 : {
234 9807 : OBJECT_ALLOCATOR(engraving, Accidental)
235 2376 : DECLARE_CLASSOF(ElementType::ACCIDENTAL)
236 :
237 : public:
238 :
239 115 : Accidental* clone() const override { return new Accidental(*this); }
240 :
241 : Note* note() const;
242 :
243 : TranslatableString subtypeUserName() const override;
244 : void setSubtype(const AsciiStringView& s);
245 0 : int subtype() const override { return (int)m_accidentalType; }
246 :
247 : void setAccidentalType(AccidentalType t);
248 419024 : AccidentalType accidentalType() const { return m_accidentalType; }
249 :
250 2080 : void setRole(AccidentalRole r) { m_role = r; }
251 4607 : AccidentalRole role() const { return m_role; }
252 :
253 61720 : AccidentalBracket bracket() const { return m_bracket; }
254 1911 : void setBracket(AccidentalBracket val) { m_bracket = val; }
255 : bool parentNoteHasParentheses() const;
256 :
257 4180 : bool isSmall() const { return m_isSmall; }
258 260 : void setSmall(bool val) { m_isSmall = val; }
259 :
260 : SymId symId() const;
261 :
262 : bool acceptDrop(EditData&) const override;
263 : EngravingItem* drop(Transaction& tx, EditData&) override;
264 :
265 0 : bool isEditable() const override { return true; }
266 0 : void startEdit(EditData&) override { setGenerated(false); }
267 :
268 : PropertyValue getProperty(Pid propertyId) const override;
269 : bool setProperty(Pid propertyId, const PropertyValue&) override;
270 : PropertyValue propertyDefault(Pid propertyId) const override;
271 :
272 : static AccidentalVal subtype2value(AccidentalType); // return effective pitch offset
273 : static SymId subtype2symbol(AccidentalType);
274 : static AsciiStringView subtype2name(AccidentalType);
275 : static AccidentalType value2subtype(AccidentalVal);
276 : static AccidentalType value2MicrotonalSubtype(AccidentalVal val, int quarterOff);
277 : static AccidentalType name2subtype(const AsciiStringView&);
278 5583 : static bool isMicrotonal(AccidentalType t) { return t > AccidentalType::FLAT3; }
279 : static double subtype2centOffset(AccidentalType);
280 : static AccidentalType centOffset2Subtype(double centOffset);
281 :
282 7518 : int stackingOrder() const { return ldata()->stackingNumber + m_stackingOrderOffset; }
283 :
284 : int line() const;
285 :
286 : String accessibleInfo() const override;
287 :
288 : void computeMag();
289 :
290 : struct LayoutData : public EngravingItem::LayoutData {
291 : struct Sym {
292 : SymId sym;
293 : double x;
294 : double y;
295 4105 : Sym(SymId _sym, double _x, double _y)
296 4105 : : sym(_sym), x(_x), y(_y) {}
297 : };
298 :
299 : std::vector<Sym> syms;
300 :
301 : ld_field<int> stackingNumber = { "[Accidental] stackingNumber", 0 };
302 : ld_field<int> verticalSubgroup = { "[Accidental] verticalSubgroup", 0 };
303 : ld_field<int> column = { "[Accidental] column", 0 };
304 : ld_field<std::vector<Accidental*> > octaves = { "[Accidental] octaves", std::vector<Accidental*> {} };
305 : ld_field<std::vector<Accidental*> > seconds = { "[Accidental] seconds", std::vector<Accidental*> {} };
306 :
307 4086 : bool isValid() const override { return EngravingItem::LayoutData::isValid() && !syms.empty(); }
308 : };
309 102481 : DECLARE_LAYOUTDATA_METHODS(Accidental)
310 :
311 2618 : int stackingOrderOffset() const { return m_stackingOrderOffset; }
312 0 : void setStackingOrderOffset(int v) { m_stackingOrderOffset = v; }
313 :
314 : private:
315 :
316 : friend class Factory;
317 :
318 : Accidental(DummyParentOr<EngravingItem> parent);
319 :
320 : AccidentalType m_accidentalType = AccidentalType::NONE;
321 : AccidentalBracket m_bracket = AccidentalBracket::NONE;
322 : AccidentalRole m_role = AccidentalRole::AUTO;
323 : bool m_isSmall = false;
324 : int m_stackingOrderOffset = 0;
325 : };
326 :
327 : extern AccidentalVal sym2accidentalVal(SymId id);
328 : }
329 :
330 : #ifndef NO_QT_SUPPORT
331 0 : Q_DECLARE_METATYPE(mu::engraving::AccidentalType)
332 : #endif
|