Means
Arithmetic mean
The arithmetic mean of two numbers x and y is
(x + y)/2
The arithmetic mean of 1/1 and 2/1 is 3/2.
We can make a scale by starting with 1/1 and 2/1 and repeatedly adding arithmetic means between neighbouring terms. This gives the scales
0: 1/1, 2/1 1: 1/1, 3/2, 2/1 2: 1/1, 5/4, 3/2, 7/4, 2/1 3: 1/1, 9/8, 5/4, 11/8, 3/2, 13/8, 7/4, 15/8, 2/1
These are all harmonic series segments.
Harmonic mean
The harmonic mean of two numbers x and y is
2/(1/x + 1/y)
The harmonic mean of 1/1 and 2/1 is 4/3.
Repeatedly adding harmonic means between 1/1 and 2/1 gives the scales
0: 1/1, 2/1 1: 1/1, 4/3, 2/1 2: 1/1, 8/7, 4/3, 8/5, 2/1 3: 1/1, 16/15, 8/7, 16/13, 4/3, 16/11, 8/5, 16/9, 2/1
These are all subharmonic series segments.
Further reading
- Richard L. Crocker, Pythagorean mathematics and music, The Journal of Aesthetics and Art Criticism 22.3 (1964) pp. 325-335
- John Chalmers, Divisions of the Tetrachord, Frog Peak Music (1993), Chapter 4, p. 29
Python code
"""
>>> scale1 = iterated_arithmetic_mean([Fraction(1, 1), Fraction(2, 1)], 3)
>>> harmonic_series_segment = [Fraction(i, 2**3) for i in range(2**3, 2**4 + 1)]
>>> assert scale1 == harmonic_series_segment
>>> scale2 = iterated_harmonic_mean([Fraction(1, 1), Fraction(2, 1)], 3)
>>> subharmonic_series_segment = sorted(Fraction(2**4, i) for i in range(2**3, 2**4 + 1))
>>> assert scale2 == subharmonic_series_segment
"""
from fractions import Fraction
def iterated_arithmetic_mean(s, k):
"""
>>> iterated_arithmetic_mean([Fraction(1, 1), Fraction(2, 1)], 1)
[Fraction(1, 1), Fraction(3, 2), Fraction(2, 1)]
>>> iterated_arithmetic_mean([Fraction(1, 1), Fraction(2, 1)], 2)
[Fraction(1, 1), Fraction(5, 4), Fraction(3, 2), Fraction(7, 4), Fraction(2, 1)]
>>> iterated_arithmetic_mean([Fraction(1, 1), Fraction(2, 1)], 3)
[Fraction(1, 1), Fraction(9, 8), Fraction(5, 4), Fraction(11, 8), Fraction(3, 2), Fraction(13, 8), Fraction(7, 4), Fraction(15, 8), Fraction(2, 1)]
"""
result = list(s)
for _ in range(k):
new = [(x + y) / 2 for x, y in zip(result, result[1:])]
result = sorted(result + new)
return result
def iterated_harmonic_mean(s, k):
"""
>>> iterated_harmonic_mean([Fraction(1, 1), Fraction(2, 1)], 1)
[Fraction(1, 1), Fraction(4, 3), Fraction(2, 1)]
>>> iterated_harmonic_mean([Fraction(1, 1), Fraction(2, 1)], 2)
[Fraction(1, 1), Fraction(8, 7), Fraction(4, 3), Fraction(8, 5), Fraction(2, 1)]
>>> iterated_harmonic_mean([Fraction(1, 1), Fraction(2, 1)], 3)
[Fraction(1, 1), Fraction(16, 15), Fraction(8, 7), Fraction(16, 13), Fraction(4, 3), Fraction(16, 11), Fraction(8, 5), Fraction(16, 9), Fraction(2, 1)]
"""
result = list(s)
for _ in range(k):
new = [2 / (1 / x + 1 / y) for x, y in zip(result, result[1:])]
result = sorted(result + new)
return result
Scales
| File | Call |
|---|---|
| xen18-ayers-table-04 | iterated_arithmetic_mean([Fraction(1, 1), Fraction(2, 1)], 3) |
| xen18-ayers-table-11 | iterated_harmonic_mean([Fraction(1, 1), Fraction(2, 1)], 3) |