In the previous page on chords we used some structures using the 12 half steps as our model with a one octave limit to the voicing capability. However in traditional music theory we use a different system. One common system is using numbers as scale degrees. The numbers '1 2 3 4 5 6 7 8' represent a major scale. Then sharps or flats can be used to create different structures. For example '1 2 b3 4 5 6 b7 8' represents a Dorian scale. That number system can be applied to chords also. A major chord is represented by '1 3 5' and a minor chord is '1 b3 5'. But these numbers do not represent a list of half steps, so they cannot be used directly by the computer to create the correct musical structure.
But since a number system is common for musicians to use and understand, it is worth the effort to build a system that allows an arranger to define scales and chord voicing using the language that is common to music theory. So we'll create a system where the user can write a string of '1 3 5 7' and the computer will create a list of [0, 4, 7, 11] which the computer can use with a root to create a list of pitches (or frequencies) that can be used with Tone.js.
In a jazz style there are some common chord voicing used by pianist and guitarist when acompanying soloist. Often the written chord progression is only a starting point, and it is common for experienced players to add changes, extensions and alterations to the written chords. My own motivation is to build a system that I can use while thinking as a musician instead of a computer programmer. I want to think in terms of a written chord progressions as Dm7 G7 Cma7 Am7 but with several specific voicings defined for that type of progression, however the voicings that are played might be more accurately defined as Dm9 G13b9 Cma9 Am11, (just to jazz it up a bit). The chord symbol isn't currently used but it could be used with LilyPond for printing.
chordArray: using the following format
[ ['{chordSymbol_1}', 'root_1', '{voicingString_1}'],
['{chordSymbol_2}', 'root_2', '{voicingString_2}'], [{...},{...}] ]
EXAMPLE:
[['Dm7', 'D3', 'b3 b7 9'], ['G7', 'G2', 'b7 3 13 b9'], ['Cma7', 'C3', '3 7 9 5'], ['Am7', 'A2', '5 9 b3 11'] ];
The assumption is that the notes are arranged from left to right as lowest to highest pitch. This would allow any specific voicing to be used for a chord symbol. Notice these voicing don't have roots. This technique is common in jazz comping especially in jazz combos and ensembles. In this case we can use voicings like these as a 'left hand' piano leaving room for a 'right hand' melody. Or these voicings could be the 'right hand' of a piano voicing that also included a bass clef part ('left hand') which is rhythmic independent of the comping part.
There are several common comping rhythms also which can be associated with the voicings. But it would be best to design a system that let's us use any rhythm with any voicing. So if we have a stream of rhythms that span over some chords we'll need a symbol to indicate where the chords change within that stream of rhythms. We'll arbitrarily choose "|" as the symbol to indicate a chord change. The following would play each chord with the same rhythm ('1, 2-and' for each chord).
['4n','8nr','8n','2nr','|','4n','8nr','8n','2nr','|','4n','8nr','8n','2nr','|','4n','8nr','8n','2nr']
We'll create a module to do the scale degree processing for us. Then use the Rhythm module to create the code usable with Tone.js. The basic code should look like this:
var chords = [['Dm7', 'D3', 'b3 b7 9'], ['G7', 'G2', 'b7 3 13 b9'], ['Cma7', 'C3', '3 7 9 5'], [ 'Am7', 'A2', '5 9 b3 b7'] ];
var rhythms = ['4n','8nr','8n','2nr','|','4n','8nr','8n','2nr','|','4n','8nr','8n','2nr','|','4n','8nr','8n','2nr'];
// scaleDegree.makeRhythmAndChordProg() returns a two element array
// each element is itself an array of rhythms (index 0) and chords (index 1)
var rhythmAndChords = scaleDegree.makeRhythmAndChordProg(rhythms, chords);
var myComping = Rhythm.mergeDurationVelocityAndPitch(rhythmAndChords[0], rhythmAndChords[1]);
The myComping var can be used with Tone.Part().
This page has four examples of using this new scale degree oriented system for chord voicings. Each example has a chordal part and an independent bassline (also using the scale degree method). This approach for the chord voicings aligns better with some common music terminology used in jazz education, but of course in the end the scale degrees get resolved by the code as 'half step arrays' and then translated into the notes names. You can choose from the Examples menu to hear them and view source to see the code.