This is an interactive visualisation based on Tom Glazebrook's metaharmony concept. It is mainly for personal use, and I have departed from Tom's colour scheme and geometric representation.
The user can explore an infinite grid of musical notes, going up a minor third every unit in the x axis and going up a fifth every unit in the y axis.
Notes are coloured RED, GREEN or BLUE depending on which of the three diminished 7th chords they belong to. I chose C to be red, since it is the most common starting point for learning anything musical. Then, for ease of memorisation, G is green and B is blue.
In metaharmony, the major and minor triads are given the sum of the two colours they contain. For instance, Am is A C E, and since A and C are red and E is green, Am is yellow. These colours are indicated by vertical edges.
Tom used the traditional primary colours of red, yellow and blue. This is fiddly to achieve programmatically, and using rgb values has the nice property that adding them works as expected. Plus, the metaphor is better in my opinion. Red and green light, when mixed, makes yellow. I like the idea of notes as coloured light.
I came up with the grid when reflecting on the hypercube concept in metaharmony. The "blue" notes and edges around the "orange" hypercube are duplicated: two Fs, two Ds, two Bs and two Abs. If we identify each pair, we get some kind of twisted multidimensional toroidal object that I can't even get my head around. When I started trying to draw this object, the grid came out naturally. And indeed, we may well wish to start at a higher C chord, and resolve down to a lower C (for example).
All of this might turn out to be a bad idea if and when Tom elaborates on the geometry he has in mind; his website is currently under construction. I look forward to seeing where it goes! But anyway this has been useful for me to visualise different common substitution patterns.
Currently VisPy.
- Currently each edge has its own
Lineelement. I want to batch them by colour to improve performance. - Another option is hardcoding an image of a 12x12 portion of the grid, and then tiling the plane with it.
- I want to find a way to limit the zoom that isn't awful (nothing I tried worked how I wanted it to)
- I need to add some screenshots to this README!
- Panning and zooming don't work very well: pan slowly and don't zoom too much.
- It takes some time to load and moves quite slowly. But it's mainly for looking at in a static state, so it's useful to me. I may try to improve it in the future.
- I allowed ChatGPT to be a bit more active in this project than for previous projects. I didn't vibe code it but I had ChatGPT generate code directly, which I didn't do before. I found it frustrating to be honest, and ChatGPT is way over-confident in its knowledge of VisPy in particular.