Last active
August 30, 2023 01:24
-
-
Save Preinfarction/a775d4862a30527649e62b541fbbb091 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
def interval_difference(interval1, interval2): | |
interval_difference = (e1 - e2 for (e1, e2) in zip(interval1, interval2)) | |
return tuple(interval_difference) | |
def interval_sum(interval1, interval2): | |
interval_sum = (e1 + e2 for (e1, e2) in zip(interval1, interval2)) | |
return tuple(interval_sum) | |
def quality_and_ordinal_to_interval(quality, ordinal): | |
base_name_to_interval = { | |
"P1": (0, 0), | |
"m2": (1, 1), | |
"M2": (2, 1), | |
"m3": (3, 2), | |
"M3": (4, 2), | |
"P4": (5, 3), | |
"P5": (7, 4), | |
"m6": (8, 5), | |
"M6": (9, 5), | |
"m7": (10, 6), | |
"M7": (11, 6), | |
} | |
name = quality + str(ordinal) | |
if name in base_name_to_interval: | |
return base_name_to_interval[name] | |
if ordinal < 1: | |
return interval_difference(quality_and_ordinal_to_interval(quality, ordinal + 7), (12, 7)) | |
if ordinal > 7: | |
return interval_sum(quality_and_ordinal_to_interval(quality, ordinal - 7), (12, 7)) | |
if re.match(r"[d]+", quality): | |
degree_of_diminution = len(quality) | |
if ordinal in [1, 4, 5]: | |
return interval_sum(quality_and_ordinal_to_interval("P", ordinal), (-degree_of_diminution, 0)) | |
if ordinal in [2, 3, 6, 7]: | |
return interval_sum(quality_and_ordinal_to_interval("m", ordinal), (-degree_of_diminution, 0)) | |
if re.match(r"[A]+", quality): | |
degree_of_augmentation = len(quality) | |
if ordinal in [1, 4, 5]: | |
return interval_sum(quality_and_ordinal_to_interval("P", ordinal), (degree_of_augmentation, 0)) | |
if ordinal in [2, 3, 6, 7]: | |
return interval_sum(quality_and_ordinal_to_interval("M", ordinal), (degree_of_augmentation, 0)) | |
def name_to_interval(name): | |
_, quality, ordinal, _ = re.split(r"^([AdMmP]+)([0-9\-]+)$", name) | |
ordinal = int(ordinal) | |
interval = quality_and_ordinal_to_interval(quality, ordinal) | |
return interval | |
print(name_to_interval("AAAAAA-8")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment