Jump to content
Sign in to follow this  
opmo

Opusmodus with sound synthesis package (CLM)

Recommended Posts

Since some time we are working on implementing Bill's Schottstaedt 'Synthesis package CLM' into Opusmodus.

As expected we make the CLM working with OMN form sequence or with single parameters - example below.

 

The score is using partials from The Bells of the Campanile: La Marangona.

Below you will find an audio file of the score which is rendered each time you make evaluation.

 

Best wishes to all,

Janusz

;; ---------------------------------------------------------
;; MARANGONA
;; ---------------------------------------------------------
;; Parameters

(defparameter count 50)

(setf partials1 (library 'marangona-partials 'partials nil :random 50))
(setf partials2 (library 'marangona-partials 'partials nil :random 50))
(setf partials3 (library 'marangona-partials 'partials nil :random 50))
(setf partials4 (library 'marangona-partials 'partials nil :random 50))

(setf par1 (rnd-sample count (partial :freq (flatten partials1))))
(setf par2 (rnd-sample count (partial :freq (flatten partials2))))
(setf par3 (rnd-sample count (partial :freq (flatten partials3))))
(setf par4 (rnd-sample count (partial :freq (flatten partials4))))

(defparameter freq1 (gen-divide (rnd-sample count '(2 3 4 5)) par1))
(defparameter freq2 (gen-divide (rnd-sample count '(1 2 3 4 5)) par2))
(defparameter freq3 (gen-divide (rnd-sample count '(1 2 3 1 4 5)) par3))
(defparameter freq4 (gen-divide (rnd-sample count '(1 2 3 1 4 5)) par3))

(defparameter len1 (list (length-span 42 (rnd-sample count '(w h q w)))))
(defparameter len2 (list (length-span 42 (rnd-sample count '(d h h)))))
(defparameter len3 (list (length-span 42 (rnd-sample count '(h. w q)))))
(defparameter len4 (list (length-span 42 (rnd-sample count '(d d h)))))

(do-timeline
 '( 
   len1 (---xxx-xx- ---xxx---- --x--xx--- ---x------ x-)
   len2 (---xxx-xx- ---xx-x--- --x--xx--- ---x------ x-)
   len3 (---xxx-xx- ---xx--x-- --x--xx--- ---x------ --)
   len4 (---xxx-xx- ---xx---x- --x--xx--- ---x------ --)
   )
 '(gen-pause x) :time '(w))

(defparameter dur1 (omn :length (flatten len1)))
(defparameter dur2 (omn :length (flatten len2)))
(defparameter dur3 (omn :length (flatten len3)))
(defparameter dur4 (omn :length (flatten len4)))

(defparameter amp1 (rnd-number count 0.05 0.43))
(defparameter amp2 (rnd-number count 0.05 0.43))
(defparameter amp3 (rnd-number count 0.05 0.43))
(defparameter amp4 (rnd-number count 0.05 0.43))

(defparameter env '((0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0)
                    (0 0 60 .1000 80 .2000 90 .4000 95 1 100 0)
                    (0 0 10 1 16 0 32 .1000 50 1 56 0 60 0 90 .3000 100 0)
                    (0 0 30 1 56 0 60 0 90 .3000 100 0)
                    (0 0 50 1 80 .3000 100 0)
                    (0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0)
                    (0 0 10 1 32 .1000 50 1 90 .3000 100 0)
                    (0 0 60 .1000 80 .3000 95 1 100 0)
                    (0 0 80 .1000 90 1 100 0)))

;; ---------------------------------------------------------
;; Score

(with-sound (:play nil :reverb jc-reverb
                   :scaled-to .7 :statistics t
                   :channels 2 :output "marangona-series")
  
  (fm-violin-synth dur1 freq1 amp1
                  :degree (rnd-number count 45 85)
                  :fm-index (rnd-number count 0.10 1.0)
                  :reverb-amount 0.30
                  :noise-amount (rnd-number count 0.00 0.004)
                  :amp-env (rnd-sample count env)
                  :fm1-rat (rnd-number count 0.00 6.718)
                  :fm2-rat (rnd-number count 0.00 4.414)
                  :fm3-rat (rnd-number count 0.00 1.141)  
                  :glissando-amount (rnd-number count 0.00 0.8)
                  )
  
  (fm-violin-synth dur2 freq2 amp2
                  :degree (rnd-number count 45 85)
                  :fm-index (rnd-number count 0.10 1.0)
                  :reverb-amount 0.30
                  :noise-amount (rnd-number count 0.00 0.004)
                  :amp-env (rnd-sample count env)
                  :fm1-rat (rnd-number count 0.00 4.718)
                  :fm2-rat (rnd-number count 0.00 6.414)
                  :fm3-rat (rnd-number count 0.00 1.141)
                  :glissando-amount (rnd-number count 0.00 0.8)
                  )
  
  (fm-violin-synth dur3 freq3 amp3
                  :degree (rnd-number count 45 85)
                  :fm-index (rnd-number count 0.10 1.0)
                  :reverb-amount 0.30
                  :noise-amount (rnd-number count 0.00 0.004)
                  :amp-env (rnd-sample count env)
                  :fm1-rat (rnd-number count 0.00 1.718)
                  :fm2-rat (rnd-number count 0.00 4.414)
                  :fm3-rat (rnd-number count 0.00 6.141)
                  :glissando-amount (rnd-number count 0.00 0.8)
                  )
  
  (fm-violin-synth dur4 freq4 amp4
                  :degree (rnd-number count 45 85)
                  :fm-index (rnd-number count 0.10 1.0)
                  :reverb-amount 0.30
                  :noise-amount (rnd-number count 0.00 0.004)
                  :amp-env (rnd-sample count env)
                  :fm1-rat (rnd-number count 0.00 4.718)
                  :fm2-rat (rnd-number count 0.00 6.414)
                  :fm3-rat (rnd-number count 0.00 1.141)
                  :glissando-amount (rnd-number count 0.00 0.8)
                  )
  )

 

Score with omn-form sequence:

(with-sound (:play nil :channels 2 :reverb jc-reverb
             :scaled-to .6 :statistics t :output "quartet")

  (fm-violin-omn vn1 :reverb-amount 0.20 :bpm 44)
  (fm-violin-omn vn2 :reverb-amount 0.20 :bpm 44)
  (fm-violin-omn va :reverb-amount 0.20 :bpm 44)
  (fm-violin-omn vc :reverb-amount 0.20 :bpm 44)
  )

 

 

Share this post


Link to post
Share on other sites

This opens up windows to Spectral work withing Opusmodus !

Congrats !

I'm so curious about the timeline stuff...

All the best !

Share this post


Link to post
Share on other sites

I'am strongly interested in a C-Sound-like environment in OM!

The example above is not working yet, right?

Is it possible to load the CLM package myself into OM (to follow the tutorial on the CLM Page)? If yes, how, can you give a brief instruction?

 

Thanks!

Share this post


Link to post
Share on other sites

There are too many errors especially with .dynlib path and there are lines of code that are unsafe in CCL.

We now have solved all of this. CLM will be part of version 1.3

Share this post


Link to post
Share on other sites

Thanks for the answer! I'am not asking for a release date, practising paitience in the mean time :–)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Topics

    • By opmo
      – Update:
      SNIPPET – length snippet will display without a line staff.

      To display the length SNIPPET line staff, set the *SNIPPET-LENGTH-LINE* to T. 
      (defparameter *snippet-length-line* T "Enable or disable the length snippet line staff display.") The default is: NIL

      – Fixes:
      Bug fix found in length conversion to length-symbols function.
      Missing OM Developer documents (English version).
       
      Best wishes,
      Janusz
    • By opmo
      – Function name changes:
      LENGTH-DIVIDE2 to LENGTH-SUBDIVISION
      LENGTH-DIVIDE3 to LENGTH-SYNCOPATE

      – Function update:
      LENGTH-DIVIDE – changes to arguments.
      LENGTH-SUBDIVISION – changes to arguments.
      LENGTH-SYNCOPATE – changes to arguments.
      POLYGON-RHYTHM – enable fixed sides polygon. 

      – Note:
      If you used any of the functions:
      LENGTH-DIVIDE, LENGTH-DIVIDE2 or LENGTH-DIVIDE3 in your scores,
      please check new documents in order to make the necessary correction.

      – New:
      Enable or disable the DO-VERBOSE macro. 
      (defparameter *do-verbose* nil "Enable or disable traces printed by do-verbose.")  
       
      length-divide
      This function is able to divide number of lengths to a given division value. The :set and :ignore option increases the control for the desired result. When processing the omn-form sequence an optional third value allows you to fill intervalic steps (a root transposition) to new length values derived from the divisions.
       
      (setf rhy '(1/4 1/4 1/4 1/4)) (length-divide '(2 2) rhy) => (1/8 1/8 1/4 1/4 1/8 1/8) (length-divide '(2 4) rhy) => (1/4 1/16 1/16 1/16 1/16 1/16 1/16 1/16 1/16 1/4)  
      Example:
      (length-divide '(1 2) '(1/4 -1/8 1/16 1/16 -1/32 -3/32 1/8 1/1) :seed 34) => (1/4 -1/8 1/16 1/32 1/32 -1/32 -3/32 1/8 1)  
      In the example above only 1 length is divided by 2 - that is the 1/16. In the example below 4 lengths are divided by 2.
      (length-divide '(4 2) '(1/4 -1/8 1/16 1/16 -1/32 -3/32 1/8 1/1) :seed 34) => (1/8 1/8 -1/8 1/16 1/32 1/32 -1/32 -3/32 1/16 1/16 1/2 1/2) (length-divide '(1 2) '(1/4 -1/8 1/16 1/16 -1/32 -3/32 1/8 1/1) :set 'min :seed 34) => (1/4 -1/8 1/32 1/32 1/16 -1/32 -3/32 1/8 1) (length-divide '(1 4) '(1/4 -1/8 1/16 1/16 -1/32 -3/32 1/8 1/1) :set 1/8 :seed 34) => (1/4 -1/8 1/16 1/16 -1/32 -3/32 1/32 1/32 1/32 1/32 1) (length-divide '((2 3) (1 2)) '((1/4 -1/8 1/16 1/16) (1/32 -3/32 1/8 1/1)) :ignore 'max :seed 45) => ((1/4 -1/8 1/48 1/48 1/48 1/48 1/48 1/48) (1/64 1/64 -3/32 1/8 1)) (length-divide '((2 4) (1 2)) '((q -e s s) (s -e. e w)) :set 'max :ignore 1 :seed 65) => ((1/16 1/16 1/16 1/16 -1/8 1/16 1/64 1/64 1/64 1/64) (1/16 -3/16 1/16 1/16 1))
      OMN:
      (setf mat1 '(q c4 d4 e4 f4 g4 a4 b4)) (length-divide '(3 4) mat1 :seed 45) => (s d4 bb3 cs4 b3 cs4 eb4 c4 e4 q s g4 e4 eb4 fs4 q g4 a4 b4)
      Symbol 'r will apply repeat function:
      (length-divide '(3 4 r) mat1 :seed 45) => (s c4 c4 c4 c4 d4 d4 d4 d4 q e4 s f4 f4 f4 f4 q g4 a4 b4)
      Here we use a set of interval values at the end of the division list:
      (length-divide '(3 4 (13 0 1 13)) mat1 :seed 45) => (s cs5 c4 cs4 cs5 eb5 d4 eb4 eb5 q e4 s fs5 f4 fs4 fs5 q g4 a4 b4) (setf mat2 '((e c4 p e4 mp g4 he c5 p) (q c4 f c4 cs4 mp - d5 p d5) (q cs5 mf = - - cs5 p =))) (length-divide '((1 4) (2 4) (2 5)) mat2 :seed 34) => ((e c4 p e4 mp t a4 f4 gs4 fs4 he c5 p) (q c4 f s b3 cs4 bb3 d4 q cs4 mp - d5 p s c5 e5 cs5 eb5) (q cs5 mf cs5 - - 5q eb5 p b4 c5 d5 eb5 c5 eb5 b4 d5 c5))
      In the example below we assign three series of division values to variables s1, s2 and s3:
      (setf s1 '(3 4 (6 12 18 24)) s2 '(3 4 ((13 1 13 0) (13 0 7 1) r)) s3 '(2 5 ((13 0 13 0 13) ?)) ) (length-divide (list s1 s2 s3) mat2 :seed 34) => ((e c4 p t bb4 mp e5 bb5 e6 cs5 g5 cs6 g6 et fs5 p c6 fs6 c7) (q c4 f s cs5 cs4 cs5 c4 q cs4 mp - s eb6 p d5 a5 eb5 d5 d5 d5 d5) (5q d6 mf cs5 d6 cs5 d6 q cs5 - - cs5 p 5q d5 eb5 c5 b4 d5))  
       
      length-subdivision
      This function is able to divide a list of lengths into a number of subdivisions derived from a given length segment value. The :type and :position option increases the control for the desired result. When processing the omn-form sequence an optional third value allows you to fill intervalic steps (a root transposition) to new length values derived from the divisions. This function is a more sophisticated version of LENGTH-DIVIDE. It produces fascinating variants on the simplest of note-lengths, as can be seen below.
       
      (setf rhy '(1/4 1/4 1/4 1/4)) (length-subdivision '(2 1/8) rhy) => (1/8 1/8 1/8 1/8 1/8 1/8 1/8 1/8)
      position 's (start):
      (length-subdivision '(2 1/16) rhy :position 's) => (1/16 1/16 1/8 1/16 1/16 1/8 1/16 1/16 1/8 1/16 1/16 1/8)
      position 'e (end):
      (length-subdivision '(2 1/16) rhy :position 'e) => (1/8 1/16 1/16 1/8 1/16 1/16 1/8 1/16 1/16 1/8 1/16 1/16)
      type 'r (rest), position 'e (end):
      (length-subdivision '(2 1/16) rhy :type 'r :position 'e) => (-1/8 1/16 1/16 -1/8 1/16 1/16 -1/8 1/16 1/16 -1/8 1/16 1/16)
      type 'r (rest), position 's (end):
      (length-subdivision '(2 s) rhy :type 'r :position 's) => (1/16 1/16 -1/8 1/16 1/16 -1/8 1/16 1/16 -1/8 1/16 1/16 -1/8)
      type at random, rest or note :
      (length-subdivision '(2 s) rhy :type '? :position 's) => (1/16 1/16 -1/8 1/16 1/16 -1/8 1/16 1/16 -1/8 1/16 1/16 1/8)
      position and type at random:
      (length-subdivision '(1 e) rhy :type '? :position '? :seed 34) => (1/16 1/8 1/16 1/8 1/8 -1/8 1/8 1/8 1/8) (length-subdivision '((2 5q) (1 3q)) rhy :type '? :position 's :seed 34) => (1/20 1/20 3/20 1/12 -1/6 1/20 1/20 3/20 1/12 -1/6) (length-subdivision '((2 5q) (1 3q) (1 e) (1 s)) rhy :seed 34) => (1/20 1/20 3/20 1/12 1/12 1/12 1/8 1/8 3/16 1/16)  
      Example:
      (setf rhy2 '((1/4 1/4 1/4 1/4) (1/4 1/4 1/4 1/4))) (length-subdivision '(1 e) rhy2 :seed 34) => ((1/8 1/8 1/16 1/8 1/16 1/8 1/8 1/8 1/8) (1/16 1/8 1/16 1/8 1/8 1/8 1/8 1/8 1/8)) (length-subdivision '((1 e) (1 3q)) rhy2 :seed 34) => ((1/8 1/8 1/12 1/12 1/12 1/8 1/8 1/6 1/12) (1/16 1/8 1/16 1/6 1/12 1/8 1/8 1/6 1/12)) (length-subdivision '(((1 e)) ((1 3q))) rhy2 :seed 34) => ((1/8 1/8 1/16 1/8 1/16 1/8 1/8 1/8 1/8) (1/12 1/12 1/12 1/6 1/12 1/12 1/6 1/6 1/12)) (length-subdivision '((3 3q) (1 e)) '((q -e e h) (s e. q h)) :seed 65) => ((1/12 1/12 1/12 -1/8 1/8 1/12 1/12 1/12 1/4) (1/16 3/16 1/8 1/8 1/8 1/12 1/12 1/12 1/8)) (length-subdivision '(((3 3q)) ((1 e))) '((q -e e h) (s e. q h)) :seed 65) => ((1/12 1/12 1/12 -1/8 1/8 1/12 1/12 1/12 1/4) (1/16 1/16 1/8 1/16 1/8 1/16 1/8 3/8)) (length-subdivision '(((2 3q)) ((1 e))) '((q -e e h) (s e. q h)) :type '? :seed 65) => ((1/12 1/12 1/12 -1/8 1/8 1/12 1/12 -1/3) (1/16 -1/16 1/8 1/8 1/8 1/8 3/8))
      OMN:
      (setf mat1 '(q c4 d4 e4 f4 g4 a4 b4)) (length-subdivision '(1 e) mat1 :seed 45) => (s cs4 e b3 s d4 e cs4 e4 s f4 e fs4 s d4 e fs4 eb4 f4 a4 bb4 gs4 bb4 a4)
      The symbol 'r (third value) will apply repeat function:
      (length-subdivision '(1 e r) mat1 :seed 45) => (s c4 e s e d4 d4 s e4 e s e f4 f4 g4 g4 a4 a4 b4 b4)
      Here we define the intervals (third value):
      (length-subdivision '(1 e (13 0 13 0)) mat1 :seed 45) => (s cs5 e c4 s cs5 e eb5 d4 s f5 e e4 s f5 e fs5 f4 gs5 g4 bb5 a4 c6 b4) (length-subdivision '(4 s (13 0 13 0)) mat1 :seed 45) => (s cs5 c4 cs5 c4 eb5 d4 eb5 d4 f5 e4 f5 e4 fs5 f4 fs5 f4 gs5 g4 gs5 g4 bb5 a4 bb5 a4 c6 b4 c6 b4) (length-subdivision '(2 3q (13 0 13 0)) mat1 :type '(r n) :seed 45 :position '(e s s s e s s)) => (-3q cs5 c4 eb5 d4 eb5 f5 e4 - fs5 f4 fs5 - gs5 g4 bb5 a4 bb5 c6 b4 -) (setf mat2 '((e c4 p e4 mp g4 he c5 p) (q c4 f c4 cs4 mp - d5 p d5) (q cs5 mf = - - cs5 p =))) (length-subdivision '((1 e (13 0 13 0)) (2 e (13 0 13 0)) (2 3q (13 0 13 0))) mat2 :type '? :seed 34) => ((e c4 p e4 mp g4 q cs6 p e c5 q cs6) (e cs5 f c4 cs5 c4 -3q d5 mp cs4 -q e eb6 p d5 eb6 d5) (-s e cs5 mf -s e d6 cs5 -q - 3e d6 p 3q cs5 d6 3e cs5 e d6 cs5)) (length-subdivision '(((1 e (13 0 13 0))) ((2 s (13 0 13 0))) ((2 3q r))) mat2 :type '? :seed 34) => ((e c4 p e4 mp g4 q cs6 p e c5 q cs6) (e cs5 f s c4 cs5 -e s cs5 c4 e d5 mp s cs4 d5 -q -s eb6 p d5 - eb6 d5 eb6 d5) (3q cs5 mf cs5 cs5 cs5 cs5 cs5 -q - 3q cs5 p cs5 - - cs5 cs5))  
      In the example below we assign three series of values to variables s1, s2 and s3:
      (setf s1 '(2 e (6 12 18 24)) s2 '(1 3q ((13 1 13 0) (13 0 7 1) r)) s3 '(3 5q ((13 0 13 0 13) ?)) ) (length-subdivision (list s1 s2 s3) mat2 :seed 23) => ((e c4 p 3e bb4 mp 3q e5 e cs6 cs5 p cs6 q.) (e fs4 f c5 3q cs5 cs4 cs5 5h mp 5q c4 g4 c4 -q e c4 p c4 3q d5 3h cs4) (e g5 mf cs6 3q d6 3h d5 -q - 5q d6 p cs5 cs5 5h e d6 cs5))  
       
       
      length-syncopate
      The function LENGTH-SYNCOPATE is a valuable way of bringing more rhythmic interest into a length list. The usual idea of syncopating rhythm is to 'choke' certain attacks so that the attack is delayed or pre-empted.
      (setf rhy '(1/4 1/4 1/4 1/4)) (length-syncopate '(1 4) rhy) => (1/4 3/16 1/16 1/4 1/4) (length-syncopate '(2 4) rhy) => (1/16 3/16 1/4 3/16 1/16 1/4)  
      Example:
      (length-syncopate '(1 4) '(1/4 -1/8 1/16 1/16 -1/8 1/8 1/1) :seed 34) => (1/4 -1/8 1/16 1/64 3/64 -1/8 1/8 1)
      In the example above only 1 length is divided by 4 (1, 3) - that is the 1/16. In the example below 2 values are divided by 3: (1, 2) and (2, 1).
      (length-syncopate '(2 3) '(1/4 -1/8 1/16 1/16 -1/8 1/8 1/1) :seed 34) => (1/4 -1/8 1/48 1/24 1/16 -1/8 1/8 2/3 1/3) (length-syncopate '(1 4) '(1/4 -1/8 1/16 1/16 -1/8 1/8 1/1) :set 1/8 :seed 34) => (1/4 -1/8 1/16 1/16 -1/8 1/32 3/32 1)
      Example with :set for each list:
      (length-syncopate '((2 3) (1 4)) '((1/4 -1/8 1/16 1/16) (1/32 -3/32 1/8 1/1)) :set '(min 1/8) :seed 45) => ((1/4 -1/8 1/24 1/48 1/24 1/48) (1/32 -3/32 3/32 1/32 1)) (length-syncopate '((2 3) (1 5)) '((q -e s s) (s -e. q h)) :set 'max :ignore 'h :seed 65 :omn t) => ((3h 3q -e s 3s 3e) (s -e. 5q 5w h))
      OMN:
      (setf mat '(q c4 d4 e4 f4 g4 a4 b4)) (length-syncopate '(3 4) mat :seed 12) => (s b3 e. cs4 q d4 e. fs4 s d4 q f4 g4 a4 e. bb4 s c5)  
      Here we use a set of interval values:
      (length-syncopate '(3 4 ((13 0) (0 14) (1 13))) mat :seed 23) => (s cs5 e. c4 d4 s e5 q e4 f4 s gs4 e. gs5 q a4 b4) (setf mat2 '((e c4 p e4 mp g4 he c5 p) (q c4 f c4 cs4 mp - d5 p d5) (q cs5 mf = - q cs5 stacc p = =)) (length-syncopate '((1 3 (-3 6)) (2 4 (6 0)) (2 5 (11 13))) mat2 :seed 34) => ((e c4 p e4 mp 3e 3q cs5 he c5 p) (q c4 f s fs4 e. c4 q cs4 mp - e. gs5 p s d5 q) (q cs5 mf cs5 - 5w c6 stacc 5q d6 stacc q cs5 p 5q c6 5w d6 q cs5))
       
       
      polygon-rhythm
      In the next three examples below we use a list of fixed polygon sides (non-symmetrical):
      (circle-rhythm-plot (polygon-rhythm '(1 6 10) 16 1) :points 16) To rotate the polygon we change the starting point value:
      (circle-rhythm-plot (polygon-rhythm '(1 6 10) 16 2) :points 16) (circle-rhythm-plot (polygon-rhythm '(0 2 5 7 10 12 13 15 16 18 19 21 23) 24 0) :points 24 :value 1/24)  
      Best wishes,
      JP
    • By opmo
      – Additions:
      ADD-TEXT-ATTRIBUTS – Optional attribute type: :sticky and :non-sticky

      – Fixed:
      Typo error in 'GM Instrument Set.lisp' file.
       
      Best wishes,
      Janusz
×
×
  • Create New...