Start from a just lattice. Each prime is a generator. Turn a dial to make a comma vanish. Two directions of the lattice become one direction. The rank drops by one. A scale closes. Built for Marcus Hobbs from his own explanation, on the hexany first.
A generator per prime is just intonation itself. The hexany's lattice has four independent directions when you count the octave: 2, 3, 5 and 7. If every prime gets its own generator you have four generators, no error, no coincidences, and no two-step or three-step melody, because the scale never closes. Every time you temper one comma you fuse two of those directions into one and drop the rank by one, and that is where the melodic structure comes from. So the dial you are turning is how many commas vanish. Rank 4 is JI with zero commas. Rank 3 is two generators with one comma. Rank 2 is one generator with two commas. Rank 1 is equal temperament with three commas.
Station 1 shows the lattice with one generator per prime. Station 2 lists the commas. Station 3 is the dial. Station 4 shows the scales that close at each rank. Station 5 is the table of measured results. The page computes every number live from the monzos, except the receipts in station 5.
Each tone is a product of primes. Its monzo lists the exponent of each prime. To reach the tone, walk that many steps along each prime axis. The primes are the generators. The rank is the number of independent generators.
Two ways to count the rank. With the octave, the hexany is rank 4: generators 2, 3, 5 and 7. Octave-equivalent, it is rank 3: generators 3, 5 and 7, with pitch classes on a circle. The repo's SPEC.md counts octave-equivalent. This page counts with the octave, so that equal temperament is rank 1.
Just intonation never closes. Each new step of 3, 5 or 7 lands on a new pitch class. No finite scale contains the lattice and all its transpositions. So there is no MOS, no two-step pattern and no three-step pattern. The error is zero. The price is the open lattice.
| tone | cents | monzo 2 · 3 · 5 · 7 | walk from 1/1 |
|---|
A comma is a lattice vector with a small pitch. Its positive exponents are one route. Its negative exponents are the other route. The two routes end a few cents apart. When the comma vanishes, the two ends are one note. Select a row to draw the comma on the lattice. Press Add to put it on the dial.
The list holds every comma under 60 cents. The box is |e3| ≤ 12, |e5| ≤ 6, |e7| ≤ 5. The Tenney height is at most 240. The page leaves out powers of a smaller comma.
Select a comma.
| comma | cents | monzo | up route | down route | name |
|---|
Each slot holds one comma and one slider. At 0 the comma is intact and the tuning is just. At 1 the comma is gone. Between 0 and 1 the comma shrinks and the tones move. The rank is discrete. It drops only when a slider reaches 1. Up to three independent commas can go.
The rule says how the comma's error is shared among the primes. The default matches the receipts in station 5. The prime rule is the usual minimax. The third rule keeps 3/2 pure when the commas permit it.
The lattice flattens along the comma. Points that differ by the comma slide together. At 1 they are one point and the lattice has one direction less.
| prime | just cents | tempered cents | error | as a sum of the generators |
|---|
| tone | just | now | error |
|---|
A proportional triad has a middle tone at the arithmetic mean of the outer two frequencies, like 4:5:6. A subcontrary triad has a middle tone at the harmonic mean, like 10:12:15. The hexany has 6 of each. A triad survives when the tempered middle tone sits within the tolerance of its mean.
| kind | triad | middle to its mean, cents | status |
|---|
These rows come from the experiment logs. The page does not recompute them. Tolerance 2 cents. Triads are the exact proportional and subcontrary triads of the hexany, 12 in all. Each rank buys one comma. Each comma buys a smaller scale and costs some triads.
| rank | commas gone | generators | smallest scale | error | triads kept | source |
|---|---|---|---|---|---|---|
| 4 | none | 2, 3, 5, 7 | 6 notes, the hexany itself | 0 | 12 of 12 | never closes |
| 3 | 225/224 | octave + two | 10 notes, three step sizes | 2.57¢ | 4 of 12 | RANK3-001, 2026-10-12 |
| 3 | 1029/1024 | octave + two | 15 notes | 2.81¢ | 10 of 12 | RANK3-001 |
| 3 | 65625/65536 | octave + two | 19 notes | 0.47¢ | 12 of 12 | RANK3-001 |
| 3 | 2401/2400 | octave + two | 21 notes | 0.12¢ | 12 of 12 | RANK3-001 |
| 3 | 32805/32768 | octave + two | 24 notes | 0.24¢ | 12 of 12 | RANK3-001 |
| 2 | 2401/2400, 3136/3125 | octave + 193.787¢ (3→16, 5→2, 7→5) | 22 notes | 1.37¢ | 10 of 12 | CPSFIT-001, 2026-10-10 |
| 2 | 2401/2400, 3136/3125 | the same | 31 notes | 0.74¢ | 12 of 12 | CPSFIT-001 |
| 1 | three | one step | no ET from 5 to 72 notes holds the hexany within 2¢ | above 2¢ | not measured | CPSFIT-001, ET range 5 to 72 |
| 1 | 2401/2400, 3136/3125, 19683/19600 | one step of 9.231¢ | 130-ET, the first ET within 2¢ | 1.78¢ | see the dial | computed on this page, not a receipt |
The dekany CPS(5,2) on 1·3·5·7·9 has 41 exact triads. No one-generator chain below 37 notes holds all of them. Two generators hold the dekany in full at 29 notes within 0.65 cents, under the schisma 32805/32768.
The eikosany CPS(6,3) on 1·3·5·7·9·11 is rank 5 with the octave. Two generators stop at about 12 cents. It needs a third generator.
Marcus prefers fewer notes for melody. He would rather explore a 10-note scale than a 21-note scale. He does not need the generators to be nameable intervals. He wants to keep the triads. So the 10-note scale under 225/224 and the 15-note scale under 1029/1024 are the ones to explore first. The triad count is the price. The 10-note scale keeps 4 of 12. The 15-note scale keeps 10 of 12.
A val is an integer map from the primes to generator counts. A comma is a lattice vector that the val sends to zero. The set of all such vectors is the kernel of the val. Each independent comma in the kernel lowers the rank by one. With all primes free, the kernel is empty and the lattice is just intonation. This page builds the val from the chosen commas by integer column reduction, so the kernel is exactly the chosen commas and nothing smaller.
Rank counts the independent generators. With the octave, a 7-limit lattice is rank 4 and equal temperament is rank 1. Octave-equivalent, the same lattice is rank 3 and an MOS is rank 1. The repo's SPEC.md uses the octave-equivalent count. This page uses the count with the octave. The difference is always one.
With two generators and the octave, the scales come from Viggo Brun's three-term algorithm. At each level the largest of three intervals is replaced by its difference with the second (calc AB) or the third (calc AC). Each step of the scale is an exact integer sum of the octave and the two generators. Erv Wilson described the algorithm in "Viggo Rhythm". Marcus Hobbs implemented it in the iOS Wilsonic in 2016 with a balance rule for the order of the two new pieces. This page ports that implementation from experiments/lattice/brun3.py.
The tuning rule on this page keeps the octave pure. The default rule makes the largest error of any lattice tone as small as possible. For one comma this gives the error floors in the receipts. On the hexany, 225/224 gives 7.71/3 = 2.57 cents. 1029/1024 gives 8.43/3 = 2.81. 65625/65536 gives 2.35/5 = 0.47. 2401/2400 gives 0.72/6 = 0.12. The schisma gives 1.95/8 = 0.24. The prime rule shares the error over the primes instead. Between 0 and 1 the page shrinks the comma to the matching fraction of its size. The same rule applies. So one comma moves the tones in a straight line.
The two generators of a rank-3 quotient are a coordinate choice. The comma is the invariant. The same temperament arrives from many generator pairs, and the Brun3 scale sizes depend on the pair. So station 4 searches small integer changes of basis and reports the pair with the smallest scale that holds the lattice.
The receipts. CPSFIT-001 (2026-10-10): no equal temperament from 5 to 72 notes holds the hexany within 2 cents. One generator of 193.787 cents holds the hexany at 22 notes within 1.37 cents with 10 of 12 triads. The same generator holds it at 31 notes within 0.74 cents with all 12. RANK3-001 (2026-10-12): two generators hold the hexany at 10, 15, 19, 21 and 24 notes under one comma each. Two generators hold the dekany with 9 at 29 notes under the schisma. This page adds one computed fact. The first equal temperament within 2 cents of the hexany is 130-ET at 1.78 cents. 73-ET misses by 8.2 cents on 5/4. The session note that named 73 as the first misread the 5 to 72 range.
This text describes the current state of the page in plain language. Copy it into Claude to continue the work.