Jump 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 #5 - 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 a bit more involved attempt using LCCOTO for my naive take of a fusion piece.

The chord track for 2 parts is given, melodies use the LCCOTO parent scale for chords.

One can exchange by other more outgoing scales.

Audio example are for normal, most ingoing lydian scale.

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

3 picked audio manifestations with different start seeds.

Seed: 78641

Seed: 34987

Seed: 10461

Here's the code. Appreciate any improvement suggestions.

;; ---------------------------------------------------------
;; 
;; LCCOTO Chordtrack derived tonaloity-series
;;
;; Variations Part A, B
;;
;; Cliff Scherer, 2025
;;
;; ---------------------------------------------------------

(progn

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

(defun prepare-fusion (&key total-span 
                            chord-track
                            parent-scale-candidates
                            melody-number-of-notes
                            melody-augmentation-factor
                            melody-tuplet) 
  
  "Prepare parts of a fusion piece"

   ;; Chords, Harmony
   (setf chord-track (length-span total-span chord-track))
   (setf harmonic-rhythm (omn :length (filter-tie chord-track)))
   
   ;; Bass
   (setf bass-rhythm-cell (length-span '(1) (pcs-rhythm '3-11 :points 6 
                                                     :rotate (rnd-pick '(0 5)) 
                                                     :legato t)))
   (setf bass-pitch-cell (rnd-pick '((c2 g2 b2)(c2 g2 d2))))
   (setf bass-mat (make-omn :pitch (pitch-transpose -0 bass-pitch-cell)
                         :length (length-span total-span bass-rhythm-cell)
                         :velocity '((0.6 0.51 0.5 0.55))
                         :articulation '(leg stacc stacc stacc )))

   ;; Melody
   (setf pattern (rhythm-series 2 melody-number-of-notes 4/4))
   (setf pattern-length (length-span total-span (quantize (length-augmentation 1 pattern)
                                                          melody-tuplet)))
   (setf pattern-pitch (bind-to-interval 
                        '(7 -7) 
                        (gen-divide 5 
                                    (vector-to-pitch '(c4 g5) 
                                                     (gen-accumulate (rndn 128 
                                                                           -1.0 1.0) :decf t)))))
                        (setf melody-mat (make-omn :pitch pattern-pitch                  
                              :length pattern-length
                              :velocity (rnd-sample 5 '((f mf) (f mp) (mf < p > pp >)))))
   

   ;; Drums
   (setf bd (gen-loop 2 (polygon-rhythm 5 8 0 :value 'e  :pitch 'c2 :velocity '(f p = = = =))))
   (setf hh (gen-loop 2 (polygon-rhythm 28 32 2 :value 's :pitch 'fs2 :velocity '(f ff mf p p f))))
   (setf ho (gen-loop 2 (polygon-rhythm 3 64 4 :value 's :pitch 'as2 :velocity '(p p))))
   (setf to (polygon-rhythm 3 8 4 :value 'e :pitch 'g2 :velocity '(p mp)))
   (setf bd-omn (assemble-seq (length-span (- total-span 1) (first bd)) 
                              (length-span 1 (second bd))))
   (setf hh-omn (assemble-seq (length-span (- total-span 1) (first hh)) 
                              (length-span 1 (second hh))))
   (setf ho-omn (assemble-seq (length-span (- total-span 1) (first ho)) 
                              (length-span 1 (second ho))))
   (setf to-omn (assemble-seq (length-span (- total-span 1) '(-e))
                              (length-span 1 to)))
                                           
   (setf drums-omn (merge-voices bd-omn hh-omn ho-omn to-omn))

   ;; Sax play same as melody but with alteration
   (setf sax-mat (pitch-transpose -36 (ambitus-field '(0 15) (pitch-invert melody-mat))))


   ;;; Bring lines to tonality

   ;; For Melody use LCCOTO parent scale for melody
   (setf chord-symbols  (omn :pitch (filter-tie chord-track)))
   (setf parent-scales (mapcar 'rnd-pick 
                            (find-parent-scale-for-chord (mclist chord-symbols) 
                                                         :scales parent-scale-candidates)))
   (setf parent-scales-root (mapcar 'find-root (mclist(expand-chord parent-scales))))
   (setf parent-scales-mode (mapcar 'second parent-scales))
   (setf parent-tonality-series (tonality-series parent-scales-mode 
                                              :root parent-scales-root 
                                              :map 'octave :ambitus '(c4 g5) :variant 'p))
   (setf melody-omn (filter-tie (tonality-map parent-tonality-series melody-mat 
                                  :time harmonic-rhythm)))

   (setf sax-omn (length-weight
                  (length-legato (filter-tie (tonality-map parent-tonality-series sax-mat 
                                                           :time harmonic-rhythm)))
                  :weight '(5 1)))

   ;; For Bass use chord
   (setf chord-pitches (chord-interval-remove '(10 11) chord-symbols))
   (setf chord-tonality-series (tonality-series chord-pitches :map 'octave))
   (setf bass-omn (tonality-map chord-tonality-series bass-mat
                             :time harmonic-rhythm))

   ;; For Chords some variation
   (setf chord-omn (pitch-transpose -12 (closest-path (drop-voicing chord-track :type '(1)))))
   (setf chord-omn (omn-replace :velocity (rnd-sample 2 '(mf mp)) chord-omn))

   
   ;; Prepare voices
   (setf v1 (omn-to-time-signature melody-omn '(4 4))
         v2 (omn-to-time-signature chord-omn '(4 4))
         v3 (omn-to-time-signature bass-omn '(4 4))
         v4 (omn-to-time-signature sax-omn '(4 4))
         v5 (omn-to-time-signature drums-omn '(4 4)))

   ;; Timeline
   (setf on-off (gen-binary-series 24 '( 2 3) '(3) :rotate -4))
   (do-timeline2 '(v1 v4) on-off '(gen-pause x) :time '(wh) :loop t)

   (def-score fusion
       (:key-signature 'chromatic
        :time-signature '(4 4)
        :tempo '(80)
        :layout (list
                 (bracket-group
                  (grand-layout 'rhand :name "Rhodes" :abbr "Rhodes")
                  (grand-layout 'lhand :name "Piano" :abbr "Piano"))
                 (tenor-sax-layout 'sax :name "Sax" :abbr "Sax")                 
                 (bass-layout 'bass :name "Bass" :abbr "Bass")
                 (drum-kit-layout 'drums :name "Drums" :abbr "Drums")))
     
     (rhand
      :port "Bus 1"
      :omn v1
      :sound 'gm 
      :program 'acoustic-grand-piano)
     (lhand
      :omn v2
      :port "Bus 2")
     (bass
      :omn v3
      :port "Bus 3")
     (sax
      :omn v4
      :port "Bus 4")
     (drums
      :omn v5
      :port "Bus 5")
     )
   )


;;; Use the function

(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)
(create-tonality lydian-chromatic-scale-6 (subseq lydian-chromatic-scale 1 6))
(create-tonality lydian-chromatic-scale-7-mod1 (subseq lydian-chromatic-scale 1 8))
(create-tonality lydian-chromatic-scale-7-mod2 (subseq lydian-chromatic-scale 2 9))



;; Create score
(setf fusion-a1 (prepare-fusion :total-span 8
                               :chord-track '((e. (f m7))(e. (f m7))(he (gs m7)))
                               :parent-scale-candidates '(lydian)
                               :melody-number-of-notes 2
                               :melody-augmentation-factor 3
                               :melody-tuplet '(1 2 4)))
(setf fusion-a2 (prepare-fusion :total-span 8
                               :chord-track '((e. (f m7))(e. (f m7))(he (gs m7)))
                               :parent-scale-candidates '(lydian)
                               :melody-number-of-notes 3
                               :melody-augmentation-factor 2
                               :melody-tuplet '(1 2 4)))
(setf fusion-b1 (prepare-fusion :total-span 8
                               :chord-track '((q. (e maj7))(e. (e 6))(qes (g 6)))
                                :parent-scale-candidates '(lydian)
                                :melody-number-of-notes 8
                                :melody-augmentation-factor 1
                                :melody-tuplet '(1 2 4)))
(setf fusion-b2 (prepare-fusion :total-span 8
                                :chord-track '((q. (e maj7))(e. (e 6))(qes (g 6)))
                                :parent-scale-candidates '(lydian)
                                :melody-number-of-notes 8
                                :melody-augmentation-factor 1
                                :melody-tuplet '(3)))

;; Arrange and Record MIDI
(setf start-1 (rnd-sample 7 '(1 2 3 4 5 6)))
(setf end-1 (x+b start-1 0))
(setf start-2 (rnd-sample 7 '(1 2 3 4 5)))
(setf end-2 (x+b start-2 1))


(compile-score 
 `(
   ;; 8 basr with a1
   (,(eval fusion-a1) :start 1 :end 1)
   (,(eval fusion-a1) :start 1 :end 1)
   (,(eval fusion-a1) :start ,(nth 0 start-2) :end ,(nth 0 end-2))
   (,(eval fusion-a1) :start ,(nth 1 start-2) :end ,(nth 1 end-2))
   (,(eval fusion-a1) :start ,(nth 1 start-1) :end ,(nth 1 end-1))
   (,(eval fusion-a1) :start 8 :end 8)
   ;; 8 bars with a2
   (,(eval fusion-a2) :start 1 :end 1)
   (,(eval fusion-a2) :start 1 :end 1)
   (,(eval fusion-a2) :start ,(nth 0 start-2) :end ,(nth 0 end-2))
   (,(eval fusion-a2) :start ,(nth 1 start-2) :end ,(nth 1 end-2))
   (,(eval fusion-a2) :start ,(nth 2 start-1) :end ,(nth 2 end-1))
   (,(eval fusion-a2) :start 8 :end 8)
   ;; 8 bars with b1
   (,(eval fusion-b1) :start 1 :end 1)
   ;;(,(eval fusion-b1) :start 1 :end 1)
   (,(eval fusion-b1) :start ,(nth 3 start-1) :end ,(nth 3 end-1))
   (,(eval fusion-b1) :start ,(nth 0 start-2) :end ,(nth 0 end-2))
   (,(eval fusion-b1) :start ,(nth 1 start-2) :end ,(nth 1 end-2))
   (,(eval fusion-b1) :start ,(nth 4 start-1) :end ,(nth 4 end-1))
   (,(eval fusion-b1) :start 8 :end 8)
   ;; 8 bars with b2
   (,(eval fusion-b2) :start 1 :end 1)
   (,(eval fusion-b1) :start ,(nth 5 start-1) :end ,(nth 5 end-1))
   (,(eval fusion-b2) :start ,(nth 0 start-2) :end ,(nth 0 end-2))
   (,(eval fusion-b2) :start ,(nth 1 start-2) :end ,(nth 1 end-2))
   (,(eval fusion-b2) :start ,(nth 6 start-1) :end ,(nth 6 end-1))
   (,(eval fusion-b2) :start 8 :end 8) 
   ;;
   (,(eval fusion-a1) :start 1 :end 1)
   (,(eval fusion-a1) :start 1 :end 1)
)
 :instrument t
 :output :midi
 :file (workspace-file "v.mid")
 :if-exists :new-index
 )

seed

)
  

Create an account or sign in to comment


Copyright © 2014-2025 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

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.