diff --git a/src/sfizz/Opcode.cpp b/src/sfizz/Opcode.cpp index ff6cbc6d..1a60ff78 100644 --- a/src/sfizz/Opcode.cpp +++ b/src/sfizz/Opcode.cpp @@ -132,18 +132,27 @@ absl::optional readNoteValue(absl::string_view value) absl::string_view validFlatLetters = "degab"; /// - char sharpOrFlatLetter = absl::ascii_tolower(value.empty() ? '\0' : value.front()); - if (sharpOrFlatLetter == '#') { - if (validSharpLetters.find(noteLetter) == absl::string_view::npos) - return {}; - ++noteNumber; - value.remove_prefix(1); - } - else if (sharpOrFlatLetter == 'b') { - if (validFlatLetters.find(noteLetter) == absl::string_view::npos) - return {}; - --noteNumber; - value.remove_prefix(1); + std::pair flatSharpPrefixes[] = { + { "#", +1 }, + { u8"♯", +1 }, + { "b", -1 }, + { u8"♭", -1 }, + }; + + for (const auto& prefix : flatSharpPrefixes) { + if (absl::StartsWith(value, prefix.first)) { + if (prefix.second == +1) { + if (validSharpLetters.find(noteLetter) == absl::string_view::npos) + return {}; + } + else if (prefix.second == -1) { + if (validFlatLetters.find(noteLetter) == absl::string_view::npos) + return {}; + } + noteNumber += prefix.second; + value.remove_prefix(prefix.first.size()); + break; + } } int octaveNumber; diff --git a/tests/OpcodeT.cpp b/tests/OpcodeT.cpp index 23cfdda0..24d6a98c 100644 --- a/tests/OpcodeT.cpp +++ b/tests/OpcodeT.cpp @@ -134,23 +134,43 @@ TEST_CASE("[Opcode] Note values") noteValue = sfz::readNoteValue("c#4"); REQUIRE(noteValue); REQUIRE(*noteValue == 61); + noteValue = sfz::readNoteValue(u8"c♯4"); + REQUIRE(noteValue); + REQUIRE(*noteValue == 61); noteValue = sfz::readNoteValue("C#4"); REQUIRE(noteValue); REQUIRE(*noteValue == 61); + noteValue = sfz::readNoteValue(u8"C♯4"); + REQUIRE(noteValue); + REQUIRE(*noteValue == 61); noteValue = sfz::readNoteValue("e#4"); REQUIRE(!noteValue); + noteValue = sfz::readNoteValue(u8"e♯4"); + REQUIRE(!noteValue); noteValue = sfz::readNoteValue("E#4"); REQUIRE(!noteValue); + noteValue = sfz::readNoteValue(u8"E♯4"); + REQUIRE(!noteValue); noteValue = sfz::readNoteValue("db4"); REQUIRE(noteValue); REQUIRE(*noteValue == 61); + noteValue = sfz::readNoteValue(u8"d♭4"); + REQUIRE(noteValue); + REQUIRE(*noteValue == 61); noteValue = sfz::readNoteValue("Db4"); REQUIRE(noteValue); REQUIRE(*noteValue == 61); + noteValue = sfz::readNoteValue(u8"D♭4"); + REQUIRE(noteValue); + REQUIRE(*noteValue == 61); noteValue = sfz::readNoteValue("fb4"); REQUIRE(!noteValue); + noteValue = sfz::readNoteValue(u8"f♭4"); + REQUIRE(!noteValue); noteValue = sfz::readNoteValue("Fb4"); REQUIRE(!noteValue); + noteValue = sfz::readNoteValue(u8"F♭4"); + REQUIRE(!noteValue); } TEST_CASE("[Opcode] Categories")