The Bohlen-Pierce Scales


There are basically two Bohlen-Pierce scales. One of them separates the frequency ratio of (3/1) (also called a justly tuned perfect 12th or a tritave) into 13 logarithmically equal pieces. Scale degree ^0 of this scale has a frequency ratio of 3^(0/13), and scale degree ^4 has a frequency ratio of 3^(4/13), and so on. If we talk about scales that equally divide the tritave (EDTs) instead of scales that equally divide the octave (EDOs), then the first Bohlen-Pierce scale is 13-EDT.

The second Bohlen-Pierce scale is really close to the first, but it has justly tuned (i.e. rational) frequency ratios, instead of irrational exponential ones. Moreover, the ratios are 7-limit or septimal, meaning that they can have factors of (2, 3, 5, 7) in their factorizations, but no higher primes. In fact, the septimal Bohlen-Pierce ratios don't have any factors of 2 - it's an odd 7-limit scale. There are no octaves and no even harmonics. Here are the elements of the septimal BP scale:

Bohlen 0: C ~ 1/1
Bohlen 1: C#/Db ~ 27/25
Bohlen 2: D ~ 25/21
Bohlen 3: E ~ 9/7
Bohlen 4: F ~ 7/5
Bohlen 5: F#/Gb ~ 75/49
Bohlen 6: G ~ 5/3
Bohlen 7: H ~ 9/5
Bohlen 8: H#/Jb ~ 49/25
Bohlen 9: J ~ 15/7
Bohlen 10: A ~ 7/3
Bohlen 11: A#/Bb ~ 63/25
Bohlen 12: B ~ 25/9
Bohlen 13: C ~ 3/1
.
There are also letter names (i.e. pitch classes) which I've written in. The letters go up to J now, instead of G. How curious. And there's no pitch class I. Kind of dumb. Not my system. Some people call the tritave a "decade", after the number 10, which fits with there being 9 natural pitch classes, just as an octave, afterr the number 8, fits with there being 7 natural pitch classes in western music. I like "decade" better than tritave, honestly, but....I'll probably use tritave in this post.

The intervals of septimal BP are symmetric with respect to the tritave, so that for example, these intervals add to a tritave:

^1 + ^12 = ^13

and their frequency ratios multiply to a justly-tuned tritave:

(27/25) * (25/9) = (3/1)

Consequently, the intervals between successive steps are also symmetric with respect to the tritave. Four different intervals show up between successive steps. I'm not sure yet how to name intervals in Bohlen-Pierce, but the four intervals have the following frequency ratios:

(27/25), (49/45), (375/343), (625/567)
.

These four tuned intervals happen to increase in size with increasing complexity. Here they are in cents:

133 cents ~ (27/25)
147 cents ~ (49/45)
154 cents ~ (375/343)
169 cents ~ (625/567)
.

The small simple ratios ("A-sized" intervals) are related to each other by one factor and the large complicated ratios ("B-sized" intervals) are related to each other by the same factor:

(49/45) / (27/25) = (245/243)
(625/567) / (375/343) = (245/243)

Each large-complicated ratio is also related to one of the small-simple ratios:

(375/343) * (49/45) = (25/21)
(625/567) * (27/25) = (25/21)

, so there's a lot of structure here.

I said that I don't know how to name intervals in the Bohlen-Pierce scales, but one thing that we could do is just take the names of septimal frequency ratios in {septimal just intonation with pure octaves} and import the names directly to talk about this new scale without octaves. On each line below I show a frequency ratio for a scale degree in septimal BP, the frequency ratio represented in the reduced prime basis (2/1, 3/2, 5/4, 7/4), and the name for the frequency ratio in the Johnston-Lilley naming system for 7-limit just intonation.

1/1 :: (0, 0, 0, 0) : P1
27/25 :: (-1, 3, -2, 0) : Acm2
25/21 :: (1, -1, 2, -1) : SpA2
9/7 :: (0, 2, 0, -1) : SpM3
7/5 :: (0, 0, -1, 1) : Sbd5
75/49 :: (1, 1, 2, -2) : SpSpAA4
5/3 :: (1, -1, 1, 0) : M6
9/5 :: (0, 2, -1, 0) : m7
49/25 :: (0, 0, -2, 2) : SbSbAcd9
15/7 :: (1, 1, 1, -1) : SpA8
7/3 :: (1, -1, 0, 1) : Sbm10
63/25 :: (0, 2, -2, 1) : SbAcd11
25/9 :: (2, -2, 2, 0) : A11
3/1 :: (1, 1, 0, 0) : P12
.
I think it would be really cool if I could take music written in an octave-based tuning system and retune it to BP. That'll be one of my goals in this blog post. Also, I want to find a principled way of assigning interval names to BP steps that looks better than the thing above. Like, the opposite of an augmented 11th, A11, should be diminished interval, not an acute minor second, Acm2. The interval prefixes are mismatched here (or, rather, they're matched to octave complements, rather than tritave complements).

We just represented the BP frequency ratios in a rank-4 basis in order to import names from a subspace of the rank-4 septimal intervals with octave complements, but Bohlen-Pierce is only a rank-3 space: you can represent frequency ratios with powers of (3/1, 5/1, 7/1). Another option I prefer is the tritave-reduced odd prime basis, (3/1, 5/3, 7/3), in which all the odd prime ratios are divided by 3 until they fit in the rage [1/1, 3/1].

Here are the septimal Bohlen Pierce frequency ratios represented in the tritave-reduced odd prime basis:
1/1: (0, 0, 0)
27/25: (1, -2, 0)
25/21: (0, 2, -1)
9/7: (1, 0, -1)
7/5: (0, -1, 1)
75/49: (1, 2, -2)
5/3: (0, 1, 0)
9/5: (1, -1, 0)
49/25: (0, -2, 2)
15/7: (1, 1, -1)
7/3: (0, 0, 1)
63/25: (1, -2, 1)
25/9: (0, 2, 0)
3/1: (1, 0, 0)
.
There's an even better basis than this though. To introduce it, let's talk about how to name BP intervals a little. Guided a lot by the specific intervals that appear between successive steps of the septimal BP scale, and a little bit by the pitch classes for BP scale steps that are listed on Wikipedia and reproduced at the top of this post, I came up with this assignment of interval names and pitch classes for the septimal BP steps:

Bohlen 0: C ~ 1/1 :: P1
Bohlen 1: Db ~ 27/25 :: m2
Bohlen 2: D ~ 25/21 :: M2
Bohlen 3: E ~ 9/7 :: P3
Bohlen 4: Fb ~ 7/5 :: m4
Bohlen 5: F ~ 75/49 :: M4
Bohlen 6: G ~ 5/3 :: P5
Bohlen 7: H ~ 9/5 :: P6
Bohlen 8: Jb ~ 49/25 :: m7
Bohlen 9: J ~ 15/7 :: M7
Bohlen 10: A ~ 7/3 :: P8
Bohlen 11: Bb ~ 63/25 :: m9
Bohlen 12: B ~ 25/9 :: M9
Bohlen 13: C ~ 3/1 :: P10
.
The basic insight that let me build this is that an A-sized interval increases the pitch class lexicographically through (A, B, C, D, E , F, G, H, J), and a B-sized interval raises the pitch class from a flat to a natural. 

This assignment of pitch classes is really close to the set of pitch classes for Bohlen-Pierce that you can find on Wikipedia, or at the top of this article. The only changes are that (Bohlen ^4 ~ 7/5) is now called Fb instead of F, and (Bohlen ^5 ~ 75/49) is now called F instead of F#/Gb. My system has an intervallic justification and is superior.

Once I had all of that figured out, I examined the merits of some bases that had an A-sized interval, a B-sized interval, and third fudge factor interval to smooth over the fact A and B have two members. Since the two members of each size are related by a factor of (245/243), that was my obvious fudge-factor for C-sized intervals. Doing that worked tremendously well - so well that I gave the frequency ratio basis [(27/25), (375/343), (245/243)] a name, the Bluepoint basis, but there's an even better one coming. A Bluepoint is an oyster harvested near Long Island in New York. It's a cute name. I'm cute.

Of the four intervals that appear between successive steps of septimal Bohlen-Pierce, 

[(27/25), (49/45), (375/343), (625/567)]

only the first one has been associated with an interval name so far: it's a minor second, and it appears as Bohlen ^1. If (49/45) is also an A-sized interval that raises letter names of pitch classes, then it also has to be some kind of a 2nd interval. The more I looked at it, the more I came to realize that it was functioning like an acute minor second, Acm2, in 5-limit just intonation. This means that C-sized interval, the "fudge-factor" with a frequency ratio of (245/243), is an acute unison, Ac1. The B-sized interval that raises pitch classes from flat to natural is obviously an augmented unison, A1, since that's basically what augmentation means. I ended up calling (375/343) the A1 and the related (625/567) is an acute augmented unison, AcA1.

All together we have these differences between successive chromatic intervals:

P1 - m2 = m2
m2 - M2 = AcA1
M2 - P3 = m2
P3 - m4 = Acm2
m4 - M4 = A1
M4 - P5 = Acm2
P5 - P6 = m2
P6 - m7 = Acm2
m7 - M7 = A1
M7 - P8 = Acm2
P8 - m9 = m2
m9 - M9 = AcA1
M9 - P10 = m2
.

Next I wrote a program that names intervals in Bluepoint, which we can now say is an interval basis, (m2, A1, Ac1), tuned to a frequency ratio basis, [(27/25), (375/343), (245/243)]. The results are a little bit crazy; some intervals with short names have very large numerators and denominators:

(0, -1, -1) : Grd1 : (567/625)
(0, -1, 0) : d1 : (343/375)
(0, -1, 1) : Acd1 : (16807/18225)
(0, 0, 0) : P1 : (1/1)
(0, 0, 1) : Ac1 : (245/243)
(0, 1, 0) : A1 : (375/343)
(0, 1, 1) : AcA1 : (625/567)
(1, -1, -1) : Grd2 : (15309/15625)
(1, -1, 0) : d2 : (3087/3125)
(1, -1, 1) : Acd2 : (16807/16875)
(1, 0, 0) : m2 : (27/25)
(1, 0, 1) : Acm2 : (49/45)
(1, 1, 0) : GrM2 : (405/343)
(1, 1, 1) : M2 : (25/21)
(1, 1, 2) : AcM2 : (875/729)
(1, 2, 0) : GrA2 : (151875/117649)
(1, 2, 1) : A2 : (3125/2401)
(1, 2, 2) : AcA2 : (15625/11907)
(2, 0, 0) : Grd3 : (729/625)
(2, 0, 1) : d3 : (147/125)
(2, 0, 2) : Acd3 : (2401/2025)
(2, 1, 0) : Gr3 : (2187/1715)
(2, 1, 1) : P3 : (9/7)
(2, 1, 2) : Ac3 : (35/27)
(2, 2, 0) : GrA3 : (164025/117649)
(2, 2, 1) : A3 : (3375/2401)
(2, 2, 2) : AcA3 : (625/441)
(3, 0, 1) : Grd4 : (3969/3125)
(3, 0, 2) : d4 : (2401/1875)
(3, 0, 3) : Acd4 : (117649/91125)
(3, 1, 1) : Grm4 : (243/175)
(3, 1, 2) : m4 : (7/5)
(3, 1, 3) : Acm4 : (343/243)
(3, 2, 1) : GrM4 : (3645/2401)
(3, 2, 2) : M4 : (75/49)
(3, 2, 3) : AcM4 : (125/81)
(3, 3, 1) : GrA4 : (1366875/823543)
(3, 3, 2) : A4 : (28125/16807)
(3, 3, 3) : AcA4 : (15625/9261)
(4, 1, 2) : Grd5 : (189/125)
(4, 1, 3) : d5 : (343/225)
(4, 1, 4) : Acd5 : (16807/10935)
(4, 2, 2) : Gr5 : (81/49)
(4, 2, 3) : P5 : (5/3)
(4, 2, 4) : Ac5 : (1225/729)
(4, 3, 2) : GrA5 : (30375/16807)
(4, 3, 3) : A5 : (625/343)
(4, 3, 4) : AcA5 : (3125/1701)
(5, 1, 2) : Grd6 : (5103/3125)
(5, 1, 3) : d6 : (1029/625)
(5, 1, 4) : Acd6 : (16807/10125)
(5, 2, 2) : Gr6 : (2187/1225)
(5, 2, 3) : P6 : (9/5)
(5, 2, 4) : Ac6 : (49/27)
(5, 3, 2) : GrA6 : (32805/16807)
(5, 3, 3) : A6 : (675/343)
(5, 3, 4) : AcA6 : (125/63)
(6, 1, 3) : Grd7 : (27783/15625)
(6, 1, 4) : d7 : (16807/9375)
(6, 1, 5) : Acd7 : (823543/455625)
(6, 2, 3) : Grm7 : (243/125)
(6, 2, 4) : m7 : (49/25)
(6, 2, 5) : Acm7 : (2401/1215)
(6, 3, 3) : GrM7 : (729/343)
(6, 3, 4) : M7 : (15/7)
(6, 3, 5) : AcM7 : (175/81)
(6, 4, 3) : GrA7 : (273375/117649)
(6, 4, 4) : A7 : (5625/2401)
(6, 4, 5) : AcA7 : (3125/1323)
(7, 2, 4) : Grd8 : (1323/625)
(7, 2, 5) : d8 : (2401/1125)
(7, 2, 6) : Acd8 : (117649/54675)
(7, 3, 4) : Gr8 : (81/35)
(7, 3, 5) : P8 : (7/3)
(7, 3, 6) : Ac8 : (1715/729)
(7, 4, 4) : GrA8 : (6075/2401)
(7, 4, 5) : A8 : (125/49)
(7, 4, 6) : AcA8 : (625/243)
(8, 2, 4) : Grd9 : (35721/15625)
(8, 2, 5) : d9 : (7203/3125)
(8, 2, 6) : Acd9 : (117649/50625)
(8, 3, 4) : Grm9 : (2187/875)
(8, 3, 5) : m9 : (63/25)
(8, 3, 6) : Acm9 : (343/135)
(8, 4, 5) : GrM9 : (135/49)
(8, 4, 6) : M9 : (25/9)
(8, 4, 7) : AcM9 : (6125/2187)
(8, 5, 5) : GrA9 : (50625/16807)
(8, 5, 6) : A9 : (3125/1029)
(8, 5, 7) : AcA9 : (15625/5103)
(9, 3, 6) : d10 : (343/125)
(9, 4, 5) : Gr10 : (729/245)
(9, 4, 6) : P10 : (3/1)
(9, 4, 7) : Ac10 : (245/81)
(9, 5, 6) : A10 : (1125/343)

, but that's not a problem with my system; when you have frequency ratios with factors of (3, 5, 7) instead of (2, 3, 5), the numerators and denominators are simply usually going to be bigger. So here's the code. You can now name name septimal Bohlen-Pierce intervals, provided you can express them in the Bluepoint basis, which is a pretty simple matter of finding the exponents of [(27/25), (375/343), (245/243)] that reproduce your desired frequency ratio. 

This basis is really good. It has many of the desirable properties of Lilley's (Ac1, A1, d2) basis for 5-limit just intonation. Let's look at just the chromatic intervals of septimal BP in the Bluepoint basis for a moment:

(0, 0, 0) : P1 : (1/1)
(1, 0, 0) : m2 : (27/25)
(1, 1, 1) : M2 : (25/21)
(2, 1, 1) : P3 : (9/7)
(3, 1, 2) : m4 : (7/5)
(3, 2, 2) : M4 : (75/49)
(4, 2, 3) : P5 : (5/3)
(5, 2, 3) : P6 : (9/5)
(6, 2, 4) : m7 : (49/25)
(6, 3, 4) : M7 : (15/7)
(7, 3, 5) : P8 : (7/3)
(8, 3, 5) : m9 : (63/25)
(8, 4, 6) : M9 : (25/9)
(9, 4, 6) : P10 : (3/1)

.

Some desirable properties:

1) All of the basis components increase monotonically with increasing BP step.

2) All of the frequency ratios of the tuned basis elements are greater than (1/1).

3) One of the basis components matches the ordinal of the interval name minus one. I would have been happy if they were related by any constant integer offset, but minus one is nice.

4) The absolute determinant of the basis is unity, which just ensures that things have integral coordinates. I haven't demonstrated this to you, and I know it's a little unclear what I mean. If you express Bluepoint in the odd prime basis, you can find the determinant of that matrix of vectors, and the absolute value of the determinant will be 1. There are lots of full rank bases with determinants that are one or minus one, and expressing any of them in any of the others will give you determinant whose absolute value is unity, which gives you integer coordinates. Integer coordinates are good for lots of reasons, like for designing isomorphic keyboards with non-overlapping keys. Also integer coordinates become integer exponents in tuning, which means that if you start with basis elements tuned to rational values, then every interval in your system will also be rational. Tuning systems where the absolute determinant of the matrix of basis vectors is unity (when the basis vectors are expressed in any other such basis, using the primes as a base case for inducing the full family) let you define just intonation tuning systems.

There's an even better basis coming, but this table is still good for quickly looking up interval names and their corresponding frequency ratios.

What if you don't want to do a brute force search over exponents in order to name a frequency ratio? I can help with that. First, factorize your frequency ratio, i.e. express it in the odd prime basis (3/1, 5/1, 7/1). Then we can do a change of basis to Bluepoint.   

If you've been reading my blog, you know the drill by now. To change bases, first you find the frequency ratios of the old basis (the odd 7-limit prime basis in this case) expressed in the new basis (the Bluepoint basis in this case):

3/1 = (9, 4, 6) # P10
5/1 = (13, 6, 9) # P14
7/1 = (16, 7, 11) # P17

Then you convert columns into rows: 

def convert_prime_basis_to_bluepoint(interval):
(x, y, z) = interval
a = x * 9 + y * 13 + z * 16
b = x * 4 + y * 6 + z * 7
c = x * 6 + y * 9 + z * 11
return (a, b, c)

It is done, and it is done well. Now you can find the tritave-based interval names associated with arbitrary odd 7-limit frequency ratios from their factorizations, by using this change of basis function and then running my python code from before.

Now for the best basis: in 5-limit octave-based just intonation, the Lilley basis is (Ac1, A1, d2). In septimal Bohlen-Pierce, the Bluepoint basis is (m2, A1, Ac1). The order of intervals isn't important, so the only real difference is that the d2 from 5-limit JI is replaced with an m2 in the Bluepoint basis. What happens if we use Lilley's (Ac1, A1, d2) for Bohlen Pierce intervals though? The BP diminished 2nd is 

d2 : (3087/3125)

To make a change of basis, here are the old vectors of the Bluepoint basis 

(0, 1, 1) = 27/25 # m2
(0, 1, 0) = 375/343 # A1
(1, 0, 0) = 245/243 # Ac1

expressed in a version of the Lilley basis, (Ac1, A1, d2), modified for Bohlen-Pierce, so that we now tune those intervals to frequency ratios of (245/243, 375/343, 3087/3125). Although, it's actually faster for me to find coordinates by brute force search over exponents than to do a change of basis, so instead of writing a new change of basis function, here are the coordinates for the chromatic Bohlen Pierce intervals directly:

(0, 0, 0) = 1/1 # P1
(0, 1, 1) = 27/25 # m2
(1, 2, 1) = 25/21 # M2
(1, 3, 2) = 9/7 # P3
(2, 4, 3) = 7/5 # m4
(2, 5, 3) = 75/49 # M4
(3, 6, 4) = 5/3 # P5
(3, 7, 5) = 9/5 # P6
(4, 8, 6) = 49/25 # m7
(4, 9, 6) = 15/7 # M7
(5, 10, 7) = 7/3 # P8
(5, 11, 8) = 63/25 # m9
(6, 12, 8) = 25/9 # M9
(6, 13, 9) = 3/1 # P10

.

It's so good! Now the last component, d2, is the interval's ordinal minus 1, just as m2 was before. The second component, A1, is the number of Bohlen-Pierce steps!  The first component is... just there. I've never known how to interpret Ac1 in 5-limit octave-basis just intonation either. But it's fine. It's the fudge factor. In 5-limit JI, major Nth and minor Nths had the same Ac1 component, which was kind of nice, and that's not the case here or in the Bluepoint basis, but it's still fine.

Coordinates in the BP-Lilley basis and the JI-Lilley basis generally don't have the same interval names, and of course they shouldn't - the two systems have different intervals, like P3 in Bohlen-Pierce and P4 in Just Intonation. For an example, (4, 9, 6) is a major seventh, M7, in the BP-Lilley basis with a frequency ratio of 15/7 ~= 2.14, and it's an acute diminished 7th, Acd7, in the JI-Lilley basis, with a frequency ratio of 2187/1250 = 1.7496. I wouldn't have minded if the names had been different and the frequency ratios had been close. That would have made it easy to translate music. But it's fine. And you can still translate music if you want, it's just going to be really weird. And let's not pretend that we don't like when music is really weird. The chromatic BP intervals translated to JI intervals this way do keep their order, at least. If we take the chromatic intervals of BP and reinterpret their BP-Lilley coordinates as being JI-Lilley coordinates, we get these frequency ratios:

(0, 0, 0) -> 1.0
(0, 1, 1) -> 1.066666
(1, 2, 1) -> 1.125
(1, 3, 2) -> 1.2
(2, 4, 3) -> 1.296
(2, 5, 3) -> 1.35
(3, 6, 4) -> 1.458
(3, 7, 5) -> 1.5552
(4, 8, 6) -> 1.679616
(4, 9, 6) -> 1.7496
(5, 10, 7) -> 1.889568
(5, 11, 8) -> 2.0155392
(6, 12, 8) -> 2.125764
(6, 13, 9) -> 2.2674816

That interval on the bottom line used to be the perfect 10th with a frequency ratio of (3/1), and now it's only ~ 2.27. So just intonation is falling quite flat.

I've looked at lots of different way of translating music between tritave-based interval space and (rank-2, rank-3, rank-4) octave-based interval spaces and this is by far the best I've come up with. This post used to be about three times as long, and it was just documenting my failures with that search. This is one of the only ways that even keeps the chromatic BP intervals in the same tuned order.

My next goal is to write a program to translate music from 5-limit JI to septimal BP using this scheme to find out how it sounds. I bet it will really suck, but I've got to know.

 ...

Some other time. Some more music theory first. The 13-EDT version of the Bohlen-Pierce scale tempers out some intervals that the septimal BP scale doesn't. And we can find them *so* easily. An interval in the Lilley basis that has a zero for its second component, the A1 component, will be tuned to 0 steps in 13-EDT. All of those intervals are tempered out, i.e. tuned to the same value as P1, namely 1/1 or 3^(0/13). Here are a few with short names

  (-2, 0, 0) : GrGr1 :: 59049/60025
(-1, 0, -1) : GrA0 :: 16875/16807 (-1, 0, 0) : Gr1 :: 243/245 (-1, 0, 1) : Grd2 :: 15309/15625 (0, 0, -1) : A0 :: 3125/3087 (0, 0, 0) : P1 :: 1 (0, 0, 1) : d2 :: 3087/3125 (1, 0, -1) : AcA0 :: 15625/15309 (1, 0, 0) : Ac1 :: 245/243 (1, 0, 1) : Acd2 :: 16807/16875 (2, 0, 0) : AcAc1 :: 60025/59049

.
Those intervals are all tuned to a frequency ratio of 1/1 or 3^(0/13). The fractions at the end were their old justly tuned values. The mathematically inclined among you might be saying, "Since we're going from a 3 dimensional space to a one dimensional space, shouldn't all the tempered out intervals be a linear combination of two independent commas?" You're right and they are. The two independent ones are Ac1 and d2. Any other tempered out interval can be made by a linear combination of those two. It's so easy. There's a much harder way to tune things to 13-EDT, but let's go the easy way.

I went the hard way first and made/found some useful functions along the way though.

This one converts from the Bluepoint basis to the Lilley basis:

def convert_bluepoint_basis_to_lilley(interval):
(x, y, z) = interval
a = x * 0 + y * 0 + z * 1
b = x * 1 + y * 1 + z * 0
c = x * 1+ y * 0 + z * 0
return (a, b, c)

, and this one converts from the Lilley basis to the (P5, P8, P10) basis:

def convert_lilley_basis_to_reduced_perfect(interval):
(x, y, z) = interval
a = x * 1 + y * 3 + z * -5
b = x * 2 + y * -3 + z * 3
c = x * -2 + y * 1 + z * 0
return (a, b, c)

The intervals (P5, P8, P10) are the ones that were justly tuned to (5/3, 7/3, 3/1), respectively, so (P5, P8, P10) is just an intervallic name for the tritave-reduced prime basis of frequency ratios. It's nice that the primes got paired up with perfect intervals, isn't it? It's a good system.

It feels wrong that I have large tables and programs concerning the Bluepoint basis and comparatively little written about the BP-Lilley basis, which I prefer. So here are some more interval in the BP-Lilley basis, sorted by increasing frequency ratio:

(0, 0, 0) : P1 :: 1/1
(1, 0, 0) : Ac1 :: 245/243
(0, 0, -1) : A0 :: 3125/3087
(0, 1, 1) : m2 :: 27/25
(0, 1, 0) : A1 :: 375/343
(1, 2, 2) : d3 :: 147/125
(1, 2, 1) : M2 :: 25/21
(0, 3, 2) : Gr3 :: 2187/1715
(2, 3, 3) : d4 :: 2401/1875
(1, 3, 2) : P3 :: 9/7
(2, 3, 2) : Ac3 :: 35/27
(1, 3, 1) : A2 :: 3125/2401
(2, 4, 3) : m4 :: 7/5
(1, 4, 2) : A3 :: 3375/2401
(3, 5, 4) : d5 :: 343/225
(2, 5, 3) : M4 :: 75/49
(3, 6, 5) : d6 :: 1029/625
(2, 6, 4) : Gr5 :: 81/49
(3, 6, 4) : P5 :: 5/3
(2, 6, 3) : A4 :: 28125/16807
(4, 6, 4) : Ac5 :: 1225/729
(2, 7, 5) : Gr6 :: 2187/1225
(4, 7, 6) : d7 :: 16807/9375
(3, 7, 5) : P6 :: 9/5
(4, 7, 5) : Ac6 :: 49/27
(3, 7, 4) : A5 :: 625/343
(4, 8, 6) : m7 :: 49/25
(3, 8, 5) : A6 :: 675/343
(5, 9, 7) : d8 :: 2401/1125
(4, 9, 6) : M7 :: 15/7
(5, 10, 8) : d9 :: 7203/3125
(4, 10, 7) : Gr8 :: 81/35
(5, 10, 7) : P8 :: 7/3
(4, 10, 6) : A7 :: 5625/2401
(6, 10, 7) : Ac8 :: 1715/729
(5, 11, 8) : m9 :: 63/25
(5, 11, 7) : A8 :: 125/49
(6, 12, 9) : d10 :: 343/125
(6, 12, 8) : M9 :: 25/9
(6, 13, 10) : d11 :: 9261/3125
(5, 13, 9) : Gr10 :: 729/245
(6, 13, 9) : P10 :: 3/1
.

Cool.

You might wonder whether the chromatic intervals of the septimal Bohlen Pierce scale lie on a rank-2 subspace of the full rank-3 space. They do not, so you can't make an isomorphic keyboard in two dimensions that has them all. But I've got an idea for the next best thing!

The next best thing is to use the 13-EDT version of BP and play on a one dimensional keyboard that you may well already own. Easy.

But the next best way after that involves some math! Here it comes!

We'll make a rank-2 system in the Pythagorean way. For Pythagorean tuning, we start with the frequency ratio (1/1) and then we multiply by (3/2), dividing by an (2/1) if the result becomes larger than (2/1). Repeat that on and on upward forever. Also, we can start with the frequency ratio of (1/1) and divide by (3/2), multiplying by (2/1) if the result ever goes below (1/1). Repeat that on and on, downward forever. This produces intervals that only have factors of 2 and 3, but not 5 like in 5-limit just intonation. If we tabulate those results, the portion closest to (1/1) looks like this:

(-7, 5) 4096/2187 d8
(-6, 4) 1024/729 d5
(-5, 3) 256/243 m2
(-4, 3) 128/81 m6
(-3, 2) 32/27 m3
(-2, 2) 16/9 m7
(-1, 1) 4/3 P4
(0, 0) 1/1 P1
(1, 0) 3/2 P5
(2, -1) 9/8 M2
(3, -1) 27/16 M6
(4, -2) 81/64 M3
(5, -2) 243/128 M7
(6, -3) 729/512 A4
(7, -4) 2187/2048 A1

.

The interval coordinates on the far left are in (P5, P8) basis. The middle portion, vertically, consists of the chromatic intervals of octave-based music, and the intervals further toward the tails just get crazier - more and more augmented or diminished. Once you have the notion that (P5 * 2 + P8 * -1) should be a M6, then you can choose a better tuning system, namely quarter comma meantone, that makes things sound more 5-limit and less awful.

What if we do the same thing for Bohlen Pierce? We'll make a tuning system that only tunes intervals to frequency ratios with factors of 3 and 5, use that tuning system to figure out rank-2 interval names, and then find a new tuning system that makes it sound more septimal and less awful! If we start with the frequency ratio and repeatedly multiply or divide by (5/3), normalizing by a factor of (3/1) if things go too low or too high, then we get this table:

(3, 10, 8) : GrGrd9 :: 177147/78125
(0, 3, 3) : GrGrd4 :: 19683/15625
(3, 9, 7) : GrGrd8 :: 6561/3125
(0, 2, 2) : Grd3 :: 729/625
(3, 8, 6) : Grm7 :: 243/125
(0, 1, 1) : m2 :: 27/25
(3, 7, 5) : P6 :: 9/5
(0, 0, 0) : P1 :: 1/1
(3, 6, 4) : P5 :: 5/3
(6, 12, 8) : M9 :: 25/9
(3, 5, 3) : AcM4 :: 125/81
(6, 11, 7) : AcA8 :: 625/243
(3, 4, 2) : AcAcA3 :: 3125/2187
(6, 10, 6) : AcAcA7 :: 15625/6561
(3, 3, 1) : AcAcA2 :: 78125/59049

.

Like before, this goes off infinitely at both ends. And like before, there's a special subset in the middle surrounding P1 ~ (1/1)! The special subset here is everything but the very top interval and the very bottom interval. Look at the second component of each interval coordinates for that set; that's the A1 component and it tells you how the interval gets tuned in 13-EDT, the number of steps. In that special subset, we have every number from [0, 12]. We have a full chromatic scale! Here it is sorted by A1 the component:

(0, 0, 0) : P1 :: 1/1
(0, 1, 1) : m2 :: 27/25
(0, 2, 2) : Grd3 :: 729/625
(0, 3, 3) : GrGrd4 :: 19683/15625
(3, 4, 2) : AcAcA3 :: 3125/2187
(3, 5, 3) : AcM4 :: 125/81
(3, 6, 4) : P5 :: 5/3
(3, 7, 5) : P6 :: 9/5
(3, 8, 6) : Grm7 :: 243/125
(3, 9, 7) : GrGrd8 :: 6561/3125
(6, 10, 6) : AcAcA7 :: 15625/6561
(6, 11, 7) : AcA8 :: 625/243
(6, 12, 8) : M9 :: 25/9
.

Now that we have our chromatic order, let's represent the intervals in the (P5, P10) basis and give them the natural chromatic names that we used to use for the septimal chromatic intervals:

(0, 0) : P1 :: 1/1 => 1/1
(-2, 1) : m2 :: 27/25 => 27/25
(-4, 2) : M2 :: 25/21 => 729/625
(-6, 3) : P3 :: 9/7 => 19683/15625
(5, -2) : m4 :: 7/5 => 3125/2187
(3, -1) : M4 :: 75/49 => 125/81
(1, 0) : P5 :: 5/3 => 5/3
(-1, 1) : P6 :: 9/5 => 9/5
(-3, 2) : m7 :: 49/25 => 243/125
(-5, 3) : M7 :: 15/7 => 6561/3125
(6, -2) : P8 :: 7/3 => 15625/6561
(4, -1) : m9 :: 63/25 => 625/243
(2, 0) : M9 :: 25/9 => 25/9

.

On each line above we have coordinates for a rank-2 chromatic BP interval, the interval name, the frequency ratio associated with the interval in the 7-limit system and the frequency ratio associated with the interval in the 5-limit system.

I wondered if the 5-limit version of P8, 15625/6561, which otherwise would be tuned to 7/3, is really the best 5-limit ratio for the job. Maybe it just came about from our weird operation of stacking P5s and normalizing by P10? Sadly no. You can do a search for arbitrary ratios with powers of 3 and 5, and ....

2.2050895 :: 390625/177147
2.2674816 :: 177147/78125
2.3159674 :: 476837158203125/205891132094649
2.3316389 :: 5559060566555523/2384185791015625
2.3333333 :: 7/3
2.3814967 :: 15625/6561
2.4488801 :: 4782969/1953125
2.5720164 :: 625/243

... and you'll see that our old friend 15625/6561 is a good approximation to 7/3, and anything better would have a crazy number of digits.

That's the Bohlen Pierce version of Pythagorean tuning. Now for the Bohlen Pierce version of quarter comma meantone: to make our Pythagorean chromatic scale sound more septimal, we'll keep the P10 tuned justly to (3/1), but we'll adjust P5 away from (5/3) so that P8 is exactly (7/3). This is analogous to how quarter comma meantone adjusts fifths to improve the intonation of thirds.

The way to adjust the tuned value of the BP perfect fifth (5/3) is to start with the coordinates for P8 in the (P5, P10) basis:

(6, -2) : P8

Form (6, -2) we can say that we want the tuned value of P5, t(P5), to be such that 

t(P5)^6 * t(P10) ^-2 = 7/3

keeping t(P10) = 3/1. Solving this, we get 

t(P5) = 21^(1/6)

which is quite close to the old value of 5/3. It's about 6 cents flat. Just barely noticeable. Now you can make a 2D isomorphic keyboard to play Bohlen Pierce music, and it will sound fairly septimal.

There is a little hiccup. The interval differences don't make sense any more. For example, in this rank-2 system,

m2 - P1 = m2
M2 - m2 = m2

both of those differences happen to equal a minor second now, but they *shouldn't* be equal. The difference between two second intervals should be some kind of unison for example. If you have a solution, I'd love to hear it. I'll keep thinking about it in the meantime. But whatever the correct interval names are, I think you can make a 2D isomorphic keyboard where a step in one cardinal direction increases/decreases the frequency ratio by (3/1) and a step in the other cardinal direction increases/decreases the frequency ratio by 21^(1/6), and then you'll get music that sounds like septimal Bohlen Pierce out of it.

Ooh! I should do a comparison of the 3d septimal just BP frequency ratios against the 1d EDT BP frequency ratios against my 2d meantone BP frequency ratios!

1.0 :: P1

1.08 :: m2_septimal
1.0873803730028921 :: m2_meantone
1.0881822434633168 :: m2_equal

1.1823960755919092 :: M2_meantone
1.184140594988857 :: M2_equal
1.1904761904761905 :: M2_septimal

1.2857142857142858 :: P3_meantone
1.2857142857142858 :: P3_septimal
1.2885607692309613 :: P3_equal

1.4 :: m4_septimal
1.4021889487005645 :: m4_equal
1.404775430545576 :: m4_meantone

1.5258371159564499 :: M4_equal
1.5275252316519465 :: M4_meantone
1.530612244897959 :: M4_septimal

1.6603888560010867 :: P5_equal
1.661000956165023 :: P5_meantone
1.6666666666666667 :: P5_septimal

1.8 :: P6_septimal
1.8061398392728831 :: P6_meantone
1.8068056703447524 :: P6_equal

1.96 :: m7_septimal
1.9639610121239315 :: m7_meantone
1.9661338478579946 :: m7_equal

2.135572657926458 :: M7_meantone
2.1395119415112758 :: M7_equal
2.142857142857143 :: M7_septimal

2.3281789044302967 :: P8_equal
2.333333333333333 :: P8_meantone
2.3333333333333335 :: P8_septimal

2.52 :: m9_septimal
2.5334829434069275 :: m9_equal
2.5372208703400814 :: m9_meantone

2.7568911531325972 :: M9_equal
2.7589241763811203 :: M9_meantone
2.7777777777777777 :: M9_septimal

3.0 :: P10

.

Everything is really close, which is good. The meantone value is closer to the septimal value than is the EDT value for all of (m2, P3, M4, P5, P6, m7, P8, and M9). The EDT value is only closer to the septimal value for (M2, m4, M7, m9), and only by a small amount for each. This is to say that the added dimension helped: a 2d keyboard organized by my meantone scheme really can play Bohlen Pierce music with better intonation than a one dimensional 13-EDT keyboard. I am to be commended.  Also, I think it's petty cool that we adjusted the P5s to make the P8s pure, so you might have expected those to be particularly out of tune, yet the P5s are still closer to being pure than the EDT version. Excellent.