A doodle of mine to help organize my thoughts. Here, each “edge” in the graph connects “vertices” that represent a triad. The triads do not represent every possible set of 3 notes, but they do represent every possible set of 3 notes where every note is “consonant” with at least one other note in the set, in the sense of being a perfect fourth or fifth, or a major or minor third (or major/minor sixth as you choose octaves). This is a very limited view of “consonant” but it’s a place to start. One can also think of this as being based on the 5-limit major scale. In this context, tracing paths through this graph shows possible harmonic progressions where each changes by exactly one note. If you manage to path through every possible edge exactly once, this is an Eulerian path. If you path through every possible vertex exactly once and end where you start, this is a cycle.
This idea can be altered in many ways to create other graphs: use 4-note chords instead of 3-note chords; change what constitutes “consonant”; change exactly 2 notes instead of 1; use different scales; etc.
Update – I have working code that goes through this process, and is flexible enough to be able to apply to different kinds of scale structures. With this done, the work now is deciding upon an adjacency matrix for various scales of interest, and plugging that into my code. For now, my code only works with matrices that represent undirected graphs, but that’s good enough for what I need. I used Sagemath, which has some very handy code libraries, but the display only shows vertices labelled with zero-based numbering, so I also include an index that shows how each vertice maps to a set of notes. A PDF of the resulting graphs for the 5-limit major scale I started with above is linked below: