Skip to content

Instantly share code, notes, and snippets.

@Preinfarction
Created November 11, 2022 04:58
Show Gist options
  • Save Preinfarction/df90158d9bced90e43470890af336089 to your computer and use it in GitHub Desktop.
Save Preinfarction/df90158d9bced90e43470890af336089 to your computer and use it in GitHub Desktop.
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