Processing HarmonicTable: Part 1
Earlier this year while reading Harmonic Experience by W. A. Mathieu, I was introduced to the concept of lattices to represent tones, chords and keys. These lattices can be used to represent the basics of music composition in a visual way that makes more sense than standard scales on staffs. Here is an example:

A few weeks into reading Harmonic Experience, providence saw fit to lead me to the C-Thru AXiS controller. The AXiS is a Harmonic Table based midi controller that creates a table much like the lattice in Harmonic Experience, separating notes not in semi-tones like a keyboad, but by 5ths and 3rds (and of course many other inter-relationships based on this). Here is the layout of the AXiS:
If you look the relationships between the keys become clear. They are reversed from Mathieu’s lattice, 3rds are horizontal (diagonally), and 5ths are always straight up. To play a Major triad on the AXiS, just play that triangle pattern using starting at any key. C Major will have the same pattern as Bb Major, etc. There are of course drawbacks to this system (playing inversions, etc), but for the most part it accomplishes the goal of simplifying the muscle memory aspects of playing music so the user can concentrate on composition and performance. you learn the pattern for a scale, chord or mode only once, then you may modulate it anywhere without the need to retrain your fingers.
int length=30;
float a = length/2;
float b = sin(radians(60))*length;
float c = length;
public void drawHex(){
beginShape();
vertex(0,b);
vertex(a,0);
vertex(a+c,0);
vertex(2*c,b);
vertex(a+c,2*b);
vertex(a+c,2*b);
vertex(a,2*b);
vertex(0,b);
endShape();
}
This will construct a regular hexagon based on the length of one side.
After that I used a series of translation matrices to draw them all over the screen:
public void draw(){
rowNumber=0;
setNoteNumber(rowNumber);
for (int j=2; j<20; j++){
pushMatrix();
translate(0+space, (height-(j*(b+space/2)+1)));
drawHex(getNextNote());
for (int i=1; i <12; i++){
translate(space+(2*a)+(2*c), 0);
drawHex(getNextNote());
}
popMatrix();
j++;
rowNumber++;
setNoteNumber(rowNumber);
pushMatrix();
translate(a+c+1.5f*space, (height-(j*(b+space/2))));
drawHex(getNextNote());
for (int i=1; i <12; i++){
translate(space+(2*a)+(2*c), 0);
drawHex(getNextNote());
}
popMatrix();
rowNumber++;
setNoteNumber(rowNumber);
}
}
I predefined the number of horizontal hexagons to 12 for each row, this means that STRAIGHT horizontally across a row I will have a perfect chromatic scale. The number of vertical keys I simply copied from the AXiS.After predefining the number of columns and rows, it meant that I could construct the size of the screen based on the length of one side of the hexagon. I also included a variable that allows me to declare an amount of fixed space in between the keys (in case my fingers are too big for the key’s surface). One variable, named length, can be changed to create a bigger surface with larger keys.
After implementing some simple code to write the note name into the key as well, I was finished with the layout. Here is a snapshot of it directly out of processing:
Its of course much bigger. With the key surface complete now all I have to do is map the key locations to the midi note they’re associated with, and use some on press functions to trigger them. After that I just need to get access to a touch screen, anyone want to donate one?
Here is the preliminary code to draw the hexagons, as well as the code required to map midi notes:
HarmonicTable
NoteReference
In Part 2 I’ll have have midi functionality implemented and some testing done.
In Part 3 I’ll have it implemented with a touchscreen, most likely a laptop, at that point I’ll make the rest of the code available.
Pingback: music notes layouts | Digg hot tags