20181122

Block Around the Clock Group

In a previous post, we examined a b=22 block t=2-(v=12,k=6,λ=5) block design evenly distributed around the chromatic universe in both pitch-class (PC) and interval content. The design gave us 22 hexachords (132=6×22 pitches) where each PC turns up 11 times (132=11×12) and where also each of the interval-classes (1 to 6) appear exactly 5 times each. The blocks come from the 2nd block design partially reproduced here (a bleeding chunk, eliding unnecessary detail, from the previous post) as

… autGroup:=Group([(1,11,10,9,8,7,6,5,4,3,2)]), blockNumbers:=[22], blockSizes:=[6],
blocks:=[[1,2,3,4,7,12], [1,2,3,6,11,12], [1,2,4,6,8,9], [1,2,5,6,8,10], [1,2,5,10,11,12], [1,3,4,7,8,10], [1,3,5,6,9,10], [1,3,5,7,8,11], [1,4,5,7,9,11], [1,4,9,10,11,12], [1,6,7,8,9,12], [2,3,4,5,8,12], [2,3,5,7,9,10], [2,3,6,7,9,11], [2,4,5,8,9,11], [2,4,6,7,10,11], [2,7,8,9,10,12], [3,4,5,6,9,12], [3,4,6,8,10,11], [3,8,9,10,11,12], [4,5,6,7,10,12], [5,6,7,8,11,12]],… lambdas:=[5], t:=2), v:=12)

Interval-class is defined as the shortest distance in semitones between pitch classes, modulo 12. A major sixth - an upward skip of 9 semitones - is thus equivalent to the shorter 3 semitone skip down of a minor third - octaves being ignored. The 6 semitone tritone leap, is consequently the largest interval class. Each block contains (after renumbering 1 … 12 to 0 … 11 to bring us into PC - modulo 12 - territory) 6 PCs, and thus 6×5/2=15 intervals between pairs therein. Over the 22 blocks we therefore have 22×15=330=66×5 intervals in total and the block design itself ensures that all possible intervals between 12 PCs - which is of course 66=12×11/2 - occur 5 times each. Musically speaking, it's a very 'democratic' distribution. Not only do all pitch classes get equal representation but all interval classes too. This is an alternative way to give 'equality' to chromaticism rather than via Schoenbergian tone rows and their transformations to retrograde, inversion, and retrograde inversion; or via Hauer's tropical hexads.

By Design

Just playing a sequence of the 22 hexads - perhaps as chords, perhaps as ascending arpeggios, perhaps even as both with 11 of them in the treble and the other 11 in the bass, will result in a mathematically legitimate presentation of that equal opportunity. But it will likely not be musically interesting (e.g. see below). In any case, the blocks generated by the design aren't presented 'ordered', but due (as far as the musician is concerned) entirely to the exigencies of linear text.

We, however, can seek further structure within, structure which may pique interest. Mathematically, all we have - all we asked for - is a bunch of numbers delivered with a certain guaranteed distribution. The design's specification required nothing more. But first, here are the blocks, presented as PC Sets (in the Forte sense):

Blocks as Pitch Class Sets from the design
block≡ PC SetiStringFort(e)ifications
NormalPrimeICVECSet
[1,4,5,7,9,11]{0,3,4,6,8,10}312222{0,3,4,6,8,10}{0,1,3,5,7,9}1424226-34A
[1,3,5,7,8,11]{0,2,4,6,7,10}222132{0,2,4,6,7,10}{0,2,4,6,8,9}〃6-34B
[1,2,5,6,8,10]{0,1,4,5,7,9}131223{0,1,4,5,7,9}{0,1,4,5,7,9}2234316-31A
[2,3,6,7,9,11]{1,2,5,6,8,10}131223{0,1,4,5,7,9}〃〃〃
[1,3,5,6,9,10]{0,2,4,5,8,9}221313{0,2,4,5,8,9}{0,2,4,5,8,9}〃6-31B
[2,4,6,7,10,11]{1,3,5,6,9,10}221313{0,2,4,5,8,9}〃〃〃
[1,3,4,7,8,10]{0,2,3,6,7,9}213123{0,2,3,6,7,9}{0,2,3,6,7,9}2242326-Z29
[2,4,5,8,9,11]{1,3,4,7,8,10}213123{0,2,3,6,7,9}〃〃〃
[1,2,4,6,8,9]{0,1,3,5,7,8}122214{0,1,3,5,7,8}{0,1,3,5,7,8}2323416-Z26
[2,3,5,7,9,10]{1,2,4,6,8,9}122214{0,1,3,5,7,8}〃〃〃
[3,4,6,8,10,11]{2,3,5,7,9,10}122214{0,1,3,5,7,8}〃〃〃
[3,4,5,6,9,12]{2,3,4,5,8,11}111333{0,1,2,3,6,9}{0,1,2,3,6,9}3242226-Z42
[4,5,6,7,10,12]{3,4,5,6,9,11}111324{0,1,2,3,6,8}{0,1,2,3,6,8}3322326-Z41B
[2,3,4,5,8,12]{1,2,3,4,7,11}111342{0,1,2,3,6,10}{0,2,3,4,5,8}3333216-Z39A
[2,7,8,9,10,12]{1,6,7,8,9,11}511122{0,5,6,7,8,10}{0,1,2,3,5,7}3422316-9A
[1,6,7,8,9,12]{0,5,6,7,8,11}511131{0,5,6,7,8,11}{0,1,2,3,6,7}4222326-5A
[5,6,7,8,11,12]{4,5,6,7,10,11}111315{0,1,2,3,6,7}〃〃〃
[1,2,5,10,11,12]{0,1,4,9,10,11}135111{0,1,4,9,10,11}{0,1,2,3,4,7}4332216-Z36B
[1,2,3,4,7,12]{0,1,2,3,6,11}111351{0,1,2,3,6,11}〃〃〃
[1,2,3,6,11,12]{0,1,2,5,10,11}113511{0,1,2,5,10,11}〃〃〃
[1,4,9,10,11,12]{0,3,8,9,10,11}351111{0,3,8,9,10,11}〃〃〃
[3,8,9,10,11,12]{2,7,8,9,10,11}511113{0,5,6,7,8,9}〃〃〃

The above table is sorted by Forte's 'interval vector' classification for no particular reason other than to show that the 22 PC Sets may be aggregated into 10 distinct interval spread classes in 12 distinct Forte Prime PC Sets. We can't imagine that this is anything other than happenstance. As usual on this blog, the blue background indicates a symmetric (inverse = self) PC set and pink indicates asymmetric (with Forte A and B Forms). There's a page devoted to 12 TET hexads if more background is needed.

Non-Blocky Tetradic Links

In order to justify an order we might apply to the 22 blocks, we sought links between the blocks beyond any demanded by the block design itself. And indeed we found such a link, in the appearance of common tetrads between the hexads. Even better, we found several cycles (i.e. Hamiltonian circuits) of all 22 blocks, stepwise connected via such tetrad-sharing, in such a way that the last block connected to the first.

Each block links to three other blocks via tetrads, which means that the blocks' connectivity can be represented as a cubic graph, specifically one with 22 vertices (the blocks) and 33 edges (the linking tetrads shared between each vertex pair). And 22 of those edges form a circuit allowing the graph's presentation as a 22-gon with 11 internal edge connections.

The cubic graph exhibits an emergent symmetry having nothing to do with the block design's requirements. Nobody asked for symmetry or for common 4-sets connecting the 6-set blocks, or even anything regarding 4-sets at all.

22 hexad blocks linked by tetrads

An Ordered Block Design

The symmetry is doubtless due to the algorithm used to produce the design, most likely from the underlying group used to generate the design which in this case was C11 - Cyclic Group order 11 generated by the permutation (1,11,10,9,8,7,6,5,4,3,2) as shown in the design's output report.

The following is a possible expression of the above block order. The hex annotations under each bar label the six PCs present in the bar. If the staff could be wrapped around a circle, the four PCs 0,9,a and b in the final bar could - in principal - be tied to the same PCs in the first.

Hexachord sequence tied across bars by common tetrads.

Musical Implementation of Block Design

We say 'in principal' because the PCs a and b (as, respectively, a high A# and a centred B) are in the 'wrong' octave for bar #1, as are PCs 0 and 9 (as bass notes A and C - two octaves apart from their high treble appearances in bar #1). A 'true' circular join is of course possible. But as it is, it sounds like this:

Below is the graph with PC Set {0,3,8,9,10,11} at the top, labelled as vertex 0 (the arbitrarily chosen 'first' block in the circuit shown as the first column labelled (hexadecimally as) 0389AB in the image above).

Graph of 22 Hexadic Blocks with 33 Tetradic Commonalities
0 B A 9 8 3 0 1 B A 9 8 7 2 2 A 9 7 5 3 2 3 9 7 6 3 2 0 4 B 6 3 2 1 0 5 B A 5 2 1 0 6 A 8 6 5 2 1 7 A 9 6 5 3 1 8 B 9 6 5 4 3 9 B A 7 6 5 4 A A 7 6 4 2 0 B A 8 6 4 3 0 C A 8 7 4 3 1 D B 7 4 3 2 1 E B 8 5 4 3 2 F 9 8 5 4 2 0 G 9 8 6 4 2 1 H B 9 8 7 6 1 I B 8 7 6 5 0 J 8 7 5 3 1 0 K 9 7 5 4 1 0 L B A 9 4 1 0

Each block, labelled as vertices 0 to L clockwise from the top, is shown with its 6 constituent hexadic pitch classes (labelled in hexadecimal) in a hexagonal 'satellite' arrangement around it. Every block is connected to three others, two being nearest neighbours around the circumference and the third being somewhere across the circle.

Each of the three connections carries a common tetrad. For example vertex C - PC set {1,3,4,7,8,10} - connects on either side with vertex B = {0,3,4,6,8,10} and D = {1,2,3,4,7,11} as well as to the relatively distant vertex J = {0,1,3,5,7,8}, the common tetrads between them being respectively {3,4,8,10}, {1,3,4,7}, {1,3,7,8}

From Graph to Group

Howsoever a cyclic symmetry of C11 in the generation of a block design managed to percolate through to emergent common tetradicities, the 22-vertex 33-edge graph (teased out of that collection by seeking Hamiltonian circuits via those tetradic connections) has dihedral symmetry with an automorphism group isomorphic to D22 (or D11 depending upon which Dihedral Group naming convention you follow).

For the moment, we'll dispense with the hexadic attachments - the group is concerned only with the graph's symmetries but doesn't care how it got them.

As with all dihedral groups, two generators - a mirror flip and a rotation cycle - will suffice and in this case they are the permutations (1L)(2K)(3J)(4I)(5H)(6G)(7F)(8E)(9D)(AC) and (01HI98ED45L)(2GJA7FC36KB).

We're using cyclic permutation notation where each parenthesised string (in this case of graph vertex labels) cycles (i.e. moves its tail character to its head) each time the permutation is applied.

The flipper is relatively easy to see as a simultaneous swap of 10 vertex pairs over the vertical axis through 0 and B. Vertex 1 moves to L and L moves to 1, 2 moves to K and K to 2, and so on, each effectively swapping places.

The flip permutation (leaving tetradic connections unaltered)
0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L

Vertices 0 and B are absent from the permutation and unaffected. In other words its action permutes the sequence 0123456789ABCDEFGHIJKL into 0LKJIHGFEDCBA987654321 (stabilising 0 and B) as you'd expect of such a flipper. Hover over the image with your mouse to see the flip in action. Or click here to see the 10 components of the permutation acting in sequence. The part of the graph unaffected by the permutation is in red.

The twist permutation (leaving tetradic connections unaltered)
0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L

The second generator is harder to see because the twist's rotation takes place around a pair of 11-gonal paths which - due to the tetradic connectivity of the graph - is somewhat tortuously buried within the 22-gon. They're showing as two, blue and green, polygons. The cyclic permutation notation describes the simultaneous rotation through that pair of 11-gons. The first cycle moves vertex 0 to vertex 1, vertex 1 to vertex H, vertex H to vertex I, I to 9, 9 to 8 etc all the way around until the final move from vertex L to vertex 0. All vertices are moved by this operation (hence no red pieces). The group action maps the vertices 0123456789ABCDEFGHIJKL to 1HG65LKFE87234DCJI9AB0. Click here to see the two component permutations in sequence, or hover over the figure to see the complete action.

Certainly the graph may be re-presented to show the rotations more clearly - at the expense of making the Hamiltonian circuit hard to apprehend. Relabelling the vertices, as in the following graph, effectively disentangles the 11-gons. The original Hamiltonian circuit is still there, traced along the blue edges via 0123456789ABCDEFGHIJKL as before, but is no longer on the circumference.

The Hamiltonian circuit jumps back and forth between the two orbits, as in fig. 6, and is not itself an orbit of the group. The only thing the group does do for us, musically speaking, is ensure that - by its operations - it maintains a cycle of hexads (which may be changed by the operation) where adjacent hexads always have a common tetrad (which may also changed by the operation). The group has no idea it's doing this for us, all it 'knows' is that the cubic graph - of which it's an automorphism - is structured the way it is, and that it will preserve that structure.

The twist (rotation) permutation on a relabeled graph
0 1 H I 9 8 7 A J G 2 B K 6 3 C F E D 4 5 L

The identity permutation - formally (0)(1)(2)(3)(4)(5)(6)(7)(8)(9)(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L) but abbreviated to () since permutations which move something to itself are conventionally omitted - and the two generator permutations (1L)(2K)(3J)(4I)(5H)(6G)(7F)(8E)(9D)(AC) and (01HI98ED45L)(2GJA7FC36KB) are only three of the twenty two elements of this group.

We can usefully notate those operations as 'e' for the identity (it's a convention), as 'f' for the flip and as 'r' for the twist/rotator permutations. In particular, r twists its way around the two eleven stage zig-zaggy polygonal paths - not the single twenty-two stage circumference. Don't be overly misled by the term 'rotation'.

You may even, if so inclined, write r as the product of two mutually exclusive, non-interfering, rotations 'p' and 'q' - respectively the permutation cycles (01HI98ED45L) - the blue 11-gon - and (2GJA7FC36KB) - the green one. Acting independently their product, r = pq = qp, is commutative. One sees that p2 = (0H9E4L1I8D5), that q2 = (2J7C6BGAF3K) and hence that r2 = p2q2 = q2p2 - and so on, for higher powers.

Reversing the strings inside the parentheses inverts the operation, explaining why 'flippers' involving solely permutation cycles of length two are self-inverting. Thus r-1 = p-1q-1 = (0L54DE89IH1)(2BK63CF7AJG). So a flip followed by a rotation followed by a further flip is equivalent to the reverse rotation - true of all dihedrals.

You might also have noticed that p itself is a Hamiltonian cycle of length 11 - eleven of the blue cubic graph's edges form its 'circumference'. We also see that q is not a Hamiltonian, but that q4 = (276GFKJCBA3) is a Hamiltonian (as is, naturally, q-4).

The following table shows all 22 of the group's elements written in terms of r and f, their orders (i.e. how many of that operation would have to be performed in sequence to be equivalent to the identity), the equivalent permutation product (in cycle notation) and the vertex action (the resulting reorder if the group were acting on a set of vertex labels).

Bear in mind that the labels on the vertices are there for our convenience only - the group operations 'see' only a bunch of (in this case 22) points abstractly linked with each other (with, in this case, 33 relations) for 'whatever reason'. There's no 'geography' but only an invariant structure which can be operated upon in 22 distinct ways whilst preserving their connectivities in exactly the same symmetric pattern.

The (D22) Automorphism Group's 22 Operations
operation order permutation vertex action
e1()0123456789ABCDEFGHIJKL
f2(1L)(2K)(3J)(4I)(5H)(6G)(7F)(8E)(9D)(AC)0LKJIHGFEDCBA987654321
fr2(01)(2B)(3A)(49)(5I)(6J)(7C)(8D)(GK)(HL)10BA9IJCD43278EFKL56GH
fr22(0H)(37)(48)(59)(6A)(BG)(CF)(DE)(IL)(JK)H12789A3456GFEDCB0LKJI
fr32(0I)(1H)(2G)(3F)(4E)(58)(67)(9L)(AK)(BJ)IHGFE8765LKJCD43210BA9
fr42(09)(1I)(2J)(3C)(4D)(5E)(6F)(7K)(8L)(AB)9IJCDEFKL0BA3456GH1278
fr52(08)(19)(2A)(5D)(6C)(7B)(EL)(FK)(GJ)(HI)89A34DCB012765LKJIHGFE
rf2(0L)(15)(26)(3G)(4H)(9E)(AF)(BK)(CJ)(DI)L56GH1278EFKJI9A34DCB0
r2f2(05)(14)(23)(6B)(7A)(89)(CG)(DH)(EI)(FJ)543210BA9876GHIJCDEFKL
r3f2(04)(1D)(2C)(3B)(5L)(6K)(7J)(8I)(EH)(FG)4DCB0LKJI9A321HGFE8765
r4f2(0D)(1E)(2F)(3K)(4L)(7G)(8H)(9I)(AJ)(BC)DEFKL56GHIJCB012789A34
r5f2(0E)(18)(27)(36)(45)(9H)(AG)(BF)(CK)(DL)E87654321HGFKL0BA9IJCD
r11(01HI98ED45L)(2GJA7FC36KB)1HG65LKFE87234DCJI9AB0
frf11(0L54DE89IH1)(2BK63CF7AJG)L0BCD43A9IJKFE8721HG65
r211(0H9E4L1I8D5)(2J7C6BGAF3K)HIJKL0BCDEFG6543A98721
fr2f11(05D8I1L4E9H)(2K3FAGB6C7J)5LKFEDCJIHG6789AB01234
r311(0IE519DLH84)(2ACKG73BJF6)I9AB01234DCJKL5678EFGH
fr3f11(048HLD915EI)(26FJB37GKCA)45678EFGH123A9IJKL0BCD
r411(094185HELID)(276GFKJCBA3)98721HG6543AB0LKFEDCJI
fr4f11(0DILEH58149)(23ABCJKFG67)D43A987210BCJIHG65LKFE
r511(08L95I4HD1E)(2FB7KA6J3GC)8EFGHIJKL567210BCD43A9
r611(0E1DH4I59L8)(2CG3J6AK7BF)EDCJI9AB0LKFGH12345678

The Cycle Index of the group is pretty much what you'd expect of such a group, i.e. 1⁄22(z122 + 11 z12z210 + 10 z112).

Operations of order 2 are their own inverses - applied twice in succession, they 'do nothing'. This is naturally to be expected of the single flip, but we can see this also results from a flip-twist-flip-twist, or a flip-twist-twist-flip-twist-twist etc. And 11 consecutive rotations, for example, return you to whence you started.

These permutation actions by the group upon the set of labels 0 … L show that there are 22 different Hamiltonian circuits around the 22 blocks via the 33 links. But as 11 of them are just reversals (flips) of the other 11, we'd consider that there are really only 11. And as 11 is a prime number, those 11 are truly 'different' and can't be further subfactored.

Applications

There's quite a lot to play with here - its group representation shows that there are many more than simply the one way of ordering the 22 hexads (here's another one of the same ordering, but split between three instruments):

Rendering hexads with common tetrads across bars with a trio

Permuting the cycle a further 10 times (or even 21 if you're happy to include reversals) will get you further 'new' sequences of tetradically linked hexads, all of them with equally occurring PC and IC frequencies. Not only that, but you may also consider splitting the sequences into separate groups of eleventh order Hamiltonian sequences. The 'democracy' of pitch class and interval class will be maintained as long as the appropriately related cycles are kept together (as per the last ten rows of the above table). That would give you 11-lengthed sequences of 12 PCs - though not all distinct. All this from just one block design. Enjoy.

20180902

The GAP Mined for Music

The previous post presented some introduction to (Balanced Incomplete) Block Designs with a simple musical application. It did not, however, provide much in the way of obtaining block designs in the first place, other than by using extant published material. It would be nice to find some software capable of producing block designs.

I've been aware of the GAP computer algebra software, and have even occasionally used it, for some years now but did not realise that it included software for block designs. Perhaps that should not come as a surprise as it is growing all the time.

It is free to download and install, is multi-platform and is fun to play with in any case. It's a command line console based system and therefore very useful for generating (and processing) text files. I'm certainly not going to say anything about it here - other than those bits of it I'll be using in this note. Don't ask me for any help on installation or use - I'll probably mislead you and, anyway, there are far more authoritative guides than I.

This post will present not just results of the use of GAP/DESIGN, but will attempt - at the risk of boring the already knowledgeable - to represent the voyage itself. Also note that I've taken a few liberties with the representation of GAP's typical output; which is a stream of unformatted text. There's certainly enough syntax to make the output completely unambiguous, but there's no syntactic sugar - it just flops out. So for clarity's sake I've tidied it up a bit.

The current (v4.9.2 at the time of writing) GAP release includes Soicher's DESIGN package (v1.6 @tow), but does not load it by default. For any particular GAP session you will therefore need to import the software with:

LoadPackage("design");

If the package loads successfully, then GAP reports 'true'. The method used by the package is based on what is known as the '*-construction' - far too abstruse to go into here but still available to the adventurous. Basically, one employs a slightly simpler t-(v-1,k-1,(k-t)λ) design to generate a bunch of t-(v,k,nλ) designs, which will work (in our case, where we are interested in block sizes of 2, 3, 4 and 6) if n is the lowest common multiple of (k-t)C(2-t), (k-t)C(3-t), (k-t)C(4-t), (k-t)C(6-t), which is to say of k-2C0, k-2C1, k-2C2 and k-2C4 for each of the k with which we're treating. The DESIGN package will therefore require the use of an eleventh, not twelfth, order group which we will create with

G11:=CyclicGroup(IsPermGroup, 11);

The Two Tone Tour

First of all, we should verify the existence of the (12,2,1) design which essentially lists all 66 of the t=2 design's pitch class pairs. The above conditioning of n for k=2 requires only that it be the lowest common multiple of k-2C0 as it's the only one which can apply (yet). This clearly has n = 1 with a *-construction using 2-(11,1,0) - a trivial design used to generate a 2-(v=12,k=2,nλ=1) design. We know that λ=1 and are required to provide this information by defining a record:

tlamb:=rec(t:=2, lambdas:=[1]);

which information is passed into another record specifying the desired block size and using the earlier defined permutation group:

basis:=rec(v:=12, blockSizes:=[2], tSubsetStructure:=tlamb, requiredAutSubgroup:=G11);

Once this basis is defined it may be used directly:

D:=BlockDesigns(basis);

upon which GAP emits the following list of length 1:

[ rec(autGroup:=Group([(1,2,3,4,5,6,7,8,9,10,11,12),(1,2)]),
blockNumbers:=[66], blockSizes:=[2],
blocks:=[ [1,2], [1,3], [1,4], [1,5], [1,6], [1,7], [1,8], [1,9], [1,10], [1,11], [1,12], [2,3], [2,4], [2,5], [2,6], [2,7], [2,8], [2,9], [2,10], [2,11], [2,12], [3,4], [3,5], [3,6], [3,7], [3,8], [3,9], [3,10], [3,11], [3,12], [4,5], [4,6], [4,7], [4,8], [4,9], [4,10], [4,11], [4,12], [5,6], [5,7], [5,8], [5,9], [5,10], [5,11], [5,12], [6,7], [6,8], [6,9], [6,10], [6,11], [6,12], [7,8], [7,9], [7,10], [7,11], [7,12], [8,9], [8,10], [8,11], [8,12], [9,10], [9,11], [9,12], [10,11], [10,12], [11,12] ],
isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11,
tSubsetStructure:=rec(lambdas:=[1], t:=2), v:=12) ]

And there you are. The information provided - as well as showing all possible pitch class pairs exactly once (λ=1) as requested - reports the number of blocks as (the expected) 66 and the r = 11, being the number of occurrences of each of the 12 pitch classes in all blocks (recall vr = bk, in this case 12×11 = 66×2).

Triadic Transitions

For k=3 block designs, which we used to construct a sequence of triads each carrying a common diad (to provide a binding musical integrity, some kind of voice-leading) between consecutive chords, we'll again need r=11 and v=12. The k=3 triadic requirement means we will expect 132/3 = 44 blocks. In this case n is required to be the lowest common multiple of both 1C0 and 1C1. As this is also just 1 there's no change there and nλ remains unaffected. Setting up the required tSubsetStructure for a λ of 2, this time, and resetting basis to use the new record (otherwise it will - by default - remember the old value:

tlamb:=rec(t:=2, lambdas:=[2]);
basis:=rec(v:=12, blockSizes:=[3], tSubsetStructure:=tlamb, requiredAutSubgroup:=G11);

In fact you may skip the 'tlamb' construction and use its (now nameless) value directly, e.g:

basis:=rec(v:=12, blockSizes:=[3], tSubsetStructure:=rec(t:=2, lambdas:=[2]), requiredAutSubgroup:=G11);

Now you may generate the designs with the new basis:

D:=BlockDesigns(basis);

Alternatively you may skip the named 'basis' construction and use its value directly (although arguably with less clarity):

D:=BlockDesigns(rec(v:=12, blockSizes:=[3], tSubsetStructure:=rec(t:=2, lambdas:=[2]), requiredAutSubgroup:=G11));

The result is a list of five 2-(12,3,2) block designs, of which we'll display only the first and last:

[rec(autGroup:=Group([(1,11,10,9,8,7,6,5,4,3,2)]), blockNumbers:=[44], blockSizes:=[3],
blocks:=[[1,2,3], [1,2,11], [1,3,8], [1,4,7], [1,4,9], [1,5,7], [1,5,12], [1,6,9], [1,6,10], [1,8,12], [1,10,11], [2,3,4], [2,4,9], [2,5,8], [2,5,10], [2,6,8], [2,6,12], [2,7,10], [2,7,11], [2,9,12], [3,4,5], [3,5,10], [3,6,9], [3,6,11], [3,7,9], [3,7,12], [3,8,11], [3,10,12], [4,5,6], [4,6,11], [4,7,10], [4,8,10], [4,8,12], [4,11,12], [5,6,7], [5,8,11], [5,9,11], [5,9,12], [6,7,8], [6,10,12], [7,8,9], [7,11,12], [8,9,10], [9,10,11]], isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11, tSubsetStructure:=rec(lambdas:=[2], t:=2), v:=12),

… (three further records) …

rec(autGroup:=Group([(1,11,10,9,8,7,6,5,4,3,2)]), blockNumbers:=[44], blockSizes:=[3], blocks:=[[1,2,4], [1,2,6], [1,3,9], [1,3,11], [1,4,6], [1,5,11], [1,5,12], [1,7,8], [1,7,10], [1,8,12], [1,9,10], [2,3,5], [2,3,7], [2,4,10], [2,5,7], [2,6,12], [2,8,9], [2,8,11], [2,9,12], [2,10,11], [3,4,6], [3,4,8], [3,5,11], [3,6,8], [3,7,12], [3,9,10], [3,10,12], [4,5,7], [4,5,9], [4,7,9], [4,8,12], [4,10,11], [4,11,12], [5,6,8], [5,6,10], [5,8,10], [5,9,12], [6,7,9], [6,7,11], [6,9,11], [6,10,12], [7,8,10], [7,11,12], [8,9,11]], isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11, tSubsetStructure:=rec(lambdas:=[2], t:=2), v:=12)]

You may look for the usual things like Hamiltonian circuits.

Foursomes

Now we can get a little more adventurous and look for designs with tetrads (k=4), where the number of blocks in the design will be b = vr/k = 33. This will require n now being the lowest common multiple of 2C0, 2C1 and 2C2 which is again simply the value of 1 and thus we'll not be forced into more than the λ=r(k-1)/(v-1) = 3 that we wish for, which would require consequently larger b and r values (some simply impossible).

Upon entering into GAP the required calculation:

D:=BlockDesigns(rec(v:=12, blockSizes:=[4], tSubsetStructure:=rec(t:=2, lambdas:=[3]), requiredAutSubgroup:=G11));

We get a list of eight records of 2-(12,4,3) designs. Again, we'll show only the first and last:

[rec(autGroup:=Group([(1,9,6,3,11,8,5,2,10,7,4)]), blockNumbers:=[33], blockSizes:=[4], blocks:=[[1,2,4,5], [1,2,7,12], [1,2,9,10], [1,3,4,11], [1,3,5,8], [1,3,6,10], [1,4,8,10], [1,5,7,9], [1,6,7,12], [1,6,11,12], [1,8,9,11], [2,3,5,6], [2,3,8,12], [2,3,10,11], [2,4,6,9], [2,4,7,11], [2,5,9,11], [2,6,8,10], [2,7,8,12], [3,4,6,7], [3,4,9,12], [3,5,7,10], [3,7,9,11], [3,8,9,12], [4,5,7,8], [4,5,10,12], [4,6,8,11], [4,9,10,12], [5,6,8,9], [5,6,11,12], [5,10,11,12], [6,7,9,10], [7,8,10,11]], isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11, tSubsetStructure:=rec(lambdas:=[3], t:=2), v:=12),

… (six further records) …

rec(autGroup:=Group([(1,9,6,3,11,8,5,2,10,7,4)]), blockNumbers:=[33], blockSizes:=[4], blocks:=[[1,2,4,5], [1,2,6,8], [1,2,9,10], [1,3,4,11], [1,3,6,12], [1,3,7,8], [1,4,10,12], [1,5,6,10], [1,5,7,11], [1,7,9,12], [1,8,9,11], [2,3,5,6], [2,3,7,9], [2,3,10,11], [2,4,7,12], [2,4,8,9], [2,5,11,12], [2,6,7,11], [2,8,10,12], [3,4,6,7], [3,4,8,10], [3,5,8,12], [3,5,9,10], [3,9,11,12], [4,5,7,8], [4,5,9,11], [4,6,9,12], [4,6,10,11], [5,6,8,9], [5,7,10,12], [6,7,9,10], [6,8,11,12], [7,8,10,11]], isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11, tSubsetStructure:=rec(lambdas:=[3], t:=2), v:=12)]

Hexachords

The last designs we can attempt to find, without requiring large numbers of blocks, is the 22 block sized 2-(12,6,5) set of hexads. Remembering to check the lowest common multiple constraint, we see that when k=6, 4C0 = 1, 4C1 = 4, 4C2 = 6 and 4C4 = 1 yet again have us needing only an n=1. Thus we can expect the *-construction to work, as indeed it does.

D:=BlockDesigns(rec(v:=12, blockSizes:=[6], tSubsetStructure:=rec(t:=2, lambdas:=[5]), requiredAutSubgroup:=G11));

Yields a list of four 2-(12,6,5) designs.

[rec(autGroup:=Group([(1,11,10,9,8,7,6,5,4,3,2)]), blockNumbers:=[22], blockSizes:=[6],
blocks:=[[1,2,3,4,8,12], [1,2,3,7,11,12], [1,2,4,5,7,9], [1,2,4,6,9,10], [1,2,6,10,11,12], [1,3,4,6,8,11], [1,3,5,8,9,11], [1,3,6,7,9,10], [1,4,5,7,8,10], [1,5,6,7,8,12], [1,5,9,10,11,12], [2,3,4,5,9,12], [2,3,5,6,8,10], [2,3,5,7,10,11], [2,4,7,8,10,11], [2,5,6,8,9,11], [2,6,7,8,9,12], [3,4,5,6,10,12], [3,4,6,7,9,11], [3,7,8,9,10,12], [4,5,6,7,11,12], [4,8,9,10,11,12]],
isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11,
tSubsetStructure:=rec(lambdas:=[5], t:=2), v:=12),
rec(autGroup:=Group([(1,11,10,9,8,7,6,5,4,3,2)]), blockNumbers:=[22], blockSizes:=[6],
blocks:=[[1,2,3,4,7,12], [1,2,3,6,11,12], [1,2,4,6,8,9], [1,2,5,6,8,10], [1,2,5,10,11,12], [1,3,4,7,8,10], [1,3,5,6,9,10], [1,3,5,7,8,11], [1,4,5,7,9,11], [1,4,9,10,11,12], [1,6,7,8,9,12], [2,3,4,5,8,12], [2,3,5,7,9,10], [2,3,6,7,9,11], [2,4,5,8,9,11], [2,4,6,7,10,11], [2,7,8,9,10,12], [3,4,5,6,9,12], [3,4,6,8,10,11], [3,8,9,10,11,12], [4,5,6,7,10,12], [5,6,7,8,11,12]],
isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11,
tSubsetStructure:=rec(lambdas:=[5], t:=2), v:=12),
rec(autGroup:=Group([(1,5,8,2,3)(4,10,9,11,7),(1,4,9,10,8)(3,11,6,5,7)]), blockNumbers:=[22], blockSizes:=[6],
blocks:=[[1,2,3,5,6,8], [1,2,3,5,8,12], [1,2,4,5,7,11], [1,2,4,7,11,12], [1,2,4,8,9,10], [1,3,4,6,10,11], [1,3,6,10,11,12], [1,3,7,8,9,11], [1,4,8,9,10,12], [1,5,6,7,9,10], [1,5,6,7,9,12], [2,3,4,6,7,9], [2,3,4,6,9,12], [2,3,5,9,10,11], [2,5,9,10,11,12], [2,6,7,8,10,11], [2,6,7,8,10,12], [3,4,5,7,8,10], [3,4,5,7,10,12], [3,7,8,9,11,12], [4,5,6,8,9,11], [4,5,6,8,11,12]],
isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11,
tSubsetStructure:=rec(lambdas:=[5], t:=2), v:=12),
rec(autGroup:=Group([(2,3)(4,11)(5,6)(7,10),(2,3)(6,8)(7,12)(9,11),(1,3,2)(5,6,8)(7,10,12),(1,5,3)(4,9,12)(7,11,10),(1,2,3)(5,7,6,10,8,12)(9,11)]), blockNumbers:=[22], blockSizes:=[6],
blocks:=[[1,2,3,5,6,8], [1,2,3,7,10,12], [1,2,4,5,7,11], [1,2,4,8,9,10], [1,2,6,9,11,12], [1,3,4,5,9,12], [1,3,4,6,10,11], [1,3,7,8,9,11], [1,4,6,7,8,12], [1,5,6,7,9,10], [1,5,8,10,11,12], [2,3,4,6,7,9], [2,3,4,8,11,12], [2,3,5,9,10,11], [2,4,5,6,10,12], [2,5,7,8,9,12], [2,6,7,8,10,11], [3,4,5,7,8,10], [3,5,6,7,11,12], [3,6,8,9,10,12], [4,5,6,8,9,11], [4,7,9,10,11,12]],
isBinary:=true, isBlockDesign:=true, isSimple:=true, r:=11,
tSubsetStructure:=rec(lambdas:=[5], t:=2), v:=12)]

More Triads

We can present these block designs as 22 columns of 12 pitch classes, indicating presence or absence thereof with a blue ball. For example the fourth design would look like:

Fourth Block Design

Notice that, in deference to musicians, the blocks have been vertically flipped so that GAP's block design's set element labellings 1 … 12 read upwards from bottom to top and have simultaneously been re-labelled on the right with more familiar note names. Naturally, the corresponding pitch class numbers 0 … 11 may be read as starting from other than the conventional C.

What may be of some interest in this kind of block design is that it gives plenty of scope for ordering the blocks in such a way as to carry several pitch classes at once from one block to the next, were one minded to place the blocks in some 22 bar sequence. For example, there are 6C3 = 20 triads available from each hexad. GAP may be used to list them - for example the final design's first emitted block is [1,2,3,5,6,8] and we can get GAP to list all its 3-sets with:

T:=Combinations([1,2,3,5,6,8], 3);

And GAP obliges with the list of that hexad's 20 triads:

[ [1,2,3], [1,2,5], [1,2,6], [1,2,8], [1,3,5], [1,3,6], [1,3,8], [1,5,6], [1,5,8], [1,6,8], [2,3,5], [2,3,6], [2,3,8], [2,5,6], [2,5,8], [2,6,8], [3,5,6], [3,5,8], [3,6,8], [5,6,8] ]

If we pick another block, at random, out of that same design, say [2,4,5,6,10,12], we may list its triads:

T:=Combinations([2,4,5,6,10,12], 3);

And GAP provides:

[ [2,4,5], [2,4,6], [2,4,10], [2,4,12], [2,5,6], [2,5,10], [2,5,12], [2,6,10], [2,6,12], [2,10,12], [4,5,6], [4,5,10], [4,5,12], [4,6,10], [4,6,12], [4,10,12], [5,6,10], [5,6,12], [5,10,12], [6,10,12] ]

Visual inspection tells us that these two lists have only [2,5,6] in common, but GAP may be used to confirm this with

Intersection(Combinations([1,2,3,5,6,8], 3), Combinations([2,4,5,6,10,12], 3));

by emitting:

[ [2,5,6] ]

The DESIGN package presents what we need ideally suited for passing as arguments to GAP's more basic functions. For instance the aforementioned [1,2,3,5,6,8] and [2,4,5,6,10,12] are available to us directly from D as D[4].blocks[1] and D[4].blocks[15] and it's easy to see that we can find all common triads between each of the 22 hexads with a simple nested for loop:

for i in [1..21] do one:=Combinations(D[4].blocks[i], 3); for j in [i+1..22] do two:=Combinations(D[4].blocks[j], 3); Print(i, " - ", j, " : ", Intersection(one, two), "\n"); od; od;

And 21×22/2 = 231 lines of output are printed, almost all of which show exactly one triad common between each pair of hexads - excepting 11 cases where no triad is held in common. We can also discern that each of the remaining 220 common triads is distinct with no repeats. In fact all possible 12C3 = 12!/(9!3!) = 220 triads are accounted for (as common links between hexad pairs) in this structure. The 22 blocks may thus be represented as a 22 node graph wherein each node is a hexad with 20 triadic edges to other nodes. A complete 22 node graph would connect each node with its 21 neighbours. Our graph has, apparently, each node singling out one particular unloved neighbour. This latter property means that the nodes come in pairs because - for example - any node's one and only disconnected neighbour must be a node whose one and only disconnected neighbour must be that first node since it cannot be not-connected to a third, different, node.

Make GAP work for you

At this point it is worth defining our own GAP function to construct lists of node pairs connected by edges representing any commonly contained k-chords:

BlockLinks := function(des, k)
local blx, blc, lis, i, j, one, two, com;
blx := des.blocks;;
blc := des.blockNumbers[1];;
lis := [];;
for i in [1 .. blc-1] do
one := Combinations(blx[i], k);;
for j in [i+1 .. blc] do
two := Combinations(blx[j], k);;
com := Intersection(one, two);;
if Length(com) > 0 then Add(lis, [ i, j, com]);; fi;
od;
od;
return lis;
end;

By invoking this function in GAP with:

L43 := BlockLinks(D[4], 3);
Length(L43);

we can confirm that it generates a list with 220 members (the 11 'empties' have been filtered out), one of which is [1, 15, [[2,5,6]]], representing the fact that the first and fifteenth blocks in the fourth design each share the single common triad [2,5,6] - as noted above. Note that the items are no longer printed (one per line) with punctuating '-' and ':' marks as the output is now a proper GAP object.

Fourth Block Design reordered for Circuit

As this particular design, viewed as a graph of hexadic nodes and common-triadic edges between then is so well-connected, it's not at all difficult to find Hamiltonian Circuits. In fact the design as presented is almost such a circuit (i.e. from block 1 to block 2 via [1,2,3], from block 2 to block 3 via [1,2,5] … etc. One needs only to swap block 12 with 13 and block 21 with 22 to recover this design to the left.

The horizontal bars show the common triads linked across successive columns (vertically flipped as before), including the wraparound at the final column back to the first.

If we look at the third block design however, with a completely different set of 22 hexads -

L33 := BlockLinks(D[3], 3);
Length(L33);

We recover this time a list containing only 176 members. This time we can see that the inter-node triadic commonalities form a more complex network. Here is a 'bleeding chunk' of it, showing all non-empty triadic commonalities at node 14:

…
[1,14,[[2,3,5]]],
[2,14,[[2,3,5]]],
[3,14,[[2,5,11]]],
[5,14,[[2,9,10]]],
[6,14,[[3,10,11]]],
[7,14,[[3,10,11]]],
[8,14,[[3,9,11]]],
[10,14,[[5,9,10]]],
[12,14,[[2,3,9]]],
[13,14,[[2,3,9]]],
[14,15,[[2,5,9], [2,5,10], [2,5,11], [2,9,10], [2,9,11], [2,10,11], [5,9,10], [5,9,11], [5,10,11], [9,10,11]]],
[14,16,[[2,10,11]]],
[14,18,[[3,5,10]]],
[14,19,[[3,5,10]]],
[14,20,[[3,9,11]]],
[14,21,[[5,9,11]]],
…

We can see that not only is node 14 (corresponding to the hexad [2,3,5,9,10,11]) disconnected from five nodes instead of just one, it is connected to node 15 (hexad [2,5,9,10,11,12]) by ten common triads rather than just one. Furthermore, nodes 1 and 2 are connected to 14 by the same triad (as are nodes 6 and 7, 12 and 13 etc). Design 3 is clearly a very different musical animal to design 4.

Tetradic Bridges Across the Hexachords

We can use our homebrew function to look for common tetrad links between the hexads of the second design:

L24:=BlockLinks(D[2],4);
[[1,2,[[1,2,3,12]]],
[1,6,[[1,3,4,7]]],
[1,12,[[2,3,4,12]]],
[2,5,[[1,2,11,12]]],
[2,14,[[2,3,6,11]]],
[3,4,[[1,2,6,8]]],
[3,11,[[1,6,8,9]]],
[3,15,[[2,4,8,9]]],
[4,5,[[1,2,5,10]]],
[4,7,[[1,5,6,10]]],
[5,10,[[1,10,11,12]]],
[6,8,[[1,3,7,8]]],
[6,19,[[3,4,8,10]]],
[7,13,[[3,5,9,10]]],
[7,18,[[3,5,6,9]]],
[8,9,[[1,5,7,11]]],
[8,22,[[5,7,8,11]]],
[9,10,[[1,4,9,11]]],
[9,15,[[4,5,9,11]]],
[10,20,[[9,10,11,12]]],
[11,17,[[7,8,9,12]]],
[11,22,[[6,7,8,12]]],
[12,15,[[2,4,5,8]]],
[12,18,[[3,4,5,12]]],
[13,14,[[2,3,7,9]]],
[13,17,[[2,7,9,10]]],
[14,16,[[2,6,7,11]]],
[16,19,[[4,6,10,11]]],
[16,21,[[4,6,7,10]]],
[17,20,[[8,9,10,12]]],
[18,21,[[4,5,6,12]]],
[19,20,[[3,8,10,11]]],
[21,22,[[5,6,7,12]]]
]
Length(L24);
33

Second Block Design as (tetradically edged) Graph

The above GAP output looks reasonably promising for just 22 barsworth, and with three edges per node it seems worth presenting here, left, as a graph. We've distributed the 22 hexadic nodes evenly, in the design's order, circularly clockwise from the top. Then we've linked them by their common tetradic edges. There's no point in labelling anything yet.

This graph is connected enough to be worth running through Prof Dharwadker's Hamiltonian Circuit detection software

Second Block Design Reordered as (tetradically edged Circuit) Graph

The software finds eight circuits. Here is the fifth (clockwise through blocks 16 21 22 8 9 15 12 18 7 13 17 11 3 4 5 10 20 19 6 1 2 14 and back to 16 at top)

The light blue boxes carry the six pitch classes of the hexachord as a hexadecimal string where each of the design's block's set element value has been reduced by 1, to bring it into our more conventional modulo 12 territory. Thus block 16, at the top, originally presented as [2,4,6,7,10,11] is here notated as 13569A. The common tetrads between joined nodes are similarly hexadecimally reduced and lie midway along the edge adjoining the two nodes sharing the tetrad.

It has not escaped our attention that the remaining 11 non-circuit edges (i.e. those edges not on the circumference but crossing the circle) of the re-ordered block exhibit an unexpected symmetry along the diametrically dividing line situated from 4 to 15 on the 22 hour clock topped at 0 (or at roughly ten past two across to ten past eight on a 12 hour clock). This rather suggests that a musical composition might start on one of those nodes - it would then, halfway through the run, essentially reverse.

Second Block Design Reordered

The design looks like this, with the design's blocks reordered according to the discovered Hamiltonian circuit, and with the aforementioned symmetry point (originally block [1,4,9,10,11,12], now labelled as 0389AB) moved to the first place.

We can also rotate the graph to make its tetradic-link symmetry more plain as a north-south reflection. The leftmost, westernmost, 9 o'clockiest point corresponds to that new first block, and it thence clockwisely follows the new block order.

Second Block Design Graph Rotated

The Tetrads common to the successive Hexachords in the re-ordered Block Design #2

The Tetrads common to successive Hexachords

Common Pentads - A Bridge too far?

If we now have a look at common pentads between the hexads, by invoking BlockLinks(D[4], 5), we get a completely disconnected graph - there are no common pentads between any of the hexads. But if we try the third design we have a little more luck:

L35:=BlockLinks(D[3],5);
[[1,2,[[1,2,3,5,8]]],
[3,4,[[1,2,4,7,11]]],
[5,9,[[1,4,8,9,10]]],
[6,7,[[1,3,6,10,11]]],
[8,20,[[3,7,8,9,11]]],
[10,11,[[1,5,6,7,9]]],
[12,13,[[2,3,4,6,9]]],
[14,15,[[2,5,9,10,11]]],
[16,17,[[2,6,7,8,10]]],
[18,19,[[3,4,5,7,10]]],
[21,22,[[4,5,6,8,11]]]
]

But just not very much. One might expect that 5 is possibly a little too close to 6 for common PC sets in such a small population of 22 blocks. But remember that the initial purpose of block designs was to provide sufficiently large test environments for conducting experiments without introduction of accidental bias. One is quite free to bump up the λ and the r values (subject to those constraints between the parameters) and generate designs with large numbers of blocks, and which still give equal opportunity to all pitch classes and intervals.

So, musically speaking, there's an awful lot to play with here and GAP can help you research the features you may wish to examine. As for converting these designs and any derivatives or transformations thereof into actual music, well, you know what to do. At the risk of pointing out the obvious, all of the integers in these set representations are ranged from 1 to 12, so just subtract 1 from each to recover the musician's traditional PC modulo 12 notations - or just live with it and treat the 12 as a 0. Everything else is just transposition anyway.

Remember that block designs are not restricted to using 12-sets and there's no need to bind yourself inside a twelve-tone universe.

More GAP code

A modification of the BlockLinks function can also provide an adjacency matrix since it may as well be calculated at the same time as the common subsets. First of all, we provide an 'object labelling' function:

OrdList36 := function(lords)
  local s, l, i, u;

  s := [];;
  u := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if IsList(lords) then
    l := Length(lords);;
    if l > 0 then
      if IsInt(lords[1]) then
        for i in [1 .. l] do
          Add(s, u[lords[i]]);;
        od;
      else
        for i in [1 .. l] do
          Add(s, OrdList36(lords[i]));;
        od;
      fi;
    fi;
  fi;
  return s;
end;

This provides us with PC-Set friendly labels, allowing us to replace the rather bulky (and 1-based) set denotations such as [1,3,5,7,10,11] with a sugar-free (and 0-based, hex-encoded) label 02469A.

The new function, BlockDesignGraph, produces a record carrying node and edge counts and names using the friendlier labels as well as an adjacency matrix which may be used to find those Hamiltonian paths and circuits:

BlockDesignGraph := function(design, subsiz)
  local blx, blc, lis, i, j, k, len, one, two, com, mat;
  blx := design.blocks;;
  blc := design.blockNumbers[1];;
  mat := NullMat(blc, blc);
  lis := [];;
  for i in [1 .. blc-1] do
    one := Combinations(blx[i], subsiz);;
    for j in [i+1 .. blc] do
      two := Combinations(blx[j], subsiz);;
      com := Intersection(one, two);;
      len := Length(com);
      if len > 0 then
        for k in [1 .. len] do
          Add(lis, [ i, j, OrdList36(com)[k]]);;
        od;
        mat[i][j] := mat[i][j] + len;;
        mat[j][i] := mat[j][i] + len;;
      fi;
    od;
  od;
  return rec(nNames:= OrdList36(blx), nCount := Length(blx), eNames:=lis, eCount:=Length(lis), incidenceMatrix:=mat);
end;

20180815

Pitching Democracy

The term twelve tone music suggests we treat each of those tones equally to eliminate bias. But this does not limit us to any of the 836017[1] essential patterns of serial music's twelve tone rows, with their derivative inversions, retrogrades, retrograde-inversions and cyclic-shiftings, all regarded as equivalencies. There are numerous other ways of 'democratising' twelve elements, for example statistically rather than serially.

We could have equal numbers of instances of each of the twelve elements and throw them up into the air. The resultant scatter will be expected to be uniformly distributed. And very likely musically uninteresting. We need some way of introducing structure by building composite objects out of those elements, but without giving undue weight to any particular one of them.

… that all intervals are created equal

The next obvious candidate (many will argue it's actually the principal) is the interval, characterised as a set of pitch class pairs, a duple, pij ≝ {pi, pj}. We need hardly state explicitly that j ≠ i and pij ≡ pji (but there it is anyway). There are nC2 = n(n-1)/2 such pairs chooseable from n objects in general, so from 12 pitch classes (labelled 0 … 11) we have:

{0,1}, {1,2}, {2,3}, {3,4}, {4,5}, {5,6}, {6,7}, {7,8}, {8,9}, {9,10}, {10,11}, {0,2}, {1,3}, {2,4}, {3,5}, {4,6}, {5,7}, {6,8}, {7,9}, {8,10}, {9,11}, {0,3}, {1,4}, {2,5}, {3,6}, {4,7}, {5,8}, {6,9}, {7,10}, {8,11}, {0,4}, {1,5}, {2,6}, {3,7}, {4,8}, {5,9}, {6,10}, {7,11}, {0,5}, {1,6}, {2,7}, {3,8}, {4,9}, {5,10}, {6,11}, {0,6}, {1,7}, {2,8}, {3,9}, {4,10}, {5,11}, {0,7}, {1,8}, {2,9}, {3,10}, {4,11}, {0,8}, {1,9}, {2,10}, {3,11}, {0,9}, {1,10}, {2,11}, {0,10}, {1,11}, {0,11}

This is a well-defined set of sets in that it comprises a complete accounting of all possible 2-sets contained within a 12-set. As such, it is a simple enough animal. But simple things are ofttimes just manifestations of something more complicated.

A Confederacy of Duples

This animal is also an instance of a more complex artifice comprising - more generally - 66 subsets of 2 elements each, drawn from a set of 12 elements, each of which appears 11 times and where each and every 2-form appears exactly 1 time.

These specifications - which will first seem a rather over-engineered-for-purpose definition - make it more than just a set of sets. This structure also happens to be, and is known as, a balanced incomplete block design. This one is specifically a 2-design and the above specifying quantities, or enumerations, are usually notated with the following letters (ordered as they're found within the above description):

  • b … 66 subsets …
  • k … 2 elements …
  • v … 12 elements …
  • r … 11 times …
  • t … 2-form …
  • λ … 1 time …

Hitherto we've used n to denote the size of the pitch class universe, and also k for the smaller sizes of pitch class sets used for scales or chords. Block (or t-) design combinatorics (for that is where we are now) continues to use k for the subset size, but uses v instead of n. The structure itself is notated as the 5-tuple (v,b,r,k,λ) - where the t is understood to be 2. Often it's just the triple (v,k,λ) when b and r are inferred from the specific construction.

It's important to be aware that t is not the same as k, though they have - in this case coincidentally - the same value of 2. The t refers to the size of the duple (the size of the pitch class pair, the abstract 2-form - represented by another 2-set - it's what this structure is 'about'). The k, on the other hand, refers to the size of the subsets containing it (or, in general, them). The above set of 2-sets, each in one to one correspondence with its 2-form, is the simplest, most transparent design one could have.

The above structure carries each of the 66 possible duples exactly once. If we wished to instantiate a piece of music from that, then what could we do with such a collection? Again, like the elements themselves (the pitch classes available in the simpler structure, the universal 12-set that we started with), we could maybe play the 66 dichords, or (admittedly rather tiny) scale patterns, in some order with some rhythm and with some dynamics.

Or we could decide we need more instances of the pairs, to give us a little more scope to play with. Such as two of each duple - we can't single any one of them out, so each duple should appear in equal quantity. Naturally this could mean just using two of these structures and we'd have 132 little musical objects to deploy in some interesting way.

Repackaging without Bias

However, we might notice that 3-sets can carry 3 duples (i.e. p1~p2, p2~p3, p3~p1) in one bag, as it were. So instead of toting around 132 bags we can manage with only a third of them - i.e. 44 (admittedly 50% bigger) bags. We can't toss just any old trio of elements into each bag (which we'll call a block from now on) but must arrange their contents in such a way as to ensure that exactly two instances of each of our 66 duples (t-forms) turn up altogether. In other words we must construct a design out of b=44 blocks of k=3-sets (drawn from our universe of the v=12 set) so that exactly λ=2 of each duple/interval appear in it. Thus the t-set is no longer explicitly visible, whereas the k-set remains very much so.

It should be relatively easy to see that, when forming an exhaustive b sized list of k-sized subsets of v elements, you'll need r = bk/v each of the elements to build it. We have seen that vr = 12×11 = 132 = 2×66 = kb. With 3-sets we can instead have 132 = 3×44 = kb. Which is an illustration of the invariance of vr = kb within such systems.

We note that there are 12C3 = 220 possible triples, which is 5 times as many as we want/need. So how do we go about gathering a valid collection of exhaustively and non-preferentially distributed embedded duples? We could start with the whole 220, list all the duples implied in each, and (very carefully) remove 176 triples carrying exactly 8 each of the 66 duples. Or find some other algorithm to start from the bottom up. But sometimes the simple answer is that we just find them in the literature[2].

Redistribution of Assets

Consider this set of (so far, magically generated) 44 3-sets, which happens to be such a (12,44,11,3,2) block design:

{0,1,3}, {1,2,4}, {2,3,5}, {3,4,6}, {4,5,7}, {5,6,8}, {6,7,9}, {7,8,10}, {0,8,9}, {1,9,10}, {0,2,10}, {4,5,9}, {5,6,10}, {0,6,7}, {1,7,8}, {2,8,9}, {3,9,10}, {0,4,10}, {0,1,5}, {1,2,6}, {2,3,7}, {3,4,8}, {2,6,8}, {3,7,9}, {4,8,10}, {0,5,9}, {1,6,10}, {0,2,7}, {1,3,8}, {2,4,9}, {3,5,10}, {0,4,6}, {1,5,7}, {7,10,11}, {0,8,11}, {1,9,11}, {2,10,11}, {0,3,11}, {1,4,11}, {2,5,11}, {3,6,11}, {4,7,11}, {5,8,11}, {6,9,11}

If you cared to, you could verify that the 11 instances of each of our 12 pitch classes are present. For example pitch class 3 turns up in {0,1,3}, {2,3,5}, {3,4,6}, {3,9,10}, {2,3,7}, {3,4,8}, {3,7,9}, {1,3,8}, {3,5,10}, {0,3,11} and {3,6,11}. You might also check that each of the 66 pitch class pairs turn up twice each, e.g. {4,8} ⊂ {3,4,8} and {4,8} ⊂ {4,8,10} but in no others.

Abstraction to Application

One moderately musically interesting result of this latter property (a consequence of λ=2) is that we may conceivably write a piece of music comprising a sequence of triads (the blocks) in which each triad leads to the next carrying a common interval with the third pitch guaranteed as changing. For example the two successive bars with the above {4,8} (conventionally enough taking PC4 as E and PC8 as G#) in common:

We may then choose the common pair {3,4} or {3,8} for the preceding bar's common interval connection, and either {8,10} or {4,10} for the following bar's. After electing {3,8} to the left (introducing PC3 = E♭) and {8,10} to the right (introducing PC10 = B♭) we'd get:

Now we're forced to complete the left hand bar with the only remaining triad containing {3,8} that we're assured we have by the design (i.e. {1,3,8}, introducing PC1 = C#) and also to complete the right hand bar as the only remaining triad containing {8,10}, which is {7,8,10} (bringing in a PC7 = G):

Here's what (a), (b) and (c) sound like:

At this point we can pick either of {1,3} or {1,8} to continue the leftward process (since by now we have consumed both {3,8}) and either of {7,8} or {7,10} for the rightward (likewise both {8,10}).

I.e. what remains is:

{0,1}, {1,2}, {2,3}, {3,4}, {4,5}, {5,6}, {6,7}, {7,8}, {8,9}, {9,10}, {10,11}, {0,2}, {1,3}, {2,4}, {3,5}, {4,6}, {5,7}, {6,8}, {7,9}, {8,10}, {9,11}, {0,3}, {1,4}, {2,5}, {3,6}, {4,7}, {5,8}, {6,9}, {7,10}, {8,11}, {0,4}, {1,5}, {2,6}, {3,7}, {4,8}, {5,9}, {6,10}, {7,11}, {0,5}, {1,6}, {2,7}, {3,8}, {4,9}, {5,10}, {6,11}, {0,6}, {1,7}, {2,8}, {3,9}, {4,10}, {5,11}, {0,7}, {1,8}, {2,9}, {3,10}, {4,11}, {0,8}, {1,9}, {2,10}, {3,11}, {0,9}, {1,10}, {2,11}, {0,10}, {1,11}, {0,11}

{0,1,3}, {1,2,4}, {2,3,5}, {3,4,6}, {4,5,7}, {5,6,8}, {6,7,9}, {7,8,10}, {0,8,9}, {1,9,10}, {0,2,10}, {4,5,9}, {5,6,10}, {0,6,7}, {1,7,8}, {2,8,9}, {3,9,10}, {0,4,10}, {0,1,5}, {1,2,6}, {2,3,7}, {3,4,8}, {2,6,8}, {3,7,9}, {4,8,10}, {0,5,9}, {1,6,10}, {0,2,7}, {1,3,8}, {2,4,9}, {3,5,10}, {0,4,6}, {1,5,7}, {7,10,11}, {0,8,11}, {1,9,11}, {2,10,11}, {0,3,11}, {1,4,11}, {2,5,11}, {3,6,11}, {4,7,11}, {5,8,11}, {6,9,11}

The obvious question is whether or not we can continue in this fashion to consume all 44 triads exactly once without breaking the common duple rule tying successive bars together. I.e is there a Hamiltonian path, with the 3-sets regarded as the nodes of a graph? Or - even better - a Hamiltonian circuit in which the final, 44th, bar links neatly back to the 1st bar with a common duple.

Since at each stage of this construction we have two choices at both left and right edges, and bearing in mind that there are 44 3-sets to consume, along with 44 of the 66 duples (leaving 22 of them unemployed - one of the hazards of democracy?), it seems unlikely that the current example will succeed since it was begun somewhat arbitrarily, and grown via what amounts to a sequence of coin-tosses.

So, rather than (possibly) waste time working blindly, we can attempt to draw a graph of the design, with the 44 3-sets as nodes and the 66 duples as edges. Each edge will therefore connect two nodes (a direct consequence of λ=2) and each node will carry three edges (since each 3-set contains 3 2-sets and the 2-sets match the edges). With such a graph (although it's a bit of a mess) it may be easier to visualise a path or circuit which visits each (blue) node exactly once. We've emphasised the three edges we've used so far with three heavy reddish lines.

But visual path detection seems by no means such an easy task. It would be helpful if we could find some software to do this. It doesn't take long to dig up an algorithm from the early 2000s (thank you Ashay Dharwadker). All this particular piece of software requires is a text file containing an incidence matrix for the graph, which takes only minutes to prepare.

With our graph, the program produces 45 results almost instantly. Searching those results for circuits with the particular choices made above - perhaps not surprisingly - reveals nothing. However, the single circuit presented employs our last three bars (blocks {3,8,4} via {4,8} to {4,8,10} via {8,10} to {7,8,10}). Had we chosen {3,4} rather than the {3,8} we did, the previous bar (the first of four, above) would have been {3,4,6} instead of {3,1,8}, and we would at that point have remained on course - doubtless to hit the rocks not much later. But now we know better and the complete circuit is

{0,1,3}, {1,3,8}, {1,7,8}, {1,5,7}, {4,5,7}, {4,5,9}, {2,4,9}, {1,2,4}, {1,2,6}, {1,6,10}, {5,6,10}, {3,5,10}, {2,3,5}, {2,5,11}, {2,10,11}, {0,2,10}, {0,4,10}, {0,4,6}, {3,4,6}, {3,4,8}, {4,8,10}, {7,8,10}, {7,10,11}, {4,7,11}, {1,4,11}, {1,9,11}, {1,9,10}, {3,9,10}, {3,7,9}, {2,3,7}, {0,2,7}, {0,6,7}, {6,7,9}, {6,9,11}, {3,6,11}, {0,3,11}, {0,8,11}, {5,8,11}, {5,6,8}, {2,6,8}, {2,8,9}, {0,8,9}, {0,5,9}, {0,1,5}

Which, as you can see, cycles from the final {0,1,5} via a {0,1} to the initial {0,1,3} (not that {0,1,3} must be initial - we could now start anywhere).

In the following figure, we present the circuit - labeling the edges only - with the triads occupying 44 nodes as blue discs. We do not need to clutter-label the nodes as the three pitch classes within each disc simply comprise the union of the pitch class pairs on the large circle's arcs on either side of it. For example, right at the top we have a disc/node with {0,1} to its left and {1,3} to its right, so we know this block is {0,1,3}. Note that the third edge's (every disc supports three edges) label, i.e. {0,3}, can be found halfway along the line tracing off down and to the left towards block/disc {0,3,11}.

Placing edge labels automatically (halfway) may occasionally lead to confusion. Beware, for example, the {1,5} in proximity to the {1,3,8} node at the top. This may appear to suggest, erroneously, that pitch class 5 should be in that block. In fact that {1,5} labels an edge from two completely different nodes on either side and just happens to land inconveniently close by. It's true third edge's label, {3,8} is halfway along a line tracing to the south east.

Here is a simple musical manifestation of the circuit, along with a pair of audio files

The second playable example is a faster manifestation with tuned percussion and a bit of rhythmic interest (just not very much). It lasts longer only because it's played twice around the Hamiltonian circuit.

Note that the above block design - essentially the set of 44 3-sets, from which we have serialised the blocks in a sequence of our own choosing to satisfy some musical whim is only one of the 242995846[3] purported (12,44,11,3,2) block designs. One may apprehend the size of the solution space by considering the 22 unused edges criss-crossing the large circle above. There is no obvious pattern and one should not expect one. Indeed it would be a little unnerving to find one.

The Higher Strata

Other factorisations of the vr=bk invariant (in this case equal to 132) allow us to propose designs of 33 blocks of 4-sets (tetrachords or tetratonic scales/arpeggios), for example the following (12,33,11,4,3) design, where our 66 duples each turn up 3 times (there are more than 17 million[3] of these, this is just one of them):

{0,1,3,7}, {1,2,4,8}, {2,3,5,9}, {3,4,6,10}, {0,4,5,7}, {1,5,6,8}, {2,6,7,9}, {3,7,8,10}, {0,4,8,9}, {1,5,9,10}, {0,2,6,10}, {2,4,9,10}, {0,3,5,10}, {0,1,4,6}, {1,2,5,7}, {2,3,6,8}, {3,4,7,9}, {4,5,8,10}, {0,5,6,9}, {1,6,7,10}, {0,2,7,8}, {1,3,8,9}, {5,6,8,11}, {6,7,9,11}, {7,8,10,11}, {0,8,9,11}, {1,9,10,11}, {0,2,10,11}, {0,1,3,11}, {1,2,4,11}, {2,3,5,11}, {3,4,6,11}, {4,5,7,11}

There's another invariant of such systems, viz. λ(v-1) = r(k-1). The first has 1×(12-1) = 11×(2-1) and the last 5×(12-1) = 11×(6-1). You may wish to confirm this with the other two designs.

Designs comprising 22 blocks of 6-sets (hexachords and/or hexatonic arpeggios) exist. E.g. the (12,22,11,6,5) design where our 66 duples each turn up 5 times (1 of 11603[3] possible designs):

{0,2,3,4,8,10}, {0,1,3,4,5,9}, {1,2,4,5,6,10}, {0,2,3,5,6,7}, {1,3,4,6,7,8}, {2,4,5,7,8,9}, {3,5,6,8,9,10}, {0,4,6,7,9,10}, {0,1,5,7,8,10}, {0,1,2,6,8,9}, {1,2,3,7,9,10}, {1,5,6,7,9,11}, {2,6,7,8,10,11}, {0,3,7,8,9,11}, {1,4,8,9,10,11}, {0,2,5,9,10,11}, {0,1,3,6,10,11}, {0,1,2,4,7,11}, {1,2,3,5,8,11}, {2,3,4,6,9,11}, {3,4,5,7,10,11}, {0,4,5,6,8,11}

In a block design such as this, transitioning between blocks via duples would be modelled by a graph with the 22 blocks (nodes) and 165 (duples) edges, with each node carrying 6C2 = 15 edges.

At first glance a design using 5-sets, with pentatonics, seems impossible since k=5 doesn't divide evenly into v=12. But we may accomodate pentatonic designs by relaxing the vr=132 constraint (it must still equal bk though!). I.e. have r=55 of each pitch class turn up in a (rather larger) structure of b=132 k=5-sets with λ=20 instances each of our intervalic duples in a (12, 132, 55, 5, 20) design.

Realpolitik

We finally note here that - with these 2-designs - no particular pitch classes or intervals stand out against each other in the design. But particular musical applications of it may - for example by keeping 22 nominally equal citizens out of work as we did above. Other musical economies may be more successful in employing everyone. Additionally, in any application of a particular design, it will be the case that one (12,44,11,3,2) block design will draw attention to only 44 of the 220 possible triads mentioned above. And another will favour a different 44. It's fair(-ish) to say, then, that musical democracy extends upwards in the aggregations of all possible 2-designs, i.e. not simply any one of them. Naturally, you may actually democratise triples by building 3-designs, quadruples with 4-designs, etc. The problem with 'equal opportunities' for a design employing all 220 3-set citizens in equal numbers (via that design's λ value) is that no pre-singularity human being will be able to apprehend the structure. It's certainly not likely that even the 'mere' 44-ness presented here would be noticed as some kind of integrable musical idea - the 40 parts available to listeners of Spem In Alium notwithstanding (thanks due to Hans Jacobi for this thought).

I'm extremely grateful to Tom Johnson, with whom I spent a pleasant and mathematically engrossing couple of hours at the end of June, 2018. For it was he who introduced me to the world of block designs, both at his fortress of solfège-étude and via his book[4]. The field presents a vast source of ideas, with which I'm now mildly obsessed.

[1] Combinatorial problems in the theory of music, R C Read, Elsevier Discrete Mathematics 1997, table 2 page 547.

[2] A Survey of Resolvable Solutions of Balanced Incomplete Block Designs, Kageyama Sanpei, Longman Int Stat Rev Vol 40#3 1972, table on page 270.

[3] Handbook of Combinatorial Designs, IIed, Charles J Colbourn and Jeffrey H Dinitz, CRC Press 2010, page 37.

[4] Other Harmony - beyond tonal and atonal, Tom Johnson, Editions 75 2014, block designs page 191.