Parsimonious Voice Leading (again): attempts to provide an algorithm
In a previous post I deleted, I was trying to find a good way to ensure the minimal parsimonious Voice-Leading (VL) between a sequence of chords.
In this post I will try to explain my second attempt.
Let's take a look at a sequence of chords, spreaded out almost in a random way, with no VL
(setf chordstovl2 '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8)
Let's specify and evaluate a variable for the number of voices used:
(setf voices 3)
Let's try to think the best way to connect this pitches with minimal movement. I will apply the following expression to ensure a better and less ambiguous result when applying the CHORD-CLOSEST-PATH function.
Evaluate voices before
(setf voices 3)
Then
(setf chordized
(mclist
(chordize-list
(gen-divide voices
(setf vlfinal
(integer-to-pitch
(modus
(interval-to-pitch
(replace-map '((-11 1) (-10 2) (-9 3) (-8 4) (-7 5) (7 -5) (8 -4) (9 -3)(10 -2)(11 -1))
(integer-to-interval
(modus
(pitch-to-midi
(setf chordmelo
(pitch-melodize chordstovl2))))))
:start (car chordmelo)))))))))
Please note the use of the replace-map function ensuring that no movement will be greater than a tritone away. This means that a movement like "C to G" (7 semitones) will be convertet in a G to C (5 semitones). This ensure a modulo 12 (octave constraint) reduction of all the material and also a constraint in terms of the size of the movements that will not exceed 6 semitones.
Finally, I will apply the CHORD-CLOSEST-PATH function
(chord-closest-path (car chordized) (chordize-list (gen-divide voices vlfinal)))
Hope it help some VL efforts.
Best,
Julio Herrlein