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 #4 - LCCOTO - 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/

Here's another 16bars short attempt to play with different level of in- and outgoing melodies according to LCCOTO..

Code for the function find-chord-for-parent-scale is this post.

Would be great to have a scale like lydian-chromatic (c1 g1 d2 a2 e3 b3 fs4 gs4 eb5 bb5 f6 cs7) properly built into OM (respecting the order of pitches, which is important for LCCOTO).

Maybe with a reference to Russell as this seems to be a tradition in OM (Modes.opmo).

The OM built-in scale chromatic-lydian with similar name seems to be 7-pitch scale (c4 cs4 e4 f4 fs4 a4 b4).


(setf seed (rnd-pick (gen-integer-seq '((1 100000)))))
(init-seed seed)


;;; Idea --------------
;;;
;;; Cliff Scherer, 2025
;;;
;;; Melodic pitch material from two parent scales with different levels of ingoing/outgoing
;;; Chords symbol material in one scale
;;; Bass pitch for chords
;;; All materials are organized in lists aligned to the same size
;;; Later we may pick list elements using one random master index
;;;


;;; Scales

;; Define LCCOTO scale ---

(setf lydian-chromatic-scale (make-scale 'c1 12 :alt '(7 7 7 7 7 7 2 7 7 7 8)))
(create-tonality lydian-chromatic 'lydian-chromatic-scale)

;; Set 2 parent scale tonics ---

(setf 
 c-lydian-chromatic-scale (expand-tonality '(c lydian-chromatic))
 eb-lydian-chromatic-scale (expand-tonality '(eb lydian-chromatic)))



;;; Melody

;; Melody pitch material with different consonance/dissonance 

(setf 
 c-lydian-chromatic-1 (ambitus '(c4 c5) (gen-surround c-lydian-chromatic-scale :start 0 :size 5))
 eb-lydian-chromatic-1 (ambitus '(eb4 eb6) (gen-surround eb-lydian-chromatic-scale :start 0 :size 5))
 c-lydian-chromatic-2 (ambitus '(c4 c6) (gen-surround c-lydian-chromatic-scale :start 0 :size 7))
 eb-lydian-chromatic-2 (ambitus '(eb4 eb6) (gen-surround eb-lydian-chromatic-scale :start 0 :size 6))
 c-lydian-chromatic-3 (ambitus '(c5 c6) (gen-surround c-lydian-chromatic-scale :start 2 :size 8))
 eb-lydian-chromatic-3 (ambitus '(c5 c6) (gen-surround eb-lydian-chromatic-scale :start 2 :size 5)))

(setf
 melo-mat-size 2
 melo-mat-pitch-1 (rnd-sample melo-mat-size (combination 4 c-lydian-chromatic-1))
 melo-mat-pitch-2 (rnd-sample melo-mat-size (combination 4 c-lydian-chromatic-2))
 melo-mat-pitch-3 (rnd-sample melo-mat-size (combination 4 c-lydian-chromatic-3))
 melo-mat-pitch-4 (rnd-sample melo-mat-size (combination 4 eb-lydian-chromatic-1))
 melo-mat-pitch-5 (rnd-sample melo-mat-size (combination 4 eb-lydian-chromatic-2))
 melo-mat-pitch-6 (rnd-sample melo-mat-size (combination 4 eb-lydian-chromatic-3))
 ;; main result
 melo-mat-pitch (flatten-sublist (list melo-mat-pitch-1 melo-mat-pitch-1 
                                       melo-mat-pitch-2 melo-mat-pitch-2 
                                       melo-mat-pitch-3
                                       melo-mat-pitch-4 melo-mat-pitch-4
                                       melo-mat-pitch-5  
                                       melo-mat-pitch-6))
)

;; Voice-variant material for melody
(setf 
 melo-voice-variant-variant '(a d ad d)
 melo-voice-variant-tuplet '(1 1 1 1))

;; Melody velocity material
(setf melo-mat-velocity '((0.1)(0.2)(0.3)(0.4)(0.45)))

;; Melody initial length material
(setf melo-mat-length-cell-1 (pcs-rhythm '7-35 :rotate '(10) :legato t))
(setf melo-mat-length-cell-2 (pcs-rhythm '7-35 :rotate '(11) :legato t))

(setf melo-mat-length (list (fit-to-span '4/4 melo-mat-length-cell-1)
                            (fit-to-span '4/4 (length-augmentation 2 melo-mat-length-cell-1))
                            (fit-to-span '4/4 (length-augmentation 4 melo-mat-length-cell-1))
                            (fit-to-span '4/4 melo-mat-length-cell-2)
                            (fit-to-span '4/4 (length-augmentation 2 melo-mat-length-cell-2))
                            (fit-to-span '4/4 (length-augmentation 4 melo-mat-length-cell-2))))
                            


;;; Chords

;; Chord pitch material 

(setf 
 chord-quality '((m7/add2)(maj7/add2)(7/sus2))
 chords-found-in-scale (find-chord-for-parent-scale chord-scale chord-quality)
 chord-mat-size 2
 ;; main result
 chord-mat-symbol (combination chord-mat-size 
                               (flatten-sublist (flatten-sublist chords-found-in-scale))))

;; Chord velocity material
(setf chord-mat-velocity '((0.1)(0.2)(0.3)(0.35)))

;; Chord length material
(setf chord-mat-length '((q -q q -q)(-q q -q q)(e -q. q -q)(q. -e q. -e)))


;;; Bass

;; Bass pitch material 
(setf 
 chord-mat-root (find-root (flatten-sublist chord-mat))
 bass-mat-pitch (pitch-transpose -24 (gen-divide chord-mat-size chord-mat-root)))

;; Bass velocity material
(setf bass-mat-velocity '((0.45)(0.5)(0.55)(0.6)(0.65)))

;; Bass length material
(setf bass-mat-length '((h h)(q -q q -q)(-q q -q q)))


;; The lists have different lengths 
(setf master-mat-length (max (length melo-mat-pitch)
                             (length melo-mat-velocity)
                             (length melo-voice-variant-variant)
                             (length melo-mat-length)
                             (length chord-mat-symbol)
                             (length chord-mat-velocity)
                             (length chord-mat-length)
                             (length bass-mat-pitch)
                             (length bass-mat-velocity)
                             (length bass-mat-length)
                             ))

;; Trim them to have the same
(setf 
 melo-mat-pitch (gen-trim master-mat-length melo-mat-pitch)
 melo-voice-variant-variant (gen-trim master-mat-length melo-voice-variant-variant)
 melo-voice-variant-tuplet (gen-trim master-mat-length melo-voice-variant-tuplet)
 melo-mat-velocity (gen-trim master-mat-length melo-mat-velocity)
 melo-mat-length (gen-trim master-mat-length melo-mat-length)
 chord-mat-symbol (gen-trim master-mat-length chord-mat-symbol)
 chord-mat-velocity (gen-trim master-mat-length chord-mat-velocity)
 chord-mat-length (gen-trim master-mat-length chord-mat-length)
 bass-mat-pitch (gen-trim master-mat-length bass-mat-pitch)
 bass-mat-velocity (gen-trim master-mat-length bass-mat-velocity)
 bass-mat-length (gen-trim master-mat-length bass-mat-length)
)


;; Pick material with one master index
(setf nbars 16
      master-index (rnd-sample nbars (gen-integer 0 (- master-mat-length 1)))
      melo-mat-pitch-picked (mapcar (lambda (x) (nth x melo-mat-pitch)) master-index)
      melo-voice-variant-variant (mapcar (lambda (x) (nth x melo-voice-variant-variant)) master-index)
      melo-voice-variant-tuplet (mapcar (lambda (x) (nth x melo-voice-variant-tuplet)) master-index)
      melo-mat-velocity (mapcar (lambda (x) (nth x melo-mat-velocity)) master-index)
      melo-mat-length (mapcar (lambda (x) (nth x melo-mat-length)) master-index)
      chord-mat-symbol-picked (mapcar (lambda (x) (nth x chord-mat-symbol)) master-index)
      chord-mat-velocity (mapcar (lambda (x) (nth x chord-mat-velocity)) master-index)
      chord-mat-length (mapcar (lambda (x) (nth x chord-mat-length)) master-index)
      bass-mat-pitch-picked (mapcar (lambda (x) (nth x bass-mat-pitch)) master-index)
      bass-mat-velocity (mapcar (lambda (x) (nth x bass-mat-velocity)) master-index)
      bass-mat-length (mapcar (lambda (x) (nth x bass-mat-length)) master-index)
)



;;; Create omn ------------
;;; 
;;; 

;; Assemble ---
(setf melody-omn (make-omn :pitch melo-mat-pitch-picked
                           :length melo-mat-length
                           :velocity melo-mat-velocity
                           :swallow nil)
      chords-omn (make-omn :pitch chord-mat-symbol-picked
                       :length chord-mat-length
                       :velocity chord-mat-velocity
                       :swallow nil)
      bass-omn (make-omn :pitch bass-mat-pitch-picked
                     :length bass-mat-length
                     :velocity bass-mat-velocity
                     :swallow nil))

;; Final voices ---
(setf 
 melody (filter-tie (velocity-to-dynamic (flatten-sublist (loop for me in melody-omn
                               for va in melo-voice-variant-variant
                               for tr in melo-voice-variant-tuplet
      collect (voice-variant (list me) :variant va :tuplet tr)))))
 ;;melody (velocity-to-dynamic melody-omn)
 chords (velocity-to-dynamic (drop-voicing chords-omn :type '(1 2) :leading 'l))
 bass (velocity-to-dynamic bass-omn))

;; Ambitus control
(length melody)
(setf melody (ambitus '(c4 c5) melody :section '(0 1 2 3)))
(setf melody (ambitus '(g4 g5) melody :section '(4 5 6 7)))
(setf melody (ambitus '(c5 c6) melody :section '(8 9 10 11)))
(setf melody (ambitus '(g5 g6) melody :section '(12)))
(setf melody (ambitus '(c4 c5) melody :section '(13 14)))
(setf melody (ambitus '(c4 c5) melody :section '(15 16)))

;; Preview ---

(ps 'gm
    :tempo 60
    :p (list (omn-to-time-signature melody '(4 4)) 
             chords)
    :bass (list bass))

;; Record MIDI
(compile-score *last-score*
               :output :midi
               :file (workspace-file "v.mid")
               :if-exists :new-index)

seed

Seed for this example was: 24113.

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

Important Information

Terms of Use Privacy Policy

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.