Skip to content

Instantly share code, notes, and snippets.

@Preinfarction
Last active September 23, 2023 14:15
Show Gist options
  • Select an option

  • Save Preinfarction/11f92e449d4486116c1381bf250c2f77 to your computer and use it in GitHub Desktop.

Select an option

Save Preinfarction/11f92e449d4486116c1381bf250c2f77 to your computer and use it in GitHub Desktop.
Name Interval Coordinates Expressed In The Rank-6 Lilley-Johnston Basis
import re
from fractions import Fraction
def ordinal_to_suffix(degree):
ds = str(degree)
if ds[-1] == "1":
if len(ds) > 1:
if ds[-2] == "1":
return "th"
return "st"
if ds[-1] == "2":
if len(ds) > 1:
if ds[-2] == "1":
return "th"
return "nd"
if ds[-1] == "3":
if len(ds) > 1:
if ds[-2] == "1":
return "th"
return "rd"
else:
return "th"
def interval_name_to_english(interval_string):
interval_string = re.sub(r"Sp", r"super-", interval_string)
interval_string = re.sub(r"Sb", r"sub-", interval_string)
interval_string = re.sub(r"Ac", r"acute ", interval_string)
interval_string = re.sub(r"Gr", r"grave ", interval_string)
interval_string = re.sub(r"m", r"minor ", interval_string)
interval_string = re.sub(r"d", r"diminished ", interval_string)
interval_string = re.sub(r"M", r"major ", interval_string)
interval_string = re.sub(r"Pr", r"prominent-", interval_string)
interval_string = re.sub(r"Re", r"recessed-", interval_string)
interval_string = re.sub(r"P", r"perfect ", interval_string)
interval_string = re.sub(r"De", r"descendant-", interval_string)
interval_string = re.sub(r"As", r"ascendant-", interval_string)
interval_string = re.sub(r"A", r"augmented ", interval_string)
return interval_string
def tune_interval_in_comma_basis(interval):
a, b, c, d, e, f = interval
ratio = Fraction(81, 80) ** a * Fraction(25, 24) ** b * Fraction(128, 125) ** c * Fraction(36, 35) ** d * Fraction(33, 32) ** e * Fraction(65, 64) ** f
return ratio
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"DeP", r"De", interval_string)
interval_string = re.sub(r"SbP", r"Sb", interval_string)
interval_string = re.sub(r"AsP", r"As", interval_string)
interval_string = re.sub(r"SpP", r"Sp", interval_string)
interval_string = re.sub(r"GrP", r"Gr", interval_string)
interval_string = re.sub(r"PrP([0-9]+)", r"Pr\1", interval_string)
interval_string = re.sub(r"ReP", r"Re", 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_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 interval_to_quality(interval):
a, b, c, d, e, f = interval
if c >= 7:
return interval_to_quality(interval_difference((a, b, c, d, e, f), (3, 12, 7, 0, 0, 0)))
if c < 0:
return interval_to_quality(interval_sum((a, b, c, d, e, f), (3, 12, 7, 0, 0, 0)))
base_interval_to_quality = {
(0, 0, 0, 0, 0, 0): "P",
(0, 1, 1, 0, 0, 0): "m",
(0, 2, 1, 0, 0, 0): "M",
(1, 3, 2, 0, 0, 0): "m",
(1, 4, 2, 0, 0, 0): "M",
(1, 5, 3, 0, 0, 0): "P",
(2, 7, 4, 0, 0, 0): "P",
(2, 8, 5, 0, 0, 0): "m",
(2, 9, 5, 0, 0, 0): "M",
(3, 10, 6, 0, 0, 0): "m",
(3, 11, 6, 0, 0, 0): "M",
}
c_to_natural_gravity = {
0: 0,
1: 0,
2: 1,
3: 1,
4: 2,
5: 2,
6: 3,
}
if interval in base_interval_to_quality:
return base_interval_to_quality[interval]
if f < 0:
return "Re" + interval_to_quality((a, b, c, d, e, f + 1))
if f > 0:
return "Pr" + interval_to_quality((a, b, c, d, e, f - 1))
if e < 0:
return "De" + interval_to_quality((a, b, c, d, e + 1, f))
if e > 0:
return "As" + interval_to_quality((a, b, c, d, e - 1, f))
if d < 0:
return "Sb" + interval_to_quality((a, b, c, d + 1, e, f))
if d > 0:
return "Sp" + interval_to_quality((a, b, c, d - 1, e, f))
natural_gravity = c_to_natural_gravity[c]
gravity_difference = a - natural_gravity
if gravity_difference < 0:
return "Gr" * abs(gravity_difference) + interval_to_quality((a - gravity_difference, b, c, d, e, f))
if gravity_difference > 0:
return "Ac" * gravity_difference + interval_to_quality((a - gravity_difference, b, c, d, e, f))
if c == 0:
if b < 0:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 0:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
if c == 1:
if b < 1:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 2:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
if c == 2:
if b < 3:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 4:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
if c == 3:
if b < 5:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 5:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
if c == 4:
if b < 7:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 7:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
if c == 5:
if b < 8:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 9:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
if c == 6:
if b < 10:
return "d" + interval_to_quality((a, b + 1, c, d, e, f))
if b > 11:
return "A" + interval_to_quality((a, b - 1, c, d, e, f))
def name_rank_6_interval(interval):
(a, b, c, d, e, f) = interval
ordinal = interval[2] + 1
name = interval_to_quality(interval) + str(ordinal)
name = pprint(name)
return name
intervals = [
(3, 10, 6, 0, 0, 0),
(3, 10, 6, 1, 0, 1),
]
for interval in intervals:
name = name_rank_6_interval(interval)
frequency_ratio = tune_interval_in_comma_basis(interval)
frequency_ratio_string = str(frequency_ratio.numerator) + "/" + str(frequency_ratio.denominator)
#ordinal = interval[2] + 1
#english_name = interval_name_to_english(name) + ordinal_to_suffix(ordinal)
print(name, "=", list(interval), "#", frequency_ratio_string, "=", float(frequency_ratio))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment