Jump to content

Stephane Boussuge

Moderators
  • Posts

    1,056
  • Joined

  • Last visited

Everything posted by Stephane Boussuge

  1. Last piece from 3 Images pour Violon et Piano. SB.
  2. 2nd Image from 3 Images for Violin and Piano. SB.
  3. Small duet for Violin and Piano from 3 Images pour Violon et Piano. The 2 others duet are in progress. I've used some midi pre-recorded material prepared and edited in Logic before importation into Opusmodus and after import, i've processed this material with opmo functions and export back to Logic X for final edition and final score edit. SB.
  4. Hi, here's the first movement of a work in progress, my strings quartet No.1. OpmoScore attached. You can also find how it was algorithmically made in this forum article/example: SB. Sqrt1-Full-GM.opmo
  5. (setf seq '(s c4 tie s c4 tie s c4 tie s c4 s d4 tie s d4 tie s d4 tie s d4 s e4 tie s e4 tie s e4 t gs5 g5 fs5 f5 e5 -1/32 s g4 tie s g4 tie s g4 tie s g4 tie s g4 tie s g4)) (filter-tie seq) S.
  6. Hi, i don't know if this could help you but just in case, here's how i use pattern-map inside some of my functions: ;;; ============================================= ;;; ARTICULATION-MAP ;;; AJOUTE DES ARTICULATIONS SUR DES LISTES OMN ;;; BASÉES SUR DU PATTERN MATCHING. ;;; ============================================= (defun articulation-map (map omn &key (otherwise '-)) (do-verbose ("articulation-map") (let* ((plist (disassemble-omn omn))) (setf (getf plist :articulation) (pattern-map map (getf plist :length) :otherwise otherwise :swallow t)) (apply 'make-omn plist)))) #| USAGE (setf mat '((q c4 p d4 e e4 f4 s g4 f a4 g4 f4 q e4)(e d4 mp c4 s d4 e4 f4 e4 q d4 e c4 b3)(h a3 f -h))) (setf prules '( ((s s s) (leg leg leg)) ((s s)(leg leg)) ((s e)(- -)) ((s q)(- stacc)) ((q) (stacc)) ((e) (-)) )) (setf out (articulation-map prules mat)) |# Cheers. Stéphane.
  7. Hi, new piece after a paint by Egon Schiele. SB. mwploaFullScoreEdit.opmo (update)
  8. You can also have a look to LSytem functions.... length-lsystem pitch-lsystem rewrite-lsystem S.
  9. i've used Opusmodus a bit last year with Ableton live without problems but may be something change on new version... Attached, the setup i've used at this time. Just in case if it could help .... SB. OpmoMidiSetupLive.als
  10. Hi, maybe this little example could help a bit: (setf pitch (gen-trim 128 '(c4 d4 e4 f4 g4 a4 b4 c5 d5 e5 f5 g5))) (setf len1 (gen-length (rnd-sample 32 '(2 4 6 8)) '16)) (setf len2 (gen-length (rnd-sample 32 '(2 4 6 8)) '16)) (setf len3 (gen-length (rnd-sample 32 '(2 4 6 8)) '16)) (setf len4 (gen-length (rnd-sample 32 '(2 4 6 8)) '16)) (setf align (distribute-seq pitch len1 len2 len3 len4)) (setf p1 (make-omn :pitch (1~ align) :length len1 )) (setf p2 (make-omn :pitch (2~ align) :length len2 )) (setf p3 (make-omn :pitch (3~ align) :length len3 )) (setf p4 (make-omn :pitch (4~ align) :length len4 )) (def-score temp ( :key-signature 'chromatic :time-signature '(4 4) :composer "Stéphane Boussuge" :copyright "Copyright © 2017 s.boussuge" :tempo 120 ) (inst1 :omn p1 :channel 1 :sound 'gm :program 'acoustic-grand-piano ) (inst2 :omn p2 :channel 2 :sound 'gm :program 'acoustic-grand-piano ) (inst3 :omn p3 :channel 3 :sound 'gm :program 'acoustic-grand-piano ) (inst4 :omn p4 :channel 4 :sound 'gm :program 'acoustic-grand-piano ) ) SB
  11. Thank you André. I've made that based on you code for replace pitch on technique: ;;; REPLACE-PITCH-OF-A-TECHNIQUE ;;; Based on code from AM. (replace-velocity-of-a-technique) (defun replace-pitch-of-a-technique (omn-list &key technique pitch) (flatten (loop for i in (single-events omn-list) when (equal (nth 3 i) technique) collect `(,(nth 0 i) ,(rnd-pick pitch) ,(nth 2 i) ,(nth 3 i)) else collect i))) (replace-pitch-of-a-technique '(e. c4 p tasto d4 ponte e4) :technique 'tasto :pitch '(g6)) (replace-pitch-of-a-technique '(e. c4 p tasto d4 ponte e4 d4 tasto f5 tasto) :technique 'tasto :pitch '(g4 e5 a6)) S.
  12. Here's some few examples of use of the recently updated tonality-system. (complete opmo score attached to this post.) ;; Utility function useful for using ;; bass note of chords/scales as root ;; in tonality-series. (defun get-lowest-chord-tone (chords) (do-verbose ("get-lowest-chord-tone") (integer-to-pitch (mapcar 'find-min (pitch-to-integer chords))) )) #| ;;; USAGE (setf chords '(d4f4a4 ab3d4eb4g4 f4eb3c5)) (get-lowest-chord-tone chords) |# It is better now to see the tonality as kind of PCS (pitch Class Set). If you would express them in pitch, it is easier to work on C base. Something interesting if the fact tonality can now be sorted or not. It will be reflected in the output of tonality-map. ;; Some tests (tonality-map '(d4e4f4g4a4b4) '(c4 d4 e4 f4 g4 a4 b4)) (tonality-map '(d4e4f4g4a4b4) '(c3 e4g4)) (tonality-map '(d4e4f4g4a4b4 :root d4) '(c3 e4g4)) (tonality-map '((0 2 3 5 7 9 10) :root d4) '(c3 e4g4)) (tonality-map '((0 2 3 5 7 9 10) :root d4 :closest 'down) '(c3 e4g4)) More extended test with use of bass note as root: (setf row '(c4 e4 f4 b4 a4 bb4 cs4 gs4 fs4 g4 eb4 d4)) (setf modes1 (harmonic-progression '(0 1 2 3 4 5 6 7 8 9 10 11) row :step 1 :size 8 )) (setf mtv '((s c4 d4 e4 f4 g4 a4 b4 c5))) (setf test1 (tonality-map (mclist modes1) (gen-repeat 12 mtv))) (setf path1 (tonality-series modes1 :root (get-lowest-chord-tone modes1) ;:closest '(down) )) (setf test2 (tonality-map path1 (gen-repeat 12 mtv))) (setf mtv2 '((s c4 cs4 d4 ds4 e4 f4 fs4 g4))) (setf test3 (tonality-map (mclist modes1) (gen-repeat 12 mtv2))) (setf test4 (tonality-map path1 (gen-repeat 12 mtv2))) (setf path2 (tonality-series modes1 :root (get-lowest-chord-tone modes1) ;:closest '(down) :map '(step) )) (setf test5 (tonality-map path2 (gen-repeat 12 mtv))) (setf test6 (tonality-map path2 (gen-repeat 12 mtv2))) (setf path3 (tonality-series modes1 :root (get-lowest-chord-tone modes1) ;:closest '(down) :map '(step) :sort t )) (setf test7 (tonality-map path3 (gen-repeat 12 mtv2))) (setf test8 (tonality-map path3 (gen-repeat 12 mtv))) SB. NewTonalitySystemExamples.opmo
  13. I think the easy way and best way is to use my function (revised by Torsten) ADD-INTERVAL-IF-LENGTH: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;; ADD-INTERVAL-IF-LENGTH ;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; USAGE #| (setf seq '((e c4 p stacc d4 stacc e4 stacc f4 stacc q g4 g3) (q c4 mf e c6 b5 a5 g5 f5 d5) (s e4 f4 e4 d4 q g4 b4 d5) (q g5 ff marc g4 marc h c5 ))) ; with default parameters (add-interval-if-length '(1/4 c4 d4 e4 1/8 e4 f4)) (add-interval-if-length seq) ; with specified condition (add-interval-if-length seq :condition '<) (add-interval-if-length seq :condition '=) ; with specifird conditions en length value specification (add-interval-if-length seq :condition '= :length-val '1/4) |# ;;; VERSION REVISEE PAR TORSTEN ;;; ============================================== ;;; UTILITY FUNCTIONS ;;; (defun add-interval-if-length-aux (omn &key (test #'>) (length-val 1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (let ((s-events (single-events omn))) (loop for e in s-events for i in (gen-trim (length s-events) interval-list) when (funcall test (omn-encode (first e)) length-val) append (omn-replace :pitch (chord-interval-add (list i) (list (second e))) e) else append e))) ;(add-interval-if-length-aux '(q c4 d4 e4 f4 e g4 a4) :interval-list '(10 11)) ;;; ============================= ;;; MAIN FUNCTION (defun add-interval-if-length (omn &key (test #'>) (length-val 1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (do-verbose ("add-interval-if-length") (let ((test-fn (case test (> #'>) (< #'<) (= #'=) (otherwise test)))) (if (listp (car omn)) (mapcar #'(lambda (x) (add-interval-if-length-aux x :test test-fn :length-val (omn-encode length-val) :interval-list interval-list)) omn) (add-interval-if-length-aux omn :test test-fn :length-val (omn-encode length-val) :interval-list interval-list))))) ;(add-interval-if-length '((q c4 d4 e4 f4 e g4 a4) (e f4 e4 q d4 c4 a4 g4 f4)) :interval-list '(10 11)) ;(add-interval-if-length '((q c4 d4 e4 f4 e g4 a4) (e f4 e4 q d4 c4 a4 g4 h f4)) :interval-list '(3 4) :test #'>= :length-val 'q) you can setf a phrase processed first by this function and another one with another processing with the same function but with other parameters: (setf seq '((e c4 p stacc d4 stacc e4 stacc f4 stacc q g4 g3) (q c4 mf e c6 b5 a5 g5 f5 d5) (s e4 f4 e4 d4 q g4 b4 d5) (q g5 ff marc g4 marc h c5 ))) ; with default parameters (setf proc1 (add-interval-if-length seq)) (setf proc2 (add-interval-if-length proc1 :interval-list '(3 4) :test #'>= :length-val 'q)) SB.
  14. Something useful for automatic stuff generation, you can define a variable seed defined with random number and replace the value of the variable by it's value when you got an interesting result. Example: (setf seed (car (rnd-number 1 1 100000))) (init-seed seed) SB.
  15. I've made this long time ago, bit different but may be also of interest, this function use a specs of number of "1" and "0" in input: ;;; GEN-BINARY_INTEGER (defun gen-binary-integer (one-list zero-list &key (flatten t)) (do-verbose ("gen-binary-integer") (if flatten (flatten (loop for i in one-list for o in (gen-trim (length one-list) zero-list) collect (append (gen-repeat i '(1)) (gen-repeat o '(0)) ))) (loop for i in one-list for o in (gen-trim (length one-list) zero-list) collect (append (gen-repeat i '(1)) (gen-repeat o '(0)) ))))) #| USAGE (gen-binary-integer '(3 4 3 2 4 2 5) '(1 1 3)) => (1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0) (gen-binary-integer '(3 4 3 2 4 2 5) '(1 1 3) :flatten nil) => ((1 1 1 0) (1 1 1 1 0) (1 1 1 0 0 0) (1 1 0) (1 1 1 1 0) (1 1 0 0 0) (1 1 1 1 1 0)) (setf intg '(3 2 4 5 3)) (setf zero-k '(1 2 1 3)) (gen-binary-integer intg zero-k) => '(1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0) |# S.
  16. Thank you very much Torsten ! all the best Stéphane
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;; ADD-INTERVAL-IF-LENGTH ;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; USAGE #| (setf seq '((e c4 p stacc d4 stacc e4 stacc f4 stacc q g4 g3) (q c4 mf e c6 b5 a5 g5 f5 d5) (s e4 f4 e4 d4 q g4 b4 d5) (q g5 ff marc g4 marc h c5 ))) ; with default parameters (add-interval-if-length '(1/4 c4 d4 e4 1/8 e4 f4)) (add-interval-if-length seq) ; with specified condition (add-interval-if-length seq :condition '<) (add-interval-if-length seq :condition '=) ; with specifird conditions en length value specification (add-interval-if-length seq :condition '= :length-val '1/4) |# ;;; CODE ;;; ============================================== ;;; UTILITY FUNCTIONS (defun add-interval-if-length-greater* (omn &key (length-val '1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (let ((s-events (single-events omn))) (loop for e in s-events for i in (gen-trim (length s-events) interval-list) when (> (omn-encode (first e)) length-val) append (omn-replace :pitch (chord-interval-add (list i) (list (second e))) e) else append e))) (defun add-interval-if-length-greater (omn &key (length-val '1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (if (listp (car omn)) (mapcar (lambda(x) (add-interval-if-length-greater* x :length-val (omn-encode length-val) :interval-list interval-list)) omn) (add-interval-if-length-greater* omn :length-val (omn-encode length-val) :interval-list interval-list))) ;(add-interval-if-length-greater '((q c4 d4 e4 f4 e g4 a4)(e f4 e4 q d4 c4 a4 g4 f4)) :interval-list '(10 11)) ;(add-interval-if-length-greater* '(q c4 d4 e4 f4 e g4 a4) :interval-list '(10 11)) (defun add-interval-if-length-lesser* (omn &key (length-val '1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (let ((s-events (single-events omn))) (loop for e in s-events for i in (gen-trim (length s-events) interval-list) when (< (omn-encode (first e)) length-val) append (omn-replace :pitch (chord-interval-add (list i) (list (second e))) e) else append e))) (defun add-interval-if-length-lesser (omn &key (length-val '1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (if (listp (car omn)) (mapcar (lambda(x) (add-interval-if-length-lesser* x :length-val (omn-encode length-val) :interval-list interval-list)) omn) (add-interval-if-length-lesser* omn :length-val (omn-encode length-val) :interval-list interval-list))) ;(add-interval-if-length-lesser '((q c4 d4 e4 f4 e g4 a4)(e f4 e4 q d4 c4 a4 g4 f4)) :length-val '1/2 :interval-list '(10 11)) ;(add-interval-if-length-lesser '(q c4 d4 e4 f4 e g4 a4) :length-val '1/4 :interval-list '(10 11)) (defun add-interval-if-length-equal* (omn &key (length-val '1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (let ((s-events (single-events omn))) (loop for e in s-events for i in (gen-trim (length s-events) interval-list) when (equal (omn-encode (first e)) length-val) append (omn-replace :pitch (chord-interval-add (list i) (list (second e))) e) else append e))) (defun add-interval-if-length-equal (omn &key (length-val '1/8) (interval-list '(4 3 4 7 4 3 5 4 7 3))) (if (listp (car omn)) (mapcar (lambda(x) (add-interval-if-length-equal* x :length-val (omn-encode length-val) :interval-list interval-list)) omn) (add-interval-if-length-equal* omn :length-val (omn-encode length-val) :interval-list interval-list))) ;(add-interval-if-length-equal '((q c4 d4 e4 f4 e g4 a4)(e f4 e4 q d4 c4 a4 g4 f4)) :length-val '1/4 :interval-list '(10 11)) ;(add-interval-if-length-equal '(q c4 d4 e4 f4 e g4 a4) :length-val '1/4 :interval-list '(10 11)) ;(add-interval-if-length-equal '(q c4 d4 e4 f4 e g4 a4) :length-val 'q :interval-list '(10 11)) ;;; MAIN FUNCTION ;;; ============================= (defun add-interval-if-length (omn &key (condition '>) (length-val '1/8)(interval-list '(4 3 4 7 4 3 5 4 7 3))) (do-verbose ("add-interval-if-length") (if (equal condition '>) (add-interval-if-length-greater omn :length-val length-val :interval-list interval-list) (if (equal condition '<) (add-interval-if-length-lesser omn :length-val length-val :interval-list interval-list) (if (equal condition '=) (add-interval-if-length-equal omn :length-val length-val :interval-list interval-list) ))))) SB.
  18. Hello, a small piece for piano solo. Score script attached to this post. SB. Jeu2PourPiano.opmo
  19. (let ((i -1)) (defun next (liste) (nth (mod (incf i) (length liste)) liste))) ;;; (next '(a b c d e f)) SB.
  20. Great Tortsten and very useful !! Thank you for this function !! Stéphane
  21. Hello, a new piece for ensemble after viewing an Egon Schiele exposition in Albertina museum, Vienna. SB TheSingleOrangeWasTheOnlyLight Partition complète.pdf
  22. Hello, Here's an example of a possible way for achieve group instrumentation. The idea is to create names of instrumental groups and extract some binary list from this groups for using in do-timeline2 function for apply the instrumentation. The score is also attached to this post. ;;;--------------------------------------------------------- ;;; GROUP INSTRUMENTATION EXAMPLE ;;;--------------------------------------------------------- (setf size 12) ;;; Basic Pitch material generation (setf pmat (integer-to-pitch (rnd-number 24 -4 16))) ;;; Global velocity definition (setf gvel (rnd-sample size '((pp)(p)(mp)(mf)(f)))) ;;; OMN material for each instrument (setf flute (make-omn :pitch (pitch-transpose 12 (rnd-sample-seq (rnd-number size 2 8) (gen-repeat 6 (list pmat)))) :length (euclidean-rhythm (gen-repeat size '(16)) 1 16 's :type '(2)) :velocity gvel )) (setf clarinet (make-omn :pitch (pitch-transpose 7 (rnd-sample-seq (rnd-number size 2 8) (gen-repeat 6 (list pmat)))) :length (euclidean-rhythm (gen-repeat size '(16)) 1 16 's :type '(2)) :velocity gvel )) (setf violin (make-omn :pitch (pitch-transpose 10 (rnd-sample-seq (rnd-number size 2 8) (gen-repeat 6 (list pmat)))) :length (euclidean-rhythm (gen-repeat size '(16)) 1 8 's :type '(2)) :velocity gvel )) (setf violoncello (make-omn :pitch (pitch-transpose -12 (rnd-sample-seq (rnd-number size 2 8) (gen-repeat 6 (list pmat)))) :length (euclidean-rhythm (gen-repeat size '(16)) 1 8 's :type '(2)) :velocity gvel )) (setf piano-rh (make-omn :pitch (pitch-transpose 4 (rnd-sample-seq (rnd-number size 2 8) (gen-repeat 6 (list pmat)))) :length (euclidean-rhythm (gen-repeat size '(16)) 1 8 's :type '(2)) :velocity gvel )) (setf piano-lh (make-omn :pitch (pitch-transpose -17 (rnd-sample-seq (rnd-number size 2 8) (gen-repeat 6 (list pmat)))) :length (euclidean-rhythm (gen-repeat size '(16)) 1 4 's :type '(2)) :velocity gvel )) ;;; GROUP INSTRUMENTATION ;;; the main idea is to generate some binary list ;;; based on the interpretation of "instrumental textures or group names). ;; INSTRUMENTAL GROUPS DEFINITION (setf texture1 '(flute clarinet)) (setf texture2 '(flute violin)) (setf texture3 '(flute clarinet violoncello piano-rh piano lh)) (setf texture4 '(clarinet violin violoncello)) (setf texture5 '(violin violoncello piano-rh piano-lh)) (setf texture6 '(flute)) (setf orch-template '(flute clarinet violin violoncello piano-rh piano-lh )) ;; utility function definition (defun binary-orch1 (orch-template groups) (loop for i in orch-template collect (if (member i groups) 0 1))) ;; main function (defun binary-orch (orch-template groups) (mapcar (lambda(x) (binary-orch1 orch-template x)) groups)) ;; group order choice (setf orchestration1 (apply-eval (rnd-sample size '( texture1 texture2 texture3 texture4 texture5 texture6 )))) ;; generate binary from group order (setf binary-from-orch (binary-orch orch-template orchestration1 )) ;; apply the orchestration (do-timeline2 '(flute clarinet violin violoncello piano-rh piano-lh) (matrix-transpose binary-from-orch) '(gen-pause x) ) ;;;--------------------------------------------------------- ;;; Score and Layout ;;;--------------------------------------------------------- (def-score pierrot-ensemble (:title "Title" :composer "Composer" :copyright "Copyright ©" :key-signature 'chromatic :time-signature '((1 1 1 1) 4) :tempo 71 :layout (list (bracket-group (flute-layout 'flute) (clarinet-layout 'clarinet) (violin-layout 'violin) (violoncello-layout 'violoncello)) (piano-layout 'piano-rh 'piano-lh))) (flute :omn flute :channel 1 :sound 'gm :program 'flute :volume 95 :pan 70 :controllers (91 '(52)) ) (clarinet :omn clarinet :channel 3 :sound 'gm :program 'clarinet :volume 95 :pan 60 :controllers (91 '(57)) ) (violin :omn violin :channel 14 :sound 'gm :program 'violin :volume 100 :pan 16 :controllers (91 '(48)) ) (violoncello :omn violoncello :channel 15 :sound 'gm :program 'cello :volume 90 :pan 95 :controllers (91 '(60)) ) (piano-rh :omn piano-rh :channel 7 :sound 'gm :program 'acoustic-grand-piano :volume 100 :pan 64 :controllers (91 '(60)) ) (piano-lh :omn piano-lh :channel 8 :sound 'gm :program 'acoustic-grand-piano :volume 100 :pan 64 :controllers (91 '(60)) ) ) SB. ExempleForumInstrumentation.opmo
  23. (rnd-pick '(((h q) (h)) ((h. q) (h)) ((h. h) (h))) :encode nil) => ((h. q) (h)) It works this way but i think it need to work also with :encode T. May be a bug in encoding process who remove nested list. Janusz ? S.
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy