Jump to content

opmo

Administrators
  • Posts

    2,894
  • Joined

  • Last visited

Posts posted by opmo

  1. If you use this library please replace the content of the "Load CL-Collider library.lisp" file with the code below:

     

    ;;; -----------------------------------------------------------
    ;;; Load CL-Collider library
    ;;; -----------------------------------------------------------
    (in-package :om)
    
    ;;; -----------------------------------------------------------
    ;;; Please note, the 'Super Collider' application needs
    ;;; to be installed (present in your Application folder)
    ;;; before activating the library.
    ;;; -----------------------------------------------------------
    ;;; To load the CL-Collider library at startup you need
    ;;; to uncomment the expressions below.
    ;;; -----------------------------------------------------------
    
    (load-cl-collider)
    
    ;;; -----------------------------------------------------------
    ;;; Start SC and server
    
    (in-package :sc)
    
    (defparameter *my-server-options*
      (make-server-options :num-output-bus 32 :block-size 32))
    
    (setf *s* (make-external-server "localhost" :port 4444 :server-options *my-server-options*))
    (server-boot *s*)
    (setf *synth-definition-mode* :load)
    
    
  2. You should omit the use of 'flat' or 'exclude', the keywords are often used with a different functionality in OM.

     

    Here is the correct use of seed in a function:

    (defun rk-rnd-order-omn (omn &key omit flatten seed)
      (let (state)
        (setf state *init-seed*)
        (setf seed (rnd-seed seed))
        (do-verbose ("rk-rnd-order-omn ~s" seed)
          (let* ((omnl (if flatten (flatten omn) omn))
                 (len (if (member 'l omit) (omn :length omnl) (rnd-order (omn :length omnl) :seed (seed))))
                 (pit (if (member 'p omit) (omn :pitch omnl) (rnd-order (omn :pitch omnl) :seed (seed))))
                 (vel (if (member 'v omit) (omn :velocity omnl) (rnd-order (omn :velocity omnl) :seed (seed))))
                 (dur (if (member 'd omit) (omn :duration omnl) (rnd-order (omn :duration omnl) :seed (seed))))
                 (arti (if (member 'a omit) (get-articulation omnl) (rnd-order (get-articulation omnl) :seed (seed))))
                 (out (make-omn :length len :pitch pit :velocity vel :duration dur :articulation arti)))
            (init-state state)
            out))))


     Examples:

    (setf mat2 '((q e5 leg e fs5 leg gs5 q a5 ten cs6 ten)
                 (h cs6 leg q b5 e d6 leg cs6 leg)
                 (q a5 cs6 marc+leg gs5 cs6 leg)
                 (h. fs5)))
                 
    (gen-loop 10 (rk-rnd-order-omn mat2 :seed 10))
    (gen-loop 10 (rk-rnd-order-omn mat2 :flatten t :seed 10))
    (gen-loop 10 (rk-rnd-order-omn mat2 :omit '(p) :flatten t :seed 10))
    (gen-loop 10 (rk-rnd-order-omn mat2))
    (gen-loop 10 (rk-rnd-order-omn mat2 :omit '(p)))
    (gen-loop 10 (rk-rnd-order-omn mat2 :omit '(l a leg) :seed 60))
    (gen-loop 10 (rk-rnd-order-omn mat2 :flatten t))

     

    This is how the function could be written. Playing with duration will destroy the original events - as you can see in the result of your function.

  3. (progn
    ;; DEFSYNTH
    (sc:defsynth sine4 ((freq 200) (dur 2.0) (vel 1.0) (pan 0) (times 0.3) (pm 12))
      (let* ((env (* 0.3 (sc:env-gen.kr (sc:perc .0 (* 4.0 dur)) :act :free) vel))
             (out (* times (sc:sin-osc.ar freq 0 (max 0 (sc:lf-noise1.kr pm)))))
             (out (sc:pan2.ar out pan)))
        (sc:out.ar 0 out)))
    
      ;; OMN-SCORE
    (setf size 200)
    (setf vector
          (list-plot
           (add-triangle-waves
            4 size 1 0.6
            :modulation (gen-triangle
                         size 1 '(0.5 0.4 0.3 0.6)
                         :modulation (gen-triangle size 1 0.3 :phase 180)))
           :point-radius 2))
    
    (setf pitches (gen-divide 4 (vector-to-pitch '(g2 g6) vector :quantize 1/4)))
    (setf transpose (pitch-transpose -12 pitches))
    (setf variants (pitch-variant transpose :variant '?))
    (setf length1 (rnd-sample 120 '(s e s -s)))
    (setf length2 (rnd-sample 120 '(s e s -s)))
    (setf time1 (span pitches length1))
    (setf time2 (span variants length2))
    (setf dynamics '(p mf ff))
    
    (setf omn1 (make-omn :length time1
                         :pitch (pitch-transpose 12 pitches)
                         :velocity (rnd-sample size dynamics)))
    
    (setf omn2 (make-omn :length time2
                         :pitch variants
                         :velocity (rnd-sample size dynamics)))
    
    ;; CONVERSION
    (setf len1 (omn-to-sc :length omn1))
    (setf len2 (omn-to-sc :length omn2))
    (setf freq1 (omn-to-sc :hertz omn1))
    (setf freq2 (omn-to-sc :hertz omn2))
    (setf vel1 (omn-to-sc :velocity omn1))
    (setf vel2 (omn-to-sc :velocity omn2))
    
    ;; SC-SCORE
    (def-sc-score add-triangle
        (:tempo 128
         :layout ((in1 . len1) (in2 . len2))
         ;:output "add-triangle"
         )
    
      (in1 :synth sine4
           :freq freq1
           :dur len1
           :times (rnd size :low 0.1 :high 0.3)
           :vel vel1
           :pan (rnd size :low -1.0 :high 1.0)
           :pm (rnd-sample size (gen-integer 6 30))
         )
    
      (in2 :synth sine4
           :freq freq2
           :dur len2
           :times (rnd size :low 0.1 :high 0.3)
           :vel vel2
           :pan (rnd size :low -1.0 :high 1.0)
           :pm (rnd-sample size (gen-integer 6 30))
         )
      )
    )

     

    image.png

     

     

     

     

  4. DEF-SC-SCORE additional keywords:
     

    output - Specifies the name of the saved audio file (provided as a string).
             By default, the file is saved in the Waveform Audio (WAVE) format.
    
    sr - Defines the sample rate of the saved audio file.
         The default setting is 48000 with a bit depth of 24 bits per sample.

     

    The :output "name" option enables you to save the score file in the Opusmodus/Media/Audio directory.
     

    (def-sc-score example2
      (:tempo 120
       :layout ((ins . len))
       :output "exp2")
      (ins :synth saw-synth
           :note midi
           :dur len
           :vel vel)
    )

     

  5. Thanks to Sungmin's support and the introduction of the new DEF-SC-SCORE macro, Opusmodus users can now create a series of instruments similar to those created with the DEF-SCORE macro for traditional instrument scores.

     

    The primary objective of the DEF-SC-SCORE was to enable users to take Opusmodus scores (whether in omn-form or single-element omn forms) and convert them to the CL-Collider (SuperCollider) input format. To achieve this, we introduced the OMN-TO-SC function specifically for this task.

     

    Below are a few examples that illustrate the conversion process and the use of the DEF-SC-SCORE macro:

     

    Example 1:

    DEFSYNTH:

    (sc:defsynth snd2 ((dur 2.0) (vel 1.0) (left 10) (right 10) (index-low 4) (index-high 12))
      (let* ((trigger (sc:impulse.kr (list left right)))
             (pitch (round (sc:t-rand.kr 36 72 trigger) 1))
             (timbre (sc:lf-noise0.kr 1/20 0.2 2))
             (env (* 1.0 (sc:env-gen.kr (sc:perc .0 (* 2.0 dur)) :act :free)
                     (sc:linen.kr trigger 0.0 vel (/ 1 (list left right)))))
             (index (+ (* env index-high) index-low))
             (pitch (sc:midicps pitch))
             (out (sc:pm-osc.ar pitch (* pitch timbre) index 0 env)))
        (sc:out.ar 0 out)))
    
    (sc:defsynth pm-crotale ((note 60) (dur 2.0) (vel 1.0) (pan 0))
      (declare (ignore amp))
      (let* ((freq (sc:midicps (+ 0 note)))
             (envl (sc:perc 0 (* 4.0 dur)))
             (mod! (+ 5 (/ 1 (sc:i-rand.ir 2 6))))
             (out (sc:pm-osc.ar freq
                                (* mod! freq)
                                (sc:env-gen.kr envl
                                               :time-scale (* 4.0 dur)
                                               :level-scale vel)
                                0
                                (sc:env-gen.kr envl
                                               :time-scale (* 4.0 dur)
                                               :level-scale 0.3)))
             (out (sc:pan2.ar out pan))
             (out (* out
                     (sc:env-gen.kr envl
                                    :time-scale (* 1.3 (* 4.0 dur))
                                    :level-scale (sc:rand.ir 0.1 0.4)
                                    :act :free))))
        (sc:out.ar 0 out)))


    OMN Score:

    (setf size 120)
    (setf vector
          (list-plot
           (gen-sine
            size 1 '(0.5 0.4 0.3 0.6)
            :modulation (gen-sine size 1 0.3 :phase 180))))
            
    (setf pitch (vector-to-pitch '(g1 g6) vector))
    (setf pitch1 (gen-divide 4 pitch))
    (setf pitch-transp (pitch-transpose -12 pitch1))
    (setf section (rnd-unique 15 (gen-integer 0 27)))
    (setf pitch2 (pitch-variant pitch-transp :variant '? :section section))
    
    (setf length1 (rnd-sample size '(s e s s)))
    (setf span (get-span length1))
    (setf length2 (length-span span (rnd-sample size '(s e s s))))
    (setf len-sum (list (sum (abs! length1))))
    
    (setf dynamic1 (rnd-sample size '(p mp mf f ff)))
    (setf dynamic2 (rnd-sample size '(p mp mf f ff)))
    
    (setf omn1 (make-omn :length length1 :pitch pitch1 :velocity dynamic1))
    (setf omn2 (make-omn :length length2 :pitch pitch2 :velocity dynamic2))

     

    DEF-SC-SCORE:

    (def-sc-score example1
        (:tempo 120
         :layout ((in1 . len1) (in2 . len2) (in3 . len-sum)))
         
      (in1 :synth pm-crotale
           :note midi1
           :dur len1
           :vel vel1
           :pan (gen-loop size (rnd1)))
           
      (in2 :synth pm-crotale
           :note midi2
           :dur len2
           :vel vel2
           :pan (gen-loop size (rnd1)))
           
      (in3 :synth snd2
           :note '(60)
           :dur length-sum
           :vel '(0.1))
      )

     

     

    Example 2:

     

    DEFSYNTH:

    (sc:defsynth pm-crotale ((note 60) (dur 2.0) (vel 1.0) (pan 0))
      (declare (ignore amp))
      (let* ((freq (sc:midicps (+ 0 note)))
             (envl (sc:perc 0 (* 4.0 dur)))
             (mod! (+ 5 (/ 1 (sc:i-rand.ir 2 6))))
             (out (sc:pm-osc.ar freq
                                (* mod! freq)
                                (sc:env-gen.kr envl
                                               :time-scale (* 4.0 dur)
                                               :level-scale vel)
                                0
                                (sc:env-gen.kr envl
                                               :time-scale (* 4.0 dur)
                                               :level-scale 0.3)))
             (out (sc:pan2.ar out pan))
             (out (* out
                     (sc:env-gen.kr envl
                                    :time-scale (* 1.3 (* 4.0 dur))
                                    :level-scale (sc:rand.ir 0.1 0.4)
                                    :act :free))))
        (sc:out.ar 0 out)))

     

    OMN Score:

    (setf chrom '(c4 cs4 d4 ds4 e4 f4 fs4 g4 gs4 a4 bb4 b4))
    (setf chords (gen-chord-series chrom chrom :method 1 :type '? :segment '?))
    (setf size (length chords))
    (setf length (rnd-sample size '(w h q -q)))

     

    DEF-SC-SCORE:

    (def-sc-score example2
        (:tempo 102
         :layout ((ins . length)))
      
      (ins :synth pm-crotale
           :note (omn-to-sc :midi chords)
           :dur length
           :vel (gen-loop size (rnd1)))
      )

     

    To see more CL-Collider (SuperCollider) examples and understand the usage of the DEF- SC-SCORE macro, please follow these steps:

     

    Navigate to the Assistant navigator.
    Press the (D) icon.
    Look for the 'CL-Collider Examples' folder. Open the 'CL-Collider.opmo' file.

     

    Happy coding,

    Janusz

  6. First get-span (to find the max length from your patters:

     

    (setf max (find-max (list (get-span pattern1)
                              (get-span pattern2)
                              (get-span pattern3)
                              (get-span pattern4))))

     

    After:

     

    (length-span max pattern1)


    etc...

    or you need to add pauses.

×
×
  • Create New...

Important Information

Terms of Use Privacy Policy