Handle unicode note names
This commit is contained in:
parent
86e7e6fbcc
commit
bc466866c3
2 changed files with 41 additions and 12 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue