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) 2025 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 : #include "generalmidi.h"
23 :
24 : #include <array>
25 : #include <string_view>
26 :
27 : using namespace std::literals;
28 :
29 : namespace mu::iex::midi {
30 : namespace {
31 : struct Gm1ProgramData {
32 : GM1Program program;
33 : std::string_view midiName;
34 : };
35 :
36 : static constexpr std::array GM1_PROGRAM_DATA = {
37 : Gm1ProgramData{ GM1Program::AcousticGrandPiano, "Grand Piano"sv },
38 : Gm1ProgramData{ GM1Program::BrightAcousticPiano, "Bright Piano"sv },
39 : Gm1ProgramData{ GM1Program::ElectricGrandPiano, "E.Grand"sv },
40 : Gm1ProgramData{ GM1Program::HonkyTonkPiano, "Honky-tonk"sv },
41 : Gm1ProgramData{ GM1Program::ElectricPiano1, "E.Piano"sv },
42 : Gm1ProgramData{ GM1Program::ElectricPiano2, "E.Piano 2"sv },
43 : Gm1ProgramData{ GM1Program::Harpsichord, "Harpsichord"sv },
44 : Gm1ProgramData{ GM1Program::Clavi, "Clav."sv },
45 : Gm1ProgramData{ GM1Program::Celesta, "Celesta"sv },
46 : Gm1ProgramData{ GM1Program::Glockenspiel, "Glockenspiel"sv },
47 : Gm1ProgramData{ GM1Program::MusicBox, "Music Box"sv },
48 : Gm1ProgramData{ GM1Program::Vibraphone, "Vibraphone"sv },
49 : Gm1ProgramData{ GM1Program::Marimba, "Marimba"sv },
50 : Gm1ProgramData{ GM1Program::Xylophone, "Xylophone"sv },
51 : Gm1ProgramData{ GM1Program::TubularBells, "Tubular Bells"sv },
52 : Gm1ProgramData{ GM1Program::Dulcimer, "Dulcimer"sv },
53 : Gm1ProgramData{ GM1Program::DrawbarOrgan, "Drawbar Organ"sv },
54 : Gm1ProgramData{ GM1Program::PercussiveOrgan, "Perc. Organ"sv },
55 : Gm1ProgramData{ GM1Program::RockOrgan, "Rock Organ"sv },
56 : Gm1ProgramData{ GM1Program::ChurchOrgan, "Church Organ"sv },
57 : Gm1ProgramData{ GM1Program::ReedOrgan, "Reed Organ"sv },
58 : Gm1ProgramData{ GM1Program::Accordion, "Akkordion"sv },
59 : Gm1ProgramData{ GM1Program::Harmonica, "Harmonica"sv },
60 : Gm1ProgramData{ GM1Program::TangoAccordion, "Bandoneon"sv },
61 : Gm1ProgramData{ GM1Program::AcousticGuitarNylon, "Nylon Gtr."sv },
62 : Gm1ProgramData{ GM1Program::AcousticGuitarSteel, "Steel Gtr."sv },
63 : Gm1ProgramData{ GM1Program::ElectricGuitarJazz, "Jazz Guitar"sv },
64 : Gm1ProgramData{ GM1Program::ElectricGuitarClean, "Clean Guitar"sv },
65 : Gm1ProgramData{ GM1Program::ElectricGuitarMuted, "Muted Guitar"sv },
66 : Gm1ProgramData{ GM1Program::OverdrivenGuitar, "Overdrive Gtr"sv },
67 : Gm1ProgramData{ GM1Program::DistortionGuitar, "DistortionGtr"sv },
68 : Gm1ProgramData{ GM1Program::GuitarHarmonics, "Gtr.Harmonics"sv },
69 : Gm1ProgramData{ GM1Program::AcousticBass, "Acoustic Bass"sv },
70 : Gm1ProgramData{ GM1Program::ElectricBassFinger, "Fingered Bass"sv },
71 : Gm1ProgramData{ GM1Program::ElectricBassPick, "Picked Bass"sv },
72 : Gm1ProgramData{ GM1Program::FretlessBass, "Fretless Bass"sv },
73 : Gm1ProgramData{ GM1Program::SlapBass1, "Slap Bass 1"sv },
74 : Gm1ProgramData{ GM1Program::SlapBass2, "Slap Bass 2"sv },
75 : Gm1ProgramData{ GM1Program::SynthBass1, "Synth Bass 1"sv },
76 : Gm1ProgramData{ GM1Program::SynthBass2, "Synth Bass 2"sv },
77 : Gm1ProgramData{ GM1Program::Violin, "Violin"sv },
78 : Gm1ProgramData{ GM1Program::Viola, "Viola"sv },
79 : Gm1ProgramData{ GM1Program::Cello, "Cello"sv },
80 : Gm1ProgramData{ GM1Program::Contrabass, "Contrabass"sv },
81 : Gm1ProgramData{ GM1Program::TremoloStrings, "Tremolo Str."sv },
82 : Gm1ProgramData{ GM1Program::PizzicatoStrings, "PizzicatoStr."sv },
83 : Gm1ProgramData{ GM1Program::OrchestralHarp, "Harp"sv },
84 : Gm1ProgramData{ GM1Program::Timpani, "Timpani"sv },
85 : Gm1ProgramData{ GM1Program::StringEnsemble1, "Strings 1"sv },
86 : Gm1ProgramData{ GM1Program::StringEnsemble2, "Strings 2"sv },
87 : Gm1ProgramData{ GM1Program::SynthStrings1, "Syn.Strings 1"sv },
88 : Gm1ProgramData{ GM1Program::SynthStrings2, "Syn.Strings 2"sv },
89 : Gm1ProgramData{ GM1Program::ChoirAahs, "Choir Aahs"sv },
90 : Gm1ProgramData{ GM1Program::VoiceOohs, "Voice Oohs"sv },
91 : Gm1ProgramData{ GM1Program::SynthVoice, "Synth Voice"sv },
92 : Gm1ProgramData{ GM1Program::OrchestraHit, "Orchestra Hit"sv },
93 : Gm1ProgramData{ GM1Program::Trumpet, "Trumpet"sv },
94 : Gm1ProgramData{ GM1Program::Trombone, "Trombone"sv },
95 : Gm1ProgramData{ GM1Program::Tuba, "Tuba"sv },
96 : Gm1ProgramData{ GM1Program::MutedTrumpet, "Muted Trumpet"sv },
97 : Gm1ProgramData{ GM1Program::FrenchHorn, "French Horn"sv },
98 : Gm1ProgramData{ GM1Program::BrassSection, "Brass Section"sv },
99 : Gm1ProgramData{ GM1Program::SynthBrass1, "Synth Brass 1"sv },
100 : Gm1ProgramData{ GM1Program::SynthBrass2, "Synth Brass 2"sv },
101 : Gm1ProgramData{ GM1Program::SopranoSax, "Soprano Sax"sv },
102 : Gm1ProgramData{ GM1Program::AltoSax, "Alto Sax"sv },
103 : Gm1ProgramData{ GM1Program::TenorSax, "Tenor Sax"sv },
104 : Gm1ProgramData{ GM1Program::BaritoneSax, "Baritone Sax"sv },
105 : Gm1ProgramData{ GM1Program::Oboe, "Oboe"sv },
106 : Gm1ProgramData{ GM1Program::EnglishHorn, "English Horn"sv },
107 : Gm1ProgramData{ GM1Program::Bassoon, "Bassoon"sv },
108 : Gm1ProgramData{ GM1Program::Clarinet, "Clarinet"sv },
109 : Gm1ProgramData{ GM1Program::Piccolo, "Piccolo"sv },
110 : Gm1ProgramData{ GM1Program::Flute, "Flute"sv },
111 : Gm1ProgramData{ GM1Program::Recorder, "Recorder"sv },
112 : Gm1ProgramData{ GM1Program::PanFlute, "Pan Flute"sv },
113 : Gm1ProgramData{ GM1Program::BlownBottle, "Blown Bottle"sv },
114 : Gm1ProgramData{ GM1Program::Shakuhachi, "Shakuhachi"sv },
115 : Gm1ProgramData{ GM1Program::Whistle, "Whistle"sv },
116 : Gm1ProgramData{ GM1Program::Ocarina, "Ocarina"sv },
117 : Gm1ProgramData{ GM1Program::Lead1Square, "Square Wave"sv },
118 : Gm1ProgramData{ GM1Program::Lead2Sawtooth, "Saw Wave"sv },
119 : Gm1ProgramData{ GM1Program::Lead3Calliope, "Calliope"sv },
120 : Gm1ProgramData{ GM1Program::Lead4Chiff, "Chiffer Lead"sv },
121 : Gm1ProgramData{ GM1Program::Lead5Charang, "Charang"sv },
122 : Gm1ProgramData{ GM1Program::Lead6Voice, "Solo Vox"sv },
123 : Gm1ProgramData{ GM1Program::Lead7Fifths, "Fifth Saw"sv },
124 : Gm1ProgramData{ GM1Program::Lead8BassAndLead, "Bass Lead"sv },
125 : Gm1ProgramData{ GM1Program::Pad1NewAge, "New Age Pad"sv },
126 : Gm1ProgramData{ GM1Program::Pad2Warm, "Warm Pad"sv },
127 : Gm1ProgramData{ GM1Program::Pad3Polysynth, "Polysynth Pad"sv },
128 : Gm1ProgramData{ GM1Program::Pad4Choir, "Choir Pad"sv },
129 : Gm1ProgramData{ GM1Program::Pad5Bowed, "Bowed Pad"sv },
130 : Gm1ProgramData{ GM1Program::Pad6Metallic, "Metallic Pad"sv },
131 : Gm1ProgramData{ GM1Program::Pad7Halo, "Halo Pad"sv },
132 : Gm1ProgramData{ GM1Program::Pad8Sweep, "Sweep Pad"sv },
133 : Gm1ProgramData{ GM1Program::FX1Rain, "Rain"sv },
134 : Gm1ProgramData{ GM1Program::FX2Soundtrack, "Soundtrack"sv },
135 : Gm1ProgramData{ GM1Program::FX3Crystal, "Crystal"sv },
136 : Gm1ProgramData{ GM1Program::FX4Atmosphere, "Athmosphere"sv },
137 : Gm1ProgramData{ GM1Program::FX5Brightness, "Brightness"sv },
138 : Gm1ProgramData{ GM1Program::FX6Goblins, "Goblins"sv },
139 : Gm1ProgramData{ GM1Program::FX7Echoes, "Echoes"sv },
140 : Gm1ProgramData{ GM1Program::FX8SciFi, "Sci-Fi"sv },
141 : Gm1ProgramData{ GM1Program::Sitar, "Sitar"sv },
142 : Gm1ProgramData{ GM1Program::Banjo, "Banjo"sv },
143 : Gm1ProgramData{ GM1Program::Shamisen, "Shamisen"sv },
144 : Gm1ProgramData{ GM1Program::Koto, "Koto"sv },
145 : Gm1ProgramData{ GM1Program::Kalimba, "Kalimba"sv },
146 : Gm1ProgramData{ GM1Program::BagPipe, "Bagpipe"sv },
147 : Gm1ProgramData{ GM1Program::Fiddle, "Fiddle"sv },
148 : Gm1ProgramData{ GM1Program::Shanai, "Shanai"sv },
149 : Gm1ProgramData{ GM1Program::TinkleBell, "Tinkle Bell"sv },
150 : Gm1ProgramData{ GM1Program::Agogo, "Agogo"sv },
151 : Gm1ProgramData{ GM1Program::SteelDrums, "Steel Drums"sv },
152 : Gm1ProgramData{ GM1Program::Woodblock, "Woodblock"sv },
153 : Gm1ProgramData{ GM1Program::TaikoDrum, "Taiko Drum"sv },
154 : Gm1ProgramData{ GM1Program::MelodicTom, "Melodic Drum"sv },
155 : Gm1ProgramData{ GM1Program::SynthDrum, "Synth Drum"sv },
156 : Gm1ProgramData{ GM1Program::ReverseCymbal, "Rev. Cymbal"sv },
157 : Gm1ProgramData{ GM1Program::GuitarFretNoise, "GtrFret Noise"sv },
158 : Gm1ProgramData{ GM1Program::BreathNoise, "Breath Noise"sv },
159 : Gm1ProgramData{ GM1Program::Seashore, "Seashore"sv },
160 : Gm1ProgramData{ GM1Program::BirdTweet, "Bird Tweed"sv },
161 : Gm1ProgramData{ GM1Program::TelephoneRing, "Telephone"sv },
162 : Gm1ProgramData{ GM1Program::Helicopter, "Helicopter"sv },
163 : Gm1ProgramData{ GM1Program::Applause, "Applaus"sv },
164 : Gm1ProgramData{ GM1Program::Gunshot, "Gunshot"sv },
165 : };
166 : static_assert(GM1_PROGRAM_DATA.size() == 128);
167 : } // namespace
168 : } // namespace mu::iex::midi
169 :
170 118 : std::string_view mu::iex::midi::getMidiName(const GM1Program program)
171 : {
172 118 : const auto& data = GM1_PROGRAM_DATA[static_cast<std::size_t>(program)];
173 :
174 118 : return data.midiName;
175 : }
|