Jump to content
Sign in to follow this  
JulioHerrlein

Harmonic Systems - Harmonizing from top notes (melodies)

Recommended Posts

 

In the jazz world, Barry Harris came up with the idea of harmonizing a bebop scale.

Combining a C6 (C, E, G, A) and a Bdim7 (B, D, F, Ab) chords, we have this scale:

 

image.png.33d590fc724833a5a2a9cc8f49911b9f.png

 

From this stantpoint we can alternate tonic and dominant sounds, like this:

 

image.png.51341b46efa89420d525523e7d050f87.png

 

Every pair of chords have all the 8-note set.

The notes C,E, G and A are always harmonized with a C6 chord.

The notes D, F, Ab and B are always harmonized with a Bdim7 chord.

 

So, from the point of view of sets, there is no problem.

 

WHAT IS NEEDED:

 

I want a way to start FROM the melody, and then make a four part block harmonization with this (or any other) harmonic system

 from the melody as an OMN expression.

 

So, I need a way to filter the notes to aply the right chord:

 

FOR EXAMPLE:

 

For the notes C, E, G and A

If the note is an C (in any register), I will apply a chord like image.png.bb73a02934ba0d1706f32ae737c0e352.png, I will add the notes A, G and E, below the melody.

If the note is an  (in any register), I will apply a chord like image.png.82899596d3eb416729d33b27e9b102f7.png, I will add the notes G, E and C, below the melody.

And so on...

For the notes D, F, Ab and B:

 

If the note is an B (in any register), I will apply a chord like image.png.b08248cbaaa4c39e3d28bcd1c7ab5ab1.png, I will add the notes Ab, F and D, below the melody.

And so on:

 

So, to make any procedure:

 

I need first find a way to apply a specific procedure only over the notes I want, over all the C notes, all the B notes, etc.

 

How to filter from an OMN expression ?

 

All the best !

Julio

 

 

 

 

Share this post


Link to post
Share on other sites

In other words:

 

Given and OMN expression, how can I apply one operation (like transposition, for example) to just the C notes, or just the B notes (in any register)?

 

Best

Julio

Share this post


Link to post
Share on other sites

Dear Janusz,

 

The chord generators in the system (as far as I know) are root based systems, i.e., they buid chords stacking notes over a root.

 

When you work a saxophone soli section in a big band arrangement, you use a top to bottom approach, i.e., you start with the melody of a song or an origianl tune (think a Charlie Parker bebop head) and you build an harmonization under it. The melody becomes the top note of a 4-part harmonization. We use some rules to determine wich chord will be used in each case, depending on the melodic function. In the above example, the notes C, E, G and A will be always harmonized with the corresponding close position inversions of the C6 chord while the B, D, F and Ab will be always harmonized with the corresponding close position inversions of the Bdim7 chord.

 

We need a function that will transform a melody to a 4-part harmonization, similar to chord-interval-add function.

For example:

 

(chord-interval-add '(-3 -3)(chord-interval-add '(-4 -3)(chord-interval-add '(-3 -3) '(c5 d5 e5 f5 g5 gs5 a5 b5))))

This will result in a 4-part harmonization, but this is not "note selective", it will apply the same interval series over the entire list of notes.

I need a filter to apply diferent series of intervals over each different note.

For example:

 

Over all the C notes, I want the (-3 -2 -3) as interval add.

Over all the D, F, A and Ab/G# notes, I want (-3 -3 -3)

Over all the E notes, I want the (-4 -3 -2) as interval add.

Over all the G notes, I want the (-3 -4 -3) as interval add.

 

This is the Barry Harris Rule for harmonizing a bebop scale.

 

So I need a chord-interval-add function with note selection (a kind of IF - DO filter): IF  this is an C note (in any register) DO ADD this interval list (-3 -2 -3) from the melody, forming a 4-part C6 chord with melody on top. IF this is a B, D, F or G#/Ab note, ADD this interval list (-3 -3 -3) from the melody, forming a 4-part Bdim7 chord with melody on top.

 

And prefearably, a chord-interval-add function with multiple choice of intervals, but I can workaround this, if not possible, working with variables setf, I think...

 

Is it clear now ?

 

BEst,

Julio

 

Share this post


Link to post
Share on other sites

originally, i've made gen-chord3 with JP for using in this top to bottom approach. 

what  is called root in gen-chord3 parameters was not thinked by me originaly as "root" but more cantus note on with to add other notes (below or not). 

 

S.

But naturally, the gen-chord3 function is not conditionnal, so we have to think about something else but i think you can do that with pattern-match function.

 

S.

or also with def-case.

 

Share this post


Link to post
Share on other sites

Aparently, this works

 

(pattern-map '(((c5 d5 e5) (e4g4a4c5 f4gs4b4d5 e5c5a4g4)))
             '(c5 d5 e5 fs4) :otherwise 'c4f4bb4eb5)

 

Is there some WILDCARD to mean all C pitch classes?

 

  If no, I will have to program it for all the octaves of the range of the melody.

 

For example  cs$ or cs? meaning all C# in ANY octave.

 

Best,

Julio

Share this post


Link to post
Share on other sites

I found a solution with pattern-match.

 

Pitches for melody

(setf melody '(c5 c5 d5 e5 g5 a5 g5 c6 b5 c6))

 

Block harmonization with pattern-match

(setf blkharm (pattern-map '(((c3) (e2g2a2c3)) ((d3) (f2gs2b2d3))
                             ((e3) (e3c3a2g2)) ((f3) (gs2b2d3f3))
                             ((g3) (g3e3c3a2)) ((gs3) (b2d3f3gs3))
                             ((ab3) (b2d3f3ab3)) ((a3) (c3e3g3a3))
                             ((b3) (d3f3ab3b3)) ((c4) (e3g3a3c4))
                             ((d4) (f3gs3b3d4)) ((e4) (e4c4a3g3))
                             ((f4) (gs3b3d4f4)) ((g4) (g4e4c4a3))
                             ((gs4) (b3d4f4gs4)) ((ab4) (b3d4f4ab4))
                             ((a4) (g4e4c4a4)) ((b4) (d4f4ab4b4))
                             ((c5) (e4g4a4c5)) ((d5) (f4gs4b4d5))
                             ((e5) (e5c5a4g4)) ((f5) (gs4b4d5f5))
                             ((g5) (g5e5c5a4)) ((gs5) (b4d5f5gs5))
                             ((ab5) (b4d5f5ab5)) ((a5) (g5e5c5a5))
                             ((b5) (d5f5ab5b5)) ((c6) (e5g5a5c6))
                             ((d6) (f5gs5b5d6)) ((e6) (e6c6a5g5))
                             ((f6) (gs5b5d6f6)) ((g6) (g6e6c6a5))
                             ((gs6) (b5d6f6gs6)) ((ab6) (b5d6f6ab6))
                             ((a6) (g6e6c6a6)) ((b6) (d6f6ab6b6)))
                            melody :otherwise 'c4f4bb4eb5))

 

OMN with all

(make-omn
 :length '(q e e e e e e q q q)
 :pitch blkharm)

Share this post


Link to post
Share on other sites

You can use pitch-class within pattern-map function:

(pattern-map 
 '(((0 1 9 4 2 5) (0 4 2 1 9 5))
   ((11 8 10 3 7 6) (10 8 11 3 7 6)))
 '((c6 cs4 a4 e3 d6 f4) (b4 gs3 bb4 eb4 g5 fs6))
  :pcs t)
=> ((c6 e4 d4 cs3 a6 f4)
    (bb4 gs3 b4 eb4 g5 fs6))

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Topics

    • By Wim Dijkgraaf
      Is there a more elegant way to do this?
       
      ;; create major scale (defun majorScale (root) (make-scale root 16 :alt '(2 2 1 2 2 2 1))) ;; usage: (majorScale 'c4) ;; 4 part root position harmony of every degree of a major scale (defun harmonizeMajorScale (root) (harmonic-progression '(0 1 2 3 4 5 6 7) (majorScale root) :size 4)) ;; usage: (harmonizeMajorScale 'c4) ;; 4 part drop 2 of every degree of a major scale, with every chord in a specific inversion (defun 4PartDrop2 (chords inversion) (loop for chord in chords collect (chordize (pitch-transpose-n '(0 0 -12 0) (pitch-melodize (list (chord-inversion inversion chord) ) ) ) ) ) ) ;; usage: (4PartDrop2 (harmonizeMajorScale 'c4) 3) Any advice very much appreciated.
       
      Kind regards,
       
      Wim Dijkgraaf
    • By JulioHerrlein
      Dear All,
       
      Stephane did this amazing and clear example (code below) of how to spread an harmonic progression over a predefined texture.
      This can be altered to any harmonic idiom. I did some test, using a chorale texture originated from a 12-tone row and also
       a more jazz-oriented chorale.
       
      THE QUESTION IS (For Stephane Boussuge)
       
      1) How the harmonic rhythm is controlled here? In the example, the chord changes every half note.
      2) How can I make the harmony changes at every quarter note ?
      3) Can I use different rates of harmonic rhythms ?
       
      Best,
      Julio
       
       
      ;;; Classical Accompaniment Exemple ;;;--------------------------------------------------------- ;;; Parameters ;;;--------------------------------------------------------- ;;; Motif definition (setf mtf1 '((s c5 leg g5 leg e6 leg g5 c5 leg g5 leg e6 leg g5))) (setf mtf2 (pitch-transpose 4 mtf1)) (setf mtf3 '((-q e5))) (setf mtf4 '((-q g4c5))) (setf mtf5 '((q c2 -))) ;;; Chords definition (setf chords (library 'harmoprog1 'minor-4vx 'prog1)) ;;; Ostinati (setf ost1 (gen-repeat (length chords) mtf1)) (setf ost2 (gen-repeat (length chords) mtf2)) (setf ost3 (gen-repeat (length chords) mtf3)) (setf ost4 (gen-repeat (length chords) mtf4)) (setf ost5 (gen-repeat (length chords) mtf5)) ;;; Tonality-map series (setf tm-path (tonality-series chords)) ;;; Here we apply the map 'tm-path' into arpegio sequence. (setf ost1.map (tonality-map tm-path ost1)) (setf ost2.map (tonality-map tm-path ost2)) ;;; Here we apply our library chords into chord sequence. ;;; The harmonic-path preserves the voice leading. (setf ost3.map (harmonic-path chords ost3)) (setf ost4.map (harmonic-path chords ost4)) (setf ost5.map (harmonic-path chords ost5)) (setf violin1 (ambitus '(g3 c7) ost2.map)) (setf violin2 (ambitus '(g3 c6) ost1.map)) (setf viola (ambitus '(c3 e4) ost3.map)) (setf violoncello (ambitus-chord 12 (pitch-transpose -12 ost4.map))) (setf bass ost5.map) ;;;--------------------------------------------------------- ;;; Score and Layout ;;;--------------------------------------------------------- (def-score Classical-accomp (:title "Classical accompaniment example" :composer "S.Boussuge" :copyright "Copyright © 2018 s.boussuge" :key-signature 'chromatic :time-signature '((1 1 1 1) 4) :tempo 80 :layout (bracket-group (violin-layout 'violin1 :name "Violin-1") (violin-layout 'violin2 :name "Violin-2") (viola-layout 'viola) (violoncello-layout 'violoncello) (contrabass-layout 'bass) ) ) (violin1 :omn violin1 :channel 1 :sound 'gm :program 'String-Ensemble-1 :volume 100 :pan 48 :controllers (91 '(68)) ) (violin2 :omn violin2 :channel 2 :sound 'gm :program 'String-Ensemble-1 :volume 100 :pan 48 :controllers (91 '(68)) ) (viola :omn viola :channel 3 :sound 'gm :program 'String-Ensemble-1 :volume 90 :pan 64 :controllers (91 '(68)) ) (violoncello :omn violoncello :channel 4 :sound 'gm :program 'String-Ensemble-1 :volume 90 :pan 80 :controllers (91 '(68)) ) (bass :omn bass :channel 5 :sound 'gm :program 'String-Ensemble-1 :volume 90 :pan 80 :controllers (91 '(68)) ) )  
    • By Stephane Boussuge
      Here is an example of generation of harmonic progression with Opusmodus using chords rules defined with a transition table.
      The technique presented here uses the concept of tonal degrees, but it is important to note that as you will see later in this article, this concept can be pushed quite far and quite outside the traditional tonal system.
       
      First, we define some transition rules from degree to degree:
       
      (setf transition       '((1 (4 1) (5 1) (6 2))         (2 (5 2) (4 1))         (3 (4 1))         (4 (5 1) (2 1))         (5 (1 3) (6 2) (4 1))         (6 (4 1))         (7 (1 1) (6 1))))  
      So here is a transition rule saying  a 1st degree will be 2 times more likely to be followed by a sixth degree (1 (6 2)) as a 4th or 5th (1 (4 1) (5 1) ).
      A second degree will be most likely followed by a 5th degree (2 (5 2) than a 4th (2 (4 1))
      We define this way all the transition rules for each degree of the scale.
       
      We now generate a sequence of degrees we call prog based on these rules with the function GEN-MARKOV-FROM-TRANSITIONS (for more information on Markov chains, you can consult:  https://en.wikipedia.org/wiki/Markov_chain ):
       
      (setf prog (gen-markov-from-transitions transition :size 24 :start 1))  
      which can for example give this result:
       
      => (1 5 1 4 2 4 2 4 2 5 6 4 5 1 5 6 4 5 1 5 6 4 2 5)
       
      Because the function that we'll use to generate chords is based on a numbering starting from zero but our degrees generation is based on a numbering starting from 1, we will subtract 1 to each value of our list prog to able to provide our next function a number list starting from zero.
      To do this, we use the MAPCAR Lisp function to apply -1 to each value of the list and we store the result in the variable prog.prep.
       
      (setf prog.prep (mapcar (lambda(x) (- x 1)) prog)) => (0 4 0 3 1 3 1 3 1 4 5 3 4 0 4 5 3 4 0 4 5 3 1 4)
       
      Now we generate chords using the HARMONIC-PROGRESSION function and store the result in the variable named chords:
       
      (setf chords (harmonic-progression prog.prep '(d4 major)))   
      The parameters passed to the function are our degrees List prog.prep and a scale with a root base (here d4).
       
      Here is the output of this function in notation:
       

       
      Of course, we are not limited to Major and Minor scales, we can use any scale or pitch structure available or generated by Opusmodus, here are some examples:
       
      (setf chords (harmonic-progression prog.prep '(d4 messiaen-mode5)))
      (setf chords (harmonic-progression prog.prep '(c4 acoustic-scale)                                     :root '(d4 f4 g4 e4 bb3)))  

       
      (setf chords (harmonic-progression prog.prep '(d4e4fs4gs4as4c5ds5)                                     :root '(d4 f4 g4 e4 bb3)))  
       

       
      A final example using the keyword :relative  enabling a smoother transition between chords with a relative voice leading between chords. 
       
      (setf chords (harmonic-progression prog.prep '(d4e4fs4gs4as4c5ds5)                                     :root '(d4 f4 g4 e4 bb3)                                     :relative t))  
       

       
      Once these chords generated, you can use them as you want in Opusmodus, map them on musical structures with TONALITY-MAP function or use them as basic materials to create reservoirs of pitch or other kind of pitch material.
       
      SB.
×
×
  • Create New...