Posted April 26, 20195 yr 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