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";
|
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;
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue