November 17, 2025Nov 17 Followup on post: https://opusmodus.com/forums/topic/3989-om-lydian-chromatic-concept-of-tonal-organization-george-russell/According to LCCOTO chords which are derived from a parent scale have a nice property as they all lean on the same lydian parent-scale- tonic, hence may feel similar in harmonic environment.This may be used for various compositional purposes.Example:A G7 -> Cmaj7 cadence is in LCCOTO basically a movement of F-lydian-parent-scale-tonic to C-lydian-parent-scale-tonic.Moving clockwise on circle of fifths with regards to parent scales tonic.G7 is a chord on mode 2 in f-lydian.Cmaj7 is chord on mode 1 in c-lydian.According to LCCOTO it should be possible to exchange G7by various other chords as long as they are derived from F-lydian parent scale or derived ones, like F-lydian augmented, etc.For that a function I called "find-chord-in-parent-scale" may be useful.New function ;;; --------------------------------------------------------------------------- ;;; ;;; Find chord in a parent scale according to LCCOTO ;;; for a list of chords quality symbols and a list of parent scales ;;; ;;; Conceptual framework: ;;; Lydian Chromatic Concept of Tonal Organization, LCCOTO ;;; by George Russell, 1953, Concept Publishing Company) ;;; ;;; This function helps to get all possible chords in a parent scale ;;; given their quality, i.e. maj, m7, sus2, 7, etc. ;;; Parameter "quality" must be a list with elemens which comply to OMs ;;; definition of chord-symbols (see docu chord-symbols.pdf). ;;; ;;; The parameters scale and quality are lists. ;;; The return value is a nested list. ;;; ;;; Version 1, 2025-11-17 ;;; Author: Cliff Scherer ;;; ;;; ;;; v1: initial version ;;; ;;; --------------------------------------------------------------------------- (defun find-chord-in-parent-scale (scale quality) "Find chords in a list of parent scales and a list of chord qualities" ;; Main function for one scale (defun find-chord-in-parent-scale-one-scale (scale quality) ;; Main function for one chord quality (defun find-chord-in-parent-scale-one-chord (scale quality) "Find chords in one parent scale for one chord quaity" ;; We use the lydian parent-scale with lydian tonic c (setf parent-scale (flatten scale)) (setf parent-scale-pcs (get-pcs (expand-tonality parent-scale))) ;; Next we define a chord symbol (setf chord-symbol quality) ;; Prepare all possible chords for symbol and pcs of scale (setf chord-symbol-candidates (cartesian (list (integer-to-pitch parent-scale-pcs) chord-symbol))) ;; Get their PC (setf chord-pc-candidates (get-pcs (expand-chord chord-symbol-candidates))) ;; Test for intersection (setf test-intersect-pc (mapcar (lambda (x) (intersection x parent-scale-pcs)) chord-pc-candidates)) ;; Test for full intersection (setf chord-size (length (first chord-pc-candidates))) (setf test-intersect-pc-complete (mapcar (lambda (x) (equal (length x) chord-size)) test-intersect-pc)) ;; Return chord symbols (setf result (remove nil (loop for test in test-intersect-pc-complete for chord in chord-symbol-candidates collect (if test chord nil)))) result ) (mapcar (lambda (x) (find-chord-in-parent-scale-one-chord scale x)) quality) ) (mapcar (lambda (x) (find-chord-in-parent-scale-one-scale x quality)) scale) ) ;; Tests --- ;; (find-chord-in-parent-scale '((c lydian)) '((maj))) ;; ((((c4 maj) (d4 maj) (g4 maj)))) ;; Use of the nested list result may require use of (multiple) flatten-sublist calls (expand-chord (flatten-sublist (find-chord-in-parent-scale '((c lydian)) '((maj))))) ;; ((c4e4g4 d4fs4a4 g4b4d5)) (find-chord-in-parent-scale '((c lydian)) '((maj)(m7))) ;; ( ;; ( -> for scale ;; ((c4 maj) (d4 maj) (g4 maj)) -> for first quality ;; ((e4 m7) (a4 m7) (b4 m7)) -> for second quality ;; ) ;; ) ;; Use (expand-chord (flatten-sublist (find-chord-in-parent-scale '((c lydian)) '((maj)(m7))))) ;; ((c4e4g4 d4fs4a4 g4b4d5) (e4g4b4d5 a4c5e5g5 b4d5fs5a5)) (find-chord-in-parent-scale '((f lydian)(c lydian)) '((maj)(m7))) ;; ( ;; ( -> for first scale ;; ((f4 maj) (g4 maj) (c4 maj)) -> for first quality ;; ((a4 m7) (d4 m7) (e4 m7)) -> for second quality ;; ) ;; ( -> for second scale ;; ((c4 maj) (d4 maj) (g4 maj)) -> for first quality ;; ((e4 m7) (a4 m7) (b4 m7)) -> for second quality ;; ) ;; ) ;; Experiments to exchange G7 in V7->Cmaj7 --- ;; First the original - (assemble-seq (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian)) '((7))))) '(c4 maj7)) ;; ((g4 7) (c4 maj7)) ;; Try m7 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian)) '((m7)))))) '(c4 maj7)) ;; ((a4 m7) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian)) '((m7)))))) '(c4 maj7)) ;; ((d4 m7) (c4 maj7)) (assemble-seq (third (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian)) '((m7)))))) '(c4 maj7)) ;; ((e4 m7) (c4 maj7)) ;; Try maj7 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian)) '((maj7)))))) '(c4 maj7)) ;; ((f4 maj7) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian)) '((maj7)))))) '(c4 maj7)) ;; ((c4 maj7) (c4 maj7)) :-) ;; Try dim7 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian-diminished)) '((dim7)))))) '(c4 maj7)) ;; ((f4 dim7) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f lydian-diminished)) '((dim7)))))) '(c4 maj7)) ;; ((gs4 dim7) (c4 maj7)) ;; Try 7/b5 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((g4 7/b5) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((bb4 7/b5) (c4 maj7)) (assemble-seq (third (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((cs4 7/b5) (c4 maj7)) (assemble-seq (fourth (flatten-sublist (flatten-sublist (find-chord-in-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((e4 7/b5) (c4 maj7)) ;; Stay inside similar parent scales with same tonic but vary the chord quality --- ;; See chord pregression below (assemble-seq (find-chord-in-parent-scale '((f lydian)) '((maj7)(7/sus4))) (find-chord-in-parent-scale '((f lydian-augmented)) '((maj7)(aug)(m7))) (find-chord-in-parent-scale '((f lydian-diminished)) '((dim7)(aug)(m7))) (find-chord-in-parent-scale '((f lydian-b7)) '((m7)(7)(7/b5))))LCC3.mp3
November 17, 2025Nov 17 Author The concept of movement on circle of fifths clockwise with regards to parent scale tonic is explained here:Also the idea to substitute G7 by another chord from it's F-lydian parent scale.
November 17, 2025Nov 17 Author New version v2:rename to "find-chord-for-parent-scale" to match the counterpart function "find-parent-scale-for-chord" ;;; --------------------------------------------------------------------------- ;;; ;;; Find chord in a parent scale according to LCCOTO ;;; for a list of chords quality symbols and a list of parent scales ;;; ;;; Conceptual framework: ;;; Lydian Chromatic Concept of Tonal Organization, LCCOTO ;;; by George Russell, 1953, Concept Publishing Company) ;;; ;;; This function helps to get all possible chords in a parent scale ;;; given their quality, i.e. maj, m7, sus2, 7, etc. ;;; Parameter "quality" must be a list with elemens which comply to OMs ;;; definition of chord-symbols (see docu chord-symbols.pdf). ;;; ;;; The parameters scale and quality are lists. ;;; The return value is a nested list. ;;; ;;; Version 2, 2025-11-17 ;;; Author: Cliff Scherer ;;; ;;; v2: ;;; - rename to find-chord-for-parent-scale, to match ;;; the counterpart find-parent-scale-for-chord ;;; ;;; v1: initial version ;;; ;;; --------------------------------------------------------------------------- (defun find-chord-for-parent-scale (scale quality) "Find chords in one parent scale and a list of chord qualities" ;; Main function for one scale (defun find-chord-in-parent-scale-one-scale (scale quality) ;; Main function for one chord quality (defun find-chord-in-parent-scale-one-chord (scale quality) "Find chords in one parent scale for one chord quaity" ;; We use the lydian parent-scale with lydian tonic c (setf parent-scale (flatten scale)) (setf parent-scale-pcs (get-pcs (expand-tonality parent-scale))) ;; Next we define a chord symbol (setf chord-symbol quality) ;; Prepare all possible chords for symbol and pcs of scale (setf chord-symbol-candidates (cartesian (list (integer-to-pitch parent-scale-pcs) chord-symbol))) ;; Get their PC (setf chord-pc-candidates (get-pcs (expand-chord chord-symbol-candidates))) ;; Test for intersection (setf test-intersect-pc (mapcar (lambda (x) (intersection x parent-scale-pcs)) chord-pc-candidates)) ;; Test for full intersection (setf chord-size (length (first chord-pc-candidates))) (setf test-intersect-pc-complete (mapcar (lambda (x) (equal (length x) chord-size)) test-intersect-pc)) ;; Return chord symbols (setf result (remove nil (loop for test in test-intersect-pc-complete for chord in chord-symbol-candidates collect (if test chord nil)))) result ) (mapcar (lambda (x) (find-chord-in-parent-scale-one-chord scale x)) quality) ) (mapcar (lambda (x) (find-chord-in-parent-scale-one-scale x quality)) scale) ) ;; Tests --- ;; (find-chord-for-parent-scale '((c lydian)) '((maj))) ;; ((((c4 maj) (d4 maj) (g4 maj)))) ;; Use of nested lest may require use of (multiple flatten-sublist calls (expand-chord (flatten-sublist (find-chord-for-parent-scale '((c lydian)) '((maj))))) ;; ((c4e4g4 d4fs4a4 g4b4d5)) (find-chord-for-parent-scale '((c lydian)) '((maj)(m7))) ;; ( ;; ( -> for scale ;; ((c4 maj) (d4 maj) (g4 maj)) -> for first quality ;; ((e4 m7) (a4 m7) (b4 m7)) -> for second quality ;; ) ;; ) ;; Use (expand-chord (flatten-sublist (find-chord-for-parent-scale '((c lydian)) '((maj)(m7))))) ;; ((c4e4g4 d4fs4a4 g4b4d5) (e4g4b4d5 a4c5e5g5 b4d5fs5a5)) (find-chord-for-parent-scale '((f lydian)(c lydian)) '((maj)(m7))) ;; ( ;; ( -> for first scale ;; ((f4 maj) (g4 maj) (c4 maj)) -> for first quality ;; ((a4 m7) (d4 m7) (e4 m7)) -> for second quality ;; ) ;; ( -> for second scale ;; ((c4 maj) (d4 maj) (g4 maj)) -> for first quality ;; ((e4 m7) (a4 m7) (b4 m7)) -> for second quality ;; ) ;; ) ;; Experiments to exchange G7 in V7->Cmaj7 --- ;; First the original - (assemble-seq (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian)) '((7))))) '(c4 maj7)) ;; ((g4 7) (c4 maj7)) ;; Try m7 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian)) '((m7)))))) '(c4 maj7)) ;; ((a4 m7) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian)) '((m7)))))) '(c4 maj7)) ;; ((d4 m7) (c4 maj7)) (assemble-seq (third (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian)) '((m7)))))) '(c4 maj7)) ;; ((e4 m7) (c4 maj7)) ;; Try maj7 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian)) '((maj7)))))) '(c4 maj7)) ;; ((f4 maj7) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian)) '((maj7)))))) '(c4 maj7)) ;; ((c4 maj7) (c4 maj7)) :-) ;; Try dim7 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian-diminished)) '((dim7)))))) '(c4 maj7)) ;; ((f4 dim7) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f lydian-diminished)) '((dim7)))))) '(c4 maj7)) ;; ((gs4 dim7) (c4 maj7)) ;; Try 7/b5 - (assemble-seq (first (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((g4 7/b5) (c4 maj7)) (assemble-seq (second (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((bb4 7/b5) (c4 maj7)) (assemble-seq (third (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((cs4 7/b5) (c4 maj7)) (assemble-seq (fourth (flatten-sublist (flatten-sublist (find-chord-for-parent-scale '((f whole-half-tone-scale)) '((7/b5)))))) '(c4 maj7)) ;; ((e4 7/b5) (c4 maj7)) ;; Stay inside same parentscale tonic but vary the chord quality --- ;; See chord pregression below (assemble-seq (find-chord-for-parent-scale '((f lydian)) '((maj7)(7/sus4))) (find-chord-for-parent-scale '((f lydian-augmented)) '((maj7)(aug)(m7))) (find-chord-for-parent-scale '((f lydian-diminished)) '((dim7)(aug)(m7))) (find-chord-for-parent-scale '((f lydian-b7)) '((m7)(7)(7/b5))))
Create an account or sign in to comment