Posted September 26, 2024Sep 26 simulation.mov Opusmodus / A musical reflection tool At the beginning it should be noted that this is not a piece of music! I often try out new material in Opusmodus, test ideas, almost improvise with it. It is a good tool for me to check my idea, to reflect it, to change rules/ideas. A musical reflection tool. Basic idea: I would like to build a texture (based on a Pitchfield/Chord), which is structured by scales/arpeggia, should be played by a fender rhodes and two sine players. Each gesture should have a new pace (1/20 1/12 etc.) and a new dynamic, so that this texture has homogeneity on the side (through the chord), but is very precise articualted inside. The fender rhodes should and must be playable (= done by limiting the scales), sines can be "free" ... Result: What I get with this few code is a sketch, now I can refine my rules and conditions (chord/tempi/rests) in OPUSMODUS. Likewise, I can now experiment (if this works now) in Ableton Live on the timbres, which surely will have i kind of a feedback on my CODING in OMN. A kind of circular working process... a At the end: I will write it down by hand (sibelius) to be able to articulate even more precisely (like i want it) than the code. For the stage: Coordiniaton will be done by click-track or https://polytempo.zhdk.ch Have fun! Greetings André ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; a function that generates a chains of 1/20 or 1/12 or 1/8 .. dependening on the lengths of the sub-pitch-seqences ;; ORD or REVERS (so that the "starttime" changes) by probp ;; no immediate reps (defun gen-rhythms (apitchlist) (loop for i in apitchlist for j in (rnd-sample 100 '(1/20 1/28 1/12 1/8) :norep t) collect (if (probp 0.5) (length-rational-quantize (gen-repeat (length i) j) :round (rnd-pick '(1/4 2/4))) (reverse (length-rational-quantize (gen-repeat (length i) j) :round (rnd-pick '(1/4 2/4))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; THE CHORD/INTERVAL (setf intervals '(7 6 3 4 6 4 3 6 7)) ;; intervals for pitches (setf n 20) ;; span for CYCLE (interval-rotation) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; LINES for FENDER RHODES (should be playable by humans) (setf lines1 '(loop for chord in (loop for i in (gen-rotate :left intervals :type 'list) collect (rnd-sample 5 (interval-to-pitch i :start 'b0))) ;; interval-rotation (all possibiliies), interval to pitch append (loop repeat n ;; n = how many cycles per pitch-constellation collect (progn (setf direction (setf direction (prob-pick '((0 0.7) (1 0.3))))) ;; preset by probp for SCALE or DOWN (filter-repeat 1 (if (= direction 0) ;; take 3 or 5 pitches from momentary pitch-constellation / if probp then UP (sort-asc (rnd-sample (rnd-pick '(3 5)) (rnd-sample-seq 5 ;; max in SPAN 5 pitches (for fender rhodes) (ambitus-filter (ambitus-instrument 'piano) chord)) :norep t)) (sort-desc (rnd-sample (rnd-pick '(3 5)) (rnd-sample-seq 5 ;; max in SPAN 5 pitches (for fender rhodes) (ambitus-filter (ambitus-instrument 'piano) chord)) :norep t)))))))) ;; LINES for SINE PLAYER (setf lines2 '(loop for chord in (loop for i in (gen-rotate :left intervals :type 'list) collect (interval-to-pitch i :start 'b0)) ;; interval-rotation (all possibiliies), interval to pitch append (loop repeat n ;; n = how many cycles per interval-constellation collect (progn (setf direction (setf direction (prob-pick '((0 0.7) (1 0.3))))) ;; preset by probp for SCALE or DOWN (filter-repeat 1 (if (= direction 0) ;; take 3 or 5 pitches from momentary pitch-constellation / if probp then DOWN (sort-asc (rnd-sample (rnd-pick '(3 5 7)) (ambitus-filter (ambitus-instrument 'piano) chord) :norep t)) (sort-desc (rnd-sample (rnd-pick '(3 5 7)) (ambitus-filter (ambitus-instrument 'piano) chord))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GEN FENDER PART (progn (setf fdr_1 (eval lines1)) (setf rhy1 (gen-rhythms fdr_1)) ;; gen rhy based on the pitch-seqs (setf fdr_1 (make-omn :length rhy1 :pitch fdr_1)) ;; rewrite/replace dynamics (setf fdr_1 (loop for i in fdr_1 ;;every gesture should have their own dynamics norep !! for velo in (pick-norepeat 100 '(ppp p mf fff)) collect (omn-replace :velocity velo i)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GEN SINE PARTS (progn (setf snr_1 (eval lines2)) (setf rhy2 (gen-rhythms snr_1)) ;; gen rhy based on the pitch-seqs (setf snr_1 (make-omn :length rhy2 :pitch snr_1)) ;; rewrite/replace dynamics (setf snr_1 (loop for i in snr_1 ;; every gesture should have their own dynamics norep !! for velo in (rnd-sample (length rhy2) '(ppp p mf fff) :norep t) collect (omn-replace :velocity velo i)))) (progn (setf snl_1 (eval lines2)) (setf rhy3 (gen-rhythms snl_1)) ;; gen rhy based on the pitch-seqs (setf snl_1 (make-omn :length rhy3 :pitch snl_1)) ;; rewrite/replace dynamics (setf snl_1 (loop for i in snl_1 ;; every gesture should have their own dynamics norep !! for velo in (rnd-sample (length rhy3) '(ppp p mf fff) :norep t) collect (omn-replace :velocity velo i)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PUT IN AN 3/4 (setf snl (omn-to-time-signature snl_1 '(3 4))) (setf snr (omn-to-time-signature snr_1 '(3 4))) (setf fdr (omn-to-time-signature fdr_1 '(3 4))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (def-score sketch (:title "sketch" :key-signature 'atonal :time-signature '(3 4) :tempo '(132) :layout (list (grand-layout 'fdr) (bass-layout 'snl) (bass-layout 'snr))) (snl :omn snl :channel 1 :port 9 ) (snr :omn snr :channel 1 :port 8) (fdr :omn fdr :channel 1 :port 5)) ;(live-coding-midi (compile-score 'sketch)) ;(omn-list-plot (list fdr_1 snr_1 snl_1) :style :fill :point-radius 1)
September 26, 2024Sep 26 Dear André, Thanks for sharing your thougths and methods ! All the best ! Julio Herrlein
September 27, 2024Sep 27 Author another sketch: now with a "global tendency" from scales/arpeggia to chords (and also with some structural projection - less random, more systematic). next: modify the FENDER-part (by code), so that it will be playable 😄 simulation3.mov
September 29, 2024Sep 29 Really great to see this. Precisely the sort of sharing of workflow ideas I was hoping we could use this section of the forum to showcase. I look forward to playing with some of this code! I have a number of similar 'improvisatory' approaches that I will be posting at some point soon - but at the moment I'm doing a complete overhaul of my VI/Reaper configuration and it's taking ages to do, so work with OM is currently limited almost entirely to new soundsets and instrumentsets.
Create an account or sign in to comment