Pathological EDO Definitions

We've looked at two ways to define EDO tunings systems and I'd like to relate the methods to each other. The methods are 1) tempering commas and 2) tunings prime harmonics as closely as possible to an EDO steps.

The recent work I did on chromaticism mistuning bounds was partly in service of my investigation into the relationship of the two methods of defining EDOs. But there's more to do.

In this post, I'm going to look in detail at what happens if we define EDOs by tempering weird intervals. I think that if I can understand what it meant to define an EDO by tempering a normal versus abnormal interval, that will go a long way to explaining why the method of defining an EDO by tempering some normal intervals is generally equivalent to the method of rounding prime harmonics. That's the hope.

We'll start by looking at rank-2 intervals that can be tempered to generate 31-EDO.

dddd-25 : (-49, -26) # -4961c
AAAA-29 : (-47, -30) # -4639c
dddd-18 : (-37, -19) # -3761c
AAAA-22 : (-35, -23) # -3439c
dddd-11 : (-25, -12) # -2561c
AAAA-15 : (-23, -16) # -2239c
dddd-4 : (-13, -5) # -1361c
AAAA-8 : (-11, -9) # -1039c
dddd3 : (-1, 2) # -161c
AAAA-1 : (1, -2) # 161c
dddd10 : (11, 9) # 1039c
AAAA6 : (13, 5) # 1361c
dddd17 : (23, 16) # 2239c
AAAA13 : (25, 12) # 2561c
dddd24 : (35, 23) # 3439c
AAAA20 : (37, 19) # 3761c
dddd31 : (47, 30) # 4639c
AAAA27 : (49, 26) # 4961c

I've got the interval name written, and then the rank-2 interval coordinates in the (A1, d2) basis, and then the just tuning written in cents. The intervals with the simplest coordinates, smack dab in the middle of the list,

dddd3 : (-1, 2) # -161c
AAAA-1 : (1, -2) # 161c

also have the just tunings closest to 1/1. And since tempering tunes an interval to 1/1, these are natural intervals to temper out: tempering them is a small mistuning.

The other intervals on the list are separated from these two by octaves, and tempering any of them out is a large mistuning. But what kind of large mistuning? How does it behave? Let's look at the octave complement of AAAA-1 to start, that is

    (12, 7) - (1, -2) = (11, 9)

    P8 - AAAA-1 = dddd10

This interval is justly tuned larger than P5 but smaller than P8. It's too big to be a comma, and we expect it to do screwy things to the interval space, but it's one of the least-big of the screwy intervals.

To do that, let's express a bunch of intervals in the (P8, dddd10) basis, then temper out the dddd10, i.e. look at just the P8 component. If we start from the (A1, d2) basis, then the natural intervals to investigate have these coordinates:

     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)

We can do a change of basis for each such natural interval {n} in the following way:

    n * inverse((12, 7), (11, 9))

which will give us coordinates in the (P8, dddd10) basis. And away we go:

    m2: (-2/31, 5/31)

    M2: (7/31, -2/31)

    m3: (5/31, 3/31)

    M3: (14/31, -4/31)

    P4: (12/31, 1/31)

    P5: (19/31, -1/31)

    m6: (17/31, 4/31)

    M6: (26/31, -3/31)

    m7: (24/31, 2/31)

    M7: (33/31, -5/31)

So... I guess I should conclude something, but I'm not sure what.

Let's look at how this 31-EDO tunes A1 and d2.

    A1: (9/31, -7/31)

    d2: (-11/31, 12/31)

And now the first two prime harmonics:

    P8: (31/31, 0/31)

    P12: (50/31, -1/31)

The closest tunings are the prime harmonics are [31, 49], so one step of mistuning of the 3rd harmonic seems to have huge effects.

Let's try other mistunings of P12 and see what commas we temper out as a consequence.

...

Lol, the results are in and I should have anticipated them.

Let's say we tune P8 to 31 steps of 31-EDO and we tune P12 to {y} steps of 31-EDO.

If an interval has the form (-y, 31) or (y, -31) in the (P8, P12) basis then it will be tempered out. And those two will be inverses of each other.

    (0, 0) - (-y, 31) = (y, -31)

Easy.

So when P12 is 49 steps of 31-EDO, then we have the standard definition, and the intervals (-49, 31) and (49, -31) (in the (P8, P12) basis) are tempered out. These are normally justly tuned to

     617673396283947/562949953421312

562949953421312/617673396283947

But if we mistune P12 to 50 steps of 31-EDO, then our simplest tempered commas are (-50, 31) and (50, -31) in the (P8, P12) basis, which are justly tuned to

     617673396283947/1125899906842624

1125899906842624/617673396283947

One more for my own enrichment: we've seen a value of P12 that's one step higher/sharper than the canonical definition. Now let's investigate mistuning P12 one step flat of canonical. If we tune P12 to 48 steps of 31-EDO, then our simplest tempered commas are:

    (-48, 31) # 617673396283947/281474976710656

    (48, -31) # 281474976710656/617673396283947

Great. 

I know these numbers are big and our eyes just glaze over them instead of reading, but I think you'll agree it's obvious in retrospect that all of these just tunings have 3^31 = 617673396283947 in the numerator or denominator. And the opposite part of the fraction from the large power of 3 just has some large power of 2. So clearly all of the just tunings differ from each other only by inversion and octave offsets.

Let's convert these to the (A1, d2) basis and give them rank-2 interval names. I bet they're going to look very familiar!

Below I show the prime harmonic interval, going to the (A1, d2) interval, then the rank-2 interval name.

[48, -31] → [-13, -5] dddd-4

[-48, 31] → [13, 5] AAAA6

[49, -31] → [-1, 2] dddd3

[-49, 31] → [1, -2] AAAA-1

[50, -31] → [11, 9] dddd10

[-50, 31] → [-11, -9] AAAA-8

Those are the same intervals we saw before when we were investigating weird tempering a little. Are you impressed? I am. There's a pretty straightforward relationship between defining an EDO in terms of a harmonic mistuned by N steps and defining an EDO in terms of a tempered comma, which is N octaves off from a canonical comma used to define the EDO, the canonical ones being the one and its inverse which are closest tuned to unison, and also they happen to be the ones that arise when you tune the prime harmonics as close to purely as possible, subject to the frequencies being of the EDO form, 2^(i /edo_divisions).

I feel like I should do a little more to state the relationship exactly and mathematically, but also I've done enough that the reader could figure it out for themselves. And from the relationships between the two kinds of (rank-2) pathological definitions of EDOs (octave displaced canonical commas and P12s mistuned by step), we can more clearly see the relationship between the two canonical forms of EDO definitions.

I think I'm going to write out the relationship a little bit more precisely and then it will be time to investigate how these things generalize to rank-3 interval space and higher! I'm pretty stoked!

...

Things to do: 

1) I want to state symbolically how the mistunings of prime harmonics by step produces tempered commas that are related by octave displacement to the canonical tempered commas.

2) I want to prove that the canonical tuning of the (rank-2) prime harmonic intervals produces two commas, related by inversion, that have the smallest just tunings among all tunings of P12, perhaps subject to P12 falling between P8 and P8 + P8 or something. If I could also or instead show that the pair of canonical tempered commas, related by inversion, have the smallest (A1, d2) coordinates of all tempered commas produced by tunings of P12, that would also be cool.

After that we'll look at whether there's a regular form for rank-3 commas in the rank-3 prime harmonic basis, akin to {(-y, edo_divisions) and (y, -edo_divisions)} for the rank-2 prime harmonic basis. Also we'll look at how simultaneous mistunings of P12 and M17 affect/induce different tempered commas.

...


If the canonical tuning of the prime harmonics for an EDO is

(P8, P12) = (a, b)

then we get tempered commas of the form

(b, -a)

(-b, a)

in the (P8, P12) basis. We'll call these the canonical tempered commas for the EDO.


If we instead try defining the EDO in terms of

(P8, P12) = (a, b + 1)

then the tempered commas become

((b + 1), -a)

(-(b + 1), a)

We'll call these "once-sharpened" commas. How are they related to the canonical commas?

The once-sharpened comma with a positive P8 component will be one octave higher than the canonical comma with a positive P8 component. The once-sharpened comma with a negative P8 component will be one octave lower than the canonical comma with a negative P8 component.

I think we can immediately generalize from sharpening by one step to sharpening by an integer number of steps. If we mistune P12 by {j} steps, then the comma with positive P8 component will be

    (b, -a) + j * P8

and its inverse will be

    (-b, a) - j * P8

and this works even if {j} is zero or negative.

So if (a, b) = (31, 49) are the canonical number of steps for tuning the rank-2 prime harmonic intervals to define 31-EDO, then  for {j = 1} our tempered commas are 

    (49, -31) + (1, 0) = (50, -31)

and

    (-49, 31) - (1, 0) = (-50, 31)

and for {j = -2} we have tempered commas of

    (49, -31) + (-2, 0) = (47, -31)

and

    (-49, 31) - (-2, 0) = (-47, -31)

I know that looks a little dumb in the (P8, P12) basis, but we can do the same arithmetic in other bases where it looks a little less trivial. The inverses will still be a little redundant, but the octave addition or subtraction will be a little less obvious.

...

I think I know the form of rank-3 commas. It's about as simple as turning (a, b) into (-b, a) and (b, -a).

If we tune (P8, P12, M17) to steps (a, b, c), then we'll at least have tempered commas at (-b, a, 0) like before, but now also (-c, 0, a), (0, -c, b) and all the inverses of these.

For example, if we give the canonical rank-3 definition of 31-EDO by tuning (P8, P12, M17) to (31, 49, 72) steps, then all of these are tempered commas

    (-b, a, 0) = (-49, 31, 0)

    (0, c, -b) = (0, 72, -49)

    (c, 0, -a) = (72, 0, -31)

I've specifically shown the ones above that are justly tuned to more than a perfect unison. I'll call these the easy rank-3 commas.

These easy commas are not independent, and they're definitely not the tempered commas that have the least complex just tunings for 31-EDO. The easy rank-3 commas have just tunings that look like this:
    
    (-49, 31, 0) # 617673396283947/562949953421312 
   (0, 72, -49) # 22528399544939174411840147874772641/17763568394002504646778106689453125 
    (72, 0, -31) # 4722366482869645213696/4656612873077392578125 

and the inverses of those. In comparison, I'd more succinctly define 31-EDO in rank-3 by saying that it has pure octaves and tempers out the intervals justly associated with (81/80) and (393216/390625), which have prime harmonic coordinates (-4, 4, -1)  and (17, 1, -8).

Also, it doesn't even look to me like you can take two rank-3 easy commas and the octave, (1, 0, 0) and use that to define 31-EDO, since the absolute determinant of the matrix won't be 31. 

So the easy commas are something, but not individually nice nor jointly sufficient to define 31-EDO. Is there an easy way to get from the easy commas to the latter two commas which minimally define 31-EDO?

Oh, I've got something. Let's add one of the easy commas to the other two.

Maybe if I add one to the other two?
    (-49, 31, 0) + (72, 0, -31) = (23, 31, -31)
    (0, 72, -49) + (72, 0, -31) = (72, 72, -80)

and then remove the common factor of 8 from all the entries in the lower comma:

    (72, 72, -80) -> (9, 9, -10)

These two make commas make a determinant 31 basis matrix with the octave!

    determinant of ((1, 0, 0), (9, 9, -10), (23, 31, -31)) = 31

And their just tunings are:

    (9, 9, -10) # 10077696/9765625
    (23, 31, -31) # 5181419993454688075776/4656612873077392578125

Still not great, but we're getting somewhere. If I subract (9, 9, -10) from (23, 31, -31) twice, then I get (5, 13, -11) with just tuning (51018336/48828125), and the matrix
    
    ((1, 0, 0), (9, 9, -10), (5, 13, -11))

still has determinant 31.

I've got two more ideas for getting basis matrices where the tempered commas have small frequency ratios and probably small interval components.

First: Recall that we added together some easy commas, let's call it comma 3 to commas 1 and 2. We could try different combinations, like comma 1 to commas 2 and 3 or comma 2 to commas 1 and 3. Three different basis matrices to work with. We can do some determinant-preserving matrix operations to add and subtract commas from each other and try to get small coordinates that way. And since the third component scales in the just tunings like a power of five, it's probably prudent to focus on additions and subtractions of basis vectors that get the third components to be small.


Second idea: while doing determinant-preserving matrix operations among the commas, we could be guided by the actual just tunings or by heuristic measures of their complexity. In the first case, you don't subtract a comma from another unless doing so simplifies the just tuning. In the computationally simpler case, which probably doesn't matter because computation is cheap, we could like estimate the complexity of the numerator, and assume it will be close to the complexity of the denominator for tempered commas. And the complexity of the numerator is a function of just the positive coordinates of the interval. And in particular, if we've already calculated the closest values for the prime harmonics of the edo, like (31, 49, 72), then for an interval (m, n o), a measure of the numerator complexity might be the sum of the term (m * 31) + (49 * n) + (72 * o), with each term of the sum being ignored if the interval component is negative. That's integer multiplication, which is cheap in my brain because I used to program zilog z80 microprocessors, but you could also take the sum of multiplying (m, n, o) by (log(2), log(3), log(5)), with each term being knocked out if the coefficient is negative, and that would work fine since I hear floating point arithmetic is also fairly cheap these days.

...

Given

    (a, b, c) = (31, 49, 72)

we start with easy commas of the form 
    (-b, a, 0)
    (0, c, -b)
    (c, 0, -a)

and their inverses. By combinations of these, we get
    (-b + -c, a, a)
    (-b, a + c, -b)
    (c, c, -a + -b)
    (-b + c, a, -a)
    (-c, c, -b + a)
    (-b, a + -c, b)

and their inverses. Also we could get (0, 0, 0) or doubles of the easy commas, but I'm not interested in those. I'm not sure if any pair of these with the octave will define 31-EDO, but there are at least many pairs from among those six that will define 31-EDO along with the octave.

Here are the just tunings for the six above:
    (-49, 103, -49) # 13915193059764305937984450503671774362956903094027/10000000000000000000000000000000000000000000000000
    (23, 31, -31) # 5181419993454688075776/4656612873077392578125
    (72, 72, -80) # 106387358923716524807713475752456393740167855629859291136/82718061255302767487140869206996285356581211090087890625
    (-121, 31, 31) # 2876265888493261300027370452880859375/2658455991569831745807614120560689152
    (-72, 72, -18) # 22528399544939174411840147874772641/18014398509481984000000000000000000
    (-49, -41, 49) # 17763568394002504646778106689453125/20532471611663975528200467420020736

Quite large.

...

Okay, suppose I start with the tempered comma set 

    [[23, 31, -31], [72, 72, -80]]

Those are sufficient to define 31-EDO, but not of minimal complexity in any sense. I wanted to find a way to transform that into the set 
    [[-4, 4, -1], [17, 1, -8]]

And I noticed that a little square matrix with integer entries 

     [[-1, 1], [3, -2]

does the trick:
    
    [[-1, 1], [3, -2] *  [[23, 31, -31], [72, 72, -80]] = [[-4, 4, -1], [17, 1, -8]]

I did a search for square matrices [[i, j], [k, l]] with integer entries to use in a product like that, and they all produced different sets of intervals, but they most had the same null space ( = null space basis? = kernel?) as the original commas, namely a null space of (31, 49, 72), except occasionally I'd occasionally get degenerate things like 

    [[-4, 4, -1], [4, -4, 1]]

which has the rank-3 meantone nullspace basis 

    [[1, 1, 0], [-1, 0, 4]]

instead of a rank-3 EDO nullspace basis.

Anyway, I did a search over 2x2 square matrices and I sorted the matrices by the complexity of the results, measured in the following way: the complexity of an interval is the sum of the absolute value of its components. The complexity of a pair of intervals is the sum of the complexity of the intervals.

In this way we can say that
    [[-17, -1, 8], [-4, 4, -1]] has complexity 35
    [[-13, -5, 9], [-4, 4, -1]] has complexity 36
    [[-9, -9, 10], [-4, 4, -1]] has complexity 37

and so on with other matrix multiplication results.

Unfortunately, when I did a search over 2x2 matrices using [[23, 31, -31], [72, 72, -80]] as my starting set, I didn't get the canonical 31-EDO commas, or any low complexity commas for that matter, even when I used matrix entries between -30 and 30, which is quite a wide net. It did simplify the complexity though? Like, this one showed up:

    commas: [[-29, 11, 5], [-3, 21, -13]]
    2x2 matrix: [[5, -2], [3, -1]]
    comma complexity: 82

So...I still have some work to do in figuring out how to get down to the minimal set. Apparently searching through 2x2 matrices doesn't always work. But also sometimes it works! And it seems like there's a complexity measure in interval coordinates that reproduces the complexity in terms of just tunings. Or at least it worked in one case.

I should probably also search for efficiently through 2x2 matrix entries. Like, these are all basically equivalent:
    [[-17, -1, 8], [-4, 4, -1]] :: [[-3, 2], [-1, 1]]
    [[-17, -1, 8], [4, -4, 1]] :: [[-3, 2], [1, -1]]
    [[-4, 4, -1], [-17, -1, 8]] :: [[-1, 1], [-3, 2]]
    [[-4, 4, -1], [17, 1, -8]] :: [[-1, 1], [3, -2]]
    [[4, -4, 1], [-17, -1, 8]] :: [[1, -1], [-3, 2]]
    [[4, -4, 1], [17, 1, -8]] :: [[1, -1], [3, -2]]
    [[17, 1, -8], [-4, 4, -1]] :: [[3, -2], [-1, 1]]
    [[17, 1, -8], [4, -4, 1]] :: [[3, -2], [1, -1]]

So I shouldn't do a matrix multiplication and complexity count for all of them. That's 8 times too much work.

I'll figure that out eventually. First I'm going to try this with a different EDO. And let's do one that doesn't temper out Ac1.

Maybe one of these?
     16-EDO: (AcA1 → 135/128 , dAcm2 → 648/625). Basis: ([1, 0, 0], [-7, 3, 1], [3, 4, -4])
22-EDO: (GrA1 → 250/243 , Grd2 → 2048/2025). Basis: ([1, 0, 0], [1, -5, 3], [11, -4, -2])
23-EDO: (AcA1 → 135/128 , dAcAcm2 → 6561/6250). Basis: ([1, 0, 0], [-7, 3, 1], [-1, 8, -5])
25-EDO: (Grm2 → 256/243 , dd0 → 3125/3072). Basis: ([1, 0, 0], [8, -5, 0], [-10, -1, 5])

Yeah, let's do 22-EDO.

The prime harmonics are tuned closest to (22, 35, 51)-steps. We can substitute these for (a, b, c) to get some easy but complicated commas:

    ec1 = (-b, a, 0)
    ec2 = (0, c, -b)
    ec3 = (c, 0, -a)

We could add ec3 to the other two. I've also given the result of that symbolically as:

    b1 = (-b + c, a, -a) =  (16, 22, -22)
    b2 = (c, c, -a + -b) =  (51, 51, -57)

Remove common factors within the components of each interval and we're ready to form a basis with the octave:

   Determinant of ((1, 0, 0), (8, 11, -11), (17, 17, -19))  = -22

We're doing great.

Next I'll take {b1} and {b2} as input and try to find a 2x2 matrix in integer coordinates that has the same kernel but lower complexity, in the sense of the sum of the absolute values of the components.

    complexity 25 : [[-10, -1, 5], [-1, 5, -3]] using [[3, -2], [2, -1]]
    complexity 26 : [[-11, 4, 2], [-1, 5, -3]] using [[5, -3], [2, -1]]

These are pretty low complexity commas! But they're not quite the commas that I identified as minimal for defining 31-EDO in rank-3 when I was using just tuning as a measure of complexity. Those were [[8, -5, 0], [-10, -1, 5]], which has interval-space complexity (8 + 5 + 10 + 1 + 5 = ) 29. And you can see that the [-10, -1, 5] interval appears in the complexity 25 set. So there's some overlap. Let's compare the just tunings:

[-10, -1, 5] # 3125/3072
[-1, 5, -3] # 243/250
[-11, 4, 2] # 2025/2048
[8, -5, 0] # 256/243

Hm, actually I don't think my 2x2 matrix finding program will ever produce [8, -5, 0]. It looks like it only ever gives me non-zero components for all three harmonics. That's probably something I have to solve.

Speaking of things I have to solve, I kind of assumed that of these guys would be tempered out and that the pairs of them had kernel = (22, 35, 51) when the pairs of intervals are linearly independent, but I guess I should verify that in code instead of just checking a few examples and assuming that the pattern holds everywhere. Instead I'll check *many* examples in code and then assume that the pattern holds everywhere.

...

I tried a different complexity measure than the sum of absolute values of components, and it still gave me [[-10, -1, 5], [-1, 5, -3]] as the simplest commas. And another complexity measure gives [[-11, 4, 2], [-1, 5, -3]] as the simplest. I bet these complexity measures would perform well enough if I let them look at intervals with zeros.

...

Lol, I messed up. The intervals ([1, 0, 0], [8, -5, 0], [-10, -1, 5]) are a minimal basis for 25-EDO, not 22-EDO. The minimal tempering basis I'd found in the "Higher-Rank EDO-Generator" post for 22-EDO were ([1, 0, 0], [1, -5, 3], [11, -4, -2]), which the current method also found.

...

The Prime Harmonic Tricorn: Rank-3 Chromatic And Diatonic Mistuning Bounds

These are the natural rank-3 intervals expressed in the rank-3 prime harmonic coordinate basis, (P8, P12, M17):

    P1 = (0, 0, 0)

    m2 = (4, -1, -1)

    M2 = (1, -2, 1)

    m3 = (1, 1, -1)

    M3 = (-2, 0, 1)

    P4 = (2, -1, 0)

    P5 = (-1, 1, 0)

    m6 = (3, 0, -1)

    M6 = (0, -1, 1)

    m7 = (0, 2, -1)

    M7 = (-3, 1, 1)

    P8 = (1, 0, 0)

If we keep the octave pure but mistune the P12 and M17, how much can we mistune them while still keeping normal chromatic intervals (and thus also the normal diatonic intervals) in their usual order that we know from 12-TET?

I'm investigating this numerically. To start, it seems that If we tune P12 purely to 3/1, then M17 can range between 

    24^(1/2) ~ 4.89897948557 

and

    27^(1/2) ~ 5.19615242271

And this starts to look like a bit of a pattern when we note that the pure value can be expressed as 25^(1/2).

If M17 is tuned purely to 5/1, then P12 can be between 

    25^(1/3) ~ 2.92401773821

and

    25/8 = 3.125

Pretty weird. I'm excited to figure out where these numbers come from. The pure value here could be expressed as 27^(1/3). But if we also express the high bound as a cube root, then we get

    25/8 = (15625/512)^(1/3)

which is pretty crazy. Unless I got that bound wrong. But I doubt it.

....

How about a 2D plot of P12 and M17 values, which shows which simultaneous mistunings will induce a chromatic ordering over the natural intervals?

I don't know how to use real software libraries, but I think I pieced together enough snippets from stack exchange to make this work in matplotlib.pyplot. The shape I was getting looked pretty wonky at low resolutions, 

(a concave nonagon)


(This is clearly Lake Superior, somehow.)

but as I increased the resolution, it got to be increasingly regular:


It's bit of a weird triangle, but at least it's a triangle and not a concave nonagon or worse, like I was getting at first.

Assuming that the plot is correct, let me see if I can figure out the coordinates for all the triangular vertices.

Just from zooming in on the graph:

    The bottom left vertex is around (2.76, 4.83).

    The bottom right vertex is around (3.2775, 5.0325).

    The top vertex is around (3.04, 5.175).

Back to numerical methods. The bottom left vertex is extremal twice: it's both the lowest chromatic/diatonic value of P12 for any M17, and the lowest chromatic/diatonic value of M17 for any P12. The other two vertices are extremal in one dimension: the top corner is the highest chromatic/diatonic value of M17 for any value of P12, and the bottom right vertex is the highest chromatic/diatonic value of P12 for any mistuning of M17.

So my visually estimated graph values were garbage and not worth referring back to for comparison, except to measure my lack of understanding of matplotlib graphs. Here are some new estimates, gotten numerically:

    The top vertex is around (3.0314, 5.2779)

    The bottom right vertex is around (3.1747, 5.0397).

    The bottom left vertex is around (2.828428, 4.75683).

The bottom left vertex appears to be {8^(1/2), 2^(9/4)}.

For both the bottom left vertex and the top vertex, we seem to have the relationship

    (P12)^3 = (M17)^2.

This holds exactly with the symbolic expressions I gave for the bottom left corner. With the numerical coordinates for the top corner, we have

    (3.0314)^(3) = 27.8567

    (5.2779)^2 = 27.8562

Which is quite close. Although for the bottom right corner, the relationship doesn't hold:

    (3.1747)^(3) = 31.996912669723002

    (5.0397)^(2) = 25.39857609

But this at least suggests that the P12 coordinate on the bottom right vertex might be 32^(1/3).  Ah, and the M17 coordinate looks a lot like 128^(1/3).

Let's try expressing all of these so that the base of the exponent is 2. For the bottom right vertex,

    32^(1/3) =  2^(5/3) ~ 3.174802

    128^(1/3) = 2^(7/3) ~ 5.039684

For the bottom left vertex

    8^(1/2) = 2^(3/2) ~ 2.82842712

    2^(9/4) ~ 4.7568284

Lol, I'm noticing that 12 is the common denominator of all these fractions. Are these all just 12-EDO values? ... No, the coordinates of the top vertex don't appear to be 12-EDO. Let's dial-in those coordinates more precisely.

I don't think the top vertex has coordinates ((147)^(2/9), 147^(1/3)). That would be silly. Why would I even mention that?

...

Okay, so we're looking for the largest diatonic/chromatic value of M17 and we want to also know the P12 that goes with it. The top coordinates more precisely are:

    (3.031433116483, 5.278031599899)

I don't know what these numbers are yet, but I'm pleased to see that the relationship between them is getting tighter also:

    3.031433116483^(3) = 27.85761756954

    5.278031599899^(2) = 27.85761756953

I'll keeping trying to dial that in. But, oh hey, I bet I could figure out the triangle coordinates another way! If I know the two bottom vertex coordinates and I have some other triangle points that aren't at the vertices (from treating P12 or M17 purely), then I should be able to get the last vertex using a little geometry. I just need to define the top two line segments and find their intersection. But I'll probably just keep with numerical methods. That's usually faster and easier than thinking. And sadly it's a method of comparable reliability.

Oh, hey, the 27.8 number in the relationship between the coordinates is 2^(24/5), right?

And if P12^3 = M17^2 = 2^(24/5), then

    P12 = 2^(8/5)

    M17 = 2^(12/5)

Nice. That doesn't actually match my numerical coordinates past six decimal places, but I have more faith in simple numbers than I do in my simulations.

So the triangle coordinates are probably

    Bottom left: (2^(3/2), 2^(9/4))

    Bottom right: (2^(5/3), 2^(7/3))

    Top: (2^(8/5), 2^(12/5))

Let's figure out line segments between those points and then test whether they interest the original points four points that I found, two on  the axis P12 = 3, and two on the axis M17 = 5.

...

If I define a line that runs through points (2^(3/2), 2^(9/4)) and
 (2^(5/3), 2^(7/3)), then it also passes through

    (x = 3, y = 4.896937808074327)

    (x = 3.126206258490623, y = 5)

.

And for another pair of points I get

    (x = 3, y = 5.197329356869208)

    (x = 2.9231412118079656, y = 5)

And for the last pair, 

    (x = 3, y = 5.330288465814343)

    (x = 3.1986726467519038, y = 5)

Unfortunately we have no exact matches to the previous values. We have several close matches:

    24^(1/2) ~ 4.89897948557 -> (y = 4.896937808074327)

    27^(1/2) ~ 5.19615242271 -> (y = 5.197329356869208)

    25^(1/3) ~ 2.92401773821 -> (x = 2.9231412118079656)

    25/8 = 3.125 ->     (x = 3.126206258490623

So I've made mistakes somewhere. Maybe the top point of the triangle really isn't (2^(8/5), 2^(12/5)). Or maybe my line program is wrong. That seems quite probable, since I got nice expressions before like 27^(1/2) whereas now I've got no real understanding of the origin of 5.197329356869208.

(Spoiler: It's not a real triangle with straight lines)

Okay. New idea: let's do it algebraically. What tuned value of M17, flat or sharp, would make two chromatic or diatonic intervals equal? Whatever value does that will also be a limit of mistuning. Like, surely we don't have the normal order in which (M2 > m2) if (m2 = M2).

I guess that means I'm looking for ...simultaneous values of P12 and M17 that temper out the various differences between successive chromatic intervals. And the intervals that show up as steps between the rank-3 chromatic intervals are (A1, m2, Acm2).

If A1 has prime harmonic coordinates [-3, -1, 2], then tempering it out is like

    2^(-3) * x^(-1) * y^(2) = 1

And that simplifies to

    1) y^2 / x = 8

That's equation one. Let's do a little more. Maybe pairs of equations like that one above can be solved to get interesting values of (x, y). Here are the prime harmonic coordinates for m2:

    [4, -1, -1]

and if we want to temper out m2, then we have this relation:

    2^(4) * x^(-1) * y^(-1) = 1

which simplifies to

    2) x * y = 16

That's equation two. Finally we have prime harmonic coordinate for the acute minor second, Acm2:

    [0, 3, -2]

and tempering that is like

    3) x^3 / y^2 = 1

Let's solve pairs of equations.

Eqns 1 and 2): (x = 2 * 2^(2/3)), (y = 4 * 2^(1/3)) // Bottom right vertex

Eqns 1 and 3): (x = 2 * 2^(1/2)), (y = 4 * 2^(1/4)) // Bottom left vertex

Eqns 2 and 3): (x = 2 * 2^(3/5)), (y = 4 * 2^(2/5)) // Top vertex

That was really fast and really easy! And it confirmed for me the coordinates of the top vertex, about which I had been a little uncertain. Also this reveals a nice form of the coordinates where the P12 coordinates are always a factor of 2 (like octave) over a value for P5, and M17 coordinates are a factor of 4 (or two octaves) over a value for M3, as they should be.

But also now we see that the thing in the graph, which isn't a nonaon or Lake Superior, also isn't a triangle! It's just the intersection of those three weird curves associated with tempering the chromatic steps. Here they are plotted:


It's definitely a three point figure, but no straight sides. I'll call it a tricorn instead of a triangle. Let's zoom in on the chromatic/diatonic tricorn and also add lines at x = 3 and y = 5.

The horizontal intersection with the green-colored line (I think it's green. I'm writing this late at night with a blue light filter on) is at
    x^3 / y^2 = 1, y = 5, solve for x
    x = 5^(2/3)

and the horizontal intersection with the red line is given by
    y^2 / x = 8, y = 5, solve for x
    x = 25/8

and the vertical intersection with the red line is given by
    y^2 / x = 8, x = 3, y > 0, solve for y 
    y = 2 * sqrt(6)

and the vertical intersection near the top of the tricorn is given by
    x^3 / y^2 = 1, x = 3, y > 0, solve for y 
    y = 3 * sqrt(3)

.
And now we now how much we can mistune some rank-3 intervals, while keeping octaves pure and also keeping the usual orders of diatonic and chromatic intervals that we know from 12-TET. We know the corners of the tricorn, we know the equations of the horn edges, and we know the maximum and minimum values for P12 and M17 while keeping the other pure.

Is there anything left to do? We could express the mistuning bounds in terms of other intervals! Like, how much can you mistune (Ac1, A1, d2) while staying in the tricorn? I don't know, but I'll keep thinking about it.

Higher Rank EDO Generators Again

My last post on this topic is becoming quite messy, but I haven't figured things out quite well enough that I can delete and rewrite.

24-EDO is a tuning system with a single generating interval size, so we may call it rank-1 in /frequency/ space. However, to analyze it in terms of intervals, we need to go to a much higher rank in /interval/ space. Let me explain.

Many EDOs can be defined over rank-2 interval space by defining a tuning system which has, as a basis, a purely tuned octave and a second interval which is "tempered", i.e. tuned to a frequency ratio of 1/1. However, there is no rank-2 interval that can be tempered out to produce 24-EDO. Neither are there two rank-3 intervals that can be tempered while keeping the octave pure. If you try to do it, all of the intervals in your interval space will fall on the 12-EDO subset. In order to analyze 24-EDO music intervallically, you need to go up to at least rank-4 interval space, at which point you get neutral intervals like the septimal super-major second, SpM2, or the septimal sub-minor third, Sbm3.

It took me a while to figure out how to predict that minimal rank of the interval space associated with an EDO, but I've done it. Consider a definition of 24-EDO in which we tune {the intervals justly associated to the prime harmonics} to the respective nearest steps of 24-EDO. Below I show the 24-EDO steps for harmonics (2/1, 3/1, 5/1, 7/1, 11/1, 13/1, 17/1, 19/1):

    [24, 38, 56, 67, 83, 89, 98, 102]

When I say 56 steps is how 24-EDO tunes the 5th harmonic, it would be more technically correct to say that we can define a 24-EDO which tunes the M17 (which is justly to to 5/1) to 2^(56/24). This is like 14 cents sharp of the pure value. To find the closest step, we find {i} which solves this equation 

    5/1 = 2^(i / 24)

and round it to the nearest integral step, so that 24-EDO tunes M17 to

    round(24 * log_2(5))

which is 56.

You can see that the first three harmonics are all tuned to even values. If we define our rank-3 intervals by combinations of the first three harmonics and all of them are tuned to even steps, then of course we won't get any intervals tuned to odd steps, and the whole thing collapses to 12-EDO. The fact that the first prime harmonic tuned to an odd number of steps is the 7th harmonic, and the fact that 7 is the fourth prime, is most of the explanation of why 24-EDO is minimally analyzed with rank-4 interval space. But instead of looking for the first odd step, the general procedure is to look for the first point at which all the harmonics so far have no jointly common factor. 

I'll say it again. The minimal-rank interval space needed to analyze a given EDO is found as the smallest number of sequential prime harmonics such that the set has {1} as its greatest common divisor.

Let's look at 60-EDO to investigate. Here are its prime harmonic intervals, up to the one justly tuned to 19/1, but now tuned to 60-EDO steps: [60, 95, 139, 168, 208, 222, 245, 255]. Brief inspection tells us that 60-EDO must be rank-3, based on these facts:

    GCD(60) = 60

    GCD(60, 95) = 5

    GCD(60, 95, 139) = 1.

Here's the prime-harmonic GCD classification of EDOs:

    rank-2: [5, 7, 8, 9, 11, 12, 13, 16, 17, 18, 19, 22, 23, 26, 27, 29, 31, 32, 33, 37, 39, 40, 41, 42, 43, 45, 46, 47, 49, 50, 53, 55, 56, 59, 61, 63, 64, 65, 67, 69, 70, 71, 73, 74, 75, 77, 79, 80, 81, 83, 88, 89, 90, 91, 94, 95, 97, 98, 99]-EDO

    rank-3: [10, 14, 15, 21, 25, 28, 34, 35, 48, 51, 52, 54, 58, 60, 72, 78, 84, 85, 87, 96]-EDO

    rank-4: [6, 24, 36, 38, 57, 66, 68, 76, 86, 100]-EDO

    rank-5: [20, 93]-EDO

    rank-6: [30, 44, 62, 82]-EDO

    rank-8: [92]-EDO

Here also is the prime harmonic GCD classification of EDOs with rank >= 6, for divisions below 600:

    rank-6 : [30, 44, 62, 82, 136, 144, 218, 404, 478, 496, 510]-EDO

    rank-7 : [174, 448, 540]-EDO

    rank-8 : [92]-EDO

    rank-9 : [322]-EDO

I haven't proved anything yet about when the definition of an EDO in this way, by rounding prime harmonics, will be equivalent to a definition in terms of tempering. But these ranks do match the ranks that I found by tempering (up to up to 100-EDO divisions at least) so that's encouraging.

Here are the commas that can be used to define the EDOs which are minimally associated to rank-2 interval space. The commas are written in prime harmonic coordinates, along with the basis matrix that includes the octave.

3-EDO: ([5, -3] → 32/27). Basis: ([1, 0], [5, -3])

5-EDO: ([8, -5] → 256/243). Basis: ([1, 0], [8, -5])

7-EDO: ([-11, 7] → 2187/2048). Basis: ([1, 0], [-11, 7])

8-EDO: ([13, -8] → 8192/6561). Basis: ([1, 0], [13, -8])

9-EDO: ([-14, 9] → 19683/16384). Basis: ([1, 0], [-14, 9])

11-EDO: ([-17, 11] → 177147/131072). Basis: ([1, 0], [-17, 11])

12-EDO: ([-19, 12] → 531441/524288). Basis: ([1, 0], [-19, 12])

13-EDO: ([21, -13] → 2097152/1594323). Basis: ([1, 0], [21, -13])

16-EDO: ([-25, 16] → 43046721/33554432). Basis: ([1, 0], [-25, 16])

17-EDO: ([27, -17] → 134217728/129140163). Basis: ([1, 0], [27, -17])

18-EDO: ([29, -18] → 536870912/387420489). Basis: ([1, 0], [29, -18])

19-EDO: ([-30, 19] → 1162261467/1073741824). Basis: ([1, 0], [-30, 19])

22-EDO: ([35, -22] → 34359738368/31381059609). Basis: ([1, 0], [35, -22])

23-EDO: ([-36, 23] → 94143178827/68719476736). Basis: ([1, 0], [-36, 23])

26-EDO: ([-41, 26] → 2541865828329/2199023255552). Basis: ([1, 0], [-41, 26])

27-EDO: ([43, -27] → 8796093022208/7625597484987). Basis: ([1, 0], [43, -27])

29-EDO: ([46, -29] → 70368744177664/68630377364883). Basis: ([1, 0], [46, -29])

31-EDO: ([-49, 31] → 617673396283947/562949953421312). Basis: ([1, 0], [-49, 31])

32-EDO: ([51, -32] → 2251799813685248/1853020188851841). Basis: ([1, 0], [51, -32])

33-EDO: ([-52, 33] → 5559060566555523/4503599627370496). Basis: ([1, 0], [-52, 33])

37-EDO: ([59, -37] → 576460752303423488/450283905890997363). Basis: ([1, 0], [59, -37])

39-EDO: ([62, -39] → 4611686018427387904/4052555153018976267). Basis: ([1, 0], [62, -39])

40-EDO: ([-63, 40] → 12157665459056928801/9223372036854775808). Basis: ([1, 0], [-63, 40])

41-EDO: ([65, -41] → 36893488147419103232/36472996377170786403). Basis: ([1, 0], [65, -41])

42-EDO: ([67, -42] → 147573952589676412928/109418989131512359209). Basis: ([1, 0], [67, -42])

43-EDO: ([-68, 43] → 328256967394537077627/295147905179352825856). Basis: ([1, 0], [-68, 43])

45-EDO: ([-71, 45] → 2954312706550833698643/2361183241434822606848). Basis: ([1, 0], [-71, 45])

46-EDO: ([73, -46] → 9444732965739290427392/8862938119652501095929). Basis: ([1, 0], [73, -46])

47-EDO: ([-74, 47] → 26588814358957503287787/18889465931478580854784). Basis: ([1, 0], [-74, 47])

49-EDO: ([78, -49] → 302231454903657293676544/239299329230617529590083). Basis: ([1, 0], [78, -49])

50-EDO: ([-79, 50] → 717897987691852588770249/604462909807314587353088). Basis: ([1, 0], [-79, 50])

53-EDO: ([-84, 53] → 19383245667680019896796723/19342813113834066795298816). Basis: ([1, 0], [-84, 53])

55-EDO: ([-87, 55] → 174449211009120179071170507/154742504910672534362390528). Basis: ([1, 0], [-87, 55])

56-EDO: ([89, -56] → 618970019642690137449562112/523347633027360537213511521). Basis: ([1, 0], [89, -56])

59-EDO: ([94, -59] → 19807040628566084398385987584/14130386091738734504764811067). Basis: ([1, 0], [94, -59])

61-EDO: ([97, -61] → 158456325028528675187087900672/127173474825648610542883299603). Basis: ([1, 0], [97, -61])

63-EDO: ([100, -63] → 1267650600228229401496703205376/1144561273430837494885949696427). Basis: ([1, 0], [100, -63])

64-EDO: ([-101, 64] → 3433683820292512484657849089281/2535301200456458802993406410752). Basis: ([1, 0], [-101, 64])

65-EDO: ([-103, 65] → 10301051460877537453973547267843/10141204801825835211973625643008). Basis: ([1, 0], [-103, 65])

67-EDO: ([-106, 67] → 92709463147897837085761925410587/81129638414606681695789005144064). Basis: ([1, 0], [-106, 67])

69-EDO: ([-109, 69] → 834385168331080533771857328695283/649037107316853453566312041152512). Basis: ([1, 0], [-109, 69])

70-EDO: ([111, -70] → 2596148429267413814265248164610048/2503155504993241601315571986085849). Basis: ([1, 0], [111, -70])

71-EDO: ([113, -71] → 10384593717069655257060992658440192/7509466514979724803946715958257547). Basis: ([1, 0], [113, -71])

73-EDO: ([116, -73] → 83076749736557242056487941267521536/67585198634817523235520443624317923). Basis: ([1, 0], [116, -73])

74-EDO: ([-117, 74] → 202755595904452569706561330872953769/166153499473114484112975882535043072). Basis: ([1, 0], [-117, 74])

75-EDO: ([119, -75] → 664613997892457936451903530140172288/608266787713357709119683992618861307). Basis: ([1, 0], [119, -75])

77-EDO: ([-122, 77] → 5474401089420219382077155933569751763/5316911983139663491615228241121378304). Basis: ([1, 0], [-122, 77])

79-EDO: ([-125, 79] → 49269609804781974438694403402127765867/42535295865117307932921825928971026432). Basis: ([1, 0], [-125, 79])

80-EDO: ([127, -80] → 170141183460469231731687303715884105728/147808829414345923316083210206383297601). Basis: ([1, 0], [127, -80])

81-EDO: ([-128, 81] → 443426488243037769948249630619149892803/340282366920938463463374607431768211456). Basis: ([1, 0], [-128, 81])

83-EDO: ([132, -83] → 5444517870735015415413993718908291383296/3990838394187339929534246675572349035227). Basis: ([1, 0], [132, -83])

88-EDO: ([-139, 88] → 969773729787523602876821942164080815560161/696898287454081973172991196020261297061888). Basis: ([1, 0], [-139, 88])

89-EDO: ([-141, 89] → 2909321189362570808630465826492242446680483/2787593149816327892691964784081045188247552). Basis: ([1, 0], [-141, 89])

90-EDO: ([143, -90] → 11150372599265311570767859136324180752990208/8727963568087712425891397479476727340041449). Basis: ([1, 0], [143, -90])

91-EDO: ([-144, 91] → 26183890704263137277674192438430182020124347/22300745198530623141535718272648361505980416). Basis: ([1, 0], [-144, 91])

94-EDO: ([149, -94] → 713623846352979940529142984724747568191373312/706965049015104706497203195837614914543357369). Basis: ([1, 0], [149, -94])

95-EDO: ([151, -95] → 2854495385411919762116571938898990272765493248/2120895147045314119491609587512844743630072107). Basis: ([1, 0], [151, -95])

97-EDO: ([154, -97] → 22835963083295358096932575511191922182123945984/19088056323407827075424486287615602692670648963). Basis: ([1, 0], [154, -97])

98-EDO: ([-155, 98] → 57264168970223481226273458862846808078011946889/45671926166590716193865151022383844364247891968). Basis: ([1, 0], [-155, 98])

99-EDO: ([157, -99] → 182687704666362864775460604089535377456991567872/171792506910670443678820376588540424234035840667). Basis: ([1, 0], [157, -99])

Here are just a few rank-2 names for those rank-2 commas:

3-EDO: (m3 → 32/27)

5-EDO: (m2 → 256/243)

7-EDO: (A1 → 2187/2048)

8-EDO: (d4 → 8192/6561)

9-EDO: (A2 → 19683/16384)

11-EDO: (A3 → 177147/131072)

12-EDO: (A0 → 531441/524288)

13-EDO: (dd5 → 2097152/1594323)

16-EDO: (AA2 → 43046721/33554432)

17-EDO: (dd3 → 134217728/129140163)

18-EDO: (dd6 → 536870912/387420489)

19-EDO: (AA0 → 1162261467/1073741824)

and here's a rank-2 reduction graph:

     256/243: 5 ← (10, 15, 20, 25, 30)

2187/2048: 7 ← (14, 21, 28, 35)

531441/524288: 12 ← (24, 36, 48, 60, 72, 84, 96)

134217728/129140163: 17 ← (34, 51, 68, 85)

1162261467/1073741824: 19 ← (38, 57, 76)

34359738368/31381059609: 22 ← (44, 66) 

2541865828329/2199023255552: 26 ← (52)

8796093022208/7625597484987: 27 ← (54)

70368744177664/68630377364883: 29 ← (58, 87)

617673396283947/562949953421312: 31 ← (62, 93)

4611686018427387904/4052555153018976267: 39 ← (78)

36893488147419103232/36472996377170786403: 41 ← (82)

328256967394537077627/295147905179352825856: 43 ← (86)

9444732965739290427392/8862938119652501095929: 46 ← (92)

Here are rank-3 definitions of some EDOs, including some that could be defined in rank-2:

3-EDO: (M2 → 10/9, m2 → 16/15). Basis: ([1, 0, 0], [1, -2, 1], [4, -1, -1])

4-EDO: (AcM2 → 9/8 , A1 → 25/24). Basis: ([1, 0, 0], [-3, 2, 0], [-3, -1, 2])

5-EDO: (m2 → 16/15 , Acm2 → 27/25). Basis: ([1, 0, 0], [4, -1, -1], [0, 3, -2])

7-EDO: (A1 → 25/24 , Ac1 → 81/80). Basis: ([1, 0, 0], [-3, -1, 2], [-4, 4, -1])

8-EDO: (m2 → 16/15 , GrA1 → 250/243). Basis: ([1, 0, 0], [4, -1, -1], [1, -5, 3])

9-EDO: (Acm2 → 27/25 , d2 → 128/125). Basis: ([1, 0, 0], [0, 3, -2], [7, 0, -3])

10-EDO: (A1 → 25/24 , Grm2 → 256/243). Basis: ([1, 0, 0], [-3, -1, 2], [8, -5, 0])

11-EDO: (AcA1 → 135/128 , d3 → 144/125). Basis: ([1, 0, 0], [-7, 3, 1], [4, 2, -3])

12-EDO: (Ac1 → 81/80 , d2 → 128/125). Basis: ([1, 0, 0], [-4, 4, -1], [7, 0, -3])

13-EDO: (A1 → 25/24 , GrGrm3 → 2560/2187). Basis: ([1, 0, 0], [-3, -1, 2], [9, -7, 1])

14-EDO: (Acm2 → 27/25 , Grd2 → 2048/2025). Basis: ([1, 0, 0], [0, 3, -2], [11, -4, -2])

15-EDO: (d2 → 128/125 , GrA1 → 250/243). Basis: ([1, 0, 0], [7, 0, -3], [1, -5, 3])

16-EDO: (AcA1 → 135/128 , dAcm2 → 648/625). Basis: ([1, 0, 0], [-7, 3, 1], [3, 4, -4])

17-EDO: (A1 → 25/24 , GrGrm2 → 20480/19683). Basis: ([1, 0, 0], [-3, -1, 2], [12, -9, 1])

18-EDO: (d2 → 128/125 , GrM2 → 800/729). Basis: ([1, 0, 0], [7, 0, -3], [5, -6, 2])

19-EDO: (Ac1 → 81/80 , dd0 → 3125/3072). Basis: ([1, 0, 0], [-4, 4, -1], [-10, -1, 5])

21-EDO: (d2 → 128/125 , AcAcA1 → 2187/2048). Basis: ([1, 0, 0], [7, 0, -3], [-11, 7, 0])

22-EDO: (GrA1 → 250/243 , Grd2 → 2048/2025). Basis: ([1, 0, 0], [1, -5, 3], [11, -4, -2])

23-EDO: (AcA1 → 135/128 , dAcAcm2 → 6561/6250). Basis: ([1, 0, 0], [-7, 3, 1], [-1, 8, -5])

25-EDO: (Grm2 → 256/243 , dd0 → 3125/3072). Basis: ([1, 0, 0], [8, -5, 0], [-10, -1, 5])

26-EDO: (Ac1 → 81/80 , ddd0 → 78125/73728). Basis: ([1, 0, 0], [-4, 4, -1], [-13, -2, 7])

27-EDO: (d2 → 128/125 , GrGrA1 → 20000/19683). Basis: ([1, 0, 0], [7, 0, -3], [5, -9, 4])

28-EDO: (dAcm2 → 648/625 , AcAcA1 → 2187/2048). Basis: ([1, 0, 0], [3, 4, -4], [-11, 7, 0])

29-EDO: (GrA1 → 250/243 , Grdd0 → 16875/16384). Basis: ([1, 0, 0], [1, -5, 3], [-14, 3, 4])

31-EDO: (Ac1 → 81/80 , Grdddd3 → 393216/390625). Basis: ([1, 0, 0], [-4, 4, -1], [17, 1, -8])

32-EDO: (Grd2 → 2048/2025 , GrAA1 → 3125/2916). Basis: ([1, 0, 0], [11, -4, -2], [-2, -6, 5])

33-EDO: (d2 → 128/125 , AcAcAcA1 → 177147/163840). Basis: ([1, 0, 0], [7, 0, -3], [-15, 11, -1])

34-EDO: (Grd2 → 2048/2025 , ddAcm0 → 15625/15552). Basis: ([1, 0, 0], [11, -4, -2], [-6, -5, 6])

35-EDO: (AcAcA1 → 2187/2048 , dd0 → 3125/3072). Basis: ([1, 0, 0], [-11, 7, 0], [-10, -1, 5])

37-EDO: (GrA1 → 250/243 , GrGrddd3 → 262144/253125). Basis: ([1, 0, 0], [1, -5, 3], [18, -4, -5])

39-EDO: (d2 → 128/125 , ddAcAcAcm2 → 1594323/1562500). Basis: ([1, 0, 0], [7, 0, -3], [-2, 13, -8])

40-EDO: (dAcm2 → 648/625 , AcAcAcA1 → 177147/163840). Basis: ([1, 0, 0], [3, 4, -4], [-15, 11, -1])

41-EDO: (dd0 → 3125/3072 , GrGrA1 → 20000/19683). Basis: ([1, 0, 0], [-10, -1, 5], [5, -9, 4])

42-EDO: (d2 → 128/125 , GrGrGrAA1 → 5000000/4782969). Basis: ([1, 0, 0], [7, 0, -3], [6, -14, 7])

43-EDO: (Ac1 → 81/80 , Grdddddd4 → 50331648/48828125). Basis: ([1, 0, 0], [-4, 4, -1], [24, 1, -11])

45-EDO: (Ac1 → 81/80 , GrGrdddddd-1 → 146484375/134217728). Basis: ([1, 0, 0], [-4, 4, -1], [-27, 1, 11])

46-EDO: (Grd2 → 2048/2025 , ddAcAcm2 → 78732/78125). Basis: ([1, 0, 0], [11, -4, -2], [2, 9, -7])

47-EDO: (dAcAcm2 → 6561/6250 , Grdd0 → 16875/16384). Basis: ([1, 0, 0], [-1, 8, -5], [-14, 3, 4])

48-EDO: (Grdd0 → 16875/16384 , GrGrA1 → 20000/19683). Basis: ([1, 0, 0], [-14, 3, 4], [5, -9, 4])

49-EDO: (ddAcm0 → 15625/15552 , GrGrm2 → 20480/19683). Basis: ([1, 0, 0], [-6, -5, 6], [12, -9, 1])

50-EDO: (Ac1 → 81/80 , Grddddddd-2 → 1220703125/1207959552). Basis: ([1, 0, 0], [-4, 4, -1], [-27, -2, 13])

51-EDO: (GrA1 → 250/243 , GrGrddddd-1 → 17578125/16777216). Basis: ([1, 0, 0], [1, -5, 3], [-24, 2, 9])

52-EDO: (dAcm2 → 648/625 , GrGrGrdd0 → 4428675/4194304). Basis: ([1, 0, 0], [3, 4, -4], [-22, 11, 2])

53-EDO: (ddAcm0 → 15625/15552 , GrGrd0 → 32805/32768). Basis: ([1, 0, 0], [-6, -5, 6], [-15, 8, 1])

54-EDO: (Grd2 → 2048/2025 , GrGrAAA1 → 390625/354294). Basis: ([1, 0, 0], [11, -4, -2], [-1, -11, 8])

55-EDO: (Ac1 → 81/80 , GrGrdddddddd5 → 6442450944/6103515625). Basis: ([1, 0, 0], [-4, 4, -1], [31, 1, -14])

56-EDO: (Grd2 → 2048/2025 , dddAcAcm0 → 1953125/1889568). Basis: ([1, 0, 0], [11, -4, -2], [-5, -10, 9])

58-EDO: (Grd2 → 2048/2025 , ddAcAcAcm2 → 1594323/1562500). Basis: ([1, 0, 0], [11, -4, -2], [-2, 13, -8])

59-EDO: (GrA1 → 250/243 , GrGrdddddd4 → 268435456/263671875). Basis: ([1, 0, 0], [1, -5, 3], [28, -3, -10])

60-EDO: (dd0 → 3125/3072 , GrGrGrd0 → 531441/524288). Basis: ([1, 0, 0], [-10, -1, 5], [-19, 12, 0])

61-EDO: (GrGrA1 → 20000/19683 , GrGrddd3 → 262144/253125). Basis: ([1, 0, 0], [5, -9, 4], [18, -4, -5])

63-EDO: (dd0 → 3125/3072 , GrGrGrm2 → 1638400/1594323). Basis: ([1, 0, 0], [-10, -1, 5], [16, -13, 2])

64-EDO: (dAcm2 → 648/625 , GrGrGrGrdd0 → 71744535/67108864). Basis: ([1, 0, 0], [3, 4, -4], [-26, 15, 1])

65-EDO: (GrGrd0 → 32805/32768 , ddAcAcm2 → 78732/78125). Basis: ([1, 0, 0], [-15, 8, 1], [2, 9, -7])

67-EDO: (Ac1 → 81/80 , GrGrddddddddd6 → 824633720832/762939453125). Basis: ([1, 0, 0], [-4, 4, -1], [38, 1, -17])

69-EDO: (Ac1 → 81/80 , GrGrGrdddddddddd-3 → 2288818359375/2199023255552). Basis: ([1, 0, 0], [-4, 4, -1], [-41, 1, 17])

70-EDO: (Grd2 → 2048/2025 , ddddAcAcm3 → 51018336/48828125). Basis: ([1, 0, 0], [11, -4, -2], [5, 13, -11])

71-EDO: (GrGrm2 → 20480/19683 , Grdddd3 → 393216/390625). Basis: ([1, 0, 0], [12, -9, 1], [17, 1, -8])

72-EDO: (ddAcm0 → 15625/15552 , GrGrGrd0 → 531441/524288). Basis: ([1, 0, 0], [-6, -5, 6], [-19, 12, 0])

73-EDO: (ddAcAcm2 → 78732/78125 , GrGrddd3 → 262144/253125). Basis: ([1, 0, 0], [2, 9, -7], [18, -4, -5])

74-EDO: (Ac1 → 81/80 , GrGrdddddddddd6 → 19791209299968/19073486328125). Basis: ([1, 0, 0], [-4, 4, -1], [41, 2, -19])

75-EDO: (GrGrA1 → 20000/19683 , GrGrdddd-1 → 2109375/2097152). Basis: ([1, 0, 0], [5, -9, 4], [-21, 3, 7])

77-EDO: (GrGrd0 → 32805/32768 , ddAcAcAcm2 → 1594323/1562500). Basis: ([1, 0, 0], [-15, 8, 1], [-2, 13, -8])

78-EDO: (Grd2 → 2048/2025 , ddddAcAcAcm0 → 244140625/229582512). Basis: ([1, 0, 0], [11, -4, -2], [-4, -15, 12])

79-EDO: (dd0 → 3125/3072 , GrGrGrGrd0 → 43046721/41943040). Basis: ([1, 0, 0], [-10, -1, 5], [-23, 16, -1])

80-EDO: (Grd2 → 2048/2025 , dddAcAcAcAcm0 → 390625000/387420489). Basis: ([1, 0, 0], [11, -4, -2], [3, -18, 11])

81-EDO: (Ac1 → 81/80 , GrGrGrddddddddddd-4 → 286102294921875/281474976710656). Basis: ([1, 0, 0], [-4, 4, -1], [-48, 1, 20])

83-EDO: (ddAcm0 → 15625/15552 , GrGrGrGrdd3 → 8388608/7971615). Basis: ([1, 0, 0], [-6, -5, 6], [23, -13, -1])

84-EDO: (ddAcAcm2 → 78732/78125 , GrGrGrd0 → 531441/524288). Basis: ([1, 0, 0], [2, 9, -7], [-19, 12, 0])

85-EDO: (dd0 → 3125/3072 , GrGrGrGrGrdd3 → 134217728/129140163). Basis: ([1, 0, 0], [-10, -1, 5], [27, -17, 0])

87-EDO: (ddAcm0 → 15625/15552 , GrGrGrGrddd3 → 67108864/66430125). Basis: ([1, 0, 0], [-6, -5, 6], [26, -12, -3])

88-EDO: (Ac1 → 81/80 , GrGrGrdddddddddddd-4 → 2384185791015625/2251799813685248). Basis: ([1, 0, 0], [-4, 4, -1], [-51, 0, 22])

89-EDO: (GrGrd0 → 32805/32768 , ddddAcm3 → 10077696/9765625). Basis: ([1, 0, 0], [-15, 8, 1], [9, 9, -10])

90-EDO: (Grd2 → 2048/2025 , ddddAcAcAcAcm0 → 1220703125/1162261467). Basis: ([1, 0, 0], [11, -4, -2], [0, -19, 13])

91-EDO: (ddAcm0 → 15625/15552 , GrGrGrGrd0 → 43046721/41943040). Basis: ([1, 0, 0], [-6, -5, 6], [-23, 16, -1])

94-EDO: (GrGrd0 → 32805/32768 , dddAcAcAcm0 → 9765625/9565938). Basis: ([1, 0, 0], [-15, 8, 1], [-1, -14, 10])

95-EDO: (GrGrA1 → 20000/19683 , Grdddddd4 → 50331648/48828125). Basis: ([1, 0, 0], [5, -9, 4], [24, 1, -11])

96-EDO: (Grdddd3 → 393216/390625 , GrGrGrd0 → 531441/524288). Basis: ([1, 0, 0], [17, 1, -8], [-19, 12, 0])

97-EDO: (GrGrGrm2 → 1638400/1594323 , dddAcAcm0 → 1953125/1889568). Basis: ([1, 0, 0], [16, -13, 2], [-5, -10, 9])

98-EDO: (Ac1 → 81/80 , GrGrGrdddddddddddddd8 → 324259173170675712/298023223876953125). Basis: ([1, 0, 0], [-4, 4, -1], [55, 2, -25])

99-EDO: (Grdddd3 → 393216/390625 , GrGrGrA1 → 1600000/1594323). Basis: ([1, 0, 0], [17, 1, -8], [9, -13, 5])

...

Here are some reductions (of EDOs with division > 53 and <= 100) that still happen when you have rank-3 commas available. 

19 ← (57)

31 ← (62)

22 ← (66)

34 ← (68)

19 ← (76)

41 ← (82)

43 ← (86)

46 ← (92)

31 ← (93)

50 ← (100)

.

Here are some rank-4 EDO definitions:

Rank-4 EDOs: 

6-EDO: (M2 → 10/9, m2 → 16/15, SbSbAcm2 → 49/48). Basis matrix: ([1, 0, 0, 0], [1, -2, 1, 0], [4, -1, -1, 0], [-4, -1, 0, 2])

24-EDO: (SbSbAcm2 → 49/48, Ac1 → 81/80, d2 → 128/125). Basis matrix: ([1, 0, 0, 0], [-4, -1, 0, 2], [-4, 4, -1, 0], [7, 0, -3, 0])

36-EDO: (Ac1 → 81/80, d2 → 128/125, SbSbSbdd3 → 686/675). Basis matrix: ([1, 0, 0, 0], [-4, 4, -1, 0], [7, 0, -3, 0], [1, -3, -2, 3])

38-EDO: (SpSpGrA0 → 50/49, Ac1 → 81/80, AA0 → 3125/3072). Basis matrix: ([1, 0, 0, 0], [1, 0, 2, -2], [-4, 4, -1, 0], [-10, -1, 5, 0])

57-EDO: (Ac1 → 81/80, SbSbSbAcAcm2 → 1029/1024, AA0 → 3125/3072). Basis matrix: ([1, 0, 0, 0], [-4, 4, -1, 0], [-10, 1, 0, 3], [-10, -1, 5, 0])

66-EDO: (GrA1 → 250/243, SbSbSbdd3 → 686/675, SbSbSbAcAcm2 → 1029/1024). Basis matrix: ([1, 0, 0, 0], [1, -5, 3, 0], [1, -3, -2, 3], [-10, 1, 0, 3])

68 EDO: (SbSbm2 → 245/243, Grd2 → 2048/2025, SbSbSbSbAcdd3 → 2401/2400). Basis matrix: ([1, 0, 0, 0], [0, -5, 1, 2], [11, -4, -2, 0], [-5, -1, -2, 4])
76 EDO: (Ac1 → 81/80, SbSbSbSbAcdd3 → 2401/2400, AA0 → 3125/3072). Basis matrix: ([1, 0, 0, 0], [-4, 4, -1, 0], [-5, -1, -2, 4], [-10, -1, 5, 0])
86 EDO: (Ac1 → 81/80, SpSpGrd1 → 6144/6125, SbSbSbSbAcdddd4 → 9604/9375). Basis matrix: ([1, 0, 0, 0], [-4, 4, -1, 0], [11, 1, -3, -2], [2, -1, -5, 4])
100-EDO: (Ac1 → 81/80, SpSpGrd1 → 6144/6125, SpSpSpSpGrAAAAA-2 → 78125/76832). Basis matrix: ([1, 0, 0, 0], [-4, 4, -1, 0], [11, 1, -3, -2], [-5, 0, 7, -4])

Rank-5 EDOs:
20 EDO: (A1 → 25/24, Sbm2 → 28/27, SbSbAcm2 → 49/48, AsAsGrd1 → 121/120). Basis matrix: ([1, 0, 0, 0, 0], [-3, -1, 2, 0, 0], [2, -3, 0, 1, 0], [-4, -1, 0, 2, 0], [-3, -1, -1, 0, 2])

93-EDO: (Ac1 → 81/80, SbAcd2 → 126/125, SbSbSbAcAcm2 → 1029/1024, DeDeDeSbAcAcM2 → 1344/1331). Basis matrix: ([1, 0, 0, 0, 0], [-4, 4, -1, 0, 0], [1, 2, -3, 1, 0], [-10, 1, 0, 3, 0], [6, 1, 0, 1, -3])

The rank-6 EDOs below 100-divisions are [30, 44, 62, 82]-EDO.

My program stopped working at rank-6 for some reason, but I tried figuring out minimal commas by hand. 

30-EDO: Sbm2 → 28/27, SbSbAcm2 → 49/48, AsGr1 → 55/54, AsSbd2 → 77/75, PrPrSpGrd1 → 169/168. Basis matrix: ([1, 0, 0, 0, 0, 0], [2, -3, 0, 1, 0, 0], [-4, -1, 0, 2, 0, 0], [-1, -3, 1, 0, 1, 0], [0, -1, -2, 1, 1, 0], [-3, -1, 0, -1, 0, 2])

44 EDO: SpSpGrA0 → 50/49, AsGr1 → 55/54, SpGr1 → 64/63, AsSpSpGrM0 → 99/98, PrPrSpGrd1 → 169/168. Basis matrix: ([1, 0, 0, 0, 0, 0], [1, 0, 2, -2, 0, 0], [-1, -3, 1, 0, 1, 0], [6, -2, 0, -1, 0, 0], [-1, 2, 0, -2, 1, 0], [-3, -1, 0, -1, 0, 2])

62 EDO: Ac1 → 81/80, AsSpSpGrM0 → 99/98, AsAsGrd1 → 121/120, SbAcd2 → 126/125, PrPrSpGrd1 → 169/168. Basis matrix: ([1, 0, 0, 0, 0, 0], [-4, 4, -1, 0, 0, 0], [-1, 2, 0, -2, 1, 0], [-3, -1, -1, 0, 2, 0], [1, 2, -3, 1, 0, 0], [-3, -1, 0, -1, 0, 2])

82 EDO: DeA1 → 100/99, SpA0 → 225/224, DeDeAcAcA1 → 243/242, DeDeSbSbAcAcM2 → 245/242, PrPrSpGrd1 → 169/168. Basis matrix: ([1, 0, 0, 0, 0, 0], [2, -2, 2, 0, -1, 0], [-5, 2, 2, -1, 0, 0], [-1, 5, 0, 0, -2, 0], [-1, 0, 1, 2, -2, 0], [-3, -1, 0, -1, 0, 2])


The absolute determinants of the basis matrices match the EDO divisions at least.

Rank-8: [92]-EDO

So 92-EDO is supposed to be rank-8 intervalically. And the program I wrote to find these things stopped working at rank-6. But I made this rank-6 matrix by hand, and it has determinant 92: 
    
    ([1, 0, 0, 0, 0, 0], [-3, -1, -1, 0, 2, 0], [1, 2, -3, 1, 0, 0], [4, 0, -2, -1, 1, 0], [0, -5, 1, 2, 0, 0], [-3, -1, 0, -1, 0, 2]]

But maybe that's not actually a definition of 92-EDO for some reason. I guess I should try tuning a bunch of intervals using that matrix and I can see if they span all the steps from 0 to 92.

If that doesn't work, I found a bunch of rank-8 matrices with determinant = 92 (and of course they're each made up of an octave and a bunch of comma intervals tuned to small frequency ratios). Here's the just tuning for one basis matrix which is quite low complexity in terms of the sum of tuned numerators and denominators:

    [221/220, 169/168, 136/135, 126/125, 364/361, 121/120, 91/90, 2/1]

and this one has low complexity in the sense of the largest numerator of the comma with the smallest cent value:

    [154/153, 136/135, 126/125, 364/361, 121/120, 343/340, 91/90, 2/1]

I meant to find the basis that minimizes the largesr numerator, but I messed up my sorting function. I'll fix it soon.

But maybe one of those will work.

...

Yeah, works fine. And they tune intervals in the same way. Empirically equivalent rank8  definitions of 92 EDO. Still have to look at tje rank 6 definition.

I'm open to the possibility that some of these sets of intervals are not jointly optimally small in their frequency ratios. Like, for 92-EDO I came up with two different notions of complexity because I didn't remember what I did for the program that worked at lower ranks and I didn't want to look through my code.

I think the programs I wrote did a good job of finding compact bases, but I can't declare without doubt that these are the canonical forms for defining EDOs minimally by tempering.

I would love it if there were a simple way to directly figure out small commas from the tunings of the prime harmonics, or even just a set of tempered commas that were adequate to define the EDO, if not to define it with intervals that get justly tuned to small frequency ratios. The closest thing that I know of is a trick to find a set of commas that are tempered out by a pair of EDOs. So like, if you want some commas for 92-EDO, you could find the commas associated with (92 and 12)-EDO or (92 and 46)-EDO and so on. 

And then you could arrange all the commas by size and see if a different subsets get you a good matrix? Mostly I just do brute force search over comma coordinates to get commas and that works quickly and reliably enough. But I'll figure out something systematic one day. I think I'd be happy if I could figure out a procedure that would automatically give me a comma for each prime-limit. Like a 3-limit fractions, a 5-limit fraction, a 7-limit fraction, so on.

Suppose I have found the tempered comma such that its tuned fraction is the smallest possible, for each prime-limit for an EDO, with limits up to the rank of the interval space. Like 82-EDO requires rank-6 intervallic interpretations, so up to rank 6 we have:
    
    36893488147419103232/36472996377170786403 # rank-2 (3-limit)
    3125/3072 # rank-3 (5-limit)
    225/224 # rank-4 (7-limit)
    100/99 # rank-5 (11-limit)
    169/168 # rank-6 (13-limit)

If we have the smallest comma of each prime limit, that should make a suitable basis with absolute determinant 82 when combined with the octave, right?

After that we can look for a few tempered commas with small associated fractions that aren't necessarily the shortest for each prime limit, like:  (243/242), (245/242), (245/243), (441/440), (540/539), (625/616), (676/675), (875/864).

Those first three fractions look a little crazy, but they're real. Anyway, now we hope we can mix some of those in to replace longer fractions in the old 82-absolute-determinant basis, and still have a suitable basis, but a shorter one. Semi-automatically, hopefully.

Why are we doing this again? Because even though EDOs are 1D in frequency space, their intervallic interpretations live in higher dimensional interval spaces, and wouldn't it be nice if we could describe those spaces without having to make reference to garbage like 36893488147419103232/36472996377170786403 # rank-2 (3-limit). I think it would be nice. No one needs to look at that to understand 82-EDO.

...