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 : #include "drumset.h"
24 :
25 : #include "translation.h"
26 :
27 : #include "types/typesconv.h"
28 : #include "types/symnames.h"
29 :
30 : #include "rw/xmlwriter.h"
31 : #include "rw/xmlreader.h"
32 :
33 : #include "articulation.h"
34 :
35 : #include "log.h"
36 :
37 : using namespace mu;
38 : using namespace mu::engraving;
39 :
40 : namespace mu::engraving {
41 : Drumset* smDrumset = nullptr; // standard midi drumset
42 :
43 10881 : bool Drumset::isValid(int pitch) const
44 : {
45 10881 : return pitch >= 0 && pitch < DRUM_INSTRUMENTS && !m_drums[pitch].name.empty();
46 : }
47 :
48 0 : String Drumset::translatedName(int pitch) const
49 : {
50 0 : return muse::mtrc("engraving/drumset", name(pitch));
51 : }
52 :
53 0 : int Drumset::pitchForShortcut(const String& shortcut) const
54 : {
55 0 : if (shortcut.isEmpty()) {
56 0 : return -1;
57 : }
58 :
59 0 : for (int pitch = 0; pitch < DRUM_INSTRUMENTS; ++pitch) {
60 0 : if (!isValid(pitch)) {
61 0 : continue;
62 : }
63 :
64 0 : if (drum(pitch).shortcut != shortcut) {
65 0 : continue;
66 : }
67 :
68 0 : return pitch;
69 : }
70 :
71 0 : return -1;
72 : }
73 :
74 0 : int Drumset::defaultPitchForLine(int val) const
75 : {
76 0 : int firstValidPitch = -1;
77 0 : for (int pitch = 0; pitch < DRUM_INSTRUMENTS; ++pitch) {
78 0 : if (!isValid(pitch) || line(pitch) != val) {
79 0 : continue;
80 : }
81 :
82 0 : if (firstValidPitch < 0) {
83 0 : firstValidPitch = pitch;
84 : }
85 :
86 0 : const NoteHeadGroup headGroup = noteHead(pitch);
87 0 : if (headGroup == NoteHeadGroup::HEAD_NORMAL) {
88 0 : return pitch;
89 : }
90 : }
91 0 : return firstValidPitch;
92 : }
93 :
94 : //---------------------------------------------------------
95 : // save
96 : //---------------------------------------------------------
97 :
98 39 : void Drumset::save(XmlWriter& xml) const
99 : {
100 39 : xml.tag("percussionPanelColumns", m_percussionPanelColumns);
101 5031 : for (int i = 0; i < DRUM_INSTRUMENTS; ++i) {
102 4992 : if (!isValid(i)) {
103 3984 : continue;
104 : }
105 3024 : xml.startElement("Drum", { { "pitch", i } });
106 1008 : const NoteHeadGroup nh = noteHead(i);
107 : //write custom as Normal notehead group + noteheads tag to keep compatibility with 2.X versions
108 1008 : const NoteHeadGroup saveNHValue = (nh == NoteHeadGroup::HEAD_CUSTOM) ? NoteHeadGroup::HEAD_NORMAL : nh;
109 1008 : xml.tag("head", TConv::toXml(saveNHValue));
110 1008 : if (nh == NoteHeadGroup::HEAD_CUSTOM) {
111 23 : xml.startElement("noteheads");
112 115 : for (int j = 0; j < int(NoteHeadType::HEAD_TYPES); j++) {
113 92 : xml.tag(TConv::toXml(NoteHeadType(j)), SymNames::nameForSymId(noteHeads(i, NoteHeadType(j))));
114 : }
115 23 : xml.endElement();
116 : }
117 1008 : xml.tag("line", line(i));
118 1008 : xml.tag("voice", voice(i));
119 1008 : xml.tag("name", name(i));
120 1008 : xml.tag("stem", int(stemDirection(i)));
121 1008 : if (!shortcut(i).empty()) {
122 146 : xml.tag("shortcut", shortcut(i));
123 : }
124 1008 : const std::vector<DrumInstrumentVariant>& vs = variants(i);
125 1008 : if (!vs.empty()) {
126 0 : xml.startElement("variants");
127 0 : for (const auto& v : vs) {
128 0 : xml.startElement("variant", { { "pitch", v.pitch } });
129 0 : if (!v.articulationName.empty()) {
130 0 : xml.tag("articulation", v.articulationName);
131 : }
132 0 : if (v.tremolo != TremoloType::INVALID_TREMOLO) {
133 0 : xml.tag("tremolo", TConv::toXml(v.tremolo));
134 : }
135 0 : xml.endElement();
136 : }
137 0 : xml.endElement();
138 : }
139 1008 : if (panelRow(i) > -1 && panelColumn(i) > -1) {
140 459 : xml.tag("panelRow", panelRow(i));
141 459 : xml.tag("panelColumn", panelColumn(i));
142 : }
143 1008 : xml.endElement();
144 : }
145 1047 : }
146 :
147 58392 : bool Drumset::readDrumProperties(XmlReader& e, int pitch)
148 : {
149 58392 : if (pitch < 0 || pitch > DRUM_INSTRUMENTS - 1) {
150 0 : return false;
151 : }
152 :
153 58392 : const AsciiStringView tag(e.name());
154 58392 : if (tag == "head") {
155 8938 : m_drums[pitch].notehead = TConv::fromXml(e.readAsciiText(), NoteHeadGroup::HEAD_NORMAL);
156 49454 : } else if (tag == "noteheads") {
157 145 : m_drums[pitch].notehead = NoteHeadGroup::HEAD_CUSTOM;
158 725 : while (e.readNextStartElement()) {
159 580 : const AsciiStringView nhTag(e.name());
160 580 : int noteType = int(TConv::fromXml(nhTag, NoteHeadType::HEAD_AUTO));
161 580 : if (noteType > int(NoteHeadType::HEAD_TYPES) - 1 || noteType < 0) {
162 0 : return false;
163 : }
164 :
165 580 : m_drums[pitch].noteheads[noteType] = SymNames::symIdByName(e.readAsciiText());
166 : }
167 49309 : } else if (tag == "line") {
168 9032 : m_drums[pitch].line = e.readInt();
169 40277 : } else if (tag == "voice") {
170 9032 : m_drums[pitch].voice = e.readInt();
171 31245 : } else if (tag == "name") {
172 9032 : m_drums[pitch].name = e.readText();
173 22213 : } else if (tag == "stem") {
174 8648 : m_drums[pitch].stemDirection = DirectionV(e.readInt());
175 13565 : } else if (tag == "shortcut") {
176 4335 : m_drums[pitch].shortcut = e.readText();
177 9230 : } else if (tag == "variants") {
178 0 : while (e.readNextStartElement()) {
179 0 : const AsciiStringView tagv(e.name());
180 0 : if (tagv == "variant") {
181 0 : DrumInstrumentVariant div;
182 0 : div.pitch = e.attribute("pitch").toInt();
183 0 : while (e.readNextStartElement()) {
184 0 : const AsciiStringView taga(e.name());
185 0 : if (taga == "articulation") {
186 0 : div.articulationName = e.readText();
187 0 : } else if (taga == "tremolo") {
188 0 : div.tremolo = TConv::fromXml(e.readAsciiText(), TremoloType::INVALID_TREMOLO);
189 : }
190 : }
191 0 : m_drums[pitch].addVariant(div);
192 0 : }
193 : }
194 9230 : } else if (tag == "panelRow") {
195 4615 : m_drums[pitch].panelRow = e.readInt();
196 4615 : } else if (tag == "panelColumn") {
197 4615 : m_drums[pitch].panelColumn = e.readInt();
198 : } else {
199 0 : return false;
200 : }
201 58392 : return true;
202 : }
203 :
204 : //---------------------------------------------------------
205 : // load
206 : //---------------------------------------------------------
207 :
208 8938 : void Drumset::loadDrum(XmlReader& e)
209 : {
210 8938 : int pitch = e.intAttribute("pitch", -1);
211 8938 : if (pitch < 0 || pitch > DRUM_INSTRUMENTS - 1) {
212 0 : LOGD("load drumset: invalid pitch %d", pitch);
213 0 : return;
214 : }
215 75883 : while (e.readNextStartElement()) {
216 58007 : if (readDrumProperties(e, pitch)) {
217 : } else {
218 0 : e.unknown();
219 : }
220 : }
221 : }
222 :
223 : //---------------------------------------------------------
224 : // clear
225 : //---------------------------------------------------------
226 :
227 1904 : void Drumset::clear()
228 : {
229 245616 : for (int i = 0; i < DRUM_INSTRUMENTS; ++i) {
230 243712 : m_drums[i].name.clear();
231 243712 : m_drums[i].notehead = NoteHeadGroup::HEAD_INVALID;
232 243712 : m_drums[i].shortcut.clear();
233 243712 : m_drums[i].variants.clear();
234 243712 : m_drums[i].panelRow = -1;
235 243712 : m_drums[i].panelColumn = -1;
236 : }
237 1904 : }
238 :
239 : //---------------------------------------------------------
240 : // nextPitch
241 : //---------------------------------------------------------
242 :
243 702 : int Drumset::nextPitch(int ii) const
244 : {
245 2967 : for (int i = ii + 1; i < DRUM_INSTRUMENTS - 1; ++i) {
246 2965 : if (isValid(i)) {
247 700 : return i;
248 : }
249 : }
250 72 : for (int i = 0; i <= ii; ++i) {
251 72 : if (isValid(i)) {
252 2 : return i;
253 : }
254 : }
255 0 : return 0;
256 : }
257 :
258 : //---------------------------------------------------------
259 : // prevPitch
260 : //---------------------------------------------------------
261 :
262 0 : int Drumset::prevPitch(int ii) const
263 : {
264 0 : for (int i = ii - 1; i >= 0; --i) {
265 0 : if (isValid(i)) {
266 0 : return i;
267 : }
268 : }
269 0 : for (int i = DRUM_INSTRUMENTS - 1; i >= ii; --i) {
270 0 : if (isValid(i)) {
271 0 : return i;
272 : }
273 : }
274 0 : return 0;
275 : }
276 :
277 : //---------------------------------------------------------
278 : // findVariant
279 : /// find a variant for the given pitch with matching chord articulation and tremolo
280 : //---------------------------------------------------------
281 :
282 105 : DrumInstrumentVariant Drumset::findVariant(int p, const std::vector<Articulation*>& articulations, TremoloType tremType) const
283 : {
284 105 : DrumInstrumentVariant div;
285 105 : const std::vector<DrumInstrumentVariant>& vs = variants(p);
286 105 : for (const DrumInstrumentVariant& v : vs) {
287 0 : bool matchTremolo = ((tremType == TremoloType::INVALID_TREMOLO) && (v.tremolo == TremoloType::INVALID_TREMOLO))
288 0 : || (v.tremolo == tremType);
289 0 : bool matchArticulation = v.articulationName.empty() && articulations.empty();
290 0 : for (const Articulation* a : articulations) {
291 0 : matchArticulation = a->articulationName() == v.articulationName;
292 0 : if (!matchArticulation) {
293 0 : break;
294 : }
295 : }
296 0 : if (matchArticulation && matchTremolo) {
297 0 : div = v;
298 0 : break;
299 : }
300 : }
301 105 : return div;
302 0 : }
303 :
304 : //---------------------------------------------------------
305 : // initDrumset
306 : // initialize standard midi drumset
307 : //---------------------------------------------------------
308 :
309 16 : void Drumset::initDrumset()
310 : {
311 16 : smDrumset = new Drumset;
312 2064 : for (int i = 0; i < DRUM_INSTRUMENTS; ++i) {
313 2048 : smDrumset->drum(i).name.clear();
314 2048 : smDrumset->drum(i).notehead = NoteHeadGroup::HEAD_INVALID;
315 2048 : smDrumset->drum(i).line = 0;
316 2048 : smDrumset->drum(i).shortcut.clear();
317 2048 : smDrumset->drum(i).voice = 0;
318 2048 : smDrumset->drum(i).stemDirection = DirectionV::UP;
319 2048 : smDrumset->drum(i).panelRow = -1;
320 2048 : smDrumset->drum(i).panelColumn = -1;
321 : }
322 :
323 : // Code generated by share/instruments/update_instruments_xml.py. To edit this code:
324 : // 1. Make your changes in the proper place:
325 : // * To change instrument data, edit the online spreadsheet.
326 : // * For other code changes, edit the Python script.
327 : // 2. Run the Python script to generate the changes here.
328 : // 3. Run Uncrustify and update the Python script if necessary to match Uncrustify's formatting.
329 :
330 : // BEGIN GENERATED CODE
331 :
332 : // Laser (High Q)
333 32 : smDrumset->drum(27) = DrumInstrument(
334 : TConv::userName(DrumNum(27)),
335 : NoteHeadGroup::HEAD_SLASH,
336 : /*line*/ 8,
337 : DirectionV::UP,
338 : /*panelRow*/ 0,
339 : /*panelColumn*/ 0,
340 : /*voice*/ 0,
341 48 : /*shortcut*/ String());
342 :
343 : // Slap
344 32 : smDrumset->drum(28) = DrumInstrument(
345 : TConv::userName(DrumNum(28)),
346 : NoteHeadGroup::HEAD_CUSTOM,
347 : /*line*/ 4,
348 : DirectionV::UP,
349 : /*panelRow*/ 0,
350 : /*panelColumn*/ 1,
351 : /*voice*/ 0,
352 48 : /*shortcut*/ String());
353 :
354 16 : smDrumset->drum(28).noteheads[static_cast<int>(NoteHeadType::HEAD_WHOLE)] = SymNames::symIdByName("noteheadSlashX");
355 16 : smDrumset->drum(28).noteheads[static_cast<int>(NoteHeadType::HEAD_HALF)] = SymNames::symIdByName("noteheadSlashX");
356 16 : smDrumset->drum(28).noteheads[static_cast<int>(NoteHeadType::HEAD_QUARTER)] = SymNames::symIdByName("noteheadSlashX");
357 16 : smDrumset->drum(28).noteheads[static_cast<int>(NoteHeadType::HEAD_BREVIS)] = SymNames::symIdByName("noteheadSlashX");
358 :
359 : // Scratch Push
360 32 : smDrumset->drum(29) = DrumInstrument(
361 : TConv::userName(DrumNum(29)),
362 : NoteHeadGroup::HEAD_SLASH,
363 : /*line*/ 6,
364 : DirectionV::UP,
365 : /*panelRow*/ 0,
366 : /*panelColumn*/ 2,
367 : /*voice*/ 0,
368 48 : /*shortcut*/ String());
369 :
370 : // Scratch Pull
371 32 : smDrumset->drum(30) = DrumInstrument(
372 : TConv::userName(DrumNum(30)),
373 : NoteHeadGroup::HEAD_SLASH,
374 : /*line*/ 6,
375 : DirectionV::UP,
376 : /*panelRow*/ 0,
377 : /*panelColumn*/ 3,
378 : /*voice*/ 0,
379 48 : /*shortcut*/ String());
380 :
381 : // Sticks
382 32 : smDrumset->drum(31) = DrumInstrument(
383 : TConv::userName(DrumNum(31)),
384 : NoteHeadGroup::HEAD_PLUS,
385 : /*line*/ -1,
386 : DirectionV::UP,
387 : /*panelRow*/ 0,
388 : /*panelColumn*/ 4,
389 : /*voice*/ 0,
390 48 : /*shortcut*/ String());
391 :
392 : // Square Click
393 32 : smDrumset->drum(32) = DrumInstrument(
394 : TConv::userName(DrumNum(32)),
395 : NoteHeadGroup::HEAD_PLUS,
396 : /*line*/ 10,
397 : DirectionV::UP,
398 : /*panelRow*/ 0,
399 : /*panelColumn*/ 5,
400 : /*voice*/ 0,
401 48 : /*shortcut*/ String());
402 :
403 : // Metronome Click
404 32 : smDrumset->drum(33) = DrumInstrument(
405 : TConv::userName(DrumNum(33)),
406 : NoteHeadGroup::HEAD_CROSS,
407 : /*line*/ 10,
408 : DirectionV::UP,
409 : /*panelRow*/ 0,
410 : /*panelColumn*/ 6,
411 : /*voice*/ 0,
412 48 : /*shortcut*/ String());
413 :
414 : // Metronome Bell
415 32 : smDrumset->drum(34) = DrumInstrument(
416 : TConv::userName(DrumNum(34)),
417 : NoteHeadGroup::HEAD_TRIANGLE_UP,
418 : /*line*/ 10,
419 : DirectionV::UP,
420 : /*panelRow*/ 0,
421 : /*panelColumn*/ 7,
422 : /*voice*/ 0,
423 48 : /*shortcut*/ String());
424 :
425 : // Acoustic Bass Drum
426 32 : smDrumset->drum(35) = DrumInstrument(
427 : TConv::userName(DrumNum(35)),
428 : NoteHeadGroup::HEAD_NORMAL,
429 : /*line*/ 8,
430 : DirectionV::UP,
431 : /*panelRow*/ 1,
432 : /*panelColumn*/ 0,
433 : /*voice*/ 1,
434 48 : /*shortcut*/ String());
435 :
436 : // Electric Bass Drum
437 32 : smDrumset->drum(36) = DrumInstrument(
438 : TConv::userName(DrumNum(36)),
439 : NoteHeadGroup::HEAD_NORMAL,
440 : /*line*/ 7,
441 : DirectionV::DOWN,
442 : /*panelRow*/ 1,
443 : /*panelColumn*/ 1,
444 : /*voice*/ 1,
445 48 : /*shortcut*/ String());
446 :
447 : // Side Stick
448 32 : smDrumset->drum(37) = DrumInstrument(
449 : TConv::userName(DrumNum(37)),
450 : NoteHeadGroup::HEAD_SLASHED1,
451 : /*line*/ 3,
452 : DirectionV::UP,
453 : /*panelRow*/ 1,
454 : /*panelColumn*/ 2,
455 : /*voice*/ 0,
456 48 : /*shortcut*/ String());
457 :
458 : // Acoustic Snare
459 32 : smDrumset->drum(38) = DrumInstrument(
460 : TConv::userName(DrumNum(38)),
461 : NoteHeadGroup::HEAD_NORMAL,
462 : /*line*/ 3,
463 : DirectionV::UP,
464 : /*panelRow*/ 1,
465 : /*panelColumn*/ 3,
466 : /*voice*/ 0,
467 48 : /*shortcut*/ String());
468 :
469 : // Hand Clap
470 32 : smDrumset->drum(39) = DrumInstrument(
471 : TConv::userName(DrumNum(39)),
472 : NoteHeadGroup::HEAD_PLUS,
473 : /*line*/ -2,
474 : DirectionV::UP,
475 : /*panelRow*/ 1,
476 : /*panelColumn*/ 4,
477 : /*voice*/ 0,
478 48 : /*shortcut*/ String());
479 :
480 : // Electric Snare
481 32 : smDrumset->drum(40) = DrumInstrument(
482 : TConv::userName(DrumNum(40)),
483 : NoteHeadGroup::HEAD_SLASH,
484 : /*line*/ 3,
485 : DirectionV::UP,
486 : /*panelRow*/ 1,
487 : /*panelColumn*/ 5,
488 : /*voice*/ 0,
489 48 : /*shortcut*/ String());
490 :
491 : // Low Floor Tom
492 32 : smDrumset->drum(41) = DrumInstrument(
493 : TConv::userName(DrumNum(41)),
494 : NoteHeadGroup::HEAD_NORMAL,
495 : /*line*/ 6,
496 : DirectionV::UP,
497 : /*panelRow*/ 1,
498 : /*panelColumn*/ 6,
499 : /*voice*/ 0,
500 48 : /*shortcut*/ String());
501 :
502 : // Closed Hi-hat
503 32 : smDrumset->drum(42) = DrumInstrument(
504 : TConv::userName(DrumNum(42)),
505 : NoteHeadGroup::HEAD_CROSS,
506 : /*line*/ -1,
507 : DirectionV::UP,
508 : /*panelRow*/ 1,
509 : /*panelColumn*/ 7,
510 : /*voice*/ 0,
511 48 : /*shortcut*/ String());
512 :
513 : // High Floor Tom
514 32 : smDrumset->drum(43) = DrumInstrument(
515 : TConv::userName(DrumNum(43)),
516 : NoteHeadGroup::HEAD_NORMAL,
517 : /*line*/ 5,
518 : DirectionV::UP,
519 : /*panelRow*/ 2,
520 : /*panelColumn*/ 0,
521 : /*voice*/ 0,
522 48 : /*shortcut*/ String());
523 :
524 : // Pedal Hi-hat
525 32 : smDrumset->drum(44) = DrumInstrument(
526 : TConv::userName(DrumNum(44)),
527 : NoteHeadGroup::HEAD_CROSS,
528 : /*line*/ 9,
529 : DirectionV::UP,
530 : /*panelRow*/ 2,
531 : /*panelColumn*/ 1,
532 : /*voice*/ 1,
533 48 : /*shortcut*/ String());
534 :
535 : // Low Tom
536 32 : smDrumset->drum(45) = DrumInstrument(
537 : TConv::userName(DrumNum(45)),
538 : NoteHeadGroup::HEAD_NORMAL,
539 : /*line*/ 4,
540 : DirectionV::UP,
541 : /*panelRow*/ 2,
542 : /*panelColumn*/ 2,
543 : /*voice*/ 0,
544 48 : /*shortcut*/ String());
545 :
546 : // Open Hi-hat
547 32 : smDrumset->drum(46) = DrumInstrument(
548 : TConv::userName(DrumNum(46)),
549 : NoteHeadGroup::HEAD_XCIRCLE,
550 : /*line*/ -1,
551 : DirectionV::UP,
552 : /*panelRow*/ 2,
553 : /*panelColumn*/ 3,
554 : /*voice*/ 0,
555 48 : /*shortcut*/ String());
556 :
557 : // Low-Mid Tom
558 32 : smDrumset->drum(47) = DrumInstrument(
559 : TConv::userName(DrumNum(47)),
560 : NoteHeadGroup::HEAD_NORMAL,
561 : /*line*/ 2,
562 : DirectionV::UP,
563 : /*panelRow*/ 2,
564 : /*panelColumn*/ 4,
565 : /*voice*/ 0,
566 48 : /*shortcut*/ String());
567 :
568 : // Hi-Mid Tom
569 32 : smDrumset->drum(48) = DrumInstrument(
570 : TConv::userName(DrumNum(48)),
571 : NoteHeadGroup::HEAD_NORMAL,
572 : /*line*/ 1,
573 : DirectionV::UP,
574 : /*panelRow*/ 2,
575 : /*panelColumn*/ 5,
576 : /*voice*/ 0,
577 48 : /*shortcut*/ String());
578 :
579 : // Crash Cymbal 1
580 32 : smDrumset->drum(49) = DrumInstrument(
581 : TConv::userName(DrumNum(49)),
582 : NoteHeadGroup::HEAD_CROSS,
583 : /*line*/ -2,
584 : DirectionV::UP,
585 : /*panelRow*/ 2,
586 : /*panelColumn*/ 6,
587 : /*voice*/ 0,
588 48 : /*shortcut*/ String());
589 :
590 : // High Tom
591 32 : smDrumset->drum(50) = DrumInstrument(
592 : TConv::userName(DrumNum(50)),
593 : NoteHeadGroup::HEAD_NORMAL,
594 : /*line*/ 0,
595 : DirectionV::UP,
596 : /*panelRow*/ 2,
597 : /*panelColumn*/ 7,
598 : /*voice*/ 0,
599 48 : /*shortcut*/ String());
600 :
601 : // Ride Cymbal 1
602 32 : smDrumset->drum(51) = DrumInstrument(
603 : TConv::userName(DrumNum(51)),
604 : NoteHeadGroup::HEAD_CROSS,
605 : /*line*/ 0,
606 : DirectionV::UP,
607 : /*panelRow*/ 3,
608 : /*panelColumn*/ 0,
609 : /*voice*/ 0,
610 48 : /*shortcut*/ String());
611 :
612 : // China Cymbal
613 32 : smDrumset->drum(52) = DrumInstrument(
614 : TConv::userName(DrumNum(52)),
615 : NoteHeadGroup::HEAD_CUSTOM,
616 : /*line*/ -3,
617 : DirectionV::UP,
618 : /*panelRow*/ 3,
619 : /*panelColumn*/ 1,
620 : /*voice*/ 0,
621 48 : /*shortcut*/ String());
622 :
623 16 : smDrumset->drum(52).noteheads[static_cast<int>(NoteHeadType::HEAD_WHOLE)] = SymNames::symIdByName("noteheadHeavyXHat");
624 16 : smDrumset->drum(52).noteheads[static_cast<int>(NoteHeadType::HEAD_HALF)] = SymNames::symIdByName("noteheadHeavyXHat");
625 16 : smDrumset->drum(52).noteheads[static_cast<int>(NoteHeadType::HEAD_QUARTER)] = SymNames::symIdByName("noteheadHeavyXHat");
626 16 : smDrumset->drum(52).noteheads[static_cast<int>(NoteHeadType::HEAD_BREVIS)] = SymNames::symIdByName("noteheadHeavyXHat");
627 :
628 : // Ride Bell
629 32 : smDrumset->drum(53) = DrumInstrument(
630 : TConv::userName(DrumNum(53)),
631 : NoteHeadGroup::HEAD_DIAMOND,
632 : /*line*/ 0,
633 : DirectionV::UP,
634 : /*panelRow*/ 3,
635 : /*panelColumn*/ 2,
636 : /*voice*/ 0,
637 48 : /*shortcut*/ String());
638 :
639 : // Tambourine
640 32 : smDrumset->drum(54) = DrumInstrument(
641 : TConv::userName(DrumNum(54)),
642 : NoteHeadGroup::HEAD_DIAMOND,
643 : /*line*/ 6,
644 : DirectionV::UP,
645 : /*panelRow*/ 3,
646 : /*panelColumn*/ 3,
647 : /*voice*/ 0,
648 48 : /*shortcut*/ String());
649 :
650 : // Splash Cymbal
651 32 : smDrumset->drum(55) = DrumInstrument(
652 : TConv::userName(DrumNum(55)),
653 : NoteHeadGroup::HEAD_CROSS,
654 : /*line*/ -4,
655 : DirectionV::UP,
656 : /*panelRow*/ 3,
657 : /*panelColumn*/ 4,
658 : /*voice*/ 0,
659 48 : /*shortcut*/ String());
660 :
661 : // Cowbell
662 32 : smDrumset->drum(56) = DrumInstrument(
663 : TConv::userName(DrumNum(56)),
664 : NoteHeadGroup::HEAD_TRIANGLE_DOWN,
665 : /*line*/ 0,
666 : DirectionV::UP,
667 : /*panelRow*/ 3,
668 : /*panelColumn*/ 5,
669 : /*voice*/ 0,
670 48 : /*shortcut*/ String());
671 :
672 : // Crash Cymbal 2
673 32 : smDrumset->drum(57) = DrumInstrument(
674 : TConv::userName(DrumNum(57)),
675 : NoteHeadGroup::HEAD_CROSS,
676 : /*line*/ -3,
677 : DirectionV::UP,
678 : /*panelRow*/ 3,
679 : /*panelColumn*/ 6,
680 : /*voice*/ 0,
681 48 : /*shortcut*/ String());
682 :
683 : // Vibraslap
684 32 : smDrumset->drum(58) = DrumInstrument(
685 : TConv::userName(DrumNum(58)),
686 : NoteHeadGroup::HEAD_TI,
687 : /*line*/ 0,
688 : DirectionV::UP,
689 : /*panelRow*/ 3,
690 : /*panelColumn*/ 7,
691 : /*voice*/ 0,
692 48 : /*shortcut*/ String());
693 :
694 : // Ride Cymbal 2
695 32 : smDrumset->drum(59) = DrumInstrument(
696 : TConv::userName(DrumNum(59)),
697 : NoteHeadGroup::HEAD_CROSS,
698 : /*line*/ 2,
699 : DirectionV::UP,
700 : /*panelRow*/ 4,
701 : /*panelColumn*/ 0,
702 : /*voice*/ 0,
703 48 : /*shortcut*/ String());
704 :
705 : // High Bongo
706 32 : smDrumset->drum(60) = DrumInstrument(
707 : TConv::userName(DrumNum(60)),
708 : NoteHeadGroup::HEAD_NORMAL,
709 : /*line*/ -1,
710 : DirectionV::UP,
711 : /*panelRow*/ 4,
712 : /*panelColumn*/ 1,
713 : /*voice*/ 0,
714 48 : /*shortcut*/ String());
715 :
716 : // Low Bongo
717 32 : smDrumset->drum(61) = DrumInstrument(
718 : TConv::userName(DrumNum(61)),
719 : NoteHeadGroup::HEAD_NORMAL,
720 : /*line*/ 0,
721 : DirectionV::UP,
722 : /*panelRow*/ 4,
723 : /*panelColumn*/ 2,
724 : /*voice*/ 0,
725 48 : /*shortcut*/ String());
726 :
727 : // Mute High Conga
728 32 : smDrumset->drum(62) = DrumInstrument(
729 : TConv::userName(DrumNum(62)),
730 : NoteHeadGroup::HEAD_CUSTOM,
731 : /*line*/ 1,
732 : DirectionV::UP,
733 : /*panelRow*/ 4,
734 : /*panelColumn*/ 3,
735 : /*voice*/ 0,
736 48 : /*shortcut*/ String());
737 :
738 16 : smDrumset->drum(62).noteheads[static_cast<int>(NoteHeadType::HEAD_WHOLE)] = SymNames::symIdByName("noteheadXOrnate");
739 16 : smDrumset->drum(62).noteheads[static_cast<int>(NoteHeadType::HEAD_HALF)] = SymNames::symIdByName("noteheadXOrnate");
740 16 : smDrumset->drum(62).noteheads[static_cast<int>(NoteHeadType::HEAD_QUARTER)] = SymNames::symIdByName("noteheadXOrnate");
741 16 : smDrumset->drum(62).noteheads[static_cast<int>(NoteHeadType::HEAD_BREVIS)] = SymNames::symIdByName("noteheadXOrnate");
742 :
743 : // Open High Conga
744 32 : smDrumset->drum(63) = DrumInstrument(
745 : TConv::userName(DrumNum(63)),
746 : NoteHeadGroup::HEAD_NORMAL,
747 : /*line*/ 1,
748 : DirectionV::UP,
749 : /*panelRow*/ 4,
750 : /*panelColumn*/ 4,
751 : /*voice*/ 0,
752 48 : /*shortcut*/ String());
753 :
754 : // Low Conga
755 32 : smDrumset->drum(64) = DrumInstrument(
756 : TConv::userName(DrumNum(64)),
757 : NoteHeadGroup::HEAD_NORMAL,
758 : /*line*/ 2,
759 : DirectionV::UP,
760 : /*panelRow*/ 4,
761 : /*panelColumn*/ 5,
762 : /*voice*/ 0,
763 48 : /*shortcut*/ String());
764 :
765 : // High Timbale
766 32 : smDrumset->drum(65) = DrumInstrument(
767 : TConv::userName(DrumNum(65)),
768 : NoteHeadGroup::HEAD_NORMAL,
769 : /*line*/ 5,
770 : DirectionV::UP,
771 : /*panelRow*/ 4,
772 : /*panelColumn*/ 6,
773 : /*voice*/ 0,
774 48 : /*shortcut*/ String());
775 :
776 : // Low Timbale
777 32 : smDrumset->drum(66) = DrumInstrument(
778 : TConv::userName(DrumNum(66)),
779 : NoteHeadGroup::HEAD_NORMAL,
780 : /*line*/ 7,
781 : DirectionV::UP,
782 : /*panelRow*/ 4,
783 : /*panelColumn*/ 7,
784 : /*voice*/ 0,
785 48 : /*shortcut*/ String());
786 :
787 : // High Agogô
788 32 : smDrumset->drum(67) = DrumInstrument(
789 : TConv::userName(DrumNum(67)),
790 : NoteHeadGroup::HEAD_TRIANGLE_DOWN,
791 : /*line*/ -2,
792 : DirectionV::UP,
793 : /*panelRow*/ 5,
794 : /*panelColumn*/ 0,
795 : /*voice*/ 0,
796 48 : /*shortcut*/ String());
797 :
798 : // Low Agogô
799 32 : smDrumset->drum(68) = DrumInstrument(
800 : TConv::userName(DrumNum(68)),
801 : NoteHeadGroup::HEAD_TRIANGLE_DOWN,
802 : /*line*/ -1,
803 : DirectionV::UP,
804 : /*panelRow*/ 5,
805 : /*panelColumn*/ 1,
806 : /*voice*/ 0,
807 48 : /*shortcut*/ String());
808 :
809 : // Cabasa
810 32 : smDrumset->drum(69) = DrumInstrument(
811 : TConv::userName(DrumNum(69)),
812 : NoteHeadGroup::HEAD_DIAMOND,
813 : /*line*/ 2,
814 : DirectionV::UP,
815 : /*panelRow*/ 5,
816 : /*panelColumn*/ 2,
817 : /*voice*/ 0,
818 48 : /*shortcut*/ String());
819 :
820 : // Maracas
821 32 : smDrumset->drum(70) = DrumInstrument(
822 : TConv::userName(DrumNum(70)),
823 : NoteHeadGroup::HEAD_DIAMOND,
824 : /*line*/ 4,
825 : DirectionV::UP,
826 : /*panelRow*/ 5,
827 : /*panelColumn*/ 3,
828 : /*voice*/ 0,
829 48 : /*shortcut*/ String());
830 :
831 : // Short Whistle
832 32 : smDrumset->drum(71) = DrumInstrument(
833 : TConv::userName(DrumNum(71)),
834 : NoteHeadGroup::HEAD_CROSS,
835 : /*line*/ -3,
836 : DirectionV::UP,
837 : /*panelRow*/ 5,
838 : /*panelColumn*/ 4,
839 : /*voice*/ 0,
840 48 : /*shortcut*/ String());
841 :
842 : // Long Whistle
843 32 : smDrumset->drum(72) = DrumInstrument(
844 : TConv::userName(DrumNum(72)),
845 : NoteHeadGroup::HEAD_TI,
846 : /*line*/ -3,
847 : DirectionV::UP,
848 : /*panelRow*/ 5,
849 : /*panelColumn*/ 5,
850 : /*voice*/ 0,
851 48 : /*shortcut*/ String());
852 :
853 : // Short Güiro
854 32 : smDrumset->drum(73) = DrumInstrument(
855 : TConv::userName(DrumNum(73)),
856 : NoteHeadGroup::HEAD_CROSS,
857 : /*line*/ -1,
858 : DirectionV::UP,
859 : /*panelRow*/ 5,
860 : /*panelColumn*/ 6,
861 : /*voice*/ 0,
862 48 : /*shortcut*/ String());
863 :
864 : // Long Güiro
865 32 : smDrumset->drum(74) = DrumInstrument(
866 : TConv::userName(DrumNum(74)),
867 : NoteHeadGroup::HEAD_SLASHED1,
868 : /*line*/ -1,
869 : DirectionV::UP,
870 : /*panelRow*/ 5,
871 : /*panelColumn*/ 7,
872 : /*voice*/ 0,
873 48 : /*shortcut*/ String());
874 :
875 : // Claves
876 32 : smDrumset->drum(75) = DrumInstrument(
877 : TConv::userName(DrumNum(75)),
878 : NoteHeadGroup::HEAD_LA,
879 : /*line*/ 0,
880 : DirectionV::UP,
881 : /*panelRow*/ 6,
882 : /*panelColumn*/ 0,
883 : /*voice*/ 0,
884 48 : /*shortcut*/ String());
885 :
886 : // High Woodblock
887 32 : smDrumset->drum(76) = DrumInstrument(
888 : TConv::userName(DrumNum(76)),
889 : NoteHeadGroup::HEAD_LA,
890 : /*line*/ 5,
891 : DirectionV::UP,
892 : /*panelRow*/ 6,
893 : /*panelColumn*/ 1,
894 : /*voice*/ 0,
895 48 : /*shortcut*/ String());
896 :
897 : // Low Woodblock
898 32 : smDrumset->drum(77) = DrumInstrument(
899 : TConv::userName(DrumNum(77)),
900 : NoteHeadGroup::HEAD_LA,
901 : /*line*/ 7,
902 : DirectionV::UP,
903 : /*panelRow*/ 6,
904 : /*panelColumn*/ 2,
905 : /*voice*/ 0,
906 48 : /*shortcut*/ String());
907 :
908 : // Mute Cuica
909 32 : smDrumset->drum(78) = DrumInstrument(
910 : TConv::userName(DrumNum(78)),
911 : NoteHeadGroup::HEAD_CROSS,
912 : /*line*/ 8,
913 : DirectionV::UP,
914 : /*panelRow*/ 6,
915 : /*panelColumn*/ 3,
916 : /*voice*/ 0,
917 48 : /*shortcut*/ String());
918 :
919 : // Open Cuica
920 32 : smDrumset->drum(79) = DrumInstrument(
921 : TConv::userName(DrumNum(79)),
922 : NoteHeadGroup::HEAD_SLASHED2,
923 : /*line*/ 8,
924 : DirectionV::UP,
925 : /*panelRow*/ 6,
926 : /*panelColumn*/ 4,
927 : /*voice*/ 0,
928 48 : /*shortcut*/ String());
929 :
930 : // Mute Triangle
931 32 : smDrumset->drum(80) = DrumInstrument(
932 : TConv::userName(DrumNum(80)),
933 : NoteHeadGroup::HEAD_CROSS,
934 : /*line*/ 0,
935 : DirectionV::UP,
936 : /*panelRow*/ 6,
937 : /*panelColumn*/ 5,
938 : /*voice*/ 0,
939 48 : /*shortcut*/ String());
940 :
941 : // Open Triangle
942 32 : smDrumset->drum(81) = DrumInstrument(
943 : TConv::userName(DrumNum(81)),
944 : NoteHeadGroup::HEAD_TRIANGLE_UP,
945 : /*line*/ 0,
946 : DirectionV::UP,
947 : /*panelRow*/ 6,
948 : /*panelColumn*/ 6,
949 : /*voice*/ 0,
950 48 : /*shortcut*/ String());
951 :
952 : // Shaker
953 32 : smDrumset->drum(82) = DrumInstrument(
954 : TConv::userName(DrumNum(82)),
955 : NoteHeadGroup::HEAD_DIAMOND,
956 : /*line*/ 5,
957 : DirectionV::UP,
958 : /*panelRow*/ 6,
959 : /*panelColumn*/ 7,
960 : /*voice*/ 0,
961 48 : /*shortcut*/ String());
962 :
963 : // Jingle Bell
964 32 : smDrumset->drum(83) = DrumInstrument(
965 : TConv::userName(DrumNum(83)),
966 : NoteHeadGroup::HEAD_TRIANGLE_DOWN,
967 : /*line*/ 3,
968 : DirectionV::UP,
969 : /*panelRow*/ 7,
970 : /*panelColumn*/ 0,
971 : /*voice*/ 0,
972 48 : /*shortcut*/ String());
973 :
974 : // Belltree
975 32 : smDrumset->drum(84) = DrumInstrument(
976 : TConv::userName(DrumNum(84)),
977 : NoteHeadGroup::HEAD_TI,
978 : /*line*/ 2,
979 : DirectionV::UP,
980 : /*panelRow*/ 7,
981 : /*panelColumn*/ 1,
982 : /*voice*/ 0,
983 48 : /*shortcut*/ String());
984 :
985 : // Castanets
986 32 : smDrumset->drum(85) = DrumInstrument(
987 : TConv::userName(DrumNum(85)),
988 : NoteHeadGroup::HEAD_LA,
989 : /*line*/ 2,
990 : DirectionV::UP,
991 : /*panelRow*/ 7,
992 : /*panelColumn*/ 2,
993 : /*voice*/ 0,
994 48 : /*shortcut*/ String());
995 :
996 : // Mute Surdo
997 32 : smDrumset->drum(86) = DrumInstrument(
998 : TConv::userName(DrumNum(86)),
999 : NoteHeadGroup::HEAD_CUSTOM,
1000 : /*line*/ 4,
1001 : DirectionV::UP,
1002 : /*panelRow*/ 7,
1003 : /*panelColumn*/ 3,
1004 : /*voice*/ 0,
1005 48 : /*shortcut*/ String());
1006 :
1007 16 : smDrumset->drum(86).noteheads[static_cast<int>(NoteHeadType::HEAD_WHOLE)] = SymNames::symIdByName("noteheadSlashX");
1008 16 : smDrumset->drum(86).noteheads[static_cast<int>(NoteHeadType::HEAD_HALF)] = SymNames::symIdByName("noteheadSlashX");
1009 16 : smDrumset->drum(86).noteheads[static_cast<int>(NoteHeadType::HEAD_QUARTER)] = SymNames::symIdByName("noteheadSlashX");
1010 16 : smDrumset->drum(86).noteheads[static_cast<int>(NoteHeadType::HEAD_BREVIS)] = SymNames::symIdByName("noteheadSlashX");
1011 :
1012 : // Open Surdo
1013 32 : smDrumset->drum(87) = DrumInstrument(
1014 : TConv::userName(DrumNum(87)),
1015 : NoteHeadGroup::HEAD_SLASH,
1016 : /*line*/ 4,
1017 : DirectionV::UP,
1018 : /*panelRow*/ 7,
1019 : /*panelColumn*/ 4,
1020 : /*voice*/ 0,
1021 48 : /*shortcut*/ String());
1022 :
1023 : // END GENERATED CODE
1024 16 : }
1025 : }
|