Jump to content

Search the Community

Showing results for tags 'update'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Welcome To Opusmodus
    • Announcements
    • Pre Sales Questions
  • Support Forum
    • Support & Troubleshooting
    • OMN Lingo
    • Function Examples
    • Score and Notation
    • Live Coding Instrument
    • Library Setup
    • MIDI Setup
  • Sharing
    • Made In Opusmodus
    • User Extensions Source Code
    • Suggestions & Ideas

Blogs

  • Stephane Boussuge
  • Didier Debril

Categories

  • OMN The Language
  • Tutorial Guide
  • CLM Examples

Categories

  • Getting Started
  • HowTo
  • Live Coding
  • Music Theory and Analysis

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website URL


Gender


Location


Interests


About Me

Found 19 results

  1. – Additions:ADD-TEXT-ATTRIBUTS – Optional attribute type: :sticky and :non-sticky– Fixed:Typo error in 'GM Instrument Set.lisp' file. Best wishes, Janusz
  2. Free update for Opusmodus 1.3. users. It includes a support for a second screen and multi voice snippets. The new UNFOLD system opens up a whole new set of possibilities for the composer using OPUSMODUS. Additional library directory: 'Def-Instrument-Sets'. New functions: DEF-INSTRUMENT-SETS Use this function to define the instrument-sets with a given name. With named instrument-sets a composer can customise OPUSMODUS to reflect MIDI synthesisers or samplers which a studio system (inboard or outboard) might contain. The DEF-INSTRUMENT-SETS function is an essential companion to the PS function (PS stands for ‘Preview Score’ or, ‘Preview Snippet’). To create instrument-sets is fairly easy to do as it resembles the instrument setup from the DEF-SCORE instance. The instrument-set template: <instrument-name> (:layout <layout> :port <port> :channel <channel> :sound <sound-set> :program <program> :controllers <controllers> :pan <panning> :volume <volume>) To explain how it all works we will define new instrument-sets with two instruments. In our example we will use :oboe and :bassoon as our instrument names with a library name: my-inst. The next step we need to do is to select the corresponding instrument layout. The predefined layouts you will find in the ‘Instrument Layout Presets’ document in the System/Layout library: Examples: (def-instrument-sets my-inst :instruments (:group group :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) )) Here is how an instrument from a defined instrument-sets name might be entered into PS: (ps 'my-inst :oboe (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))) :bassoon (list '((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) You can define as many instrument-sets instances as needed. PS Use this function if you are looking for a quick preview of your score or when a snippet (especially for education) needs a full representation of the intended notation. The PS function name stands for ‘Preview Score’ or ‘Preview Snippet’. In the following examples we use the default instrument-sets library, defined in the ‘GM Instrument Sets.lisp’ file, which you will find in the Library panel. How to create your own instrument-sets library, you will find in the DEF-INSTRUMENT-SETS document. Instrument treble: (ps 'gm :treble (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))) :key-signature '(d maj) :time-signature '(3 8 1) :tempo 112) Instrument piano: (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 :title "G. Ph. Telemann, 12 Fantasie per clavicembalo TWV 33-n.1, 1732") Examples: The examples below demonstrate how quickly you can preview your progress at any stage of your work ie. voices, instrumentation etc… (setf p1 '(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) p2 '(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) p3 '(q d5 leg eb5 3q g4 stacc bb4 stacc a4 stacc e. cs4 marc s gs4 leg q gs4 -q) p4 '(-q. e d4 pp q. eb5 mf e g4 q bb4 trem a4 trem) p5 '(q. fs3 pp 3e c3 < leg b4 < leg f4 e d3 mf s eb3 leg g3 leg bb3 leg a3 e fs3 leg fs3 3e gs4 > stacc c5 > stacc b5 > stacc t f5 pp e.. e5) p6 '(q cs3 pp -q t gs3 marc e.. fs3 mf leg e c3 -e t b3 leg f3 q.. e4 pp) ) Please note how the list function is used to enclose the instrument voices. The number of voices in an instrument should not exceed the layout of a particular instrument. For example a piano uses a two staff notation therefore the input should be a two lists in a list (list (list right-hand) (list left-hand)). (ps 'gm :p (list (list p1) (list p6))) Instrument oboe, clarinet and bassoon: (ps 'gm :ob (list p1) :cl (list p3) :bn (list p6)) Brass Quintet: (ps 'gm :b5 (list p1 p2 p3 p4 p5)) DEF-UNFOLD UNFOLD The DEF-UNFOLD and UNFOLD function opens up a whole new set of possibilities for the composer using OPUSMODUS. It can prove a very powerful tool in defining methods (functions) from the outset, for a specific work or as a global index of your most used functions. To be able to store methods, processes and solutions and call them at anytime becomes a valuable resource for a composers workflow. This function is a companion to the UNFOLD function. (def-unfold m1 var (:pitch (pitch-variant x :variant '?)) dyn (:velocity (velocity-to-dynamic x)) ) (setf omn '(s bb4 p a4 h. db4 t gs4 mf fs4 c5 b4 q f5 e5)) To run the defined methods in a given omn-form sequence use the UNFOLD function: (unfold 'm1 '(var dyn) omn) Examples: (def-unfold m2 7 (:pitch (pitch-transpose 7 x)) -12 (:pitch (pitch-transpose -12 x)) ret (:all (gen-retrograde x :flatten t)) var (:pitch (pitch-variant x :variant '?)) gf (nil (gen-fragment '(3) '(3) x)) lrq (:length (length-rational-quantize x)) dyn (:velocity (velocity-to-dynamic x)) ls (nil (length-span '(6/4 6/4) x)) ob (:pitch (ambitus 'oboe x)) bn (:pitch (ambitus 'bassoon x)) hn (:pitch (ambitus 'french-horn x)) ) Please note that the number of methods within an instance can be much bigger than in the example above. Two bars of omn - opusmodus notation (setf mat '((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))) Applying methods: (setf t1 (unfold 'm2 7 mat) t2 (unfold 'm2 '(-12 var ob) mat) t3 (unfold 'm2 'var mat) t4 (unfold 'm2 '(-12 gf lrq ls dyn ret var hn) t3) t5 (unfold 'm2 '(gf lrq ls dyn bn) t2) ) The result with a Wind-Quintet layout: (ps 'gm :w5 (list t1 t2 t3 t4 t5)) BIND-TO-INTERVAL The function BIND-TO-INTERVAL will bind (connect) a series of lists (patterns) to each-other with the given interval. Each transposition value is the sum of the last pitch in the list plus the given interval. The result of the process is a start transposition value for the next list. If rotate and variant options are used, the rotate process is the first followed by variant and finally the start transposition. In the example below the last pitch in the first list is g4, with binding interval 1 (semitone), therefore the start transposition value of the next list is gs4: (bind-to-interval '(1) '((s c4 d4 e4 g4) (s c4 d4 g4 e4))) => ((s c4 d4 e4 g4) (s gs4 bb4 eb5 c5)) Examples: (setf pattern '((s c4 d4 e4 g4) (s c4 d4 g4 e4) (s g4 e4 c4 d4) (s c4 d4 f4 g4) (s c4 d4 g4 f4) (s g4 f4 c4 d4) (s c4 d4 g4 f4) (s g4 gb4 f4 g4) (s g4 gb4 f4 a4) (s d4 f4 g4 a4) (s a4 g4 f4 d4) (s d4 f4 g4 c5))) In this example the binding intervals are 1 and 2 randomly selected: (bind-to-interval (rnd-sample (length pattern) '(1 2)) pattern) => ((s c4 d4 e4 g4) (s gs4 bb4 eb5 c5) (s d5 b4 g4 a4) (s b4 cs5 e5 fs5) (s g5 a5 d6 c6) (s d6 c6 g5 a5) (s bb5 c6 f6 eb6) (s f6 e6 eb6 f6) (s g6 fs6 f6 a6) (s bb6 cs7 eb7 f7) (s fs7 e7 d7 b6) (s cs7 e7 fs7 b7)) In the next example the binding intervals are 13 and -13 with random variant: (bind-to-interval (rnd-sample (length pattern) '(13 -13)) pattern :variant '?) => ((s c4 d4 e4 g4) (s fs3 a3 e3 d3) (s eb4 fs4 bb4 gs4) (s g3 f3 d3 c3) (s b1 a1 e1 fs1) (s g2 f2 bb2 c3) (s b1 a1 d2 e2) (s eb1 eb1 d1 cs1) (s d2 cs2 c2 e2) (s f3 d3 c3 bb2) (s b3 d4 e4 fs4) (s g5 bb5 c6 f6)) Here the binding intervals are 1, -1, 2 -2: (bind-to-interval '(1 -1 2 -1 2 -1 2) pattern) => ((s c4 d4 e4 g4) (s gs4 bb4 eb5 c5) (s b4 gs4 e4 fs4) (s gs4 bb4 cs5 eb5) (s d5 e5 a5 g5) (s a5 g5 d5 e5) (s eb5 f5 bb5 gs5) (s bb5 a5 gs5 bb5) (s b5 bb5 a5 cs6) (s c6 eb6 f6 g6) (s a6 g6 f6 d6) (s cs6 e6 fs6 b6)) (bind-to-interval '(1 -1 2 -1 2 -1 2) pattern :variant '?) => ((s c4 d4 e4 g4) (s gs4 f4 bb4 c5) (s b4 gs4 e4 fs4) (s gs4 bb4 cs5 eb5) (s d5 c5 a4 g4) (s a4 g4 e4 d4) (s cs4 eb4 gs4 fs4) (s gs4 a4 bb4 gs4) (s a4 bb4 b4 g4) (s fs4 a4 b4 cs5) (s eb5 c5 bb4 gs4) (s g4 e4 d4 a3)) Example with rotation: (bind-to-interval (rnd-sample (length pattern) '(1 2)) pattern :rotate '(1 2 1 2 1)) => ((s c4 d4 e4 g4) (s a4 f4 g4 c5) (s d5 e5 a5 fs5) (s gs5 cs5 eb5 fs5) (s gs5 fs5 cs5 eb5) (s e5 a5 g5 d5) (s e5 b4 cs5 fs5) (s g5 a5 a5 gs5) (s bb5 gs5 g5 fs5) (s g5 a5 d5 f5) (s g5 d6 c6 bb5) (s c6 d5 f5 g5)) PAN This function converts mixer panning values in the range from -100(L) to 100(R) into MIDI pan values. The centre position value in the PAN function is 0. Examples: (pan 0) => 64 (pan '(-12 0 12)) => (56 64 72) (pan '(-30 -10 10 30)) => (45 58 70 83) PAN in DEF-SCORE instrument instants definition: (def-score SQ (:title "String Quartet - VSL Show" :key-signature 'chromatic :time-signature (get-time-signature vln1) :tempo tempo :layout (string-quartet-layout 'violin1 'violin2 'viola 'cello)) (violin1 :omn vln1 :port 0 :channel 1 :sound 'vsl-violin-solo :program 0 :pan (pan -30)) (violin2 :omn vln2 :channel 2 :sound 'vsl-violin-solo :program 0 :pan (pan -10)) (viola :omn vla :channel 3 :sound 'vsl-viola-solo :program 0 :pan (pan 10)) (cello :omn vlc :channel 4 :sound 'vsl-cello-solo :program patches-vc :pan (pan 30)) ) PAN in DEF-INSTRUMENT-SETS instance: :string-quartet (:layout string-quartet-layout :port nil :channel '(1 2 3 4) :sound 'gm :program '(violin violin viola cello) :controllers nil :pan (pan '(-30 -10 10 30)) :volume 92) Multi Voice Snippet Select or place the mouse cursor at the end of the expression and press ⌘2. This snippet is very useful in sketching and testing the progress of your work ie. instrumentation, voice density etc… (setf p1 '(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) p2 '(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) p3 '(q d5 leg eb5 3q g4 stacc bb4 stacc a4 stacc e. cs4 marc s gs4 leg q gs4 -q) p4 '(q. fs3 pp 3e c3 < leg b4 < leg f4 e d3 mf s eb3 leg g3 leg bb3 leg a3 e fs3 leg fs3 3e gs4 > stacc c5 > stacc b5 > stacc t f5 pp e.. e5) p5 '(-q. e d4 pp q. eb5 mf e g4 q bb4 trem a4 trem) p6 '(q cs4 pp -q t gs4 marc e.. fs4 mf leg e c4 -e t b4 leg f4 q.. e4 pp) p7 '(-q e d4 leg eb4 h g4 mf leg q. g4 > -e) p8 '(s bb3 pp leg a3 h. db3 t gs4 mp fs3 < c5 < b3 q f4 marc e4) ) (list p1 p2 p3 p4) New window display: (display-midi *last-score* :display :window) (display-musicxml 'score :display :window) Changes to ‘Evaluate Score’ and ‘Last Score’ shortcut keys. Best wishes, Janusz
  3. – New function: POLYGON-RHYTHM – Generates a symmetrical polygon to a given n-gon. – Update: LENGTH-WEIGHT – :swallow keyword added. LENGTH-REST-SERIES – omn-form and :swallow keyword added. LENGTH-TO-REST – omn-form and :swallow keyword added. – Documents: Howto Score/Rhythm/Polygon Rhythm.opmo Note: Select 'Check for Updates...' from Opusmodus app menu to get the latest version. POLYGON-RHYTHM This function returns a symmetrical polygon to a given n-gon (sides number) with circle points (denominator) and a given staring point. In this example we use 3-gon in a 16 point circle with the starting point 0: (polygon-rhythm 3 16 0) => (1/16 -1/16 -1/16 -1/16 1/16 -1/16 -1/16 -1/16 -1/16 -1/16 -1/16 -1/16 1/16 -1/16 -1/16 -1/16) Same as above with :legato t added: (polygon-rhythm 3 16 0 :legato t) => (1/4 1/2 1/4) The 3-gon in a 16 point circle with the starting point 0 will produce 7 symmetrical 3-gon’s: Example with start point 5: (polygon-rhythm 3 16 5) => (-1/16 -1/16 -1/16 -1/16 -1/16 1/16 -1/16 -1/16 -1/16 -1/16 -1/16 1/16 -1/16 -1/16 -1/16 1/16) (circle-rhythm-plot (polygon-rhythm 3 16 5) :points 16) Examples: In the following example we create 8 bars of a ‘Drum Set’ rhythm. First we assign the ‘GM Percussion’ names to variables: (setf bd (read-map *gm-percussion* 'acoustic-bass-drum)) (setf sd (read-map *gm-percussion* 'Acoustic-Snare)) (setf ht (read-map *gm-percussion* 'High-Tom)) (setf hh (read-map *gm-percussion* 'Open-Hi-hat)) Next we create 4 polygon rhythms: (setf bd-gon (polygon-rhythm 3 16 0 :pitch bd :seed 5)) (setf sd-gon (polygon-rhythm 2 16 1 :pitch sd :seed 45)) (setf ht-gon (polygon-rhythm 2 16 5 :pitch ht :seed 45)) (setf hh-gon (polygon-rhythm 5 16 2 :pitch hh :seed 5)) With the CIRCLE-RHYTHM-PLOT function you can visualise how the rhythms are working together: (circle-rhythm-plot (list bd-gon sd-gon ht-gon hh-gon) :points 16) Let’s hear the result above, using PS function and ‘GM Instrument Set’ with a 8 times loop: (ps 'gm :ds-bd (list (gen-eval 8 'bd-gon)) :ds-sd (list (gen-eval 8 'sd-gon)) :ds-ht (list (gen-eval 8 'ht-gon)) :ds-hh (list (gen-eval 8 'hh-gon)) :tempo 120) Same as above but without a seed value: (ps 'gm :ds-bd (list (gen-eval 8 '(polygon-rhythm 3 16 0 :pitch bd))) :ds-sd (list (gen-eval 8 '(polygon-rhythm 2 16 1 :pitch sd))) :ds-ht (list (gen-eval 8 '(polygon-rhythm 2 16 5 :pitch ht))) :ds-hh (list (gen-eval 8 '(polygon-rhythm 5 16 2 :pitch hh))) :tempo 120) In the next example we add a few more percussion instruments. The '? start symbol means the start point is selected at random: 0 to 15. (progn (setf bd (read-map *gm-percussion* 'Acoustic-Bass-Drum)) (setf sd (read-map *gm-percussion* 'Acoustic-Snare)) (setf ht (read-map *gm-percussion* 'High-Tom)) (setf hh (read-map *gm-percussion* 'Open-Hi-hat)) (setf lb (read-map *gm-percussion* 'Low-Bongo)) (setf hb (read-map *gm-percussion* 'High-Bongo)) (setf mhc (read-map *gm-percussion* 'Mute-Hi-Conga)) (setf lc (read-map *gm-percussion* 'Low-Conga)) (ps 'gm :ds-bd (list (gen-eval 16 '(polygon-rhythm 3 16 0 :pitch bd))) :ds-sd (list (gen-eval 16 '(polygon-rhythm 2 16 1 :pitch sd))) :ds-ht (list (gen-eval 16 '(polygon-rhythm 2 16 5 :pitch ht))) :ds-hh (list (gen-eval 16 '(polygon-rhythm 5 16 2 :pitch hh))) :rhy (list (gen-eval 16 '(polygon-rhythm 5 16 '? :pitch lb)) (gen-eval 16 '(polygon-rhythm 4 16 '? :pitch hb)) (gen-eval 16 '(polygon-rhythm 7 16 '? :pitch mhc)) (gen-eval 16 '(polygon-rhythm 7 16 '? :pitch lc))) :tempo 120) )
  4. – New function: CHORD-PROGRESSION - sorts a sequence of chords and pitches to the lowest or highest chord note. – Update: AMBITUS function allows range smaller than 6 semitones. – Fixed: Quick Start - Lesson 1 - OMN – Documentation updates. CHORD-PROGRESSION This function will sort a sequence of chords and pitches to the lowest or highest chord note. Sorting to lowest chord note: (chord-progression '(g2g3 a2a4 a2a3 g2d4 g2g4 a2e4)) => (g2g3 g2d4 g2g4 a2a3 a2e4 a2a4) Sorting to highest chord note: (chord-progression '(g2g3 a2a4 a2a3 g2d4 g2g4 a2e4) :sort 'high) => (g2g3 a2a3 g2d4 a2e4 g2g4 a2a4) Examples: (setf omn '((q d4a4g5 fs4eb5bb5 eb4fs5d5 bb4g5a5 fs4eb5d6 bb4a5g6) (q g4d4a4 bb4fs4eb4 a4g5d6 eb5bb5fs6 bb4a5g5 eb5d5fs5))) (chord-progression omn) (chord-progression omn :sort 'high) (chord-progression omn :sort '(high low) :reverse '(nil t)) Best wishes, Janusz
  5. – Fixed: Removed AllNotesOff in Live Coding Instrument sequence-loop. – Documentation updates. Finally the Live Coding Instrument is working as it should, no more notes off while waiting. Best wishes, Janusz
  6. 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
  7. – 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
  8. 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
  9. 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
  10. 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
  11. New function: STOP-ALL-OSC-THREADS Fixed: Live Coding Instrument hanging note at Stop. Few document errors. Note: Select 'Check for Updates..." from Opusmodus menu.
  12. This update completes the CLM integration. Before opening the new application you need to delete the user Opusmodus directory. Make sure you save your personal files (scores, docs etc...) before. A good solution is to rename the Opusmodus folder first and then compress it. After you have deleted the Opusmodus user folder you can start the new application. At the start, Opusmodus will ask you for permission to create a new user folder in your home directory, if you don’t see a window for it, it means the old directory is still on your computer. Make sure the new Opusmodus directory is installed in your home directory. For those of you that wish to dive into CLM sound synthesis system, I advise everyone to read the Read Me First document carefully first. New: – CLM instruments, utilities and documentation: load-clm-ins with-sound play stop-sound ring-modulate-file-synth pins-synth expsrc-synth tubebell-synth hammondoid-synth metal-synth fm-synth (generic multi-type FM Instrument) gong-synth fm-drum-synth stochastic-synth definstrument – No bracket when tuplet is beamed. – Musicxml display improvements. Fixed: – Fixed an issue where CLM sound won't stop if there are more then two instances playing. – Fixed an issue in Preferences where Change Audition Length 1/4 would set to 1/8. – Fixed navigator drag-and-drop re-arragement on Mojave. – Fixed an issue where Navigator search instead of jumping to the match, the selection was extended. Best wishes, Janusz
  13. Whats new: —'Check for Updates...' menu in Opusmodus app menu (no more manual downloads). —New CLM instruments with omn-form plist input and documentation. badd-synth bandedwg-synth circular-scanned-synth fm-bell-synth fm-insect-synth fm-violin-synth grani-synth piano-synth pvoc-synth scanner-synth singbowl-synth —Additional _About documents for various function groups (Wikipedia). —CLM bug fixes. Installation: There are some changes to the Opusmodus user system folder and CLM implementation. Before opening the new application you need to delete the old Opusmodus folder. Make sure you save your personal files (scores, docs etc...) before. A good solution is to rename the Opusmodus folder first and then compress it. After you have deleted the Opusmodus user folder you can start the new application. At the start Opusmodus will ask you for permission to create a new user folder in your home directory, if you don’t see a window for it, it means the old folder is still on your computer. Make sure the new Opusmodus folder is installed in your home directory. Hopefully this is the last time we need to delete the previous Opusmodus user folder from the home directory. Best wishes, Janusz P.S. Few CLM examples from the "3.Howto Score/CLM/Sound Synthesis.opmo" file: fm-bell-synth (progn (defparameter count 50) (setf partials (library 'marangona-partials 'partials nil :random 20)) (setf par (rnd-sample count (partial :freq (flatten partials)))) (defparameter freq (gen-divide (rnd-sample count '(1 2 3 4 5)) par)) (defparameter dur (list (length-span 42 (rnd-sample count '(w h q w))))) (do-timeline '(dur (---xx--xx- ---xx---x- --x--xx--- ---x------ x----x---)) '(gen-pause x) :time '(w)) (defparameter vel (rnd-number count 0.05 0.43)) (defparameter dist (rnd-number count 0.5 1.0)) (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))) (with-sound (:reverb jc-reverb :scaled-to .7) (fm-bell-synth dur freq vel :amp-env (rnd-sample count env) :index-env (rnd-sample count env) :index (rnd-number count 0.3 0.9) :reverb-amount 0.30 :distance dist)) ) fm-insect-synth (progn (defparameter par (library 'tbn-cs3-partials 'partials nil :random 12)) (defparameter dur '(rnd-sample 12 '(-q q. h -h. -w w. d -d.))) (defparameter freq '(rnd-sample 12 (flatten (partial :freq par)))) (defparameter amp '(rnd-sample 12 '(pppp ppp p mp))) (defparameter mod-freq-env '(0 0 40 1 95 1 100 .5)) (defparameter mod-index-env '(0 1 25 .7 75 .78 100 1)) (defparameter amp-env '(0 0 25 1 75 .7 100 0)) (defparameter fm-index '(rnd-number 12 .01 .6)) (defparameter mod-skew '(rnd-number 12 -20.0 -1.0)) (defparameter mod-freq '(rnd-number 12 20 60)) (with-sound '() (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 500.866 mod-index-env (eval fm-index) .500) (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 649.490 mod-index-env (eval fm-index) .500) (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 562.087 mod-index-env (eval fm-index) .500) (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 300.866 mod-index-env (eval fm-index) .500) ) ) grani-synth (progn (defparameter dur '(q h w d -q -h)) (defparameter amp '(pppp p pp f mp)) (with-sound (:reverb jc-reverb :reverb-channels 2) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grains 10) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 .1 .3 .1 1 .6) :amp-envelope '(0 1 1 1) :grain-density 8 :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0) :grain-envelope-end '(0 0 .01 1 .99 1 1 0) :grain-envelope-transition '(0 0 .4 1 .8 0 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :amp-envelope '(0 1 1 1) :grain-density 20 :grain-duration '(0 .003 .2 .01 1 .3)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :amp-envelope '(0 1 1 1) :grain-density 20 :grain-duration '(0 .003 .2 .01 1 .3) :grain-duration-limit .02) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :amp-envelope '(0 1 1 1) :grain-density 40 :grain-start '(0 .1 .3 .1 1 .6)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :amp-envelope '(0 1 1 1) :grain-density 40 :grain-start '(0 .1 .3 .1 1 .6) :grain-start-spread .01) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread 0.01 :amp-envelope '(0 1 1 1) :grain-density 40 :srate '(0 0 .2 0 .6 5 1 5)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread .01 :amp-envelope '(0 1 1 1) :grain-density (rnd-sample 12 '(40 30 20)) :srate-base 2 :srate '(0 0 .2 0 .6 -1 1 -1)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread .01 :amp-envelope '(0 1 1 1) :grain-density (rnd-sample 12 '(40 30 20)) :srate-linear t :srate (list 0 1 .2 1 .6 (expt 2 5/12) 1 (expt 2 5/12))) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread .01 :amp-envelope '(0 1 1 1) :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0) :grain-density (rnd-sample 12 '(40 30 20)) :grain-duration '(0 .02 1 0.1) :grain-duration-spread '(0 0 .5 .1 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread 0.01 :amp-envelope '(0 1 1 1) :grain-density (rnd-sample 12 '(40 30 20)) :grain-degree '(0 0 1 90) :grain-degree-spread 10) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-duration .06 :grain-density 20 :grain-density-spread 2 :srate 0) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-duration .08 :grain-density (rnd-sample 12 '(40 30 20)) :grain-density-spread 2 :srate 5 :grain-degree 0 :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0) :grain-envelope-end '(0 0 .01 1 .99 1 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-duration .05 :grain-density 35 :grain-density-spread 3 :srate -5 :grain-degree 90 :srate (list 0 1 .3 1 .3 (expt 2 5/12) 1 (expt 2 5/12)))) ) piano-synth (progn (setf frames1 (library 'marangona-partials 'partials nil :random 48)) (setf frames2 (library 'marangona-frames 'partials nil :random 48)) (setf par1 (remove-partial frames1 :type :freq :min 27.5 :max 4186)) (setf par2 (remove-partial frames2 :type :freq :min 27.5 :max 4186)) (defparameter freq1 (rnd-order (gen-collect (rnd-sample 24 '(3 5 6 7 8)) (partial :freq par1)))) (defparameter freq2 (rnd-order (gen-collect (rnd-sample 38 '(2 3 4)) (partial :freq par2)))) (with-sound (:reverb jc-reverb) (piano-synth '(3e) (flatten freq1) '(.2 .3 .4) :bpm 72 :drypedalresonancefactor .25 :singlestringdecayrate-table '(21 -5 24.000 -5.000 36.000 -5.4 41.953 -5.867 48.173 -7.113 53.818 -8.016 59.693 -8.875 66.605 -9.434 73.056 -10.035 78.931 -10.293 84.000 -12.185) :singlestringpole-table '(21 .8 24 0.7 36.000 .6 48 .5 60 .3 84 .1 96 .03 108 .03) :stiffnesscoefficient-table '(21.000 -0.920 24.000 -0.900 36.000 -0.700 48.000 -0.250 60.000 -0.100 75.179 -0.040 82.986 -0.040 92.240 .3 96.000 .5 99.000 .7 108.000 .7)) (piano-synth '(e) freq2 '(0.1 0.2 0.3) :bpm 72 :drypedalresonancefactor .55 :detuningfactor-table '(24 5 36 7.0 48 7.5 60 12.0 72 20 84 30 96 100 108 300))) ) pvoc-synth (with-sound (:scaled-to .99) (pvoc-synth (rnd-sample 12 '(q h e s w d -q -h)) '(pppp pp ppp f) "marangona" :input-start 0 :input-end 12 :pitch-scaler (rnd-sample 12 '(.5 .1 .05 .8 .3 .16)) :pitch-offset (rnd-sample 20 '(20 100 200 300 440 150 730)) :pitch-offset-env '(0 0 20 0 50 100 70 100 80 0 100 0) :pitch-scaler-env '(0 1 50 2 100 1) :amp-env '(0 1 40 0 50 1 60 0 100 1) :gate 70) ) singbowl-synth (progn (defparameter size 120) (defparameter partials (library 'marangona-partials 'partials nil :random 50)) (defparameter par (rnd-sample size (partial :freq (flatten partials)))) (defparameter freq (gen-divide (rnd-sample size '(2 3 4 5)) par)) (defparameter length (rnd-sample size '(w h q e))) (defparameter velocity (rnd-number size .05 .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))) (with-sound (:reverb jc-reverb :scaled-to .7 :output "ma-partials") (singbowl-synth length freq velocity :amp-env (rnd-sample size env) :reverb-amount 0.30)) ) fm-violin-synth (progn (defparameter size 10) (defparameter count 50) (setf glc-v1 (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf glc-v2 (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf glc-va (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf glc-vc (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf gu-sq (gen-unison (list glc-v1 glc-v2 glc-va glc-vc))) (setf l-v1 (1~ gu-sq)) (setf l-v2 (2~ gu-sq)) (setf l-va (3~ gu-sq)) (setf l-vc (4~ gu-sq)) (setf l-max (first (sort-desc (list (get-count l-v1 :length :note :sum t) (get-count l-v2 :length :note :sum t) (get-count l-va :length :note :sum t) (get-count l-vc :length :note :sum t))))) (setf intervals '((0 7) (0 0) (11 5) (-4 5) (-5 5) (0 13) (-5 18) (-36 13) (-13 13) (8) (-18 7) (-1 17) (-17 17) (-26 13) (-27 23) (-19 19) (-23 23) (18) (0) (7) (-14) (13) (-23 5) (-23 2) (-2 2) (6 2) (6 5) (19) (-10) (-17 11) (-11 11) (-11 5) (-24 13) (1 14) (-14 14) (-29 1) (-1 1) (7 0) (12 6) (-21 7) (-7 7) (-18 0) (1 13) (0 1) (-14 13) (-10 5) (-14 8) (0 6) (6) (-20 6) (-5 1) (17) (1) (-17 5) (-1 5) (-10 16) (-12 8) (0 8) (1 11) (-24 4) (-18 16) (-17) (-6 6) (-18 18) (-15 3) (-6 31) (-2 5) (-29 6) (-6 13) (-13 6) (7 13))) (setf pcount (gen-repeat 2 (get-count l-v1 :length :note))) (setf gr (gen-repeat (length pcount) (list intervals))) (setf gm-v1 (gen-markov gr :size pcount)) (setf gm-v2 (gen-markov gr :size pcount)) (setf gm-va (gen-markov gr :size pcount)) (setf gm-vc (gen-markov gr :size pcount)) (setf im-v1 (interval-map nil (append-sublist gm-v1))) (setf im-v2 (interval-map nil (append-sublist gm-v2))) (setf im-va (interval-map nil (append-sublist gm-va))) (setf im-vc (interval-map nil (append-sublist gm-vc))) (setf s-v1 (span l-v1 im-v1)) (setf s-v2 (span l-v2 im-v2)) (setf s-va (span l-va im-va)) (setf s-vc (span l-vc im-vc)) (setf ra-v1 (rnd-octaves 'violin s-v1)) (setf ra-v2 (rnd-octaves 'violin s-v2)) (setf ra-va (rnd-octaves 'viola s-va)) (setf ra-vc (rnd-octaves 'cello s-vc)) (setf p-v1 (ambitus 'violin ra-v1 :type :invert)) (setf p-v2 (ambitus 'violin ra-v2 :type :invert)) (setf p-va (ambitus 'viola ra-va :type :invert)) (setf p-vc (ambitus '(a2 c5) ra-vc :type :invert)) (setf weight '(29 19 8 8 17)) (setf vel '(0.07 0.1 0.15 0.2 0.25 0.35)) (setf v-v1 (gen-weight l-max (mapcar 'list vel weight))) (setf v-v2 (gen-weight l-max (mapcar 'list vel weight))) (setf v-va (gen-weight l-max (mapcar 'list vel weight))) (setf v-vc (gen-weight l-max (mapcar 'list vel weight))) (setf vln1 (make-omn :length l-v1 :pitch p-v1 :velocity v-v1)) (setf vln2 (make-omn :length l-v2 :pitch p-v2 :velocity v-v2)) (setf vla (make-omn :length l-va :pitch p-va :velocity v-va)) (setf vlc (make-omn :length l-vc :pitch p-vc :velocity v-vc)) (do-timeline '( vln1 (---x---x-- ---x-x-x-- --x--xx--- ---x------ x-) vln2 (---x---x-- ---x---x-- --x--xx--- ---x------ x-) vla (---x---x-- ---x---x-- --x--xx--- ---x------ --) vlc (---x---x-- ---x---xx- --x--xx--- ---x------ --) ) '(gen-pause x) :time '(h h. w)) (defparameter v1 vln1) (defparameter v2 vln2) (defparameter v3 vla) (defparameter v4 vlc) (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))) (with-sound (:reverb jc-reverb :scaled-to .7) (fm-violin-synth v1 v1 v1 :bpm 30 :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) :glissando-amount (rnd-number count 0.00 0.8)) (fm-violin-synth v2 v2 v2 :bpm 30 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.03 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :glissando-amount (rnd-number count 0.00 0.8)) (fm-violin-synth v3 v3 v3 :bpm 30 :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) :glissando-amount (rnd-number count 0.00 0.8)) (fm-violin-synth v4 v4 v4 :bpm 30 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.70 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :glissando-amount (rnd-number count 0.00 0.8))) ) scanned-synth (progn (defparameter size 120) (setf partials1 (library 'tbn-cs3-partials 'partials nil :random 64)) (setf partials2 (library 'tbn-cs3-partials 'partials nil :random 64)) (setf freq1 (rnd-sample size (partial :freq (flatten partials1)))) (setf freq2 (rnd-sample size (partial :freq (flatten partials2)))) (defparameter dur1 (rnd-sample size '(s s s s))) (defparameter dur2 (rnd-sample size '(q e s s s -s))) (defparameter amp1 (rnd-number size .005 .13)) (defparameter amp2 (rnd-number size .005 .13)) (defparameter waves '(1 2 3 4 5 6 7 8 9 10 11 12 13)) (with-sound (:reverb jc-reverb) (scanned-synth dur1 freq1 amp1 :wave (rnd-sample size waves) :bpm 96 :pts (rnd-sample size '(192 256 512))) (scanned-synth dur2 freq2 amp2 :wave (rnd-sample size waves) :bpm 96 :pts (rnd-sample size '(192 256 512))) ) ) circular-scanned-synth (progn (defparameter size 24) (setf partials1 (library 'tbn-cs3-partials 'partials nil :random 50)) (setf partials2 (library 'tbn-cs3-partials 'partials nil :random 50)) (setf par1 (rnd-sample size (partial :freq (flatten partials1)))) (setf par2 (rnd-sample size (partial :freq (flatten partials2)))) (defparameter dur1 (rnd-sample size '(1 2 3 4 5))) (defparameter dur2 (rnd-sample size '(1 2 3 4 5))) (defparameter freq1 (gen-divide (rnd-sample size '(2 3 4 5)) par1)) (defparameter freq2 (gen-divide (rnd-sample size '(2 3 4 5)) par2)) (defparameter amp1 (rnd-number size .05 .43)) (defparameter amp2 (rnd-number size .05 .43)) (defparameter env '((0 0 40 .1000 60 .2000 75 1 90 1 100 0) (0 0 60 .1000 80 .2000 90 1 100 0) (0 0 10 1 16 0 32 .1000 50 1 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 82 1 100 0) (0 0 10 1 32 .1000 50 1 100 0) (0 0 60 .1000 80 .3000 95 1 100 0) (0 0 80 .1000 90 1 100 0))) (with-sound (:reverb jc-reverb) (circular-scanned-synth dur1 freq1 amp1 :wave (rnd-sample size '(1 2 3 4)) :recompute-samps (rnd-sample size '(14 222 32 162 211 72)) :pts (rnd-sample size '(192 256 512)) :cycles (rnd-sample size '(1 2 3)) :amp-env (rnd-sample size env)) (circular-scanned-synth dur2 freq2 amp2 :wave (rnd-sample size '(1 2 3 4)) :recompute-samps (rnd-sample size '(14 222 32 162 211 72)) :pts (rnd-sample size '(192 256 512)) :cycles (rnd-sample size '(1 2 3)) :amp-env (rnd-sample size env)) ) ) badd-synth (progn (defparameter size 12) (setf partials (library 'marangona-partials 'partials nil :random 64)) (setf mpar (remove-partial partials :type :freq :max 1800.0)) (setf par (partial :freq mpar)) (setf freq '(rnd-sample size (flatten par))) (defparameter dur '(rnd-sample size '(1 2 3 4 5))) (defparameter amp '(rnd-number size .12 .33)) (with-sound (:reverb jc-reverb) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) ) ) bandedwg-synth (progn (setf row (library 'vienna 'berg 'r11)) (setf degree '(0 3 4 0 -2 -3 -1 0 -2)) (setf mat (gen-eval 6 '(harmonic-progression (setf degree (gen-rotate 2 degree)) row :relative t))) (setf end1 (harmonic-progression '(-13 -13) row :relative t)) (setf end2 (harmonic-progression '(-12 -12) row :relative t)) (setf end3 (harmonic-progression '(-13 -13) row :relative t)) (setf end4 (harmonic-progression '(-12) row :relative t)) (defparameter omn (make-omn :length '((q) (-h)) :pitch (assemble-seq mat end1 end2 end3 end4) :velocity '(mp) :span :pitch)) (with-sound (:reverb jc-reverb) (bandedwg-synth omn omn omn :mode 1) ) ) As you can see it is quite easy to use CLM in OM with OMN. More CLM instruments to come.
  14. Extended documentation and bug fix in do-timeline and do-timline2 functions if binary list.
  15. Optimisation to DO-TIMELINE. MIDI and frequency (partials) conditions. New compact timeline in DO-TIMELINE and DO-TIMELINE2 Example: (do-timeline '( piccolo (---xxxxxxx xxxxxx---- xxx------- xxxxxx---- ---------- xxxxxxx--- ---xxxxxxx xx) flute (--xxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxx---- ---------- xxxxxxxxxx xxxxxxxxxx xx) alto-flute (--xxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxx------ ---------- ---x--xxxx xxxxxxxxxx xx) oboe1 (xx----xxxx xxxxxx---- xxxxxxxxxx ---xxx---- ---------- xxxxxxxxxx xxxxxxxxxx xx) oboe2 (xxxxxxxxxx xxxxxxxxx- xxxxxxxxxx ---xx----- ---------- xxxxxxxxxx xxxxxxxxxx xx) cor-anglais (xxxxxxxxxx xxxxxx---- xxxxxxxxxx ---xx----- ---------- xxxxxxxxxx xxxxxxx-xx xx) clarinet1 (xxx------- xxxxxx---- --xxxxxxxx ---xxx---- ---------- xx-------- --------xx xx) clarinet2 (xxxxxxxxxx xxxx------ xxxxxxxxxx ---xxx---- ---------- ---------- --------xx xx) clarinet3 (xxxxxxxxxx xxxx------ xxxxxxxxxx ---------- ---------- ---------- --------x- --) bass-clarinet (xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx x--------- ---------- xxxx--xxxx xxxxxxxxxx xx) bassoon1 (xxxxxxxxxx ---------- xxxxxxxxxx ---xxx---- ---------- ---------- --------xx xx) bassoon2 (xxxxxxxxxx xx-------- xxxxxxxxxx -x-------- ---------- ---------- -------x-- --) contrabassoon (xxxxxxxxxx xxxx------ xxxxxxxxxx xx-------- ---------- ---------- ------xx-- --) horn1 (x--------- xxxxxxxx-- ---------- xxxxxxxxxx ---------- ---------- ---------- --) horn2 (xxxx------ xxxxxxxxxx xxxxxxxxxx xx-x------ ---------- ---------- -------xxx --) horn3 (xxxxxx---- xxxxxxxxxx xxxxxxxxxx xx-xxx---- ---------- ---------- -------xxx xx) horn4 (xxxxxx---- xxxxxxxxxx xxxxxxxxxx xx-x------ ---------- ---------- --------xx --) trumpet1 (xxxxxx---- ---xxxxx-- ---------- ---xxx---- ---------- xxxx----xx xxxxxx--xx xx) trumpet2 (xxx--x---- ---xxxxx-- xxxxxxxxxx ---xxx---- ---------- xxxx----xx xxxx----xx xx) trumpet3 (---------- x--xxxxxxx xxxxxxxxxx ---xxx---- ---------- xxxxxxxxxx xxxxxx--xx xx) bass-trumpet (xxxx------ x--------- ---------- x--xxx---x ---------- --------xx xxxxxxx-xx xx) trombone (------xxxx xxxxxxxxxx ---------- x-xxxxxx-x ---------- ---------- ---xxxx--- --) tenor-tuba (---------- xxxxxxxxxx ---xxxxxxx x--------- ---------- ---------- ---xxxx--- --) bass-tuba (xxxxxx---x xx---xxxxx xxxxxxxxxx x--------- ---------- ---------- ---xxxx--- --) harp-lh (xxxxxxxxx- xxxxxxxxxx xx-xxxxxxx xx-xxx-x-x ---------- xxxxxx-xxx xxxxxxxxxx xx) harp-rh (xxxxxxxxxx xxxxxxxxxx xx-xxxxxxx xx-xxx-x-x ---------- xxxxxx-xxx xxxxxxxxxx xx) violin1 (xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx -xxxxxxxxx ---------- ---------- --------xx xx) violin2 (xxxxxxxxxx xxxxxxxxxx xxx------x xxxxxxxxxx ---------- ---------- --------xx xx) viola (xxxxxxxxxx xxxxxxxxxx xxxxxx-xxx xxxx--xxxx ---------- ---------- --------xx xx) violoncello (xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xx-x--xxxx ---------- ---------- --------xx xx) contrabass (xxxxxx---x xxxxxxxxxx xxxxxxxxxx xx-x--xx-- ---------- xxxxxxx-xx -xx-xx-xxx xx) ) '(gen-pause x)) Binary example: (do-timeline '( piccolo (0001111111 1111110000 1110000000 1111110000 0000000000 1111111000 0001111111 11) flute (0011111111 1111111111 1111111111 1111110000 0000000000 1111111111 1111111111 11) alto-flute (0011111111 1111111111 1111111111 1111000000 0000000000 0001001111 1111111111 11) oboe1 (1100001111 1111110000 1111111111 0001110000 0000000000 1111111111 1111111111 11) oboe2 (1111111111 1111111110 1111111111 0001100000 0000000000 1111111111 1111111111 11) cor-anglais (1111111111 1111110000 1111111111 0001100000 0000000000 1111111111 1111111011 11) clarinet1 (1110000000 1111110000 0011111111 0001110000 0000000000 1100000000 0000000011 11) clarinet2 (1111111111 1111000000 1111111111 0001110000 0000000000 0000000000 0000000011 11) clarinet3 (1111111111 1111000000 1111111111 0000000000 0000000000 0000000000 0000000010 00) bass-clarinet (1111111111 1111111111 1111111111 1000000000 0000000000 1111001111 1111111111 11) bassoon1 (1111111111 0000000000 1111111111 0001110000 0000000000 0000000000 0000000011 11) bassoon2 (1111111111 1100000000 1111111111 0100000000 0000000000 0000000000 0000000100 00) contrabassoon (1111111111 1111000000 1111111111 1100000000 0000000000 0000000000 0000001100 00) horn1 (1000000000 1111111100 0000000000 1111111111 0000000000 0000000000 0000000000 00) horn2 (1111000000 1111111111 1111111111 1101000000 0000000000 0000000000 0000000111 00) horn3 (1111110000 1111111111 1111111111 1101110000 0000000000 0000000000 0000000111 11) horn4 (1111110000 1111111111 1111111111 1101000000 0000000000 0000000000 0000000011 00) trumpet1 (1111110000 0001111100 0000000000 0001110000 0000000000 1111000011 1111110011 11) trumpet2 (1110010000 0001111100 1111111111 0001110000 0000000000 1111000011 1111000011 11) trumpet3 (0000000000 1001111111 1111111111 0001110000 0000000000 1111111111 1111110011 11) bass-trumpet (1111000000 1000000000 0000000000 1001110001 0000000000 0000000011 1111111011 11) trombone (0000001111 1111111111 0000000000 1011111101 0000000000 0000000000 0001111000 00) tenor-tuba (0000000000 1111111111 0001111111 1000000000 0000000000 0000000000 0001111000 00) bass-tuba (1111110001 1100011111 1111111111 1000000000 0000000000 0000000000 0001111000 00) harp-lh (1111111110 1111111111 1101111111 1101110101 0000000000 1111110111 1111111111 11) harp-rh (1111111111 1111111111 1101111111 1101110101 0000000000 1111110111 1111111111 11) violin1 (1111111111 1111111111 1111111111 0111111111 0000000000 0000000000 0000000011 11) violin2 (1111111111 1111111111 1110000001 1111111111 0000000000 0000000000 0000000011 11) viola (1111111111 1111111111 1111110111 1111001111 0000000000 0000000000 0000000011 11) violoncello (1111111111 1111111111 1111111111 1101001111 0000000000 0000000000 0000000011 11) contrabass (1111110001 1111111111 1111111111 1101001100 0000000000 1111111011 0110110111 11) ) '(gen-pause x)) best wishes, JP
  16. Fix to DO-TIMELINE and DO-TIMELINE2 functions when with T or NIL plus minor bug fixes.
  17. Function name change: RANDOMIZE-OCTAVES is now RND-OCTAVES Optimisation: TONALITY-MAP To change the function name in all of your scores you can use the 'Search Files...' tool.
  18. Opusmodus - made as simple as possible, but not simpler We are very excited to announce our biggest update yet Opusmodus version 1.2. The last few months have been a marathon and a sprint at the same time knowing all of you are waiting patiently wanting to see the next step in functionality, bug fixes etc… Below you will find the list of the new algorithms, tools, notation layout and fixes. For this release our main goal was to improve the notation display especially the length grouping. To achieve this we have developed an entirely new rewrite-lengths algorithm that improves: the notation display, a better tuplets display, time signature grouping, as well as an open-end bracket for incomplete tuplets. We also restructured the System Library, added new Developer documents, a few more score examples, new attributes (articulations) and a handful of new functions. I like to thank especially Achim Bornhoeft, Stephane Boussuge and Andre Meier for their contribution to the new function set. REWRITE-LENGTHS The REWRITE-LENGTHS system is now the default for notation display (snippet) and in DEF-SCORE macro. Composer intent (notation) can be achieved by setting the REWRITE-LENGTHS to Nil in the DEF-SCORE options: :rewrite-lengths nil New Opusmodus Developer documents for anyone wishing to extend their application functionality - this section will expand with time. New DEF-SCORE optional (global): rewrite-lengths NIL or T. The default is T merge-rests NIL or T. The default is T. ignore—velocity NIL or T. The default is NIL. ignore-tempo NIL or T. The default is NIL. octave-shift NIL, T or range i.e. (c2 c6). The default is Nil. accidentals :all :natural or :cautionary. The default is :natural. flexible-clef NIL or T. The default is NIL. ignore-time-signature NIL or T. The default is NIL. New functions: CHORD-RELATIVE-PATH (chord-relative-path '(c3eb4f5d5) '(c4eb4e4g4fs4ds5)) => (c3fs3eb4g4eb5e5) (chord-relative-path '(c3eb4f5d5) '(c4cs4d4g4 cs4d4fs4 c4eb4e4g4 c4d4eb4f4 e4f4g4a4)) => (c3cs4d5g5 cs3fs4d5 eb3e3c4g5 eb3f3c4d5 e3g3a3f5) (chord-relative-path '(c3eb4f5d6) '(q c4cs4d4g4 s c4 cs4 d4 fs4 q c4eb4e4g4 c4d4eb4f4 e4f4g4a4) :ambitus-chord 13) => (q d4cs4c5g4 s c3 cs3 d3 fs3 q c3eb3e3g3 c3d3eb3f3 e3f3g3a3) (chord-relative-path '(c3eb4f5d6) '((c4cs4d4g4 c4cs4d4fs4) (c4eb4e4g4 c4d4eb4f4 e4f4g4a4))) => ((g2c4cs5d6 d2cs4c5fs6) (eb3c4g5e6 f3eb4d5c6 e3f4g5a5)) (chord-relative-path '((c3eb4f5d6) (cs3d4e4f5)) '((e c4cs4d4g4 c4cs4d4fs4) (s c4eb4e4g4 c4d4eb4f4 e4f4g4a4))) => ((e d3g4c5cs6 d3cs4c5fs6) (s eb3e4g4c5 eb3d4c5f5 a3e4f5g5)) CHORD-CLOSEST-PATH (chord-closest-path '(c3eb4f5d5) '(c4eb4e4g4fs4ds5)) => (c3eb4fs5eb5e4g4) (chord-closest-path '(c3eb4f5d5) '(c4cs4d4g4 cs4d4fs4 c4eb4e4g4 c4d4eb4f4 e4f4g4a4)) => (c3d4g5cs5 cs3d4fs5 c3eb4g5e4 c3eb4f5d4 a2e4f5g4) (chord-closest-path '(c3eb4f5d5) '(q c4cs4d4g4 s c4 cs4 d4 fs4 q c4eb4e4g4 c4d4eb4f4 e4f4g4a4)) => (q c3d4g5cs5 s c3 cs3 d3 fs3 q g3c4eb4e4 f3c4eb4d4 f3a3e4g4) (chord-closest-path '((c3eb4f5d6) (cs3d4e4f5)) '((e c4cs4d4g4 c4cs4d4fs4) (s c4eb4e4g4 c4d4eb4f4 e4f4g4a4)) :seed 43) => ((e c3d4g5cs6 c3d4fs5cs6) (s c3eb4e4g5 c3eb4f4d5 a2e4f4g5)) SECTION-TO-BINARY (section-to-binary '(0 1 3 5 8 9 11)) => (1 1 0 1 0 1 0 0 1 1 0 1) (section-to-binary '((0 1 3) (5 8 9 11))) => ((1 1 0 1) (0 0 0 0 0 1 0 0 1 1 0 1)) BINARY-TO-SECTION (binary-to-section '(1 1 0 1 0 1 0 0 1 1 0 1)) => (0 1 3 5 8 9 11) (binary-to-section '((1 1 0 1) (0 0 0 0 0 1 0 0 1 1 0 1))) => ((0 1 3) (5 8 9 11)) SECTION-TO-TIMELINE (section-to-timeline '(0 1 2 5 6 7 8 10 11 15 16 23 24 25 27 28 29 30 31 32 33 36 37)) => (xxx--xxxx-xx---xx------xxx-xxxxxxx--xx) TIMELINE-TO-SECTION (timeline-to-section '(xxx--xxxx-xx---xx------xxx-xxxxxxx--xx)) => (0 1 2 5 6 7 8 10 11 15 16 23 24 25 27 28 29 30 31 32 33 36 37) DO-TIMELINE additional timeline format - compressed. (do-timeline '( ; 5 10 15 20 ; | | | | clarinet3 t contrabassoon (xxxxxxxxxxxxxxxx-x---xxx) horn3 (xx---xxxxxxxxxxxxxxxxxxx) trumpet3 (xxxxxxxxxxxxxxxxxxxxxxxx) violinx nil violin2 (xxxxxx----xxxxxxx-xx-xxx) viola (xxxxxxxxxx-x-xxxxxxxxxxx) violoncello (xx-xx-xxxxxxxxxxxx—x-x--) contrabass (xxx-xx-xxxxxx-x-x-xxxxxx) ) '(pitch-variant x :variant 'i)) GEN-TRANSITION (gen-transition 1 10 10 1) => (1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0) (gen-transition 0.5 11.2 10 1) => (0.5 1.6888889 2.8777778 4.0666666 5.2555556 6.4444447 7.633333 8.822223 10.011111 11.2) (list-plot (gen-transition 0 10 50 0.7) :zero-based t :point-radius 1.5 :join-points t) (list-plot (gen-transition 0 10 50 1.3) :zero-based t :point-radius 1.5 :join-points t) (list-plot (gen-transition '(0 1 2) '(10 11 12) 10 '(1.5 1 0.5)) :zero-based t :point-radius 1.5 :join-points t) (list-plot (gen-transition '(2 1 0) '(10 11 12) 10 '(1.5 0.5)) :zero-based t :point-radius 1.5 :join-points t) (list-plot (gen-transition '(0 1) '(10 30) 50 1 :rounded t) :zero-based t :point-radius 1.5 :join-points t) (chordize-list (gen-transition '(0 4 7) '(11 22 33) 10 1 :chords t :rounded t :type :pitch)) => (c4e4g4 cs4fs4bb4 d4gs4cs5 e4bb4e5 f4c5g5 fs4d5a5 g4e5c6 a4fs5eb6 bb4gs5fs6 b4bb5a6) (chordize-list (gen-transition '(0 4 7) '(11 22 33) 10 .5 :chords t :rounded t :type :pitch)) => (c4e4g4 e4bb4e5 f4c5g5 fs4d5bb5 g4e5c6 gs4f5d6 a4g5e6 bb4gs5fs6 bb4a5gs6 b4bb5a6) (chordize-list (gen-transition '(0 4 7) '(11 22 33) 10 2 :chords t :rounded t :type :pitch)) => (c4e4g4 c4e4g4 cs4f4gs4 cs4fs4bb4 d4gs4c5 eb4bb4eb5 f4c5g5 g4eb5b5 a4fs5e6 b4bb5a6) (chordize-list (gen-transition '(0 4 7) '(11 22 33) 10 '(1.5 1 0.5) :chords t :rounded t :type :pitch)) => (c4e4g4 c4fs4e5 cs4gs4g5 d4bb4bb5 eb4c5c6 f4d5d6 fs4e5e6 gs4fs5fs6 a4gs5gs6 b4bb5a6) GEN-SYMMETRICAL (gen-symmetrical 24 '(1 2 3 4 5 6)) => (5 2 6 2 3 2 1 5 2 3 5 4 4 5 3 2 5 1 2 3 2 6 2 5) (gen-symmetrical 24 '(1 2 3 4 5 6) :repeat t) => (1 1 3 1 1 2 4 6 4 5 5 2 2 5 5 4 6 4 2 1 1 3 1 1) (gen-symmetrical '(6 8 12) '(1/16 1/32 1/8)) => ((1/8 1/32 1/8 1/8 1/32 1/8) (1/16 1/8 1/16 1/32 1/32 1/16 1/8 1/16) (1/8 1/32 1/16 1/32 1/16 1/32 1/32 1/16 1/32 1/16 1/32 1/8)) GEN-MULTISYMMETRICAL (gen-multisymmetrical 8 '(1 2 3 4 5 6)) => (2 3 2 1 1 2 3 2 4 5 2 5 5 2 5 4 1 5 4 6 6 4 5 1 6 5 3 1 1 3 5 6 6 5 3 1 1 3 5 6 1 5 4 6 6 4 5 1 4 5 2 5 5 2 5 4 2 3 2 1 1 2 3 2) (gen-multisymmetrical 8 '(1 2 3 4 5 6) :repeat t) => (1 1 2 4 4 2 1 1 6 4 5 5 5 5 4 6 2 2 2 5 5 2 2 2 5 5 5 3 3 5 5 5 5 5 5 3 3 5 5 5 2 2 2 5 5 2 2 2 6 4 5 5 5 5 4 6 1 1 2 4 4 2 1 1) GEN-SIEVE (gen-sieve '(c4 g7) '(2 1)) => (0 2 3 5 6 8 9 11 12 14 15 17 18 20 21 23 24 26 27 29 30 32 33 35 36 38 39 41 42) (gen-sieve '(c4 g7) '(2 1) :type :pitch) => (c4 d4 eb4 f4 fs4 gs4 a4 b4 c5 d5 eb5 f5 fs5 gs5 a5 b5 c6 d6 eb6 f6 fs6 gs6 a6 b6 c7 d7 eb7 f7 fs7) (gen-sieve '((c4 g7) (c1 g7)) '((2 1 12) (3 5))) => (-36 -33 -28 -25 -20 -17 -12 -9 -4 -1 0 2 3 4 7 12 15 17 18 20 23 28 30 31 32 33 36 39) (gen-sieve '((c4 g7) (c1 g7)) '((2 1 12) (3 5)) :type :pitch) => (c1 eb1 gs1 b1 e2 g2 c3 eb3 gs3 b3 c4 d4 eb4 e4 g4 c5 eb5 f5 fs5 gs5 b5 e6 fs6 g6 gs6 a6 c7 eb7) (gen-sieve '(violin (c1 g6) piccolo) '((2 1 12) (3 5) (3 6)) :type :interval) => (3 5 3 5 3 5 3 4 1 1 1 1 5 3 3 2 1 2 5 1 2 1 1 2 1 2 1 2 6 1 2 1 5) GEN-DYNAMIC (gen-dynamic '(3 5 4 4 5) '(pp f ff mf f)) => (pp< < < f< < < < < ff> > > > mf< < < < f f f f f) Avec valeur de vélocité de fin optionelle: (gen-dynamic '(3 5 4 4 5) '(pp f ff mf f) 'p) => (pp< < < f< < < < < ff> > > > mf< < < < f> > > > p) (gen-dynamic '(3 5 4 4 5) '(pp f ff mf f) '>) => (pp< < < f< < < < < ff> > > > mf< < < < f> > > > >) (gen-dynamic '(3 5 4 4 5) '(pp f ff mf f) '<) => (pp< < < f< < < < < ff> > > > mf< < < < f< < < < <) (gen-dynamic '((3 5) (4 4) (5 3)) '((pp f) (p mf) (f p))) => ((pp< < < f> > > > >) (p< < < < mf< < < <) (f> > > > > p p p)) (gen-dynamic '((3 5) (4 4) (5 3)) '((pp f) (p mf) (f p)) 'f) => ((pp< < < f> > > > >) (p< < < < mf< < < <) (f> > > > > p< < f)) (gen-dynamic '((3 5) (4 4) (5 3)) '((pp f) (p mf) (f p)) '<) => (pp< < < f< < < < < ff> > > > mf< < < < f< < < < <) VELOCITY-TO-DYNAMIC (velocity-to-dynamic '(p p f f f mp mp f f)) => (p< < f> > > mp< < f f) (velocity-to-dynamic '(p p f f f mp mp f f) :end '>) => (p< < f> > > mp< < f> >) (velocity-to-dynamic '(p p f f f mp mp f f) :end 'p) => (p< < f> > > mp< < f> p) (velocity-to-dynamic '((p p f f f mp mp f ff) (f mp mp f f f))) => ((p< < f> > > mp< < f< ff>) (f> mp< < f f f)) (velocity-to-dynamic '((p p f f f mp mp f ff) (f mp mp f f f)) :section 0) => ((p< < f> > > mp< < f< ff) (f mp mp f f f)) GEN-LENGTH-CONSTANT (gen-length-constant '(1 2 -2 5) 'h) => (1/20 1/10 -1/10 1/4) (gen-length-constant '(1 2 -2 5) 'h :rnd-order t) => (1/4 1/10 1/20 -1/10) (gen-length-constant '(1 2 -2 5) 'h :rnd-rest-order t) => (-1/20 1/10 1/10 1/4) (gen-length-constant '(1 2 -2 5) 'h :rnd-order t :rnd-rest-order t) => (-1/4 1/10 1/10 1/20) (gen-length-constant (gen-loop 12 '(3 -2 5)) 'h :rnd-order t :rnd-rest-order t) => ((-3/20 1/10 1/4) (1/10 -3/20 1/4) (3/20 -1/10 1/4) (-1/4 3/20 1/10) (-1/4 1/10 3/20) (1/10 1/4 -3/20) (3/20 -1/4 1/10) (1/4 -3/20 1/10) (-1/10 3/20 1/4) (1/4 3/20 -1/10) (-3/20 1/10 1/4) (1/4 -3/20 1/10)) GEN-LENGTH-DENSITY (gen-length-density 2) => ((-1/16 -1/16 -1/16 1/16 1/16 1/16 1/16 -1/16 -1/16 -1/16 -1/16 -1/16) (-1/16 -1/16 1/16 -1/16 1/16 -1/16 1/16 -1/16 1/16 -1/16 1/16 1/16)) (gen-length-density 2 :omn t) ((s = - = = - = - - = - =) (s - - - - = - = = = - -)) (gen-length-density 2 :level 12 :density 10 :type 2) => ((5/16 3/16 1/4) (3/16 1/2 1/16)) (gen-length-density 2 :level 12 :density 48 :type 2) => ((3/16 1/16 1/16 1/16 1/16 1/16 1/16 3/16) (1/8 1/16 1/8 1/16 1/8 1/16 3/16)) (gen-length-density 2 :level 12 :density 85 :type 2) => ((1/16 1/16 1/8 1/8 1/16 1/16 1/16 1/16 1/16 1/16) (1/16 1/16 1/16 1/8 1/16 1/16 1/16 1/16 1/16 1/16 1/16)) (gen-length-density 2 :level 24 :density '(1 100) :type 2 :omn t) => ((w.) (s = = = = = = = = = = = = = = = = = = = = = = =)) (gen-length-density 2 :level 8 :ratio 'e :density '(25 75) :type '(2 1)) => ((3/8 5/8) (1/8 1/8 -1/8 1/8 1/8 1/8 1/8 1/8)) SPLIT-TUPLET-LENGTHS (split-tuplet-lengths '(5/32 1/32 1/4 1/32 5/32 1/20 1/10 1/10 3/32 1/32 5/32 1/16 1/32)) => ((5/32 1/32 1/4 1/32 5/32) (1/20 1/10 1/10) (3/32 1/32 5/32 1/16 1/32)) (split-tuplet-lengths '((3/5 1/10 1/20 3/10 1/16 1/8 1/4 2/5 1/2) (3/20 9/20 1/8 1/4 1/8 7/20 1/5 11/20))) => ((3/5 1/10 1/20 3/10) (1/16 1/8 1/4) (2/5) (1/2) (3/20 9/20) (1/8 1/4 1/8) (7/20 1/5 11/20)) All new function documentation as usual you’ll find in the Utilities System Library. The MAKE-OMN function by default will display length as a ratio from now on. Any of you preferring to see the output in length symbols can do that by setting the :length-symbols to true. New Attribute: octave-shift '(q ab5 marc+8va -e c6 marc+8va s g5 stacs+8va e g6 ten+8va -s e ab6 marc+stacs+8va -) Fixed to ped and ped1 midi playback. Fixed to leg (legato) when length-rest next. In DO-TIMELINE, DO-TIMLINE2 and TONALITY-MAP the :resolution keyword has changed to :span. The Opusmodus user interface has been extended with invaluable tools: Search Files… you will find the new tool in the Tools menu. Search Files… will allow you to search and replace a bunch of files all in one go. For example replacing the :resolution name to :span in all of your scores, is a matter of seconds. Other minor bug fixes and plenty of optimisation. And finally for night composers we have added the flexible background colorisation option: Toggle Dark. Happy composing, Janusz Podrazik
  19. The Opusmodus 1.1 update is recommended for all Opusmodus users. This update: Interface stability and compatibility. Listener speed improvement. DEF-SCORE performance improvement. System optimisation and revision of random functions - less CONS and LOOPs: (different results with set :seed may occur). Additional layout and improvement to MusicXML notation display. Added Layout options: :ignore-velocity :ignore-tempo :ignore-time-signature :ignore-bars :ignore-clef :cautionary-accidentals :natural-accidentals :all-accidentals :section option added to many more functions. MERGE-VOICES, MAKE-OMN and DISASSEMBLE-OMN functions are performing correctly now. Revision to System Function documentation. Notation, Scale 0.5 (default) setup added to Preferences panel. Score Templates added to New menubar. New added functions: BINARY-DO-SECTION BINARY-SECTION-MAP GEN-BINARY-MAP PITCH-FIGURATE GEN-EXTRACT Functions renamed: LENGTH-CONDENSE -> LENGTH-MERGE LENGTH-REST-CONDENSE -> LENGTH-REST-MERGE LENGTH-NOTE-CONDENSE -> LENGTH-NOTE-MERGE LENGTH-REST-WEIGHT -> LENGTH-WEIGHT :key-signature atonal - now needs a quote before the name :key-signature 'atonal or 'chromatic And more...
×
×
  • Create New...