Skip to content
View in the app

A better way to browse. Learn more.

Opusmodus

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Take #3: Lydian Chromatic Concept of Tonal Organization - George Russell

Featured Replies

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 G7

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

Bildschirmfoto 2025-11-17 um 11.12.07.png

  • 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.

  • 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


Copyright © 2014-2026 Opusmodus™ Ltd. All rights reserved.
Product features, specifications, system requirements and availability are subject to change without notice.
Opusmodus, the Opusmodus logo, and other Opusmodus trademarks are either registered trademarks or trademarks of Opusmodus Ltd.
All other trademarks contained herein are the property of their respective owners.

Powered by Invision Community

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.