summaryrefslogtreecommitdiff
path: root/src/pke-at-common.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pke-at-common.cpp')
-rw-r--r--src/pke-at-common.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/pke-at-common.cpp b/src/pke-at-common.cpp
index 8372bcc..1df5521 100644
--- a/src/pke-at-common.cpp
+++ b/src/pke-at-common.cpp
@@ -53,3 +53,130 @@ AssetHandle pke_at_audio_get_or_generate_sawtooth(double pitch_freq, double dura
handle = AM_Register(key, PKE_ASSET_TYPE_AUDIO, bytes, len, 64, &details);
return handle;
}
+
+int case_insensitive_equal(const char *lhs, const char *rhs) {
+ while (*lhs && *rhs) {
+ if (tolower((unsigned char)*lhs) != tolower((unsigned char)*rhs)) {
+ return 0;
+ }
+ lhs++;
+ rhs++;
+ }
+ return *lhs == *rhs;
+}
+
+PKE_AT_KEY_INDEX parse_key_from_string(const char *key) {
+ switch (key[0]) {
+ case 'c':
+ case 'C':
+ if (strlen(key) == 1 || key[1] != '#') {
+ return PKE_AT_KEY_INDEX_C;
+ }
+ if (key[1] == '#') {
+ return PKE_AT_KEY_INDEX_C_SHARP;
+ }
+ break;
+ case 'd':
+ case 'D':
+ if (strlen(key) == 1 || (key[1] != 'b' && key[1] != '#')) {
+ return PKE_AT_KEY_INDEX_D;
+ }
+ if (key[1] == 'b') {
+ return PKE_AT_KEY_INDEX_D_FLAT;
+ }
+ if (key[1] == '#') {
+ return PKE_AT_KEY_INDEX_D_SHARP;
+ }
+ break;
+ case 'e':
+ case 'E':
+ if (strlen(key) == 1 || key[1] != 'b') {
+ return PKE_AT_KEY_INDEX_E;
+ }
+ if (key[1] == 'b') {
+ return PKE_AT_KEY_INDEX_E_FLAT;
+ }
+ break;
+ case 'f':
+ case 'F':
+ if (strlen(key) == 1 || (key[1] != 'b' && key[1] != '#')) {
+ return PKE_AT_KEY_INDEX_F;
+ }
+ if (key[1] == '#') {
+ return PKE_AT_KEY_INDEX_F_SHARP;
+ }
+ break;
+ case 'g':
+ case 'G':
+ if (strlen(key) == 1 || (key[1] != 'b' && key[1] != '#')) {
+ return PKE_AT_KEY_INDEX_G;
+ }
+ if (key[1] == 'b') {
+ return PKE_AT_KEY_INDEX_G_FLAT;
+ }
+ if (key[1] == '#') {
+ return PKE_AT_KEY_INDEX_G_SHARP;
+ }
+ break;
+ case 'a':
+ case 'A':
+ if (strlen(key) == 1 || (key[1] != 'b' && key[1] != '#')) {
+ return PKE_AT_KEY_INDEX_A;
+ }
+ if (key[1] == 'b') {
+ return PKE_AT_KEY_INDEX_A_FLAT;
+ }
+ if (key[1] == '#') {
+ return PKE_AT_KEY_INDEX_A_SHARP;
+ }
+ break;
+ case 'b':
+ case 'B':
+ if (strlen(key) == 1 || key[1] != 'b') {
+ return PKE_AT_KEY_INDEX_B;
+ }
+ if (key[1] == 'b') {
+ return PKE_AT_KEY_INDEX_B_FLAT;
+ }
+ default:
+ break;
+ }
+ return PKE_AT_KEY_INDEX_NONE;
+}
+
+PKE_AT_SECTION_TYPE_INDEX parse_section_type_from_string(const char *section) {
+ if (case_insensitive_equal(section, "verse")) {
+ return PKE_AT_SECTION_TYPE_INDEX_VERSE;
+ }
+ if (case_insensitive_equal(section, "chorus")) {
+ return PKE_AT_SECTION_TYPE_INDEX_CHORUS;
+ }
+ if (case_insensitive_equal(section, "bridge")) {
+ return PKE_AT_SECTION_TYPE_INDEX_BRIDGE;
+ }
+ if (case_insensitive_equal(section, "intro")) {
+ return PKE_AT_SECTION_TYPE_INDEX_INTRO;
+ }
+ if (case_insensitive_equal(section, "outro")) {
+ return PKE_AT_SECTION_TYPE_INDEX_OUTRO;
+ }
+ if (case_insensitive_equal(section, "end")) {
+ return PKE_AT_SECTION_TYPE_INDEX_END;
+ }
+ if (case_insensitive_equal(section, "ending")) {
+ return PKE_AT_SECTION_TYPE_INDEX_ENDING;
+ }
+ if (case_insensitive_equal(section, "instrumental")) {
+ return PKE_AT_SECTION_TYPE_INDEX_INSTRUMENTAL;
+ }
+ if (case_insensitive_equal(section, "interlude")) {
+ return PKE_AT_SECTION_TYPE_INDEX_INTERLUDE;
+ }
+ if (case_insensitive_equal(section, "refrain")) {
+ return PKE_AT_SECTION_TYPE_INDEX_REFRAIN;
+ }
+ if (case_insensitive_equal(section, "tag")) {
+ return PKE_AT_SECTION_TYPE_INDEX_TAG;
+ }
+ return PKE_AT_SECTION_TYPE_INDEX_NONE;
+}