Jump to content

Tension level according to Hindemith Chord Classification


Recommended Posts

 Is there a function in OM which implements a tension level classification according to Hindemith chord classification method?

 

WWW.UX1.EIU.EDU

 

Example:

Sort the following chords according to their tension class:

 

(chordize (pcs-sub-sets '(2 3 4) (pcs '7-35) :pitch))

 

Link to comment
Share on other sites

Hi,

 

I've made a function long long time ago around this idea not following strictly Hindemith if I remember it correctly but it was based on the same idea/concept.

 

Here's my function, you can probably tweak it to your needs.

 

Please, if you improve it in anyway, share your improvement so it could be useful for me and community as well.

 

Stephane

 

;;;===============================================================
;;; sort chords by tension
;;;===============================================================
;;Idée: classer des accords generés de maniere X par tension avec une courbe de tensions.

;;Analyser un accord 

;;1. extraire un vecteur d'intervalles
;;2. Analyser le vecteur
;;3. retourner le resultat


(defun ana-tens (ivect)
"renvoie le taux de tension harmonique d'un vecteur d'intervalles.
utilitaire pour h-tens"
  (let* 
      ((v1 (*(nth 0 ivect) 6))
       (v2 (*(nth 1 ivect) 4))
       (v3 (*(nth 2 ivect) 3))
       (v4 (*(nth 3 ivect) 2))
       (v5 (*(nth 4 ivect) 1))
       (v6 (*(nth 5 ivect) 5))
       (r (+ v1 v2 v3 v4 v5 v6)))
    r))

(defun h-tens (chord)
  (do-verbose
   ("h-tens")
"renvoie le taux de tension harmonique relatif d'un accord."
  (let* 
      (
       (r0 (if (equal chord '(nil)) '(c4) chord)) ; Si nil, remplace par une valeur simple (c4)
       (r1 (melodize r0))  ;extraction du vecteur d'intervalles
       (r2 (pitch-to-integer r1))
       (r3 (find-unique (modus r2)))
      
		
       (r4 (if (> (length r3) 1)
	       (pcs-prime-form r3 :vector)
	       '(0 0 0 0 0 0)))
       (r5 (ana-tens r4))            ;analyse du vecteur d'intervalles
					;il faut ensuite diviser le resultat obtenu par le nombre de pcs (cardinal-number) du set et on obtient le niveau relatif de tension harmonique.
					; on s'assure d'abord de ne pas avoir un accord à 1 seul accord
       (r6 (float (/ r5 (length r1)) 1.0)))
    r6 ;retourne le resultat
)))
;;;creation d'une fonction qui prend en entrée une suite d'accords et qui renvoie cette suite triée 
;;;par ordre de tension harmonique croissant ou decroissant.
(defun extraitcar (lst)
  (loop for i in lst
        collect (car i)))

(defun extraitcdr (lst)
  (loop for i in lst
        collect (cdr i)))

(defun sort-chords-tens-up (chords)
"ordonne une suite d'accords par ordre croissant de tension harmonique"
  (do-verbose
   ("sort-chords-tens-up")
  (let* ((tens (mapcar 'h-tens  chords))
         (a-list (pairlis chords tens))
         (sorted (stable-sort a-list #'< :key #'cdr))
         (chordprog (extraitcar sorted)))
    chordprog)))

(defun sort-chords-tens-down (chords)
"ordonne une suite d'accords par ordre decroissant de tension harmonique"
  (do-verbose
   ("sort-chords-tens-down")
  (let* ((tens (mapcar 'h-tens chords))
         (a-list (pairlis chords tens))
         (sorted (stable-sort a-list #'> :key #'cdr))
         (chordprog (extraitcar sorted)))
    chordprog)))

#|
;;;Usage 

;;we generate some chords
(setf chords (chordize (gen-loop 12 (rnd-unique 4 (integer-to-pitch (gen-integer 12))))))

;;we sort chords by up tension
(setf chords-up (flatten (sort-chords-tens-up chords)))
;;we sort chords by down tension
(setf chords-down (flatten (sort-chords-tens-down chords)))
|#



;;;====================================================================================

 

Link to comment
Share on other sites

On 2/5/2024 at 11:28 AM, jesele said:

I also made one for Symbolic Composer some 25 years ago. If I can find it, I might try to translate it to OM.

Might take a while since I'm fully into a jazz-voicings function at the moment.

 

 

Jesper

Dear Jesper,

Did you checked the drop-voicing function. You can get all the drop voicings from there. Really cool function !

Best !

Link to comment
Share on other sites

Hi Julio. Yes, I know about the drop-voicings thanks. My function is a completely new library of 4-part and 5-part voicings that voice from the melody

down. 

 

 

Example from this melody:

(setf mt-omn (-h -e bb4 mf c5 f5 d5 bb4 c5 f5 h d5 tie e e bb4 c5 f5 d5 bb4 fs4 f4 tie q e fs4 he f4 tie h -e bb4 c5 f5 d5 bb4 c5 f5 h d5 -e a4 bb4 c5 d5 eb5 f5 fs5 tie q. e eb5 - b4 - gs4 h fs4 -e eb5 bb4 cs5 tie q e fs4 he tie h -e bb4 b4 cs5 tie q e fs4 he -e e5 d5 cs5 - b4 - cs5 tie q e fs4 he tie h -e bb4 b4 cs5 tie q e fs4 bb4 - b4 cs5 d5 tie q e g4 f4 fs4 cs5 - c5 tie w tie h -e f4 gs4 c5 tie q e cs5 he c5 tie h q bb4 e gs4 g4 tie w -e s bb4 gs4 e g4 gs4 c5 eb5 f5 g5 tie w tie h -e f5 - eb5 tie q e gs4 he eb5 -q e gs4 eb5 - gs5 - eb5 tie q e gs4 he eb5 -e cs5 eb5 e5 q eb5 e cs5 eb5 tie q e gs4 he eb5 -q e gs4 eb5 - gs5 - eb5 tie q e gs4 eb5 - e5 fs5 g5 - eb5 eb5 gs4 b4 fs5 d5 f5 tie w))

 

and these chord-symbols:

 

(setf mt-types
      ("Bb13" "Ebmaj13" "Gs13" "Ebmaj13" "Csm11" "Fs13" "Bmaj11" "E13" "Bmaj11" "Bm11" "E13#11" "Cm11" "F7alt" "Bbm11" "Fs13#11" "G7alt" "Gsmaj11" "Bb13" "Eb13sus4" "Fs13sus4" "Eb13sus4" "Fs13sus4" "Fm11" "Bb7alt" "Ebmaj11")) 

 

and how long each chord lasts

(setf mt-div (list 1 2 2 2 1 1 2 2 2 1/2 1/2 1/2 1/2 2 3/2 1/2 2 2 2 2 2 1 1/2 1/2 1))

 

And the function looks like this for the trumpet part.

 

(setf mt-trp (jazz-voicings4 mt-omn mt-div mt-types 18 nil mt-tonalities :div-type :length :test-type 5 :mtt-ambitus '(f3 f6) 
                               :add-root nil :5-partp nil :typelist '(1 2 3 4) :follow 'i :roots-only nil :tonality-use :passing-tones
                                         :out-ambitus '(c2 f7) :drop nil :drop-change :note :rhythm nil :measures '(4/4) :num-tries 3 :roots-only nil
                                         :chords-inside-lengths '(1/16 4) :chords-inside-ambitus '(c3 e6) :printp t :approach-interval -5
                                         :anticipation t :anticipation-max 1/8 :root-offset 0 :root-type nil :allow-group-switch nil))

 

Still have a lot of work to do though. Getting complicated with passing-tones, anticipation and approach notes etc…

The hardest part is to document everything and finding good names for the arguments.

 

Jesper

 

WWW.DROPBOX.COM

Shared with Dropbox

  

The tonalities are optional. You can supply a list like this

(setf mt-tonalities '(mixolydian ionian mixolydian ionian dorian mixolydian ionian mixolydian ionian dorian altered-dominant dorian 
                                 altered-dominant dorian altered-dominant altered-dominant ionian mixolydian 
                                 mixolydian mixolydian mixolydian mixolydian dorian altered-dominant ionian))

 

Otherwise will automatically pick tonalities from the chord-symbols with 3 different presets. One with tonalities without avoid-notes, one with "regular" tonalities

and one depending on the available top notes in each chord family. Altered-dominant for instance have voicings for all notes except F and B in the key of C

(c4 cs4 d4 ds4 e4 fs4 g4 gs4 a4 as4)

  

Link to comment
Share on other sites

Another short example:

 

;; Giant steps
(setf gs-mel (length-diminution 2 '(h fs5 d5 b4 q. g4 9/8 bb4 h b4 a4 d5 bb4 g4 q. eb4 9/8 fs4 h g4 q. f4 9/8 bb4 h b4 q. a4 9/8 d5
                 h ds5 q. cs5 9/8 fs5 h g5 q. f5 9/8 bb5 q. fs5 e fs5 -h)))

(setf gs-types '("Bmaj9" "D13" "Gmaj9" "Bb13" "Ebmaj9" "Am11" "D13" "Gmaj9" "Bb13" "Ebmaj9" "Gs13" "Bmaj9" "Fm11" "Bb13" "Ebmaj9" "Am11" "D13" "Gmaj9" 
                 "Csm11" "Fs13" "Bmaj9" "Fm11" "Bb13" "Ebmaj9" "Csm11" "Fs13"))
 

;; with max tension level 18

(setf gs-chords2 (jazz-voicings4 gs-mel nil gs-types 18 nil nil :tonality-use nil :div-type :length :add-root '(t) :printp t :drop 2 
                                :rhythm nil :measures '(4/4) :test-type 4))

 

 

((q b3eb4gs4bb4cs5fs5 mf d3c4e4g4b4d5 g2a3cs4e4fs4b4 e. bb2eb3gs3c4d4g4 s eb3g3c4d4f4bb4 tie) (h eb3g3c4d4f4bb4 mf q a2g3c4d4fs4b4 d3g3c4e4fs4a4) (q g3b3e4fs4a4d5 mf bb2gs3c4eb4g4bb4 eb2f3a3c4d4g4 e. gs2cs3fs3bb3c4eb4 s b2eb3gs3bb3cs4fs4 tie) (h b2eb3gs3bb3cs4fs4 mf q f2eb3gs3bb3d4g4 e. bb2eb3gs3c4d4f4 s eb3g3c4d4f4bb4 tie) (h eb3g3c4d4f4bb4 mf q a2g3c4d4fs4b4 e. d3g3c4e4fs4a4 s g3b3e4fs4a4d5 tie) (h g3b3e4fs4a4d5 mf q cs3b3e4fs4bb4eb5 e. fs3b3e4gs4bb4cs5 s b3eb4gs4bb4cs5fs5 tie) (h b3eb4gs4bb4cs5fs5 mf q f3eb4gs4bb4d5g5 e. bb3eb4gs4c5d5f5 s eb4g4c5d5f5bb5 tie) (h eb4g4c5d5f5bb5 mf e. cs4e4bb4b4eb5fs5 s fs3e4gs4b4eb5fs5 -q))

Link to comment
Share on other sites

Was missing the last chord:

 

((q b3eb4gs4bb4cs5fs5 mf d3c4e4g4b4d5 g2a3cs4e4fs4b4 e. bb2eb3gs3c4d4g4 s eb3g3c4d4f4bb4 tie) (h eb3g3c4d4f4bb4 mf q a2g3c4d4fs4b4 d3g3c4e4fs4a4) (q g3b3e4fs4a4d5 mf bb2gs3c4eb4g4bb4 eb2f3a3c4d4g4 e. gs2cs3fs3bb3c4eb4 s b2eb3gs3bb3cs4fs4 tie) (h b2eb3gs3bb3cs4fs4 mf q f2eb3gs3bb3d4g4 e. bb2eb3gs3c4d4f4 s eb3g3c4d4f4bb4 tie) (h eb3g3c4d4f4bb4 mf q a2g3c4d4fs4b4 e. d3g3c4e4fs4a4 s g3b3e4fs4a4d5 tie) (h g3b3e4fs4a4d5 mf q cs3b3e4fs4bb4eb5 e. fs3b3e4gs4bb4cs5 s b3eb4gs4bb4cs5fs5 tie) (h b3eb4gs4bb4cs5fs5 mf q f3eb4gs4bb4d5g5 e. bb3eb4gs4c5d5f5 s eb4g4c5d5f5bb5 tie) (h eb4g4c5d5f5bb5 mf e. cs4e4bb4b4eb5fs5 s fs3e4gs4b4eb5fs5 -q))

 

This is what the optional print argument shows:

 

major:Bmaj13                      Root: B4  - Topnote: FS5 - Tension: 3  - Test-type: 4 - First try.
unaltered-dominant:D13sus4        Root: D4  - Topnote: D5  - Tension: 4  - Test-type: 4 - First try.
major:Gmaj13#11                   Root: G4  - Topnote: B4  - Tension: 13 - Test-type: 4 - First try.
unaltered-dominant:Bb13add11      Root: BB4 - Topnote: G4  - Tension: 5  - Test-type: 4 - First try.
major:Ebmaj13                     Root: EB4 - Topnote: BB4 - Tension: 3  - Test-type: 4 - First try.
dorian-minor:Am13                 Root: A4  - Topnote: B4  - Tension: 9  - Test-type: 4 - First try.
unaltered-dominant:D13add11       Root: D4  - Topnote: A4  - Tension: 5  - Test-type: 4 - First try.
major:Gmaj13                      Root: G4  - Topnote: D5  - Tension: 3  - Test-type: 4 - First try.
unaltered-dominant:Bb13sus4       Root: BB4 - Topnote: BB4 - Tension: 4  - Test-type: 4 - First try.
major:Ebmaj13#11                  Root: EB4 - Topnote: G4  - Tension: 13 - Test-type: 4 - First try.
unaltered-dominant:Gs13add11      Root: GS4 - Topnote: EB4 - Tension: 5  - Test-type: 4 - First try.
major:Bmaj13                      Root: B4  - Topnote: FS4 - Tension: 3  - Test-type: 4 - First try.
dorian-minor:Fm13                 Root: F4  - Topnote: G4  - Tension: 9  - Test-type: 4 - First try.
unaltered-dominant:Bb13add11      Root: BB4 - Topnote: F4  - Tension: 5  - Test-type: 4 - First try.
major:Ebmaj13                     Root: EB4 - Topnote: BB4 - Tension: 3  - Test-type: 4 - First try.
dorian-minor:Am13                 Root: A4  - Topnote: B4  - Tension: 9  - Test-type: 4 - First try.
unaltered-dominant:D13add11       Root: D4  - Topnote: A4  - Tension: 5  - Test-type: 4 - First try.
major:Gmaj13                      Root: G4  - Topnote: D5  - Tension: 3  - Test-type: 4 - First try.
dorian-minor:Csm13                Root: CS4 - Topnote: EB5 - Tension: 9  - Test-type: 4 - First try.
unaltered-dominant:Fs13add11      Root: FS4 - Topnote: CS5 - Tension: 5  - Test-type: 4 - First try.
major:Bmaj13                      Root: B4  - Topnote: FS5 - Tension: 3  - Test-type: 4 - First try.
dorian-minor:Fm13                 Root: F4  - Topnote: G5  - Tension: 9  - Test-type: 4 - First try.
unaltered-dominant:Bb13add11      Root: BB4 - Topnote: F5  - Tension: 5  - Test-type: 4 - First try.
major:Ebmaj13                     Root: EB4 - Topnote: BB5 - Tension: 3  - Test-type: 4 - First try.
dorian-minor:Csm13                Root: CS4 - Topnote: FS5 - Tension: 9  - Test-type: 4 - First try.
unaltered-dominant:Fs13sus4       Root: FS4 - Topnote: FS5 - Tension: 4  - Test-type: 4 - First try.

Link to comment
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.

×
×
  • Create New...

Important Information

Terms of Use Privacy Policy