Jump to content
Sign in to follow this  
opmo

Opusmodus 1.3.24805

Recommended Posts

1.3.24805 

 

– New functions:

  •  closest-path
  •  comparative-closest-path
  •  relative-closest-path

 

– Changes:
 CHORD-CLOSEST-PATH renamed to COMPARATIVE-CLOSEST-PATH.
 CHORD-RELATIVE-PATH renamed to RELATIVE-CLOSEST-PATH.
 A new keyword :lc (live coding) added to PS function.
 The default DEF-UNFOLD-SET set name renamed to om.
:variant and :relative keywords removed from HARMONIC-PROGRESSION function.

 

– Fixed:
 HARMONIC-PROGRESSION
 HARMONIC-PATH
 PITCH-VARIANT
 PITCH-ROW 

 

– Documentation updates.
– 'Quick Start' workspace update.

 

 

VOICE LEADING FUNCTIONS

 

CLOSEST-PATH

 

The function CLOSEST-PATH returns a series of chords taking the closest path to the previous chord.

 

(closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4))

62C6C44E-BBE3-433A-82FF-ED3642173CA1.png

(closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5))

 

1AF3D275-03AA-4F74-A5B6-1FE49D4DD9B8.png

 

(closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5)
              :start 'c3eb4f5d5)

 

 

34183F3B-62CE-4332-93EB-D69F98D76B1A.png

 

(closest-path '(g5 cs3f3bb3gs4c5d5 fs5 a5b5eb6e6g2 cs3f3bb3gs4
                c5 d5fs5a5b5 eb6e6g2cs3 f3 bb3gs4c5 d5fs5a5
                b5eb6e6g2cs3f3 bb3 gs4c5d5fs5 a5b5 eb6e6g2cs3f3
                bb3gs4c5d5 fs5 a5b5eb6e6g2cs3 f3bb3gs4 c5
                d5fs5a5b5 eb6 e6g2cs3f3))

 

E1D15918-273C-48C8-B635-4DFB2D7A0FCC.png

 

(closest-path '(g5 cs3f3bb3gs4c5d5 fs5 a5b5eb6e6g2 cs3f3bb3gs4
                c5 d5fs5a5b5 eb6e6g2cs3 f3 bb3gs4c5 d5fs5a5
                b5eb6e6g2cs3f3 bb3 gs4c5d5fs5 a5b5 eb6e6g2cs3f3
                bb3gs4c5d5 fs5 a5b5eb6e6g2cs3 f3bb3gs4 c5
                d5fs5a5b5 eb6 e6g2cs3f3)
              :start 'c3eb4f5d6)

 

AA067B82-3C57-4CBB-8ADE-CEBE0DD71D06.png

 

(closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3)
                (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5)
                (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4)))

 

33FCBEB2-2049-40FE-962F-8194C259B093.png

(closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3)
                (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5)
                (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4)))
              :start '(c3eb4 f5d5 eb4f5))

 

77A8A224-4E54-413B-9876-BA998E9C556E.png

 

 

 

 

COMPARATIVE-CLOSEST-PATH

 

The function COMPARATIVE-CLOSEST-PATH returns a series of chords taking the comparatively closest path to the previous chord, derived from randomising the pitch order of a given chord before the ‘find closest interval’ process.

 

(comparative-closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4))

C11DA351-3688-4D5C-A4B8-08E21B2E8C23.pngAA8AF271-D9A6-4ECD-8508-26C3D163C78C.png

 

 

Etc…

 

(comparative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5))

 

B80D5F49-4BB5-4000-817F-2C1BC43C4D01.png7E99E8B5-5853-4470-BC81-3C1CC2479F0F.png

 

Etc…

 

 

(comparative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5)
                          :start 'c3eb4f5d5)

 

47CFB80F-697A-4454-92AE-7D4CAF33F5D8.png06163D31-3197-4058-AB0B-893430EA9FCA.png

 

Etc…

 

(comparative-closest-path '(g5 cs3f3bb3gs4c5d5 fs5 a5b5eb6e6g2 cs3f3bb3gs4
                            c5 d5fs5a5b5 eb6e6g2cs3 f3 bb3gs4c5 d5fs5a5
                            b5eb6e6g2cs3f3 bb3 gs4c5d5fs5 a5b5 eb6e6g2cs3f3
                            bb3gs4c5d5 fs5 a5b5eb6e6g2cs3 f3bb3gs4 c5
                            d5fs5a5b5 eb6 e6g2cs3f3))

 

2490DA2F-FB99-4EBA-BDD7-8F13ADFC6F9C.png

 

Etc…

 

(comparative-closest-path '(g5 cs3f3bb3gs4c5d5 fs5 a5b5eb6e6g2 cs3f3bb3gs4
                            c5 d5fs5a5b5 eb6e6g2cs3 f3 bb3gs4c5 d5fs5a5
                            b5eb6e6g2cs3f3 bb3 gs4c5d5fs5 a5b5 eb6e6g2cs3f3
                            bb3gs4c5d5 fs5 a5b5eb6e6g2cs3 f3bb3gs4 c5
                            d5fs5a5b5 eb6 e6g2cs3f3)
                          :start 'c3eb4f5d6)

 

4EE23550-0F3D-48EC-9BB8-62E9DF122423.png

 

Etc...

 

(comparative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3)
                            (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5)
                            (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4)))

 

FF3EA85C-4970-4480-A2A0-9CDAA0DD37F5.png

 

Etc…

 

(comparative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3)
                            (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5)
                            (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4))
                          :start '(c3eb4 f5d5 eb4f5))

 

FE72C794-95ED-43AE-A053-DAACF893D237.png

 

 

Etc…

 

With seed and 4 results:

(gen-eval 4 '(comparative-closest-path
              '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)
              :start '(c3c4c5c5)) :seed 23)

 

947C2F81-23EF-421B-BD97-4B7585F39A91.png

 

 

 

 

 

RELATIVE-CLOSEST-PATH

 

The function RELATIVE-CLOSEST-PATH generates cartesian series of intervals form a given chord. It then selects randomly the relative closest path (transition) to the previous chord.

 

(relative-closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4))

 

AC8BEFBE-0E7A-45BB-AC40-0FD93745126E.pngB559F54B-47FE-4862-9BFB-1B3FEDC65982.png94531108-F355-461B-B39B-B69BFAE2868D.png

C2087FC5-730E-4D53-B0A0-DBB43D76CB2C.pngE35777E3-FC8E-41F3-A0A5-38FE3EEDE3B0.png4365E224-1BB1-4575-B0C7-FF8CC72F9091.png

 

Etc…

 

(relative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5))

 

90D445C6-13AB-4778-B582-A3C59EFE9934.png81C14719-D7E0-4257-9D37-51EC9D8A9E41.png

 

Etc…

 

(relative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5)
                       :start 'c3eb4f5d5)

 

EEBE05A3-7795-4885-99EC-E28AE59D1A21.png648F1E36-DB90-49E9-A6EB-E1B85FF2634F.png

 

Etc…

 

(relative-closest-path '(g5 cs3f3bb3gs4c5d5 fs5 a5b5eb6e6g2 cs3f3bb3gs4
                         c5 d5fs5a5b5 eb6e6g2cs3 f3 bb3gs4c5 d5fs5a5
                         b5eb6e6g2cs3f3 bb3 gs4c5d5fs5 a5b5 eb6e6g2cs3f3
                         bb3gs4c5d5 fs5 a5b5eb6e6g2cs3 f3bb3gs4 c5
                         d5fs5a5b5 eb6 e6g2cs3f3))

 

AE21BAFA-7B70-4780-B0BD-ACF551137827.png

 

Etc…

 

(relative-closest-path '(g5 cs3f3bb3gs4c5d5 fs5 a5b5eb6e6g2 cs3f3bb3gs4
                         c5 d5fs5a5b5 eb6e6g2cs3 f3 bb3gs4c5 d5fs5a5
                         b5eb6e6g2cs3f3 bb3 gs4c5d5fs5 a5b5 eb6e6g2cs3f3
                         bb3gs4c5d5 fs5 a5b5eb6e6g2cs3 f3bb3gs4 c5
                         d5fs5a5b5 eb6 e6g2cs3f3)
                       :start 'c3eb4f5d6)

 

18DC9307-C498-4E0D-AF0E-12E3BEFE5890.png

 

Etc…

 

(relative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3)
                         (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5)
                         (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4)))

 

4FCEFCE1-E221-43B3-989F-D6FD64244BAD.png

 

Etc…

 

(relative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3)
                         (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5)
                         (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4))
                       :start '(c3eb4 f5d5 eb4f5))

 

FF94BD3E-51B5-4F3D-B028-CD4AE7A8C3D4.png

 

Etc…

 

(gen-eval 4 '(relative-closest-path
              '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)) :seed 542)
=> ((c4e4g4b4 c4e4f4a4 a3b3d4f4 d4e4g4b4)
    (c4e4g4b4 e4f4a4c5 d4f4a4b4 b3e4g4d5)
    (g3e4b4c5 e3f4a4c5 d3a4b4f5 d3g4b4e5)
    (g3e4b4c5 a3f4c5e5 f3a4b4d5 d3e4g4b4))

 

84D101F0-A675-469C-A2AF-8E38DF4C8930.png

 

 

 

 

Live Coding option in PS function


The :play :lc (live coding) option allows you to send the result of a PS function to ‘Live Coding Instrument’ in a live coding performance.

 

(progn
  (setf
   mat '((-w.)
         (h. eb4 pp q g3 -e q gs4 mf -s a5 p tie)
         (e. a5 -e q bb4 mf -s q cs5 p -s q. e5 mf -e.)
         (q cs5 p h. d5 mf -q c5 pp tie)
         (h c5 pp h. gs3 -e a4 p<)
         (h. fs5 mp q bb3 c5 p e4 mf tie)
         (h e4 -e q cs4 mp h d5 p e f4)
         (q d4 pp s eb4 < leg g4 < leg bb4 < leg a4 q. cs5 mf -e
            3q gs5 > leg fs5 > leg c5 > b4 > leg f4 leg e4)
         (t d4 p< leg eb4 < leg g4 f leg bb4 q. a4 marc
            t fs4 mf leg gs4 leg e. c5 e b4 t f5 leg e5 leg d5 leg eb5
            3q bb5 > a4 > bb5 > e a4 pp stacc -e)))
  
  (setf
   v1 (filter-density '(0.7 0.1 0.2 0.0 0.2 0.3 0.3) mat :type :length)
   v2 (filter-density '(0.0 0.2 0.0 0.2 0.2 0.4 0.3) mat :type :length)
   v3 (filter-density '(0.2 0.7 0.2 0.2 0.2 0.3 0.2) mat :type :length)
   v4 (filter-density '(0.0 0.2 0.2 0.7 0.2 0.2 0.7) mat :type :length))
  
  (setf
   vn1 (unfold 'om '(t7 dyn bti vn) v1)
   vn2 (unfold 'om '(t7 v? dyn bti vn) v2)
   vla (unfold 'om '(v? ra dyn bti va) v3)
   vlc (unfold 'om '(t-12 t-5 v? a-12-12 dyn bti vc) v4))
  
  (ps 'gm :sq (list vn1 vn2 vla vlc) :tempo 68 :play :lc)
  )

 

 

 

QUICK START WORKSPACE


To update your 'Quick Start' workspace to the latest version you need to delete the 'Quick Start' folder from the Opusmodus directory first.

After the deletion go to the Opusmodus menu 'Help' and select 'Install Quick Start Workspace'.

To open the new 'Quick Start' workspace file simply select 'Open Quick Start Workspace' form the 'Help' menu.

 

That's all for now,

best wishes,

Janusz

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...