Jump to content
Sign in to follow this  
opmo

Opusmodus 1.3.24952

Recommended Posts

– 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-DIVIDELENGTH-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)
AC677FE0-3292-4AF6-BEDD-39D537EAACC4.png

To rotate the polygon we change the starting point value:

(circle-rhythm-plot (polygon-rhythm '(1 6 10) 16 2) :points 16)
ED684D7B-DD61-4B70-A862-152BF7F925D1.png
(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)
503E6BBA-C78B-44D9-8332-26D2DCB8FB0E.png

 

Best wishes,

JP

Share this post


Link to post
Share on other sites

Thanks Janusz. 

Didier

Share this post


Link to post
Share on other sites

Thanks for the update Janusz. 

 

I am trying to port some code that uses length-divide2, but the interface changed as well, and I do not have access anymore to the old documentation of the original function. length-divide2 had three positional arguments, but length-subdivision has only two. The former first two arguments are now expressed as sublists of the new first argument, i.e., a matrix-transpose transformation of the former first and second argument?

 

 Thanks!

 

Best,

Torsten

 

PS: I am all for refactoring of Opusmodus functions, but if you want people to develop code that depends on Opusmodus functions, then it would be helpful if those changes are even more carefully described 🙂 

 

 

-------------------------------------------

 

 

> Enable or disable the DO-VERBOSE macro. 

 

I tried doing that in a file in the folder Opusmodus/Extensions.  I confirmed that this file is loaded (e.g., setting *snippet-length-line* in the same file works) and that setting *do-verbose* to NIL does what it is supposed to do, but somehow the value of *do-verbose* is overwritten to T again after that extension file is loaded. 

 

Is that expected? I checked that this variable is not changed anywhere in my code (it never occurs on my machine except that extension). Do you recommend setting this variable somewhere else in some automatically loaded file? 

 

Thanks! 

 

Best,

Torsten

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  

×
×
  • Create New...