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";
///
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<absl::string_view, int> 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;

View file

@ -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")