From 85598a78818e2e0caef319317d9a2f8b3420eb4f Mon Sep 17 00:00:00 2001 From: pereverzev+v <57620349+vpereverzev@users.noreply.github.com> Date: Fri, 2 Dec 2022 19:21:02 +0200 Subject: [PATCH] Merge pull request #14884 from vpereverzev/musesounds_mappings [MU4] preparation_for_musesounds_mappings --- .../mapping/stringssetupdataresolver.cpp | 15 +- .../mapping/voicessetupdataresolver.cpp | 4 +- .../mapping/windssetupdataresolver.cpp | 44 +- .../synthesizers/fluidsynth/soundmapping.h | 47 +- src/framework/mpe/events.h | 45 +- src/framework/mpe/soundid.h | 691 +++++++++--------- .../internal/musesamplerresolver.cpp | 23 +- src/playback/playbacktypes.h | 11 - 8 files changed, 479 insertions(+), 401 deletions(-) diff --git a/src/engraving/playback/mapping/stringssetupdataresolver.cpp b/src/engraving/playback/mapping/stringssetupdataresolver.cpp index c183d4cbdd45b..a3ea0eec6d0d2 100644 --- a/src/engraving/playback/mapping/stringssetupdataresolver.cpp +++ b/src/engraving/playback/mapping/stringssetupdataresolver.cpp @@ -235,13 +235,17 @@ PlaybackSetupData StringsSetupDataResolver::doResolve(const Instrument* instrume { "strings", { SoundId::StringsGroup, SoundCategory::Strings, {}, {} } }, { "double-bass", { SoundId::Contrabass, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, { "contrabass", { SoundId::Contrabass, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, - { "contrabasses", { SoundId::ContrabassSection, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, + { "contrabasses", { SoundId::Contrabass, SoundCategory::Strings, { SoundSubCategory::Orchestral, + SoundSubCategory::Section }, {} } }, { "violin", { SoundId::Violin, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, - { "violins", { SoundId::ViolinSection, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, + { "violins", { SoundId::Violin, SoundCategory::Strings, { SoundSubCategory::Orchestral, + SoundSubCategory::Section }, {} } }, { "viola", { SoundId::Viola, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, - { "violas", { SoundId::ViolaSection, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, + { "violas", { SoundId::Viola, SoundCategory::Strings, { SoundSubCategory::Orchestral, + SoundSubCategory::Section }, {} } }, { "violoncello", { SoundId::Violoncello, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, - { "violoncellos", { SoundId::VioloncelloSection, SoundCategory::Strings, { SoundSubCategory::Orchestral }, {} } }, + { "violoncellos", { SoundId::Violoncello, SoundCategory::Strings, { SoundSubCategory::Orchestral, + SoundSubCategory::Section }, {} } }, { "treble-viol", { SoundId::Viol, SoundCategory::Strings, {}, {} } }, { "alto-viol", { SoundId::Viol, SoundCategory::Strings, { SoundSubCategory::Alto }, {} } }, @@ -271,8 +275,7 @@ PlaybackSetupData StringsSetupDataResolver::doResolve(const Instrument* instrume } static const std::unordered_set supportPrimaryAndSecondaryCategories { - SoundId::Violin, - SoundId::ViolinSection, + SoundId::Violin }; if (mu::contains(supportPrimaryAndSecondaryCategories, search->second.id)) { diff --git a/src/engraving/playback/mapping/voicessetupdataresolver.cpp b/src/engraving/playback/mapping/voicessetupdataresolver.cpp index 1114f17b53f30..3a593b49bb326 100644 --- a/src/engraving/playback/mapping/voicessetupdataresolver.cpp +++ b/src/engraving/playback/mapping/voicessetupdataresolver.cpp @@ -32,8 +32,8 @@ PlaybackSetupData VoicesSetupDataResolver::doResolve(const Instrument* instrumen SoundSubCategory::Boy }, {} } }, { "soprano", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Soprano }, {} } }, { "soprano-c-clef", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Soprano }, {} } }, - { "mezzo-soprano", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Mezzo_Soprano }, {} } }, - { "mezzo-soprano-c-clef", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Mezzo_Soprano }, {} } }, + { "mezzo-soprano", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Soprano }, {} } }, + { "mezzo-soprano-c-clef", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Soprano }, {} } }, { "countertenor", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Counter_Tenor }, {} } }, { "alto", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Alto }, {} } }, { "alto-c-clef", { SoundId::Choir, SoundCategory::Voices, { SoundSubCategory::Alto }, {} } }, diff --git a/src/engraving/playback/mapping/windssetupdataresolver.cpp b/src/engraving/playback/mapping/windssetupdataresolver.cpp index 942e3f28accf2..5ccde861cd295 100644 --- a/src/engraving/playback/mapping/windssetupdataresolver.cpp +++ b/src/engraving/playback/mapping/windssetupdataresolver.cpp @@ -163,19 +163,24 @@ PlaybackSetupData WindsSetupDataResolver::doResolve(const Instrument* instrument { "piccolo-clarinet", { SoundId::Clarinet, SoundCategory::Winds, {}, {} } }, { "soprano-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Sopranino }, {} } }, - { "eb-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Sopranino }, {} } }, + { "eb-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Sopranino, + SoundSubCategory::In_E_flat }, {} } }, { "d-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Sopranino }, {} } }, { "c-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Sopranino }, {} } }, - { "bb-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Sopranino }, {} } }, + { "bb-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Soprano, + SoundSubCategory::In_B_flat }, {} } }, { "clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Soprano }, {} } }, { "a-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Soprano }, {} } }, { "g-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Soprano }, {} } }, { "basset-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Soprano }, {} } }, { "basset-horn", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Soprano }, {} } }, { "alto-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Alto }, {} } }, - { "bass-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, - { "bb-bass-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, - { "bb-bass-clarinet-bass-clef", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, + { "bass-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass, + SoundSubCategory::In_B_flat }, {} } }, + { "bb-bass-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass, + SoundSubCategory::In_B_flat }, {} } }, + { "bb-bass-clarinet-bass-clef", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass, + SoundSubCategory::In_B_flat }, {} } }, { "a-bass-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, { "a-bass-clarinet-bass-clef", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, { "contra-alto-clarinet", { SoundId::Clarinet, SoundCategory::Winds, { SoundSubCategory::Contra_Alto }, {} } }, @@ -264,18 +269,23 @@ PlaybackSetupData WindsSetupDataResolver::doResolve(const Instrument* instrument { "brass", { SoundId::BrassGroup, SoundCategory::Winds, {}, {} } }, - { "c-horn-alto", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Alto }, {} } }, - { "bb-horn-alto", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Alto }, {} } }, - { "a-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "ab-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "g-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "e-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "eb-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "d-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::French }, {} } }, - { "c-horn", { SoundId::Horn, SoundCategory::Winds, {}, {} } }, - { "c-horn-bass", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, - { "bb-horn-basso", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Bass }, {} } }, + { "c-horn-alto", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Alto, + SoundSubCategory::In_C }, {} } }, + { "bb-horn-alto", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Alto, + SoundSubCategory::In_B_flat }, {} } }, + { "a-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_A }, {} } }, + { "ab-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_A_flat }, {} } }, + { "g-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_G }, {} } }, + { "e-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_E }, {} } }, + { "eb-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_E_flat }, {} } }, + { "d-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_D }, {} } }, + { "horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::French, + SoundSubCategory::In_F }, {} } }, + { "c-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::In_C }, {} } }, + { "c-horn-bass", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Bass, + SoundSubCategory::In_C }, {} } }, + { "bb-horn-basso", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Bass, + SoundSubCategory::In_B_flat }, {} } }, { "vienna-horn", { SoundId::Horn, SoundCategory::Winds, { SoundSubCategory::Vienna }, {} } }, { "bb-wagner-tuba", { SoundId::Tuba, SoundCategory::Winds, { SoundSubCategory::Wagner }, {} } }, diff --git a/src/framework/audio/internal/synthesizers/fluidsynth/soundmapping.h b/src/framework/audio/internal/synthesizers/fluidsynth/soundmapping.h index f69106b92c28d..a8706cf2ddd4a 100644 --- a/src/framework/audio/internal/synthesizers/fluidsynth/soundmapping.h +++ b/src/framework/audio/internal/synthesizers/fluidsynth/soundmapping.h @@ -250,13 +250,17 @@ static const auto& mappingByCategory(const mpe::SoundCategory category) { { mpe::SoundId::StringsGroup, { } }, { midi::Program(0, 48) } }, { { mpe::SoundId::Contrabass, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(0, 43) } }, - { { mpe::SoundId::ContrabassSection, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(50, 48) } }, + { { mpe::SoundId::Contrabass, { mpe::SoundSubCategory::Orchestral, + mpe::SoundSubCategory::Section } }, { midi::Program(50, 48) } }, { { mpe::SoundId::Violin, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(0, 40) } }, - { { mpe::SoundId::ViolinSection, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(20, 48) } }, + { { mpe::SoundId::Violin, { mpe::SoundSubCategory::Orchestral, + mpe::SoundSubCategory::Section } }, { midi::Program(20, 48) } }, { { mpe::SoundId::Viola, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(0, 41) } }, - { { mpe::SoundId::ViolaSection, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(30, 48) } }, + { { mpe::SoundId::Viola, { mpe::SoundSubCategory::Orchestral, + mpe::SoundSubCategory::Section } }, { midi::Program(30, 48) } }, { { mpe::SoundId::Violoncello, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(0, 42) } }, - { { mpe::SoundId::VioloncelloSection, { mpe::SoundSubCategory::Orchestral } }, { midi::Program(40, 48) } }, + { { mpe::SoundId::Violoncello, { mpe::SoundSubCategory::Orchestral, + mpe::SoundSubCategory::Section } }, { midi::Program(40, 48) } }, { { mpe::SoundId::Viol, { } }, { midi::Program(0, 40) } }, { { mpe::SoundId::Viol, { mpe::SoundSubCategory::Alto } }, { midi::Program(0, 41) } }, @@ -377,9 +381,15 @@ static const auto& mappingByCategory(const mpe::SoundCategory category) { { mpe::SoundId::Clarinet, {} }, { midi::Program(0, 71) } }, { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Sopranino } }, { midi::Program(0, 71) } }, + { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Sopranino, + mpe::SoundSubCategory::In_E_flat } }, { midi::Program(0, 71) } }, { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Soprano } }, { midi::Program(0, 71) } }, + { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Soprano, + mpe::SoundSubCategory::In_B_flat } }, { midi::Program(0, 71) } }, { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Alto } }, { midi::Program(0, 71) } }, { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Bass } }, { midi::Program(0, 71) } }, + { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Bass, + mpe::SoundSubCategory::In_B_flat } }, { midi::Program(0, 71) } }, { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Contra_Alto } }, { midi::Program(0, 71) } }, { { mpe::SoundId::Clarinet, { mpe::SoundSubCategory::Contra_Bass } }, { midi::Program(0, 71) } }, @@ -449,9 +459,25 @@ static const auto& mappingByCategory(const mpe::SoundCategory category) { { mpe::SoundId::BrassGroup, {} }, { midi::Program(0, 61) } }, { { mpe::SoundId::Horn, {} }, { midi::Program(0, 60), midi::Program(0, 59) } }, - { { mpe::SoundId::Horn, { mpe::SoundSubCategory::French } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_A } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_A_flat } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_G } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_E } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_E_flat } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_D } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::In_C } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::French, + mpe::SoundSubCategory::In_F } }, { midi::Program(0, 60), midi::Program(0, 59) } }, { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Alto } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Alto, + mpe::SoundSubCategory::In_C } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Alto, + mpe::SoundSubCategory::In_B_flat } }, { midi::Program(0, 60), midi::Program(0, 59) } }, { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Bass } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Bass, + mpe::SoundSubCategory::In_B_flat } }, { midi::Program(0, 60), midi::Program(0, 59) } }, + { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Bass, + mpe::SoundSubCategory::In_C } }, { midi::Program(0, 60), midi::Program(0, 59) } }, { { mpe::SoundId::Horn, { mpe::SoundSubCategory::Vienna } }, { midi::Program(0, 60), midi::Program(0, 59) } }, { { mpe::SoundId::Tuba, { mpe::SoundSubCategory::Wagner } }, { midi::Program(0, 56) } }, @@ -912,7 +938,7 @@ inline const ArticulationMapping& articulationSounds(const mpe::PlaybackSetupDat } } - if (setupData.id == mpe::SoundId::ViolinSection) { + if (setupData.id == mpe::SoundId::Violin && setupData.contains(mpe::SoundSubCategory::Section)) { return VIOLIN_SECTION; } @@ -920,7 +946,7 @@ inline const ArticulationMapping& articulationSounds(const mpe::PlaybackSetupDat return VIOLIN; } - if (setupData.id == mpe::SoundId::ViolaSection) { + if (setupData.id == mpe::SoundId::Viola && setupData.contains(mpe::SoundSubCategory::Section)) { return VIOLA_SECTION; } @@ -928,7 +954,7 @@ inline const ArticulationMapping& articulationSounds(const mpe::PlaybackSetupDat return VIOLA; } - if (setupData.id == mpe::SoundId::VioloncelloSection) { + if (setupData.id == mpe::SoundId::Violoncello && setupData.contains(mpe::SoundSubCategory::Section)) { return VIOLONCELLO_SECTION; } @@ -936,7 +962,7 @@ inline const ArticulationMapping& articulationSounds(const mpe::PlaybackSetupDat return VIOLONCELLO; } - if (setupData.id == mpe::SoundId::ContrabassSection) { + if (setupData.id == mpe::SoundId::Contrabass && setupData.contains(mpe::SoundSubCategory::Section)) { return CONTRABASS_SECTION; } @@ -1000,7 +1026,8 @@ struct ChannelMap { midi::channel_t resolveChannelForEvent(const mpe::NoteEvent& event) { - if (event.expressionCtx().articulations.contains(mpe::ArticulationType::Standard)) { + if (event.expressionCtx().articulations.contains(mpe::ArticulationType::Standard) + || event.expressionCtx().articulations.empty()) { if (m_standardPrograms.empty()) { return 0; } diff --git a/src/framework/mpe/events.h b/src/framework/mpe/events.h index d9f208ce7308a..6cb69ff801bcb 100644 --- a/src/framework/mpe/events.h +++ b/src/framework/mpe/events.h @@ -295,15 +295,17 @@ struct PlaybackSetupData bool operator<(const PlaybackSetupData& other) const { - if (id < other.id) { + if (other.id > id) { return true; + } else if (other.id == id) { + if (other.category > category) { + return true; + } else if (other.category == category) { + return other.subCategorySet > subCategorySet; + } } - if (category < other.category) { - return true; - } - - return subCategorySet < other.subCategorySet; + return false; } bool isValid() const @@ -314,10 +316,18 @@ struct PlaybackSetupData String toString() const { - String result = String(u"%1.%2.%3") - .arg(soundIdToString(id)) - .arg(soundCategoryToString(category)) - .arg(subCategorySet.toString()); + String result; + + if (!subCategorySet.empty()) { + result = String(u"%1.%2.%3") + .arg(soundCategoryToString(category)) + .arg(soundIdToString(id)) + .arg(subCategorySet.toString()); + } else { + result = String(u"%1.%2") + .arg(soundCategoryToString(category)) + .arg(soundIdToString(id)); + } return result; } @@ -330,10 +340,19 @@ struct PlaybackSetupData StringList subStrList = str.split(u"."); + if (subStrList.size() < 2) { + return PlaybackSetupData(); + } + + SoundSubCategories subCategories; + if (subStrList.size() == 3) { + subCategories = SoundSubCategories::fromString(subStrList.at(2)); + } + PlaybackSetupData result = { - soundIdFromString(subStrList.at(0)), - soundCategoryFromString(subStrList.at(1)), - SoundSubCategories::fromString(subStrList.at(2)), + soundIdFromString(subStrList.at(1)), + soundCategoryFromString(subStrList.at(0)), + std::move(subCategories), std::nullopt }; diff --git a/src/framework/mpe/soundid.h b/src/framework/mpe/soundid.h index ee3224b278ae8..5c19071b017f7 100644 --- a/src/framework/mpe/soundid.h +++ b/src/framework/mpe/soundid.h @@ -75,12 +75,9 @@ enum class SoundId Laud, StringsGroup, Violin, - ViolinSection, Viola, ViolaDaGamba, - ViolaSection, Violoncello, - VioloncelloSection, Viol, PardessusViol, Baryton, @@ -88,7 +85,6 @@ enum class SoundId Nyckelharpa, Erhu, Contrabass, - ContrabassSection, Octobass, WindsGroup, @@ -223,6 +219,8 @@ enum class SoundId Stamp, Choir, Kazoo, + Taiko, + Metronome, Last }; @@ -331,6 +329,7 @@ enum class SoundSubCategory Glass, Shell, Wind, + Soft, Treble, Diatonic, @@ -381,212 +380,223 @@ enum class SoundSubCategory Primary, Secondary, + Section, + + In_C, + In_D, + In_D_flat, + In_E, + In_E_flat, + In_F, + In_G, + In_G_flat, + In_A, + In_A_flat, + In_B, + In_B_flat, Last }; -static const String UNDEFINED_STR(u"Undefined"); - static const std::unordered_map ID_STRINGS { - { SoundId::Accordion, String(u"Accordion") }, - { SoundId::Bandoneon, String(u"Bandoneon") }, - { SoundId::Concertina, String(u"Concertina") }, - { SoundId::Harmonica, String(u"Harmonica") }, - { SoundId::Melodica, String(u"Melodica") }, - { SoundId::Sheng, String(u"Sheng") }, - { SoundId::Celesta, String(u"Celesta") }, - { SoundId::Clavichord, String(u"Clavichord") }, - { SoundId::Harpsichord, String(u"Harpsichord") }, - { SoundId::Virginal, String(u"Virginal") }, - { SoundId::Piano, String(u"Piano") }, - { SoundId::Organ, String(u"Organ") }, - { SoundId::Harmonium, String(u"Harmonium") }, - { SoundId::Synthesizer, String(u"Synthesizer") }, - { SoundId::Theremin, String(u"Theremin") }, - { SoundId::OndesMartenot, String(u"OndesMartenot") }, - - { SoundId::Harp, String(u"Harp") }, - { SoundId::Cavaquinho, String(u"Cavaquinho") }, - { SoundId::Guitar, String(u"Guitar") }, - { SoundId::BassGuitar, String(u"BassGuitar") }, - { SoundId::Banjo, String(u"Banjo") }, - { SoundId::Ukulele, String(u"Ukulele") }, - { SoundId::Mandolin, String(u"Mandolin") }, - { SoundId::MtnDulcimer, String(u"MtnDulcimer") }, - { SoundId::Lute, String(u"Lute") }, - { SoundId::Theorbo, String(u"Theorbo") }, - { SoundId::Archlute, String(u"Archlute") }, - { SoundId::Balalaika, String(u"Balalaika") }, - { SoundId::Koto, String(u"Koto") }, - { SoundId::Oud, String(u"Oud") }, - { SoundId::Shamisen, String(u"Shamisen") }, - { SoundId::Sitar, String(u"Sitar") }, - { SoundId::Prim, String(u"Prim") }, - { SoundId::Brac, String(u"Brac") }, - { SoundId::Bugarija, String(u"Bugarija") }, - { SoundId::Berda, String(u"Berda") }, - { SoundId::Celo, String(u"Celo") }, - { SoundId::Bandurria, String(u"Bandurria") }, - { SoundId::Laud, String(u"Laud") }, - { SoundId::StringsGroup, String(u"StringsGroup") }, - { SoundId::Violin, String(u"Violin") }, - { SoundId::ViolinSection, String(u"ViolinSection") }, - { SoundId::Viola, String(u"Viola") }, - { SoundId::ViolaDaGamba, String(u"ViolaDaGamba") }, - { SoundId::ViolaSection, String(u"ViolaSection") }, - { SoundId::Violoncello, String(u"Violoncello") }, - { SoundId::VioloncelloSection, String(u"VioloncelloSection") }, - { SoundId::Viol, String(u"Viol") }, - { SoundId::PardessusViol, String(u"PardessusViol") }, - { SoundId::Baryton, String(u"Baryton") }, - { SoundId::Violone, String(u"Violone") }, - { SoundId::Nyckelharpa, String(u"Nyckelharpa") }, - { SoundId::Erhu, String(u"Erhu") }, - { SoundId::Contrabass, String(u"Contrabass") }, - { SoundId::ContrabassSection, String(u"ContrabassSection") }, - { SoundId::Octobass, String(u"Octobass") }, - - { SoundId::WindsGroup, String(u"WindsGroup") }, - { SoundId::Piccolo, String(u"Piccolo") }, - { SoundId::Heckelphone, String(u"Heckelphone") }, - { SoundId::HeckelphoneClarinet, String(u"HeckelphoneClarinet") }, - { SoundId::Oboe, String(u"Oboe") }, - { SoundId::Lupophone, String(u"Lupophone") }, - { SoundId::Flute, String(u"Flute") }, - { SoundId::PanFlute, String(u"PanFlute") }, - { SoundId::Danso, String(u"Danso") }, - { SoundId::Traverso, String(u"Traverso") }, - { SoundId::Dizi, String(u"Dizi") }, - { SoundId::Shakuhachi, String(u"Shakuhachi") }, - { SoundId::Fife, String(u"Fife") }, - { SoundId::Whistle, String(u"Whistle") }, - { SoundId::Flageolet, String(u"Flageolet") }, - { SoundId::Recorder, String(u"Recorder") }, - { SoundId::Ocarina, String(u"Ocarina") }, - { SoundId::Gemshorn, String(u"Gemshorn") }, - { SoundId::Quena, String(u"Quena") }, - { SoundId::Horn, String(u"Horn") }, - { SoundId::Bassethorn, String(u"Bassethorn") }, - { SoundId::Shawm, String(u"Shawm") }, - { SoundId::Cromorne, String(u"Cromorne") }, - { SoundId::Crumhorn, String(u"Crumhorn") }, - { SoundId::Cornamuse, String(u"Cornamuse") }, - { SoundId::Kelhorn, String(u"Kelhorn") }, - { SoundId::Rauschpfeife, String(u"Rauschpfeife") }, - { SoundId::Duduk, String(u"Duduk") }, - { SoundId::Shenai, String(u"Shenai") }, - { SoundId::Clarinet, String(u"Clarinet") }, - { SoundId::Chalumeau, String(u"Chalumeau") }, - { SoundId::Xaphoon, String(u"Xaphoon") }, - { SoundId::Tarogato, String(u"Tarogato") }, - { SoundId::Octavin, String(u"Octavin") }, - { SoundId::Saxophone, String(u"Saxophone") }, - { SoundId::Aulochrome, String(u"Aulochrome") }, - { SoundId::Bassoon, String(u"Bassoon") }, - { SoundId::Contrabassoon, String(u"Contrabassoon") }, - { SoundId::Dulcian, String(u"Dulcian") }, - { SoundId::Rackett, String(u"Rackett") }, - { SoundId::Sarrusophone, String(u"Sarrusophone") }, - { SoundId::Bagpipe, String(u"Bagpipe") }, - { SoundId::Tuba, String(u"Tuba") }, - { SoundId::Cornet, String(u"Cornet") }, - { SoundId::Posthorn, String(u"Posthorn") }, - { SoundId::BrassGroup, String(u"BrassGroup") }, - { SoundId::Trumpet, String(u"Trumpet") }, - { SoundId::Bugle, String(u"Bugle") }, - { SoundId::MellophoneBugle, String(u"MellophoneBugle") }, - { SoundId::EuphoniumBugle, String(u"EuphoniumBugle") }, - { SoundId::Euphonium, String(u"Euphonium") }, - { SoundId::Fiscorn, String(u"Fiscorn") }, - { SoundId::Flugelhorn, String(u"Flugelhorn") }, - { SoundId::Kuhlohorn, String(u"Kuhlohorn") }, - { SoundId::Ophicleide, String(u"Ophicleide") }, - { SoundId::Cornettino, String(u"Cornettino") }, - { SoundId::Cornett, String(u"Cornett") }, - { SoundId::Serpent, String(u"Serpent") }, - { SoundId::Trombone, String(u"Trombone") }, - { SoundId::Cimbasso, String(u"Cimbasso") }, - { SoundId::Sackbut, String(u"Sackbut") }, - { SoundId::Sousaphone, String(u"Sousaphone") }, - { SoundId::Helicon, String(u"Helicon") }, - { SoundId::Conch, String(u"Conch") }, - { SoundId::Saxhorn, String(u"Saxhorn") }, - { SoundId::Horagai, String(u"Horagai") }, - { SoundId::Alphorn, String(u"Alphorn") }, - { SoundId::RagDung, String(u"RagDung") }, - { SoundId::Didgeridoo, String(u"Didgeridoo") }, - { SoundId::Shofar, String(u"Shofar") }, - { SoundId::Vuvuzela, String(u"Vuvuzela") }, - - { SoundId::Timpani, String(u"Timpani") }, - { SoundId::RotoToms, String(u"RotoToms") }, - { SoundId::Tubaphone, String(u"Tubaphone") }, - { SoundId::SteelDrums, String(u"SteelDrums") }, - { SoundId::Glockenspiel, String(u"Glockenspiel") }, - { SoundId::Xylophone, String(u"Xylophone") }, - { SoundId::Xylomarimba, String(u"Xylomarimba") }, - { SoundId::Vibraphone, String(u"Vibraphone") }, - { SoundId::Dulcimer, String(u"Dulcimer") }, - { SoundId::Cimbalom, String(u"Cimbalom") }, - { SoundId::Marimba, String(u"Marimba") }, - { SoundId::Crotales, String(u"Crotales") }, - { SoundId::Chimes, String(u"Chimes") }, - { SoundId::Carillon, String(u"Carillon") }, - { SoundId::Gong, String(u"Gong") }, - { SoundId::Metallophone, String(u"Metallophone") }, - { SoundId::Flexatone, String(u"Flexatone") }, - { SoundId::MusicalSaw, String(u"MusicalSaw") }, - { SoundId::MusicalGlasses, String(u"MusicalGlasses") }, - { SoundId::KlaxonHorns, String(u"KlaxonHorns") }, - { SoundId::Kalimba, String(u"Kalimba") }, - { SoundId::Bongos, String(u"Bongos") }, - { SoundId::TomToms, String(u"TomToms") }, - { SoundId::Conga, String(u"Conga") }, - { SoundId::Cuica, String(u"Cuica") }, - { SoundId::Drumset, String(u"Drumset") }, - { SoundId::Drum, String(u"Drum") }, - { SoundId::Tablas, String(u"Tablas") }, - { SoundId::Timbales, String(u"Timbales") }, - { SoundId::Anvil, String(u"Anvil") }, - { SoundId::BellTree, String(u"BellTree") }, - { SoundId::Bell, String(u"Bell") }, - { SoundId::Chain, String(u"Chain") }, - { SoundId::Cymbal, String(u"Cymbal") }, - { SoundId::HiHat, String(u"HiHat") }, - { SoundId::Pipe, String(u"Pipe") }, - { SoundId::MarkTree, String(u"MarkTree") }, - { SoundId::Castanet, String(u"Castanet") }, - { SoundId::TamTam, String(u"TamTam") }, - { SoundId::Thundersheet, String(u"Thundersheet") }, - { SoundId::Triangle, String(u"Triangle") }, - { SoundId::Claves, String(u"Claves") }, - { SoundId::Guiro, String(u"Guiro") }, - { SoundId::Block, String(u"Block") }, - { SoundId::Cabasa, String(u"Cabasa") }, - { SoundId::Maraca, String(u"Maraca") }, - { SoundId::Quijada, String(u"Quijada") }, - { SoundId::Ratchet, String(u"Ratchet") }, - { SoundId::Shaker, String(u"Shaker") }, - { SoundId::Stones, String(u"Stones") }, - { SoundId::Tambourine, String(u"Tambourine") }, - { SoundId::Tubo, String(u"Tubo") }, - { SoundId::Vibraslap, String(u"Vibraslap") }, - { SoundId::Whip, String(u"Whip") }, - { SoundId::Snap, String(u"Snap") }, - { SoundId::Clap, String(u"Clap") }, - { SoundId::Slap, String(u"Slap") }, - { SoundId::Stamp, String(u"Stamp") }, - { SoundId::Choir, String(u"Choir") }, - { SoundId::Kazoo, String(u"Kazoo") }, - { SoundId::Last, String(u"Last") } + { SoundId::Accordion, String(u"accordion") }, + { SoundId::Bandoneon, String(u"bandoneon") }, + { SoundId::Concertina, String(u"concertina") }, + { SoundId::Harmonica, String(u"harmonica") }, + { SoundId::Melodica, String(u"melodica") }, + { SoundId::Sheng, String(u"sheng") }, + { SoundId::Celesta, String(u"celesta") }, + { SoundId::Clavichord, String(u"clavichord") }, + { SoundId::Harpsichord, String(u"harpsichord") }, + { SoundId::Virginal, String(u"virginal") }, + { SoundId::Piano, String(u"piano") }, + { SoundId::Organ, String(u"organ") }, + { SoundId::Harmonium, String(u"harmonium") }, + { SoundId::Synthesizer, String(u"synthesizer") }, + { SoundId::Theremin, String(u"theremin") }, + { SoundId::OndesMartenot, String(u"ondes_martenot") }, + + { SoundId::Harp, String(u"harp") }, + { SoundId::Cavaquinho, String(u"cavaquinho") }, + { SoundId::Guitar, String(u"guitar") }, + { SoundId::BassGuitar, String(u"bass_guitar") }, + { SoundId::Banjo, String(u"banjo") }, + { SoundId::Ukulele, String(u"ukulele") }, + { SoundId::Mandolin, String(u"mandolin") }, + { SoundId::MtnDulcimer, String(u"mtn_dulcimer") }, + { SoundId::Lute, String(u"lute") }, + { SoundId::Theorbo, String(u"theorbo") }, + { SoundId::Archlute, String(u"archlute") }, + { SoundId::Balalaika, String(u"balalaika") }, + { SoundId::Koto, String(u"koto") }, + { SoundId::Oud, String(u"oud") }, + { SoundId::Shamisen, String(u"shamisen") }, + { SoundId::Sitar, String(u"sitar") }, + { SoundId::Prim, String(u"prim") }, + { SoundId::Brac, String(u"brac") }, + { SoundId::Bugarija, String(u"bugarija") }, + { SoundId::Berda, String(u"berda") }, + { SoundId::Celo, String(u"celo") }, + { SoundId::Bandurria, String(u"bandurria") }, + { SoundId::Laud, String(u"laud") }, + { SoundId::StringsGroup, String(u"strings_group") }, + { SoundId::Violin, String(u"violin") }, + { SoundId::Viola, String(u"viola") }, + { SoundId::ViolaDaGamba, String(u"viola_dagamba") }, + { SoundId::Violoncello, String(u"violoncello") }, + { SoundId::Viol, String(u"viol") }, + { SoundId::PardessusViol, String(u"pardessus_viol") }, + { SoundId::Baryton, String(u"varyton") }, + { SoundId::Violone, String(u"violone") }, + { SoundId::Nyckelharpa, String(u"nyckelharpa") }, + { SoundId::Erhu, String(u"erhu") }, + { SoundId::Contrabass, String(u"contrabass") }, + { SoundId::Octobass, String(u"octobass") }, + + { SoundId::WindsGroup, String(u"winds_group") }, + { SoundId::Piccolo, String(u"piccolo") }, + { SoundId::Heckelphone, String(u"heckelphone") }, + { SoundId::HeckelphoneClarinet, String(u"heckelphone_clarinet") }, + { SoundId::Oboe, String(u"oboe") }, + { SoundId::Lupophone, String(u"lupophone") }, + { SoundId::Flute, String(u"flute") }, + { SoundId::PanFlute, String(u"pan_flute") }, + { SoundId::Danso, String(u"danso") }, + { SoundId::Traverso, String(u"traverso") }, + { SoundId::Dizi, String(u"dizi") }, + { SoundId::Shakuhachi, String(u"shakuhachi") }, + { SoundId::Fife, String(u"fife") }, + { SoundId::Whistle, String(u"whistle") }, + { SoundId::Flageolet, String(u"flageolet") }, + { SoundId::Recorder, String(u"recorder") }, + { SoundId::Ocarina, String(u"ocarina") }, + { SoundId::Gemshorn, String(u"gemshorn") }, + { SoundId::Quena, String(u"quena") }, + { SoundId::Horn, String(u"horn") }, + { SoundId::Bassethorn, String(u"bassethorn") }, + { SoundId::Shawm, String(u"shawm") }, + { SoundId::Cromorne, String(u"cromorne") }, + { SoundId::Crumhorn, String(u"crumhorn") }, + { SoundId::Cornamuse, String(u"cornamuse") }, + { SoundId::Kelhorn, String(u"kelhorn") }, + { SoundId::Rauschpfeife, String(u"rauschpfeife") }, + { SoundId::Duduk, String(u"duduk") }, + { SoundId::Shenai, String(u"shenai") }, + { SoundId::Clarinet, String(u"clarinet") }, + { SoundId::Chalumeau, String(u"chalumeau") }, + { SoundId::Xaphoon, String(u"xaphoon") }, + { SoundId::Tarogato, String(u"tarogato") }, + { SoundId::Octavin, String(u"octavin") }, + { SoundId::Saxophone, String(u"saxophone") }, + { SoundId::Aulochrome, String(u"aulochrome") }, + { SoundId::Bassoon, String(u"bassoon") }, + { SoundId::Contrabassoon, String(u"contrabassoon") }, + { SoundId::Dulcian, String(u"dulcian") }, + { SoundId::Rackett, String(u"rackett") }, + { SoundId::Sarrusophone, String(u"sarrusophone") }, + { SoundId::Bagpipe, String(u"bagpipe") }, + { SoundId::Tuba, String(u"tuba") }, + { SoundId::Cornet, String(u"cornet") }, + { SoundId::Posthorn, String(u"posthorn") }, + { SoundId::BrassGroup, String(u"brass_group") }, + { SoundId::Trumpet, String(u"trumpet") }, + { SoundId::Bugle, String(u"bugle") }, + { SoundId::MellophoneBugle, String(u"mellophone_bugle") }, + { SoundId::EuphoniumBugle, String(u"euphonium_bugle") }, + { SoundId::Euphonium, String(u"euphonium") }, + { SoundId::Fiscorn, String(u"fiscorn") }, + { SoundId::Flugelhorn, String(u"flugelhorn") }, + { SoundId::Kuhlohorn, String(u"kuhlohorn") }, + { SoundId::Ophicleide, String(u"ophicleide") }, + { SoundId::Cornettino, String(u"cornettino") }, + { SoundId::Cornett, String(u"cornett") }, + { SoundId::Serpent, String(u"serpent") }, + { SoundId::Trombone, String(u"trombone") }, + { SoundId::Cimbasso, String(u"cimbasso") }, + { SoundId::Sackbut, String(u"sackbut") }, + { SoundId::Sousaphone, String(u"sousaphone") }, + { SoundId::Helicon, String(u"helicon") }, + { SoundId::Conch, String(u"conch") }, + { SoundId::Saxhorn, String(u"saxhorn") }, + { SoundId::Horagai, String(u"horagai") }, + { SoundId::Alphorn, String(u"alphorn") }, + { SoundId::RagDung, String(u"rag_dung") }, + { SoundId::Didgeridoo, String(u"didgeridoo") }, + { SoundId::Shofar, String(u"shofar") }, + { SoundId::Vuvuzela, String(u"vuvuzela") }, + + { SoundId::Timpani, String(u"timpani") }, + { SoundId::RotoToms, String(u"roto_toms") }, + { SoundId::Tubaphone, String(u"tubaphone") }, + { SoundId::SteelDrums, String(u"steel_drums") }, + { SoundId::Glockenspiel, String(u"glockenspiel") }, + { SoundId::Xylophone, String(u"xylophone") }, + { SoundId::Xylomarimba, String(u"xylomarimba") }, + { SoundId::Vibraphone, String(u"vibraphone") }, + { SoundId::Dulcimer, String(u"dulcimer") }, + { SoundId::Cimbalom, String(u"cimbalom") }, + { SoundId::Marimba, String(u"marimba") }, + { SoundId::Crotales, String(u"crotales") }, + { SoundId::Chimes, String(u"chimes") }, + { SoundId::Carillon, String(u"carillon") }, + { SoundId::Gong, String(u"gong") }, + { SoundId::Metallophone, String(u"metallophone") }, + { SoundId::Flexatone, String(u"flexatone") }, + { SoundId::MusicalSaw, String(u"musical_saw") }, + { SoundId::MusicalGlasses, String(u"musical_glasses") }, + { SoundId::KlaxonHorns, String(u"klaxon_horns") }, + { SoundId::Kalimba, String(u"kalimba") }, + { SoundId::Bongos, String(u"bongos") }, + { SoundId::TomToms, String(u"tom_toms") }, + { SoundId::Conga, String(u"conga") }, + { SoundId::Cuica, String(u"cuica") }, + { SoundId::Drumset, String(u"drumset") }, + { SoundId::Drum, String(u"drum") }, + { SoundId::Tablas, String(u"tablas") }, + { SoundId::Timbales, String(u"timbales") }, + { SoundId::Anvil, String(u"anvil") }, + { SoundId::BellTree, String(u"bell_tree") }, + { SoundId::Bell, String(u"bell") }, + { SoundId::Chain, String(u"chain") }, + { SoundId::Cymbal, String(u"cymbal") }, + { SoundId::HiHat, String(u"hi_hat") }, + { SoundId::Pipe, String(u"pipe") }, + { SoundId::MarkTree, String(u"mark_tree") }, + { SoundId::Castanet, String(u"castanet") }, + { SoundId::TamTam, String(u"tam_tam") }, + { SoundId::Thundersheet, String(u"thunder_sheet") }, + { SoundId::Triangle, String(u"triangle") }, + { SoundId::Claves, String(u"claves") }, + { SoundId::Guiro, String(u"guiro") }, + { SoundId::Block, String(u"block") }, + { SoundId::Cabasa, String(u"cabasa") }, + { SoundId::Maraca, String(u"maraca") }, + { SoundId::Quijada, String(u"quijada") }, + { SoundId::Ratchet, String(u"ratchet") }, + { SoundId::Shaker, String(u"shaker") }, + { SoundId::Stones, String(u"stones") }, + { SoundId::Tambourine, String(u"tambourine") }, + { SoundId::Tubo, String(u"tubo") }, + { SoundId::Vibraslap, String(u"vibraslap") }, + { SoundId::Whip, String(u"whip") }, + { SoundId::Snap, String(u"snap") }, + { SoundId::Clap, String(u"clap") }, + { SoundId::Slap, String(u"slap") }, + { SoundId::Stamp, String(u"stamp") }, + { SoundId::Choir, String(u"choir") }, + { SoundId::Kazoo, String(u"kazoo") }, + { SoundId::Taiko, String(u"taiko") }, + { SoundId::Metronome, String(u"metronome") }, + { SoundId::Last, String(u"last") } }; inline const String& soundIdToString(const SoundId id) { auto search = ID_STRINGS.find(id); if (search == ID_STRINGS.cend()) { - return UNDEFINED_STR; + static const String UNDEFINED_ID_STR(u"undefined_id"); + return UNDEFINED_ID_STR; } return search->second; @@ -607,19 +617,20 @@ inline SoundId soundIdFromString(const String& str) static const std::unordered_map CATEGORY_STRINGS { - { SoundCategory::Keyboards, String(u"Keyboards") }, - { SoundCategory::Strings, String(u"Strings") }, - { SoundCategory::Winds, String(u"Winds") }, - { SoundCategory::Percussions, String(u"Percussions") }, - { SoundCategory::Voices, String(u"Voices") }, - { SoundCategory::Last, String(u"Last") } + { SoundCategory::Keyboards, String(u"keyboards") }, + { SoundCategory::Strings, String(u"strings") }, + { SoundCategory::Winds, String(u"winds") }, + { SoundCategory::Percussions, String(u"percussions") }, + { SoundCategory::Voices, String(u"voices") }, + { SoundCategory::Last, String(u"last") } }; inline const String& soundCategoryToString(const SoundCategory category) { auto search = CATEGORY_STRINGS.find(category); if (search == CATEGORY_STRINGS.cend()) { - return UNDEFINED_STR; + static const String UNDEFINED_SUBCATEGORY_STR(u"undefined"); + return UNDEFINED_SUBCATEGORY_STR; } return search->second; @@ -640,137 +651,153 @@ inline SoundCategory soundCategoryFromString(const String& str) static const std::unordered_map SUBCATEGORY_STRINGS { - { SoundSubCategory::English, String(u"English") }, - { SoundSubCategory::Armenian, String(u"Armenian") }, - { SoundSubCategory::Alpine, String(u"Alpine") }, - { SoundSubCategory::Australian, String(u"Australian") }, - { SoundSubCategory::Irish, String(u"Irish") }, - { SoundSubCategory::French, String(u"French") }, - { SoundSubCategory::Chinese, String(u"Chinese") }, - { SoundSubCategory::Vienna, String(u"Vienna") }, - { SoundSubCategory::Greek, String(u"Greek") }, - { SoundSubCategory::Japanese, String(u"Japanese") }, - { SoundSubCategory::Tibetan, String(u"Tibetan") }, - { SoundSubCategory::African, String(u"African") }, - { SoundSubCategory::Indian, String(u"Indian") }, - { SoundSubCategory::Spanish, String(u"Spanish") }, - { SoundSubCategory::Swedish, String(u"Swedish") }, - { SoundSubCategory::Hungarian, String(u"Hungarian") }, - { SoundSubCategory::Romanian, String(u"Romanian") }, - { SoundSubCategory::CentralEuropean, String(u"CentralEuropean") }, - - { SoundSubCategory::Baroque, String(u"Baroque") }, - { SoundSubCategory::Classical, String(u"Classical") }, - { SoundSubCategory::Modern, String(u"Modern") }, - { SoundSubCategory::Orchestral, String(u"Orchestral") }, - - { SoundSubCategory::Hammond, String(u"Hammond") }, - { SoundSubCategory::Wagner, String(u"Wagner") }, - { SoundSubCategory::Orff, String(u"Orff") }, - { SoundSubCategory::Huang, String(u"Huang") }, - { SoundSubCategory::Hohner, String(u"Hohner") }, - - { SoundSubCategory::Percussive, String(u"Percussive") }, - { SoundSubCategory::Piped, String(u"Piped") }, - { SoundSubCategory::Rotary, String(u"Rotary") }, - { SoundSubCategory::Reed, String(u"Reed") }, - { SoundSubCategory::Foot, String(u"Foot") }, - { SoundSubCategory::Hand, String(u"Hand") }, - { SoundSubCategory::Finger, String(u"Finger") }, - { SoundSubCategory::Boy, String(u"Boy") }, - { SoundSubCategory::Girl, String(u"Girl") }, - { SoundSubCategory::Male, String(u"Male") }, - { SoundSubCategory::Female, String(u"Female") }, - { SoundSubCategory::Pad, String(u"Pad") }, - { SoundSubCategory::Plucked, String(u"Plucked") }, - - { SoundSubCategory::Temple, String(u"Temple") }, - { SoundSubCategory::Military, String(u"Military") }, - { SoundSubCategory::Ride, String(u"Ride") }, - { SoundSubCategory::Sleigh, String(u"Sleigh") }, - { SoundSubCategory::Cow, String(u"Cow") }, - { SoundSubCategory::Marching, String(u"Marching") }, - - { SoundSubCategory::Splash, String(u"Splash") }, - { SoundSubCategory::Crash, String(u"Crash") }, - { SoundSubCategory::Plate, String(u"Plate") }, - { SoundSubCategory::Bowl, String(u"Bowl") }, - { SoundSubCategory::Frame, String(u"Frame") }, - { SoundSubCategory::Slit, String(u"Slit") }, - { SoundSubCategory::Field, String(u"Field") }, - { SoundSubCategory::Snare, String(u"Snare") }, - { SoundSubCategory::Brake, String(u"Brake") }, - { SoundSubCategory::Slide, String(u"Slide") }, - { SoundSubCategory::Pocket, String(u"Pocket") }, - { SoundSubCategory::Garklein, String(u"Garklein") }, - { SoundSubCategory::Toy, String(u"Toy") }, - { SoundSubCategory::TwelveString, String(u"TwelveString") }, - - { SoundSubCategory::Grand, String(u"Grand") }, - { SoundSubCategory::HonkyTonk, String(u"HonkyTonk") }, - { SoundSubCategory::Upright, String(u"Upright") }, - { SoundSubCategory::Prima, String(u"Prima") }, - { SoundSubCategory::Secunda, String(u"Secunda") }, - - { SoundSubCategory::Electric, String(u"Electric") }, - { SoundSubCategory::Acoustic, String(u"Acoustic") }, - { SoundSubCategory::Fretless, String(u"Fretless") }, - { SoundSubCategory::Pedal, String(u"Pedal") }, - { SoundSubCategory::Steel, String(u"Steel") }, - { SoundSubCategory::Metal, String(u"Metal") }, - { SoundSubCategory::Iron, String(u"Iron") }, - { SoundSubCategory::Brass, String(u"Brass") }, - { SoundSubCategory::Tin, String(u"Tin") }, - { SoundSubCategory::Nylon, String(u"Nylon") }, - { SoundSubCategory::Wooden, String(u"Wooden") }, - { SoundSubCategory::Sandpaper, String(u"Sandpaper") }, - { SoundSubCategory::Glass, String(u"Glass") }, - { SoundSubCategory::Shell, String(u"Shell") }, - { SoundSubCategory::Wind, String(u"Wind") }, - - { SoundSubCategory::Treble, String(u"Treble") }, - { SoundSubCategory::Diatonic, String(u"Diatonic") }, - { SoundSubCategory::Chromatic, String(u"Chromatic") }, - { SoundSubCategory::Octave, String(u"Octave") }, - - { SoundSubCategory::Piccolo, String(u"Piccolo") }, - { SoundSubCategory::Alto, String(u"Alto") }, - { SoundSubCategory::Tenor, String(u"Tenor") }, - { SoundSubCategory::Baritone, String(u"Baritone") }, - { SoundSubCategory::Soprano, String(u"Soprano") }, - { SoundSubCategory::Mezzo_Soprano, String(u"Mezzo_Soprano") }, - { SoundSubCategory::Sopranino, String(u"Sopranino") }, - { SoundSubCategory::Sopranissimo, String(u"Sopranissimo") }, - { SoundSubCategory::Counter_Tenor, String(u"Counter_Tenor") }, - { SoundSubCategory::Contra, String(u"Contra") }, - { SoundSubCategory::Contra_Alto, String(u"Contra_Alto") }, - { SoundSubCategory::Sub_Contra_Alto, String(u"Sub_Contra_Alto") }, - { SoundSubCategory::Contra_Bass, String(u"Contra_Bass") }, - { SoundSubCategory::Sub_Contra_Bass, String(u"Sub_Contra_Bass") }, - { SoundSubCategory::Double_Contra_Bass, String(u"Double_Contra_Bass") }, - { SoundSubCategory::Bass, String(u"Bass") }, - { SoundSubCategory::Great_Bass, String(u"Great_Bass") }, - { SoundSubCategory::Hyper_Bass, String(u"Hyper_Bass") }, - { SoundSubCategory::Melody, String(u"Melody") }, - - { SoundSubCategory::FX_Goblins, String(u"FX_Goblins") }, - { SoundSubCategory::FX_Atmosphere, String(u"FX_Atmosphere") }, - { SoundSubCategory::FX_Brightness, String(u"FX_Brightness") }, - { SoundSubCategory::FX_Crystal, String(u"FX_Crystal") }, - { SoundSubCategory::FX_Echoes, String(u"FX_Echoes") }, - { SoundSubCategory::FX_Rain, String(u"FX_Rain") }, - { SoundSubCategory::FX_SciFi, String(u"FX_SciFi") }, - { SoundSubCategory::FX_SoundTrack, String(u"FX_SoundTrack") }, - { SoundSubCategory::Primary, String(u"Primary") }, - { SoundSubCategory::Secondary, String(u"Secondary") }, - { SoundSubCategory::Last, String(u"Last") } + { SoundSubCategory::English, String(u"english") }, + { SoundSubCategory::Armenian, String(u"armenian") }, + { SoundSubCategory::Alpine, String(u"alpine") }, + { SoundSubCategory::Australian, String(u"australian") }, + { SoundSubCategory::Irish, String(u"irish") }, + { SoundSubCategory::French, String(u"french") }, + { SoundSubCategory::Chinese, String(u"chinese") }, + { SoundSubCategory::Vienna, String(u"vienna") }, + { SoundSubCategory::Greek, String(u"greek") }, + { SoundSubCategory::Japanese, String(u"japanese") }, + { SoundSubCategory::Tibetan, String(u"tibetan") }, + { SoundSubCategory::African, String(u"african") }, + { SoundSubCategory::Indian, String(u"indian") }, + { SoundSubCategory::Spanish, String(u"spanish") }, + { SoundSubCategory::Swedish, String(u"swedish") }, + { SoundSubCategory::Hungarian, String(u"hungarian") }, + { SoundSubCategory::Romanian, String(u"romanian") }, + { SoundSubCategory::CentralEuropean, String(u"central_european") }, + + { SoundSubCategory::Baroque, String(u"baroque") }, + { SoundSubCategory::Classical, String(u"classical") }, + { SoundSubCategory::Modern, String(u"modern") }, + { SoundSubCategory::Orchestral, String(u"orchestral") }, + + { SoundSubCategory::Hammond, String(u"hammond") }, + { SoundSubCategory::Wagner, String(u"wagner") }, + { SoundSubCategory::Orff, String(u"orff") }, + { SoundSubCategory::Huang, String(u"huang") }, + { SoundSubCategory::Hohner, String(u"hohner") }, + + { SoundSubCategory::Percussive, String(u"percussive") }, + { SoundSubCategory::Piped, String(u"piped") }, + { SoundSubCategory::Rotary, String(u"rotary") }, + { SoundSubCategory::Reed, String(u"reed") }, + { SoundSubCategory::Foot, String(u"foot") }, + { SoundSubCategory::Hand, String(u"hand") }, + { SoundSubCategory::Finger, String(u"finger") }, + { SoundSubCategory::Boy, String(u"boy") }, + { SoundSubCategory::Girl, String(u"girl") }, + { SoundSubCategory::Male, String(u"male") }, + { SoundSubCategory::Female, String(u"female") }, + { SoundSubCategory::Pad, String(u"pad") }, + { SoundSubCategory::Plucked, String(u"plucked") }, + + { SoundSubCategory::Temple, String(u"temple") }, + { SoundSubCategory::Military, String(u"military") }, + { SoundSubCategory::Ride, String(u"ride") }, + { SoundSubCategory::Sleigh, String(u"sleigh") }, + { SoundSubCategory::Cow, String(u"cow") }, + { SoundSubCategory::Marching, String(u"marching") }, + + { SoundSubCategory::Splash, String(u"splash") }, + { SoundSubCategory::Crash, String(u"crash") }, + { SoundSubCategory::Plate, String(u"plate") }, + { SoundSubCategory::Bowl, String(u"bowl") }, + { SoundSubCategory::Frame, String(u"frame") }, + { SoundSubCategory::Slit, String(u"slit") }, + { SoundSubCategory::Field, String(u"field") }, + { SoundSubCategory::Snare, String(u"snare") }, + { SoundSubCategory::Brake, String(u"brake") }, + { SoundSubCategory::Slide, String(u"slide") }, + { SoundSubCategory::Pocket, String(u"pocket") }, + { SoundSubCategory::Garklein, String(u"garklein") }, + { SoundSubCategory::Toy, String(u"toy") }, + { SoundSubCategory::TwelveString, String(u"twelve_string") }, + + { SoundSubCategory::Grand, String(u"grand") }, + { SoundSubCategory::HonkyTonk, String(u"honky_tonk") }, + { SoundSubCategory::Upright, String(u"upright") }, + { SoundSubCategory::Prima, String(u"prima") }, + { SoundSubCategory::Secunda, String(u"secunda") }, + + { SoundSubCategory::Electric, String(u"electric") }, + { SoundSubCategory::Acoustic, String(u"acoustic") }, + { SoundSubCategory::Fretless, String(u"fretless") }, + { SoundSubCategory::Pedal, String(u"pedal") }, + { SoundSubCategory::Steel, String(u"steel") }, + { SoundSubCategory::Metal, String(u"metal") }, + { SoundSubCategory::Iron, String(u"iron") }, + { SoundSubCategory::Brass, String(u"brass") }, + { SoundSubCategory::Tin, String(u"tin") }, + { SoundSubCategory::Nylon, String(u"nylon") }, + { SoundSubCategory::Wooden, String(u"wooden") }, + { SoundSubCategory::Sandpaper, String(u"sandpaper") }, + { SoundSubCategory::Glass, String(u"glass") }, + { SoundSubCategory::Shell, String(u"shell") }, + { SoundSubCategory::Wind, String(u"wind") }, + { SoundSubCategory::Soft, String(u"soft") }, + + { SoundSubCategory::Treble, String(u"treble") }, + { SoundSubCategory::Diatonic, String(u"diatonic") }, + { SoundSubCategory::Chromatic, String(u"chromatic") }, + { SoundSubCategory::Octave, String(u"octave") }, + + { SoundSubCategory::Piccolo, String(u"piccolo") }, + { SoundSubCategory::Alto, String(u"alto") }, + { SoundSubCategory::Tenor, String(u"tenor") }, + { SoundSubCategory::Baritone, String(u"baritone") }, + { SoundSubCategory::Soprano, String(u"soprano") }, + { SoundSubCategory::Mezzo_Soprano, String(u"mezzo_soprano") }, + { SoundSubCategory::Sopranino, String(u"sopranino") }, + { SoundSubCategory::Sopranissimo, String(u"sopranissimo") }, + { SoundSubCategory::Counter_Tenor, String(u"counter_tenor") }, + { SoundSubCategory::Contra, String(u"contra") }, + { SoundSubCategory::Contra_Alto, String(u"contra_alto") }, + { SoundSubCategory::Sub_Contra_Alto, String(u"sub_contra_alto") }, + { SoundSubCategory::Contra_Bass, String(u"contra_bass") }, + { SoundSubCategory::Sub_Contra_Bass, String(u"sub_contra_bass") }, + { SoundSubCategory::Double_Contra_Bass, String(u"double_contra_bass") }, + { SoundSubCategory::Bass, String(u"bass") }, + { SoundSubCategory::Great_Bass, String(u"great_bass") }, + { SoundSubCategory::Hyper_Bass, String(u"hyper_bass") }, + { SoundSubCategory::Melody, String(u"melody") }, + + { SoundSubCategory::In_C, String(u"in_c") }, + { SoundSubCategory::In_D, String(u"in_d") }, + { SoundSubCategory::In_D_flat, String(u"in_d_flat") }, + { SoundSubCategory::In_E, String(u"in_e") }, + { SoundSubCategory::In_E_flat, String(u"in_e_flat") }, + { SoundSubCategory::In_F, String(u"in_f") }, + { SoundSubCategory::In_G, String(u"in_g") }, + { SoundSubCategory::In_G_flat, String(u"in_g_flat") }, + { SoundSubCategory::In_A, String(u"in_a") }, + { SoundSubCategory::In_A_flat, String(u"in_a_flat") }, + { SoundSubCategory::In_B, String(u"in_b") }, + { SoundSubCategory::In_B_flat, String(u"in_b_flat") }, + + { SoundSubCategory::FX_Goblins, String(u"fx_goblins") }, + { SoundSubCategory::FX_Atmosphere, String(u"fx_atmosphere") }, + { SoundSubCategory::FX_Brightness, String(u"fx_brightness") }, + { SoundSubCategory::FX_Crystal, String(u"fx_crystal") }, + { SoundSubCategory::FX_Echoes, String(u"fx_echoes") }, + { SoundSubCategory::FX_Rain, String(u"fx_rain") }, + { SoundSubCategory::FX_SciFi, String(u"fx_scifi") }, + { SoundSubCategory::FX_SoundTrack, String(u"fx_soundtrack") }, + { SoundSubCategory::Primary, String(u"primary") }, + { SoundSubCategory::Secondary, String(u"secondary") }, + { SoundSubCategory::Section, String(u"section") }, + { SoundSubCategory::Last, String(u"last") } }; inline const String& soundSubCategoryToString(const SoundSubCategory& subCategory) { auto search = SUBCATEGORY_STRINGS.find(subCategory); if (search == SUBCATEGORY_STRINGS.cend()) { - return UNDEFINED_STR; + static const String UNDEFINED_SUBCATEGORY_STR(u"undefined"); + return UNDEFINED_SUBCATEGORY_STR; } return search->second; @@ -805,14 +832,14 @@ struct SoundSubCategories : public std::set subCategoryStrList.push_back(soundSubCategoryToString(subCategory)); } - return subCategoryStrList.join(u","); + return subCategoryStrList.join(u":"); } static SoundSubCategories fromString(const String& str) { SoundSubCategories result; - StringList subCategoryStrList = str.split(u","); + StringList subCategoryStrList = str.split(u":"); for (const String& subStr : subCategoryStrList) { result.insert(soundSubCategoryFromString(subStr)); } diff --git a/src/framework/musesampler/internal/musesamplerresolver.cpp b/src/framework/musesampler/internal/musesamplerresolver.cpp index ea0a7bffc4069..e8c457c51d2e1 100644 --- a/src/framework/musesampler/internal/musesamplerresolver.cpp +++ b/src/framework/musesampler/internal/musesamplerresolver.cpp @@ -186,26 +186,29 @@ bool MuseSamplerResolver::checkLibrary() const bool MuseSamplerResolver::isVersionSupported() const { - bool ok = true; - std::array minimumSupported = parseVersion(configuration()->minimumSupportedVersion(), ok); - if (!ok) { + IF_ASSERT_FAILED(m_libHandler) { return false; } - std::array current = parseVersion(version(), ok); + bool ok = true; + std::array minimumSupported = parseVersion(configuration()->minimumSupportedVersion(), ok); if (!ok) { return false; } - if (current.at(0) > minimumSupported.at(0)) { + int currentMajorNum = m_libHandler->getVersionMajor(); + int currentMinorNum = m_libHandler->getVersionMinor(); + int currentRevisionNum = m_libHandler->getVersionRevision(); + + if (currentMajorNum > minimumSupported.at(0)) { return true; - } else if (current.at(0) == minimumSupported.at(0)) { - if (current.at(1) > minimumSupported.at(1)) { + } else if (currentMajorNum == minimumSupported.at(0)) { + if (currentMinorNum > minimumSupported.at(1)) { return true; - } else if (current.at(1) == minimumSupported.at(1)) { - if (current.at(2) > minimumSupported.at(2)) { + } else if (currentMinorNum == minimumSupported.at(1)) { + if (currentRevisionNum > minimumSupported.at(2)) { return true; - } else if (current.at(2) == minimumSupported.at(2)) { + } else if (currentRevisionNum == minimumSupported.at(2)) { return true; } } diff --git a/src/playback/playbacktypes.h b/src/playback/playbacktypes.h index f8e008349c744..46132a8fb642f 100644 --- a/src/playback/playbacktypes.h +++ b/src/playback/playbacktypes.h @@ -112,17 +112,6 @@ struct SoundProfile { return search->second; } - auto nearestMatch = std::find_if(data.cbegin(), - data.cend(), - [key](const auto& pair) { - return pair.first.id == key.id - && pair.first.category == key.category; - }); - - if (nearestMatch != data.cend()) { - return nearestMatch->second; - } - static audio::AudioResourceMeta empty; return empty; }