Jump to content

opmo

Administrators
  • Posts

    2,894
  • Joined

  • Last visited

Everything posted by opmo

  1. 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)) (closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5)) (closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5) :start 'c3eb4f5d5) (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)) (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) (closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3) (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5) (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4))) (closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3) (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5) (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4))) :start '(c3eb4 f5d5 eb4f5)) 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)) Etc… (comparative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5)) Etc… (comparative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5) :start 'c3eb4f5d5) 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)) 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) Etc... (comparative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3) (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5) (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4))) Etc… (comparative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3) (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5) (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4)) :start '(c3eb4 f5d5 eb4f5)) Etc… With seed and 4 results: (gen-eval 4 '(comparative-closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4) :start '(c3c4c5c5)) :seed 23) 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)) Etc… (relative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5)) Etc… (relative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5) :start 'c3eb4f5d5) 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)) 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) Etc… (relative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3) (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5) (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4))) Etc… (relative-closest-path '((eb3f3a3 f3a3b3 g3bb3cs4 e3g3bb3) (g4bb4cs5 bb4cs5e5 b4eb5f5 a4b4eb5) (b3eb4f4 eb4f4a4 e4fs4bb4 c4e4fs4)) :start '(c3eb4 f5d5 eb4f5)) 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)) 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
  2. Maybe tolerance in quantize function will fix the problem: (defun add-rnd-dust (omnseq &key (span '(0.1)) (seed nil) (quantize '(1 2 3 4 5 6 7 8 9)) (tolerance 0.05)) ...) (add-rnd-dust '(h c3 h. d3 -h q. f3 q g3) :span '(0.5 0.3 0.2 0.1) :quantize '(1 2 3 4 8) :seed nil :tolerance 0.03) No quantiser can take care of all the small nuances this is why we have the tolerance option in the function. I like the function.
  3. What you see above is a new revised function. Examples: Now the start is optional. (chord-closest-path '(f3d4e5 e3a3gs5)) => (f3e5d4 e5gs3a3) (chord-closest-path '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8)) => (g3b3eb5 gs3cs4e5 b3g3f5 c4f3e5 d4e5f3 e5gs3a3) (chord-closest-path '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8) :start '(c3eb4f5)) => (g5eb4b2 gs5cs3e4 b2g5f4 c3f4e5 d3e5f4 e5gs4a2) (chord-closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)) => (c4b4e4g4 e4f4c4a4 b3f4d4a4 d4b3e4g4) (chord-closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4) :start '(c3eb4f5d6)) => (c3e6g4b5 e6f4c3a5 b2f6d4a5 d4b2e6g5)
  4. Please check: '(f3d4e5 e3a3gs5) (chord-closest-path '(f3d4e5) '(f3d4e5 e3a3gs5)) => (f3e5d4 e5gs3a3) '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8) (chord-closest-path '(b3eb5g3) '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8)) => (g3b3eb5 gs3cs4e5 b3g3f5 c4f3e5 d4e5f3 e5gs3a3) '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4) (chord-closest-path '(b4g4e4c4) '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)) => (c4b4e4g4 e4f4c4a4 b3f4d4a4 d4b3e4g4) yours, Janusz
  5. It is not hard if we look for strict result e.i. smallest total without thinking about parallel movement etc... Here is the result of our example (strict): (chord-closest-path '(b4g4e4c4) '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)) c-c = 0 e-e = 0 g-f = 2 b-a = 2 total 4 etc...
  6. Julio, the CHORD-CLOSEST-PATH function is doing exacly that: (chord-closest-path '(eb4g4b4) '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8))
  7. This short example demonstrates how powerful and flexible the UNFOLD function is, especially when working with short patterns. The entire process is very compact and requires only a few lines of code. Source: (progn (setf mat1 '((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)) mat2 '((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 < leg eb4 < leg g4 < 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)) p01 (unfold 'eg '(t7 dyn) mat1) p02 (unfold 'eg '(t7 v? dyn ob) mat1) p03 (unfold 'eg '(v? ra dyn) mat1) p04 (unfold 'eg '(t-12 t-5 dyn v? raf hn) p03) p05 (unfold 'eg '(t-12 t-5 ld ra dyn bn) p02) p11 (assemble-seq (unfold 'eg '(t7 dyn) mat1) (unfold 'eg '(t7 dyn) mat2)) p12 (assemble-seq (unfold 'eg '(t-12 v? dyn ob) mat1) (unfold 'eg '(t-12 v? dyn ob) mat2)) p13 (assemble-seq (unfold 'eg '(v? raf dyn) mat1) (unfold 'eg '(v? dyn) mat2)) p14 (unfold 'eg '(t-12 t-5 dyn v? raf dyn hn) p13) p15 (unfold 'eg '(t-12 t-5 ld ra dyn bn) p12)) (ps 'gm :w5 (list (assemble-seq p01 p11) (assemble-seq p02 p12) (assemble-seq p03 p13) (assemble-seq p04 p14) (assemble-seq p05 p15)))) Output: Best, JP
  8. PLEASE NOTE! The changes to OSC implementation - see below - are thanks to Rangarajan Krishnamoorthy. If you use OSC threads please revise your OSC files and make the necessary adjustments.
  9. – New functions: get-sieve-tree sieve-merge sieve-tree-series sieve-tree sieve pick-prob gen-prob create-osc-thread get-osc-thread-from-name send-osc-data osc-thread-alive? end-all-osc-threads end-osc-thread – Howto Score/OSC/OSC Threads.opmo – Changes to OSC functions, please check the new OSC documents if you use OSC. – Musicxml display improvements. SIEVE-TREE This function returns a sequence of lengths symbols derived from tree-data in a given root, node and level number. Examples: Low density output: (sieve-tree 32 2 3) With a smaller root number and a higher level number we increase the density: (sieve-tree 8 2 5) In the following example we add probability values using lists of paired values to node, level and rest parameters. The first value in the rest lists is a percentage value of the length-rests in a node-level list. (sieve-tree '(4 2) '((2 0.43) (3 0.37)) '((3 0.47) (4 0.56) (5 0.68)) :rest '((20 0.43) (80 0.6) (0 0.7)) :quantize '(1 2 3 4 5 7)) Here we are increasing the length-rest probability and set the quantize to quarter, eight and quintuplet only: (sieve-tree '(4 2) '((2 0.43) (3 0.37)) '((3 0.47) (4 0.56) (5 0.68)) :rest '((20 0.43) (80 0.6) (90 0.7)) :quantize '(1 2 5)) The expression below will generate 96 bars of gradual increase in the density: (sieve-tree 96 2 7 :seed 43) Let's examine the original tree-data from the expression above. To do that we call the GET-SIEVE-TREE function with the same tree values: (get-sieve-tree 96 2 7) SIEVE-TREE-SERIES SIEVE-TREE-SERIES returns a sequence of lengths symbols derived from a series of tree-data in a given root, node and level number. This function allows you to control individual tree-data parameters ie. density results. Please note, every parameter has a keyword, except the root number. Examples: (sieve-tree-series '((8 :node 2 :level ((3 0.47) (4 0.56) (5 0.68)) :rest ((40 0.43) (80 0.6) (0 0.7)) :quantize (1 2 4)) (3 :node 2 :level ((3 0.47) (4 0.56) (5 0.68)) :quantize (1 2 3 5 6)) (2 :node 3 :level ((4 0.46) (5 0.58)) :seed 23))) (sieve-tree-series '((2 :node 2 :level ((4 0.47) (5 0.66)) :rest ((40 0.43) (80 0.6) (0 0.7))) (8 :node 2 :level ((3 0.47) (4 0.56)) :quantize (1 2 3 5 6)) (3 :node 3 :level ((4 0.46) (5 0.58)) :rest ((40 0.43) (80 0.6) (0 0.7))))) GET-SIEVE-TREE GET-SIEVE-TREE returns a tree node degree data from a given root, node and level number. This function is useful for analysis of the original tree-data used in the SIEVE-TREE function. Examples: (get-sieve-tree 96 2 1) => ((48 48)) (get-sieve-tree 96 3 1) => ((32 32 32)) (get-sieve-tree 96 2 2) => (((24 24) (16 16 16))) (get-sieve-tree 96 3 2) => (((32) (16 16) (32/3 32/3 32/3))) (get-sieve-tree 96 2 3) => (((12 12) (8 8 8)) ((16) (8 8) (16/3 16/3 16/3))) (get-sieve-tree 96 3 3) => (((16 16)) ((8 8) (16/3 16/3 16/3)) ((32/3) (16/3 16/3) (32/9 32/9 32/9))) (get-sieve-tree 96 2 5) => (((3 3) (2 2 2)) ((4) (2 2) (4/3 4/3 4/3)) ((4 4)) ((2 2) (4/3 4/3 4/3)) ((8/3) (4/3 4/3) (8/9 8/9 8/9)) ((4 4) (8/3 8/3 8/3)) ((2 2) (4/3 4/3 4/3)) ((8/3) (4/3 4/3) (8/9 8/9 8/9)) ((8/3 8/3)) ((4/3 4/3) (8/9 8/9 8/9)) ((16/9) (8/9 8/9) (16/27 16/27 16/27))) SIEVE-TREE example with root 8, node 2 and level 5: (sieve-tree 8 2 5) Analysis of the above tree-data: (get-sieve-tree 8 2 5) => (((1/4 1/4) (1/6 1/6 1/6)) ((1/3) (1/6 1/6) (1/9 1/9 1/9)) ((1/3 1/3)) ((1/6 1/6) (1/9 1/9 1/9)) ((2/9) (1/9 1/9) (2/27 2/27 2/27)) ((1/3 1/3) (2/9 2/9 2/9)) ((1/6 1/6) (1/9 1/9 1/9)) ((2/9) (1/9 1/9) (2/27 2/27 2/27)) ((2/9 2/9)) ((1/9 1/9) (2/27 2/27 2/27)) ((4/27) (2/27 2/27) (4/81 4/81 4/81))) SIEVE SIEVE returns a list of numbers to a given modulus, shift and maximum number. This function can be useful in generating root numbers for the SIEVE-TREE function. (sieve 4 0 96) => (0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96) Examples: (sieve 2 0 60) => (0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60) (sieve 2 1 60) => (1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59) Example with SIEVE-TREE function: (sieve-tree (sieve 3 4 14) '((2 0.43) (3 0.37)) '((3 0.47) (4 0.56) (5 0.68)) :rest '((20 0.43) (80 0.6) (90 0.7))) SIEVE-MERGE SIEVE-MERGE returns a list of numbers derived from merging a number of sieve lists. This function can be useful in generating root numbers for the SIEVE-TREE function. Examples: Here we merge two sieve lists, one from (sieve 3 0 96) and one from (sieve 4 0 96): (sieve-merge '(3 0 4 0) 96) => (0 3 4 6 8 9 12 15 16 18 20 21 24 27 28 30 32 33 36 39 40 42 44 45 48 51 52 54 56 57 60 63 64 66 68 69 72 75 76 78 80 81 84 87 88 90 92 93 96) Example with SIEVE-TREE and SIEVE-MERGE function: (sieve-tree (sieve-merge '(3 2 4 2) 12) '((2 0.43) (3 0.37)) '((3 0.47) (4 0.56) (5 0.68)) :quantize '(1 2 4 8)) PLEASE NOTE! The changes to OSC implementation - see below - are thanks to Rangarajan Krishnamoorthy. If you use OSC threads please revise your OSC files and make the necessary adjustments. The CREATE-OSC-THREAD function creates the OSC thread with a given target. Here we assign a name Reaktor to a remote-host: 127.0.0.1 and remote-port: 10000: (defparameter reaktor '(127.0.0.1 10000)) Here we assign an variable to our OSC thread object, this is important for sending the data with the thread and for ending the thread: (setf thd1 (create-osc-thread "thread1" reaktor)) To send OSC messages with the thread we call the SEND-OSC-DATA function: (send-osc-data thd1 '((0.0 1/2) (0.0 1/2) (0.08238555 2) (0.10876829 1) (0.12127061 11/2))) To end the OSC thread and the sending of the OSC messages, we call the END-OSC-THREAD function: (end-osc-thread thd1) The SEND-OSC-THREAD function sends OSC data and performs a small amount of "background" processing on messages in the queue when the processor would otherwise be idle. This function can be called on a created thread any number of times during its lifetime. (defparameter reaktor '(127.0.0.1 10000)) (defparameter time (rnd-sample 50 '(1/4 1/2 1/4))) (defparameter values (vector-smooth 0.05 (gen-white-noise 500))) (defparameter data (gen-osc-data 60 values :time time)) (setf thd1 (create-osc-thread "thread1" reaktor)) (send-osc-data thd1 data) The GET-OSC-THREAD-FROM-NAME function returns the OSC thread from a given name. This function is useful if you don’t assign a variable to the thread object. Note we are not capturing the thread object returned from this function: (create-osc-thread "thread1" reaktor) We can get the thread object using its name when we want: (send-osc-data (get-osc-thread-from-name "thread1") '((0.0 1/2) (0.3254655 1/2) (0.08238555 2) (0.10876829 1) (0.12127061 11/2))) (end-osc-thread (get-osc-thread-from-name "thread1")) The OSC-THREAD-ALIVE? function checks if the given OSC thread object is still alive and returns T if true. (setf thd1 (create-osc-thread "thread1" '(127.0.0.1 10000))) (end-osc-thread thd1) => nil Test: (osc-thread-alive? thd1) => nil The END-OSC-THREAD function will end and destroy a given OSC thread. After the thread is destroyed, you cannot send any messages to it. (setf thd1 (create-osc-thread "thread1" '(127.0.0.1 10000))) (end-osc-thread thd1) => nil Test: (osc-thread-alive? thd1) => nil The END-ALL-OSC-THREADS function will end and destroy all OSC threads. You cannot send any messages to the threads once they are destroyed. (defparameter reaktor '(127.0.0.1 10000)) (create-osc-thread "thread1" reaktor) (create-osc-thread "thread2" reaktor) (create-osc-thread "thread3" reaktor) (create-osc-thread "thread4" reaktor) (end-all-osc-threads) => nil Best wishes, Janusz
  10. To save the graph in .opmograph format, simply click on the graph and select "Save As..." form the File menu. By default the file will be saved in the "~/Opusmodus/Graphs" folder.
  11. 1.3.24720 – Update to 'Quick Start' workspace. – Added controllers keyword :cc into PS. How to update the Quick Start workspace. Delete the 'Quick Start' folder from the "~/Opusmodus" directory. Goto the Help menu and select 'Install Quick Start Workspace'. The updated 'Quick Start' workspace will open. This way you can always rebuild your 'Quick Start' workspace to the default one if needed. Best wishes, Janusz
  12. Opusmodus musicxml file is very much to the spec (standard), many other programs are not, this is why you will get an occasional error or missing parameter in programs like Musescore or Dorico.
  13. Yes, 1/2 equal 1/2 second. Yes, after the last thread pair is send the thread will destroy by itself. Yes, this function will display all running threads: (bt:all-threads) The function: (stop-osc-threads a-thread) will destroy the given OSC thread. The function: (stop-all-osc-threads) will destroy all OSC threads. No, In order to restart a thread again you need to evaluate the expression again, example: (sets thread1 (osc-thread reaktor "osc1" '((0.18450676 5/2))) No, but you could create a loop with repeat function for a given count. Best wishes, Janusz
  14. Will save the result in pdf file format in ~/Opusmodus/Graphs folder. (circle-rhythm-plot '(0 3 6 10 11) :points 16 :file "crp1") or Click the mouse on the graph-view to copy it to the clipboard (PNG format). This allow you to past the image to any other document - works with display-midi view as well.
  15. Snippet or PS (preview score): (ps 'gm :p (list '((s a4 leg d5 leg fs4 leg d5 leg g4 leg d5) (s a4 leg d5 leg fs4 leg d5 leg g4 leg d5) (s a4 leg d5 leg cs5 leg b4 leg a4 leg g4 leg) (s fs4 leg d4 leg e4 leg cs4 leg e d4)) '((e fs3 d3 e3) (e fs3 d3 e3) (e fs3 g3 a3) (e d3 a2 d2))) :key-signature '(d maj) :time-signature '(3 8 1) :tempo 112)
  16. 1.3.24711 – Function name changes: hexachord-complement to: GET-HEXACHORD-COMPLEMENT gen-ac-hexachord to: GET-AC-HEXACHORD ac-hexachord-complement-form-set to: GET-AC-HEXACHORD-COMPLEMENT-FORM-SET – New functions: GET-DENSITY FILTER-DENSITY – New directory in System Library: Analysis. Fixed: VELOCITY-TO-DYNAMIC GET-DENSITY The function GET-DENSITY returns a density value (between 0.0 and 1.0) derived from quantitative measurements in a given sequence. There are four density types: :length, :pitch, :velocity and nil. The density information can be used in an analytical and compositional manner. Length density: (get-density '(s s s s s s s s)) => 1.0 (get-density '(s s -s s -s s -s s)) => 0.62 (get-density '(-q e -e q. s)) => 0.33555558 (get-density '(e.. s s s q s s s t -t s t)) => 0.8336364 (get-density '(-q -e -t t t t t t -q -s. t t t)) => 0.25 (get-density '((-w) (-w) (-w) (-w) (-h -e -t = -s. t -s. t -s) (-t = -s. e s = = = = = = = = = -s.) (-w) (-w) (-w) (-h -e -t = = = = = -s. =) (e.. s = = q s = = t - s t) (-t s t - s t - s t - s t - s t - s t - s t - = -s) (-t = -q -s. e t -s. s -e. t = =) (t = = = = = = = = = = = = s -e. s -e. t = =))) => (0.0 0.0 0.0 0.0 0.089999974 0.74833333 0.0 0.0 0.0 0.22666669 0.8336364 0.69 0.3185714 0.62) Pitch density: (get-density 'c4e4g4) => 0.38888893 (get-density 'c4ds4fs4a4) => 0.41666666 (get-density '((bb3 e3 bb2 a4 b4 d5) (b2 bb2 b3 b4 c7 c5) (eb3 gs3 gs2 a5 cs7 cs4))) => (0.48333335 0.8166667 0.8833334) Velocity density: (get-density '(pp pp p p mp mp mf mf f f)) => 0.30833334 (get-density '((pp< < < ff> > > > >) (p< < < < mf< < < <) (f> > > > > p p p))) => (0.4010417 0.38020834 0.30729166) OMN: (setf p00 '(-h.) p01 '(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) p02 '(t d4 < leg eb4 < leg g4 < 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) p03 '(q d5 leg eb5 3q g4 stacc bb4 stacc a4 stacc e. cs4 marc s gs4 leg q gs4 -q) p04 '(q. fs5 pp 3e c5 < leg b4 < leg f4 e d5 mf s eb5 leg g5 leg bb5 leg a5 e fs5 leg fs5 3e gs4 > stacc c5 > stacc b5 > stacc t f5 pp e.. e5) p05 '(-q. e d4 pp q. eb5 mf e g4 q bb4 a4) p06 '(q cs4 pp -q t gs4 marc e.. fs4 mf leg e c4 -e t b4 leg f4 q.. e4 pp) p07 '(-q e d4 leg eb4 h g4 mf leg q. g4 > -e) p08 '(s bb4 pp leg a4 h. db4 t gs4 mp fs4 < c5 < b4 q f5 marc e5) ) (setf pattern (assemble-seq p00 p01 p02 p03 p04 p05 p06 p07 p08)) Type nil returns a mean value derived from the three main types: (get-density pattern) => (0.0 0.3716961 0.47591507 0.343125 0.49027777 0.36222222 0.41116783 0.2487963 0.45833334) Length density: (get-density pattern :type :length) => (0.0 0.5680555 0.7047059 0.36791664 0.8072916 0.25333333 0.44183674 0.24291666 0.73148143) Pitch density: (get-density pattern :type :pitch) => (0.0 0.27272728 0.375 0.33333334 0.36666667 0.5 0.45833334 0.1388889 0.3333333) Velocity density: (get-density pattern :type :velocity) => (0.0 0.27430555 0.34803924 0.32812503 0.296875 0.33333334 0.33333334 0.36458337 0.3101852) FILTER-DENSITY The function FILTER-DENSITY analyses all bars in a given sequence and returns a new sequence based on the list of density values and their order. A short demonstration on how the density information, taken from a number of patterns can be used in a compositional manner. (setf p00 '(-w.) p01 '(q d4 pp s eb4 < leg g4 < leg bb4 < leg a4 q. cs5 mf -e 3q gs5 > leg fs5 > leg c5 > b4 pp leg f4 leg e4) p02 '(t d4 < leg eb4 < leg g4 < 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) p03 '(q d5 leg eb5 3q g4 stacc bb4 stacc a4 stacc e. cs4 marc s gs4 leg q gs4 -q) p04 '(q. fs5 pp 3e c5 < leg b4 < leg f4 e d5 mf s eb5 leg g5 leg bb5 leg a5 e fs5 leg fs5 3e gs4 > stacc c5 > stacc b5 > stacc t f5 pp e.. e5) p05 '(-q. e d4 pp q. eb5 mf e g4 q bb4 a4) p06 '(q cs4 pp -q t gs4 marc e.. fs4 mf leg e c4 -e t b4 leg f4 q.. e4 pp) p07 '(-q e d4 leg eb4 h g4 mf leg q. g4 > -e) p08 '(s bb4 pp leg a4 h. db4 t gs4 mp fs4 < c5 < b4 q f5 f marc e5) p09 '(h. eb4 pp q g3 -e q gs4 mf -s a5 p tie) p10 '(e. a5 -e q bb4 mf -s q cs5 p -s q. e5 mf -e.) p11 '(q cs5 p h. d5 mf -q c5 pp tie) p12 '(h c5 pp h. gs3 -e a4 p) p13 '(h. fs5 mp q bb3 c5 p e4 mf tie) p14 '(h e4 -e q cs4 mp h d5 p e f4) mat (assemble-seq p00 p01 p02 p03 p04 p05 p06 p07 p08 p09 p10 p11 p12 p13 p14) ) (progn (setf ;bars 1 2 3 4 5 6 7 8 9 10 11 12 13 14 p1 '(0.2 0.0 0.2 0.0 0.2 0.3 0.8 0.2 0.3 0.0 0.2 0.2 0.0 0.1) p2 '(0.0 0.2 0.6 0.3 0.0 0.5 0.2 0.7 0.0 0.2 0.0 0.2 0.3 0.2) p3 '(0.2 0.7 0.0 0.0 0.2 0.3 0.2 0.0 0.7 0.0 0.3 0.2 0.5 0.1) p4 '(0.1 0.0 0.0 0.2 0.8 0.2 0.0 0.2 0.2 0.0 0.2 0.2 0.3 0.2) p5 '(0.0 0.0 0.2 0.0 0.2 0.0 0.1 0.0 0.0 0.8 0.2 0.2 0.2 0.1) ) (setf v1 (filter-density p1 mat :type :length :seed 253) v2 (filter-density p2 mat :type :length :seed 743) v3 (filter-density p3 mat :type :length :seed 545) v4 (filter-density p4 mat :type :length :seed 987) v5 (filter-density p5 mat :type :length :seed 234) ) (setf fl (unfold 'eg '(t7 v? (a0-12 1) dyn fl) v1) ob (unfold 'eg '(t7 i (a0-12 (3 6 8)) dyn ob) v2) cl (unfold 'eg '(t7 v? (a0-12 (2 9 14)) (ra 9) dyn cl) v3) hn (unfold 'eg '(t-5 t-12 ra rol dyn hn) v4) bn (unfold 'eg '(t-5 t-12 i rol dyn bn) v5) ) (ps 'gm :w5 (list fl ob cl hn bn) :tempo 68) ) Best wishes, JP
  17. I will comeback on that in a few days.
  18. 1.3.24692 – Function name changes: DEF-UNFOLD to DEF-UNFOLD-SET DEF-INSTRUMENT-SETS to DEF-INSTRUMENT-SET – New functions: DEF-UNFOLD-SET UNFOLD-SET-NAMES GET-UNFOLD-SET GET-UNFOLD-SET-GROUPS GET-UNFOLD-SET-GROUP UNFOLD SOUND-SET-NAMES GET-SOUND-SET-PROGRAM-GROUPS GET-SOUND-SET-PROGRAM-GROUP GET-SOUND-SET-PROGRAM GET-SOUND-SET-CONTROLLER-GROUPS GET-SOUND-SET-CONTROLLER-GROUP GET-SOUND-SET-CONTROLLER DEF-INSTRUMENT-SET INSTRUMENT-SET-NAMES GET-INSTRUMENT-SET GET-INSTRUMENT-SET-GROUPS GET-INSTRUMENT-SET-GROUP – New directory in System Library: Libraries. – New directory in Def-Libraries: Def-Unfold-Sets. – New Extension file: 'OSC Remote Setup.lisp'. Fixed: – Documents errors. Examples: SOUND-SET (sound-set-names) => (xce-solo-woodwinds-generic vsl-clarinet-bb vsl-cello sgmo-acoustic-grand-piano k2500r s80 se-1 sgmo-bassoon sgmo-strings-1 zr vsl-altoflute vsl-prepared-piano supernova-ii sy55 reaktor sgmo-vibraphone vsl-imperial vsl-cello-solo trinity ms2000 pr micro-q k1 vsl-cembalo-ks sgmo-piccolo pianoteq vsl-cembalo vsl-violin vsl-viola-solo micro-piano gm2 vsl-contrabass trinity-rack sgmo-celesta sgmo-trombone nord-lead-3 gm sgmo-harp sgmo-glock karma sgmo-trumpet xv-5080 sgmo-flute sgmo-oboe vsl-violin-solo sgmo-horn sgmo-timpani k2600 sgmo-marimba vsl-hornvienna vsl-prepared-piano-ks sgmo-tuba jv-1080 vsl-harmonium-ks vsl-harmonium sgmo jv-2080 sy22 k2500 sgmo-violin virus-b sgmo-cello sgmo-clarinet k2000r k2000 vsl-bassclarinet vsl-upright xce-solo-strings-generic motif sgmo-viola) (get-sound-set-program-groups 'gm) => (piano percussion organ guitar bass strings ensemble brass reed pipe synth-lead synth-pad synth-effects ethnic percussive sound-effects) (get-sound-set-program-group 'gm 'Brass) => (trumpet trombone tuba muted-trumpet french-horn brass-section synth-brass-1 synth-brass-2) (get-sound-set-program 'gm 'trombone) => 57 (get-sound-set-controller-groups 'gm) => (general lsb pedal) (get-sound-set-controller-group 'gm 'general) => (bank-select modulation breath-control foot-control portamento-time data-entry volume balance pan expression effects-controller1 effects-controller2 gen-purpose1 gen-purpose2 gen-purpose3 gen-purpose4) (get-sound-set-controller 'gm 'expression) => 11 UNFOLD (unfold-set-names) => (m1 eg) (get-unfold-set-groups 'eg) => (transp basic ambitus) (get-unfold-set-group 'eg 'ambitus) => (ob bn hn) (get-unfold-set 'eg 'ld) => (:length (length-divide 2 2 x)) Unfold Set Example: (def-unfold-set eg :methods (:group transp t7 (:pitch (pitch-transpose 7 x)) t-12 (:pitch (pitch-transpose -12 x)) :group basic ret (:all (gen-retrograde x :flatten t)) var (:pitch (pitch-variant x :variant '?)) gf (nil (gen-fragment '(3) '(3) x)) ld (:length (length-divide 2 2 x)) lrq (:length (length-rational-quantize x)) dyn (:velocity (velocity-to-dynamic x)) ls (nil (length-span '(6/4 6/4) x)) :group ambitus ob (:pitch (ambitus 'oboe x)) bn (:pitch (ambitus 'bassoon x)) hn (:pitch (ambitus 'french-horn x)) )) INSTRUMENT-SET (instrument-set-names) => (vsl gm) (get-instrument-set-groups 'gm) => (clefs grand wind brass strings wind-ensemble brass-ensemble piano string-ensemble choir) (get-instrument-set-group 'gm 'wind) => (:pic :fl :afl :bfl :ob :eh :oda :cl :acl :bcl :bn :cbn :ssax :asax :tsax :bsax) (get-instrument-set-group 'gm 'string-ensemble) => (:s3 :sq) (get-instrument-set 'gm :p) => (:layout piano-layout :port nil :channel 1 :sound 'gm :program 0 :controllers nil :pan (pan 0) :volume 92) (get-instrument-set 'gm :sq) => (:layout string-quartet-layout :port nil :channel '(13 14 15 16) :sound 'gm :program '(violin violin viola cello) :controllers nil :pan (pan '(-30 -10 10 30)) :volume 92) Instrument Set Example: (def-instrument-set my-inst :instruments (:group wind :oboe (:layout oboe-layout :port nil :channel 1 :sound 'gm :program '(oboe) :controllers nil :pan (pan 0) :volume 92) :bassoon (:layout bassoon-layout :port nil :channel 2 :sound 'gm :program '(bassoon) :controllers nil :pan (pan -10) :volume 92) )) Note: Please create a new directory 'Def-Unfold-Sets' in your '~/Opusmodus/Def-Libraries' directory. This is where you will store your Unfold sets. The 'OSC Remote Setup.lisp' file needs to be dragged into your '~/Opusmodus/Extensions' directory. OSC Remote Setup.lisp Best wishes, Janusz
  19. Thank you Lasse for your report. Anyway, this file will fix it:
  20. If you use OSC in Opusmodus you need to drop the 'OSC Remote Setup.opmo' file into your '~/Opusmodus/Extensions' folder and restart OM. This file will fix the OSC problem. OSC Remote Setup.lisp Best wishes, Janusz
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy