November 30Nov 30 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 post3 picked audio manifestations with different start seeds.Seed: 78641e1.mp3Seed: 34987e2.mp3Seed: 10461e3.mp3Here'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