Created
November 11, 2022 04:58
-
-
Save Preinfarction/df90158d9bced90e43470890af336089 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 | |
from fractions import Fraction | |
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 ab_to_natural_gravity(a, b): | |
if a == 0: | |
return 0 | |
if a == 1 and b <= 0: | |
return 0 | |
if a == 1 and b >= 1: | |
return 1 | |
if a == 2: | |
return 1 | |
if a == 3: | |
return 2 | |
if a == 4: | |
return 3 | |
if a == 5: | |
return 3 | |
if a == 6: | |
return 4 | |
if a == 7: | |
return 5 | |
if a == 8 and b <= 3: | |
return 5 | |
if a == 8 and b >= 4: | |
return 6 | |
def pprint(interval_string): | |
interval_string = re.sub(r"dP", r"d", interval_string) | |
interval_string = re.sub(r"AP", r"A", interval_string) | |
interval_string = re.sub(r"GrP", r"Gr", interval_string) | |
interval_string = re.sub(r"AcP", r"Ac", interval_string) | |
interval_string = re.sub(r"dm", r"d", interval_string) | |
interval_string = re.sub(r"AM", r"A", interval_string) | |
return interval_string | |
def interval_to_frequency_ratio(interval): | |
(a, b, c) = interval | |
frequency_ratio = Fraction(27, 25) ** a * Fraction(375, 343) ** b * Fraction(245, 243) ** c | |
return frequency_ratio | |
def interval_to_quality(interval): | |
#print(interval, flush=True) | |
a, b, c = interval | |
if a >= 9: | |
return interval_to_quality(interval_difference((a, b, c), (9, 4, 6))) | |
if a < 0: | |
return interval_to_quality(interval_sum((a, b, c), (9, 4, 6))) | |
base_interval_to_quality = { | |
(0, 0, 0): "P", | |
(1, 0, 0): "m", | |
(1, 1, 1): "M", | |
(2, 1, 1): "P", | |
(3, 1, 2): "m", | |
(3, 2, 2): "M", | |
(4, 2, 3): "P", | |
(5, 2, 3): "P", | |
(6, 2, 4): "m", | |
(6, 3, 4): "M", | |
(7, 3, 5): "P", | |
(8, 3, 5): "m", | |
(8, 4, 6): "M", | |
} | |
if interval in base_interval_to_quality: | |
return base_interval_to_quality[interval] | |
natural_gravity = ab_to_natural_gravity(a, b) | |
gravity_difference = c - natural_gravity | |
if gravity_difference < 0: | |
return "Gr" * abs(gravity_difference) + interval_to_quality((a, b, c - gravity_difference)) | |
if gravity_difference > 0: | |
return "Ac" * gravity_difference + interval_to_quality((a, b, c - gravity_difference)) | |
if a == 0: | |
if b < 0: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 0: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 1: | |
if b < 0: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 1: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 2: | |
if b < 1: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 1: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 3: | |
if b < 1: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 2: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 4: | |
if b < 2: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 2: | |
return "A" + interval_to_quality((a, b -1, c)) | |
if a == 5: | |
if b < 2: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 2: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 6: | |
if b < 2: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 3: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 7: | |
if b < 3: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 3: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
if a == 8: | |
if b < 3: | |
return "d" + interval_to_quality((a, b + 1, c)) | |
if b > 4: | |
return "A" + interval_to_quality((a, b - 1, c)) | |
def name_interval(interval): | |
(a, b, c) = interval | |
ordinal = a + 1 | |
name = interval_to_quality(interval) + str(ordinal) | |
name = pprint(name) | |
return name | |
intervals = [ | |
(0, 0, 0), # P1 | |
(1, 0, 0), # m2 | |
(1, 1, 1), # M2 | |
(2, 1, 1), # P3 | |
(3, 1, 2), # m4 | |
(3, 2, 2), # M4 | |
(4, 2, 3), # P5 | |
(5, 2, 3), # P6 | |
(6, 2, 4), # m7 | |
(6, 3, 4), # M7 | |
(7, 3, 5), # P8 | |
(8, 3, 5), # m9 | |
(8, 4, 6), # M9 | |
(9, 4, 6), # P10 | |
(0, 0, 1), # Ac1 | |
(0, 1, 0), # A1 | |
(1, 0, 1), # Acm2 | |
] | |
for interval in intervals: | |
name = name_interval(interval) | |
frequency_ratio = interval_to_frequency_ratio(interval) | |
print(interval, ":", name, "::", frequency_ratio) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment