Tetrachordal scales

A tetrachord is four notes spanning a fourth. For example, Archytas' diatonic tetrachord is

1/1, 28/27, 32/27, 4/3

with steps

28/27, 8/7, 9/8

A tetrachordal scale, in its simplest form, is two tetrachords separated by a 9/8 whole tone. For example, combining a lower tetrachord with steps

9/8, 28/27, 8/7

with an upper tetrachord with steps

28/27, 9/8, 8/7

both being permutations of Archytas' diatonic tetrachord, gives the steps

9/8, 28/27, 8/7, 9/8, 28/27, 9/8, 8/7
|----lower----|       |----upper----|

and so the scale

1/1, 9/8, 7/6, 4/3, 3/2, 14/9, 7/4, 2/1

Further reading

Python code
import math
from fractions import Fraction

F = Fraction


def tetrachordal(t1, t2, *, disjunct=True):
    """
    >>> t1 = (Fraction(9, 8), Fraction(28, 27), Fraction(8, 7))
    >>> t2 = (Fraction(28, 27), Fraction(9, 8), Fraction(8, 7))
    >>> tetrachordal(t1, t2)
    [Fraction(1, 1), Fraction(9, 8), Fraction(7, 6), Fraction(4, 3), Fraction(3, 2), Fraction(14, 9), Fraction(7, 4), Fraction(2, 1)]
    >>> tetrachordal(t1, t2, disjunct=False)
    [Fraction(1, 1), Fraction(9, 8), Fraction(7, 6), Fraction(4, 3), Fraction(112, 81), Fraction(14, 9), Fraction(16, 9)]
    """
    for t in (t1, t2):
        assert len(t) == 3
        assert math.prod(t) == Fraction(4, 3)

    if disjunct:
        steps = [*t1, Fraction(9, 8), *t2]
    else:
        steps = [*t1, *t2]

    result = [Fraction(1, 1)]
    for step in steps:
        result.append(result[-1] * step)

    assert result[0] == Fraction(1, 1)
    assert result[-1] == (Fraction(2, 1) if disjunct else Fraction(16, 9))

    return result

Scales

FileCall
msdiat7 tetrachordal((F(44, 39), F(273, 242), F(22, 21)), (F(44, 39), F(273, 242), F(22, 21)))
xen11-chalmers-tetrachordal-04-01 tetrachordal((F(28, 27), F(8, 7), F(9, 8)), (F(28, 27), F(8, 7), F(9, 8)))
xen11-chalmers-tetrachordal-04-02a tetrachordal((F(28, 27), F(15, 14), F(6, 5)), (F(28, 27), F(8, 7), F(9, 8)))
xen11-chalmers-tetrachordal-04-02b tetrachordal((F(22, 21), F(12, 11), F(7, 6)), (F(28, 27), F(8, 7), F(9, 8)))
xen11-chalmers-tetrachordal-04-03 tetrachordal((F(21, 20), F(10, 9), F(8, 7)), (F(28, 27), F(8, 7), F(9, 8)))
xen11-chalmers-tetrachordal-04-04 tetrachordal((F(28, 27), F(8, 7), F(9, 8)), (F(9, 8), F(256, 243), F(9, 8)))
xen11-chalmers-tetrachordal-04-05 tetrachordal((F(28, 27), F(8, 7), F(9, 8)), (F(16, 15), F(9, 8), F(10, 9)))
xen11-chalmers-tetrachordal-06-04 tetrachordal((F(28, 27), F(36, 35), F(5, 4)), (F(28, 27), F(36, 35), F(5, 4)))
xen11-chalmers-tetrachordal-08-04 tetrachordal((F(28, 27), F(36, 35), F(5, 4)), (F(5, 4), F(36, 35), F(28, 27)))