Jump to content
Sign in to follow this  
JulioHerrlein

Parsimonious Voice Leading (again): attempts to provide an algorithm

Recommended Posts

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)


 

 

image.png.8119f04f427a5e28d603c4233d984bae.png

 

;lLet'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)))))))))

 

 

image.png.c384ecee7241c0568051027a02991388.png

;;; 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)))

 

image.png.858c83b30f9103f794875010d9737692.png

 

Hope it help some VL efforts.

 

Best,

Julio Herrlein

 

 

Share this post


Link to post
Share on other sites

Janusz suggested a different way for the expression:

 

(setf voices 3)
(setf chordstovl2 '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8))
(setf chordmelo (pitch-melodize chordstovl2))
(setf intervals (integer-to-interval (modus (pitch-to-midi chordmelo))))
(setf map (replace-map '((-11 1) (-10 2) (-9 3) (-8 4) (-7 5)
                         (7 -5) (8 -4) (9 -3) (10 -2) (11 -1))
                       intervals))
(setf vlfinal (integer-to-pitch
               (modus
                (interval-to-pitch map :start (car chordmelo)))))
(setf chordized (mclist (chordize-list (gen-divide voices vlfinal))))
(chord-closest-path (car chordized) chordized)

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×