Jump to content
Sign in to follow this  
JulioHerrlein

How to apply different voicings over a chord progression

Recommended Posts

How to apply different voicings over a chord progression

 

Sometimes you have to spread the notes of a chord progression in a very specific way, specially in the case of sectional writing as in the big bands, for example, where specific voicings are used, commonly named as drop2, drop3, etc.

 

All the voicings are based in the initial closed position:

 

- DROP2 is obtained by dropping the 2nd voice an octave below, as shown below:

 

image.png.eb24870710574c7bbf960f45a32c8146.png

 

- DROP3 is obtained by dropping the 3rd voice an octave below, as shown below:

 

image.png.58b40095312bb6d4b20f01ecb4db420c.png

 

There are 24 types of voicings as shown in the image below. The rule is to not exceed the octave between two adjacent voices. 

 

 

VOICING TYPES

 

From Combinatorial Harmony Book, avaiable at:

 

https://www.melbay.com/Products/Default.aspx?bookid=30042BCDEB

 

 

CLOSED, DROP2, DROP3, DROP2+4, DROP2+3 and DOUBLEDROP2+

 

 

image.png.dd7b841b5b556a4f0b05fd585914ec98.png

 

HOW TO IMPLEMENT IN OPUSMODUS

EXAMPLE

 

;;; SOME Seventh CHORDS TO USE 

(setf chords '((a4c4d4f4) (c5eb4f4gs4) (d5f4g4bb4) (cs5e4fs4a4) (e4f4a4c4) (fs4g4b4d4) (d4eb4g4bb3) (eb4e4gs4b3) (e4g4a4c4) (a4c5d5f4) (f4gs4bb4cs4) (d4f4g4bb3) (fs5g4b4d5) (b5c5e5g5) (a5bb4d5f5) (gs4a3cs4e4) (b4d4e4g4) (d5f4g4bb4) (e5g4a4c5) (eb5fs4gs4b4) (e4f4a4c4) (fs4g4b4d4) (d4eb4g4bb3) (eb4e4gs4b3)))

image.png.3bbcf6de012f2328b76fca17958126d9.png

Setting the Voicing Types:

 

csd (Closed Position)

dp2 (Drop 2)

dp2 (Drop 3)

dp2-4 (Drop 2+4)

dp2-3 (Drop 2+3)

ddp2-3 (Double Drop 2 + Drop 3)

 

(setf 
csd '(0 0 0 0)
dp2 '(0 -12 0 0)
dp3 '(0 0 -12 0)
dp2-4 '(0 -12 0 -12)
dp2-3 '(0 -12 -12 0)
ddp2-3 '(0 -24 -12 0))

Drop order to apply over the sequence

 

;;;DROP ORDER

(setf droplist (flatten 
(list csd dp2 csd dp2-4)))

Command to make the voicings over the original chord progression

;;;ABERTURAS

(chordize-list (pitch-transpose-n droplist (pitch-melodize chords)))

RESULT

Not the expected  result!!!!  See the next correction!!! 

image.png.32497d78944a75fb26c0953feba00fc5.png

 

All the best !

Julio Herrlein

 

An important correction:

 

In order to produce the right voicings is it necessary to sort the notes before transposing, so

the Command to make the voicings over the original chord progression is like this:

 

VOICINGS

(setf chordprogdrop (chordize-list
             (pitch-transpose-n 
              droplist
              (sort-desc (pitch-melodize chordtrp-rpt)))))

Now, the right result for the voicing order

 

csd dp2 csd dp2-4

 

image.png.daa4901edaeffff1c4443f69c5a791f7.png

 

Share this post


Link to post
Share on other sites

I think you can use gen-chord3.

 

also i have finished the function you asked in another post about a different version of add-interval-if-length.

 

This one is make-chord-if-length and is based on gen-chord3.

 

i'll post it here for convenience but will also post it in programming forums section.

 


;;; ==============================================
;;; UTILITY FUNCTIONS
;;;
(defun make-chord-if-length-aux (omn &key (test #'>) (length-val 1/8) (interval-list '((4 7)(7 12))) (cycle t)(relative nil) seed)
(setf seed (rnd-seed seed))
  (let ((s-events (single-events omn)))
    (loop 
      for e in s-events
      for i in (gen-trim (length s-events) interval-list)
      when (funcall test (omn-encode (first e)) length-val)
      append (omn-replace :pitch (gen-chord3  (list (second e))   i :cycle cycle :relative relative :seed (seed)) e )
      else append e)))

;(make-chord-if-length-aux '(q c4 d4 e4 f4 e g4 a4))
;(make-chord-if-length-aux '(q c4 d4 e4 f4 e g4 a4) :interval-list '((4 7)(3 10)))
;(make-chord-if-length-aux '(q c4 d4 e4 f4 e g4 a4) :interval-list '((4 7 11 14)(7 9 16)) :cycle nil)
;(make-chord-if-length-aux '(q c4 d4 e4 f4 e g4 a4) :interval-list '((4 7 11 14)(7 9 16)) :cycle nil :seed 4)
;(make-chord-if-length-aux '(q c4 d4 e4 f4 e g4 a4) :interval-list '((4 7 11 14)(7 9 16)) :cycle nil :relative t)
;(make-chord-if-length-aux '(q c4 d4 e4 f4 e g4 a4) :interval-list '((4 7 11 14)(7 9 16)) :cycle nil :relative t :seed 4)

;;; =============================
;;; MAIN FUNCTION   
(defun make-chord-if-length (omn &key (test #'>) (length-val 1/8) (interval-list '((4 7)(7 12)))(cycle nil)(relative nil) seed)
  (setf seed (rnd-seed seed))
  (do-verbose ("make-chord-if-length :seed ~s :length-val ~s :interval-list ~s :cycle ~s  :relative ~s" seed length-val interval-list cycle relative)
    (let ((test-fn (case test
                     (> #'>)
                     (< #'<)
                     (= #'=)
                     (otherwise test))))
      (if (listp (car omn))
        (mapcar #'(lambda (x) 
                    (make-chord-if-length-aux x :test test-fn :length-val (omn-encode length-val) :interval-list interval-list
                                              :cycle cycle :relative relative :seed (seed))) 
                omn)
        (make-chord-if-length-aux omn :test test-fn :length-val (omn-encode length-val) :interval-list interval-list 
                                  :cycle cycle :relative relative :seed (seed))))))

;;; Tests
;(make-chord-if-length '((q c4 e d4 e4 f4 h d4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)))
;(make-chord-if-length '((q c4 e d4 e4 f4 h d4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)) :seed 8)
;(make-chord-if-length '((q c4 e d4 e4 f4 h d4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)) :interval-list '((2 9)(7 11)))
;(make-chord-if-length '((q c4 d4 e4 f4 g4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)) :cycle t)
;(make-chord-if-length '((q c4 e d4 e4 f4 h d4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)) :cycle nil :relative t)
;(make-chord-if-length '((q c4 e d4 e4 f4 h d4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)) :cycle nil :relative t :seed 8)
  

SB.

Share this post


Link to post
Share on other sites

Thanks a lot, Stephane. I'm going to try your function soon.

 

The idea here is more about transforming a set of chords, instead of generating the chords.

More about controlling the exact spacing of the voicings in a  given progression.

 

I'm getting some trouble with gen-chord3.

When evaluating this:

(gen-chord3 '(c4 eb4 g4) '((3 3 3 3) (3 5 7 9) (2 5 7 11)))

I'm getting different results each time

First Time:

image.png.a2f31949eeb2843e6e521d1921d79102.png

Second time:

image.png.0b818e95050a7ec604a659b299934f45.png

Others:

image.png.f35186c4b912382e62a26b875c8b6928.png

image.png.64c5f89d07041f3b227701b7c19a597f.png

And so on... Is there some random algorithym in this function ?

When evaluating this:

(make-chord-if-length '((q c4 e d4 e4 f4 h d4)(s a4 b4 a4 g4 h f4)(q c4 d4 h e4)))

I'm getting different results each time?

Is this correct ?

 

1st time eval:

 

image.png.4f441eb012664c753d10c5d771f380a5.png

2nd time eval:

 

image.png.9d19667a57003f392c579b3b19ae3536.png

3rd eval...

image.png.e3fb736f37f1525b4f5f8dafecc21737.png

Best,

Julio

Share this post


Link to post
Share on other sites

From the Listener:

? gen-chord3, chord-intervals: ((3 3 3 3) (3 5 7 9) (2 5 7 11)) cycle: nil relative: nil ambitus: piano seed: 254965

 

Since the function have a seed you should get different chords unless you set the seed value.

48 minutes ago, JulioHerrlein said:

(gen-chord3 '(c4 eb4 g4) '((3 3 3 3) (3 5 7 9) (2 5 7 11)))

 

(gen-chord3 '(c4 eb4 g4) '((3 3 3 3) (3 5 7 9) (2 5 7 11)) :seed 42)

Gives you the same chords all the time.

Share this post


Link to post
Share on other sites
Just now, lviklund said:

From the Listener:

? gen-chord3, chord-intervals: ((3 3 3 3) (3 5 7 9) (2 5 7 11)) cycle: nil relative: nil ambitus: piano seed: 254965

 

Since the function have a seed you should get different chords unless you set the seed value.

 

(gen-chord3 '(c4 eb4 g4) '((3 3 3 3) (3 5 7 9) (2 5 7 11)) :seed 42)

Gives you the same chords all the time.

Thank you !! Best ! Julio

Share this post


Link to post
Share on other sites

An important correction:

 

In order to produce the right voicings is it necessary to sort the notes before transposing, so

the Command to make the voicings over the original chord progression is like this:

 

VOICINGS

(setf chordprogdrop (chordize-list
             (pitch-transpose-n 
              droplist
              (sort-desc (pitch-melodize chordtrp-rpt)))))

 

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  

×