Handle unicode note names

This commit is contained in:
Jean Pierre Cimalando 2021-02-02 17:03:24 +01:00
parent 86e7e6fbcc
commit bc466866c3
2 changed files with 41 additions and 12 deletions

View file

@ -132,18 +132,27 @@ absl::optional<uint8_t> readNoteValue(absl::string_view value)
absl::string_view validFlatLetters = "degab"; absl::string_view validFlatLetters = "degab";
/// ///
char sharpOrFlatLetter = absl::ascii_tolower(value.empty() ? '\0' : value.front()); std::pair<absl::string_view, int> flatSharpPrefixes[] = {
if (sharpOrFlatLetter == '#') { { "#", +1 },
if (validSharpLetters.find(noteLetter) == absl::string_view::npos) { u8"", +1 },
return {}; { "b", -1 },
++noteNumber; { u8"", -1 },
value.remove_prefix(1); };
}
else if (sharpOrFlatLetter == 'b') { for (const auto& prefix : flatSharpPrefixes) {
if (validFlatLetters.find(noteLetter) == absl::string_view::npos) if (absl::StartsWith(value, prefix.first)) {
return {}; if (prefix.second == +1) {
--noteNumber; if (validSharpLetters.find(noteLetter) == absl::string_view::npos)
value.remove_prefix(1); 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; int octaveNumber;

View file

@ -134,23 +134,43 @@ TEST_CASE("[Opcode] Note values")
noteValue = sfz::readNoteValue("c#4"); noteValue = sfz::readNoteValue("c#4");
REQUIRE(noteValue); REQUIRE(noteValue);
REQUIRE(*noteValue == 61); REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue(u8"c♯4");
REQUIRE(noteValue);
REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue("C#4"); noteValue = sfz::readNoteValue("C#4");
REQUIRE(noteValue); REQUIRE(noteValue);
REQUIRE(*noteValue == 61); REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue(u8"C♯4");
REQUIRE(noteValue);
REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue("e#4"); noteValue = sfz::readNoteValue("e#4");
REQUIRE(!noteValue); REQUIRE(!noteValue);
noteValue = sfz::readNoteValue(u8"e♯4");
REQUIRE(!noteValue);
noteValue = sfz::readNoteValue("E#4"); noteValue = sfz::readNoteValue("E#4");
REQUIRE(!noteValue); REQUIRE(!noteValue);
noteValue = sfz::readNoteValue(u8"E♯4");
REQUIRE(!noteValue);
noteValue = sfz::readNoteValue("db4"); noteValue = sfz::readNoteValue("db4");
REQUIRE(noteValue); REQUIRE(noteValue);
REQUIRE(*noteValue == 61); REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue(u8"d♭4");
REQUIRE(noteValue);
REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue("Db4"); noteValue = sfz::readNoteValue("Db4");
REQUIRE(noteValue); REQUIRE(noteValue);
REQUIRE(*noteValue == 61); REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue(u8"D♭4");
REQUIRE(noteValue);
REQUIRE(*noteValue == 61);
noteValue = sfz::readNoteValue("fb4"); noteValue = sfz::readNoteValue("fb4");
REQUIRE(!noteValue); REQUIRE(!noteValue);
noteValue = sfz::readNoteValue(u8"f♭4");
REQUIRE(!noteValue);
noteValue = sfz::readNoteValue("Fb4"); noteValue = sfz::readNoteValue("Fb4");
REQUIRE(!noteValue); REQUIRE(!noteValue);
noteValue = sfz::readNoteValue(u8"F♭4");
REQUIRE(!noteValue);
} }
TEST_CASE("[Opcode] Categories") TEST_CASE("[Opcode] Categories")