AM Posted September 26, 2024 Posted September 26, 2024 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) Stephane Boussuge, opmo, jesele and 1 other 2 2 Quote
JulioHerrlein Posted September 26, 2024 Posted September 26, 2024 Dear André, Thanks for sharing your thougths and methods ! All the best ! Julio Herrlein AM 1 Quote
AM Posted September 27, 2024 Author Posted September 27, 2024 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 opmo and Stephane Boussuge 2 Quote
acrawnsley Posted September 29, 2024 Posted September 29, 2024 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. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.