Jump to content

ydepps

Members
  • Content Count

    0
  • Joined

  • Last visited


Reputation Activity

  1. Like
    ydepps reacted to opmo in Short UNFOLD concept example   
    This short example demonstrates how powerful and flexible the UNFOLD concept 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
  2. Like
    ydepps reacted to opmo in Opusmodus 1.3.24692   
    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
  3. Like
    ydepps reacted to opmo in Opusmodus 1.3.24667   
    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.
  4. Like
    ydepps reacted to opmo in Opusmodus 1.3.24622   
    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
  5. Like
    ydepps reacted to opmo in Opusmodus - second monitor   
    The upcoming release will allow you to open display-midi, display-musicxml, graphs and snippets in a separate window. For any of you using second monitor this will be great addition to your work flow.
     
    Examples:
    (display-midi 'score :display :window) (display-musicxml 'score :display :window)  
    Best,
    Janusz
  6. Thanks
    ydepps reacted to opmo in Opusmodus 1.3.24534   
    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
  7. Like
    ydepps reacted to opmo in CLM Installation in Opusmodus 1.3   
    CLM Installation
     
    Common Lisp Music, by William Schottstaedt is a powerful sound synthesis language implemented in Lisp and C. CLM is essentially a toolbox for instrument building. Although it comes with a number of instruments ready to use, most composers use CLM to define their own instruments.
     
    For those of you that wish to dive into CLM sound synthesis system, I advise everyone to read this document carefully first.
     
    1. Command Line Tools
     
    First you need to find out if  "command line tools" are installed in your system.
    The C compiler is essential at the instrument compile and load time.
     
    Launch the Terminal, found in /Applications/Utilities/
    To check if command line tools are installed run:
    xcode-select --version  
    if installed you will see the below with the version found in your system, something like that:
    xcode-select version 1234
     
    If command line tools are not installed run:
    xcode-select --install  
    A software update popup window will appear that asks: “The xcode-select command requires the command line developer tools. Would you like to install the tools now?” choose to confirm this by clicking “Install”, then agree to the Terms of Service when requested. Wait for the Command Line Tools package download to complete, it’ll be about 130MB and installs fairly quickly depending on your connection speed. The installer goes away on its own when complete. Enjoy your new unix command line toolkit!
     
    2. Load and Compile Instruments
     
    CLM system comes with a number of instruments which are a great starting point to see and hear CLM in action. Some of them are simple others are complex. Before you can run any of the instruments you must compile them first. To do that you need to open and evaluate a file "Load CLM Instrument.lisp", you will find the file in the CLM directory. This process will take a minute or so and it will create binary and dynamic library files for each of the instruments. The binary files will be saved in the bin directory and the library files will be saved in the libclm directory. After this process is completed you are ready to run the CLM Examples. If you wish to load your instruments at the startup of the app move the "Load CLM Instrument.lisp" file into the “~/Opusmodus/Extensions/“ directory.
     
    Thats all you need to do to make CLM system work in Opusmodus.
     
    Best wishes,
    Janusz
     
  8. Like
    ydepps reacted to Stephane Boussuge in Working with large pieces in multiple sections   
    All of us, as Opusmodus users, know the possibility to compose a piece with multiples sections and assemble later.
     
    We can use the ASSEMBLE-SEQ function in our piece for assemble some material and sections, but we also can use COMPILE-SCORE with multiple pre-defined scores assembled in one COMPILE-SCORE instruction this way:
     
    (compile-score '( score1 score2 score3 etc. ) ) This is a very convenient way for assembling multiple sections as multiple score.
    i put this instructions in a separate file named COMPILE-SCORE and all other section-score in files named S1, S2, S3.... 
    But when the piece grown, you can have many score files in you workspace navigator to evaluate before compiling the full score.
     
    In that case, i add a last file named LoadAll. opmo containing the following instruction for load and read in one time all my section's scores:
     
    (mapcar 'load '( "/Users/yourUserName/Opusmodus/Scores/S1.opmo" ;; S1 for section1, s2 for section2 and so on... "/Users/yourUserName/Opusmodus/Scores/S2.opmo" "/Users/yourUserName/Opusmodus/Scores/S3.opmo" "/Users/yourUserName/Opusmodus/Scores/S4.opmo" "/Users/yourUserName/Opusmodus/Scores/S5.opmo" "/Users/yourUserName/Opusmodus/Scores/S6.opmo" "/Users/yourUserName/Opusmodus/Scores/S7.opmo" "/Users/yourUserName/Opusmodus/Scores/S8.opmo" )) Attached to this post, 2 pictures of one of my workspace showing the organisation of the files.
     
    SB.


  9. Like
    ydepps reacted to Andy in The learning curve..thoughts   
    It's quite a feeling this Opusmodus thing.
     
    Stephen I have a website so maybe I'll do a 'post' there.
  10. Like
    ydepps reacted to Andy in The learning curve..thoughts   
    For me, this is a much easier journey than Max/MSP or ACToolbox or Kyma or PWGL or ...in fact any program for composition where there is a bunch of boxes, wires and annoying graphics! The idea of boxes and graphics..the visual paradigm, is it is meant to make it easier somehow.. but I now realise the reverse is true.
    If you are just dealing with text and traditional music notation as in OM,  it's really very straight forward. There is a learning 'bump' initially but then it really starts to make sense.
    I got so annoyed at Max going from 4 to 5 to 6 to 7 and the ridiculous changes in the GUI that meant I had to relearn the program every time. It was all about them. I feel Opusmodus is all about me. And that's quite a unique experience. And actually the real effort visually in Opusmodus has been put in to functionality, the IDE, which to be honest is totally unique. Thanks.
    Onward and upward. (with a few backwards I'm sure)
     
     
  11. Like
    ydepps reacted to opmo in Using Nigel's Book   
    indeed, it is a great introduction to parametric composition. Nigel started working on this book at the time we were working on Opusmodus documentation. It makes me very happy to hear his work is appreciated by so many, He was a great supporter and teacher of algorithmic composition which has spread over many decades. We all miss him dearly.

    Note:
    There are a few changes to some of the Opusmodus function names since the release of Nigel's book. Some of the examples might end in error.
  12. Like
    ydepps reacted to opmo in Opusmodus 1.3.24409   
    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.
  13. Like
    ydepps reacted to opmo in Music xml import, convert to Score?   
    At the moment you can't convert musicxml file into omn score.
    But it is in our TODO list.
  14. Thanks
    ydepps reacted to Stephane Boussuge in Pluton for Orchestra   
    In memoriam Narcis Bonet who was one of my teachers.
     

    Opusmodus score attached.
    SB.
    PlutonV1-02.opmo
  15. Like
    ydepps reacted to torstenanders in Request: make-omn   
    > Sometimes is interesting for hearing snippets with different sounds without having to compile the entire score
     
    My Opmo score data structure already allows for that, though you always have to render snippets with an explicit function call, as we cannot define custom shortcuts so far.
     
    It is part of my tools at https://github.com/tanders/tot. Check out the function preview-score (https://tanders.github.io/tot/sources/score.html#_g232191). Various other functions allow to transform polyphonic score snippets for one or more instruments in various ways. 
     
    Best,
    Torsten
     
  16. Like
    ydepps reacted to opmo in Variations on Variations (2019)   
    It is a new function which generate a variations of a given score or section. The function has around 20 keywords and is not yet ready for release.
  17. Like
    ydepps reacted to opmo in Opusmodus 1.2.21330   
    MIDI controller function:
     
    gen-dynamic-controller omn-sequence &key scale loop
     
    [Function]
     
    Arguments and Values:
     
    omn-sequence        omn-form sequence.
    scale                         a floating point number from 0.1 to 2.0. The default is 1.0.
    loop                      Nil or T. The T (true) will loop the scale list to the count
                                         of the lists in the sequence. The default is Nil.
     
    Description:
     
    The GEN-DYNAMIC-CONTROLLER function generates controller values from the omn-sequence dynamic symbols.
     
    (setf omn
          '((h. eb4 pp tasto q g3 0<pp>0 ponte)
            (-e) (q gs4 fp tasto) (-s) (q a5 ffp)
            (-e) (q bb4 fffp) (-s) (q cs5 pf)
            (-s q. e5 fp -e.) (q cs5 p h. d5 pfp)
            (-q h. c5 pp) (h. gs3 0<ppp>0 ponte -e a4 p< tasto)
            (h. fs5 mp q bb3 0<pp>0 ponte)
            (q c5 p tasto h. e4 pfp) (-e)
            (q cs4 fp h d5 pp>pppp) (h. f4 pp>pppp)))
     
    (gen-dynamic-controller omn)
    => ((36 3/4) (:asc-desc 0 36 1/256 1/4) (0 1/8) (80 1/64)
        (:desc 30 25 1/256 15/64) (0 1/16) (91 1/64)
        (:desc 47 25 1/256 15/64) (0 1/8) (102 1/64)
        (:desc 56 25 1/256 15/64) (0 1/16) (25 1/64)
        (:asc 30 80 1/256 15/64) (0 1/16) (80 1/64)
        (:desc 30 25 1/256 23/64) (0 3/16) (47 1/4)
        (:asc-desc 23 80 1/256 3/4) (0 1/4) (36 3/4)
        (:asc-desc 0 25 1/256 3/4) (0 1/8)
        (:asc 47 58 1/256 1/8) (58 3/4)
        (:asc-desc 0 36 1/256 1/4) (47 1/4)
        (:asc-desc 23 80 1/256 3/4) (0 1/8) (80 1/64)
        (:desc 30 25 1/256 15/64) (:desc 36 14 1/256 1/2)
        (:desc 36 14 1/256 3/4))
     
     This is the notation of the sequence, see above:
     

     
     
    Audio:
    Virtual Instrument: VSL: Violin Solo.
    The dynamic controller values are sent to CC11: Expression 
     
       
     
     
    Examples:
     
    To scale up the controller values we set the :scale value higher than 1.0.  To scale down the controller values we set the :scale value lower than 1.0.
     
    Here the scale value is 1.2:
     
    (gen-dynamic-controller omn :scale 1.2)
    => ((43 3/4) (:asc-desc 0 43 1/256 1/4)
        (0 1/8) (96 1/64) (:desc 36 30 1/256 15/64)
        (0 1/16) (109 1/64) (:desc 56 30 1/256 15/64)
        (0 1/8) (122 1/64) (:desc 67 30 1/256 15/64)
        (0 1/16) (30 1/64) (:asc 36 96 1/256 15/64)
        (0 1/16) (96 1/64) (:desc 36 30 1/256 23/64)
        (0 3/16) (56 1/4) (:asc-desc 24 96 1/256 3/4)
        (0 1/4) (43 3/4) (:asc-desc 0 30 1/256 3/4)
        (0 1/8) (:asc 56 70 1/256 1/8) (70 3/4)
        (:asc-desc 0 43 1/256 1/4) (56 1/4)
        (:asc-desc 24 96 1/256 3/4) (0 1/8) (96 1/64)
        (:desc 36 30 1/256 15/64) (:desc 43 17 1/256 1/2)
        (:desc 43 17 1/256 3/4))
     
    To add more control to the dynamic of the sequence we can set each bar (a list) with their own scale value.
    In the example below the 4th value 1.0 will stay for all of the remaining bars (lists).
     
    (gen-dynamic-controller omn :scale '(1.0 1.1 1.2 1.0))
     
    Adding loop to the scale keyword we are looping the scale values to the count of the lists in the sequence:
     
    (gen-dynamic-controller omn :scale '(1.0 1.1 1.2 1.0) :loop t)
     
    ;;;---------------------------------------------------------
    ;;; SCORE EXAMPLE
    ;;;---------------------------------------------------------
     
    It is important to use the same omn-sequence data that you are using in the DEF-SCORE instrument instance.
     
    (setf omn
          '((h. eb4 pp tasto q g3 0<pp>0 ponte)
            (-e) (q gs4 fp tasto) (-s) (q a5 ffp)
            (-e) (q bb4 fffp) (-s) (q cs5 pf)
            (-s q. e5 fp -e.) (q cs5 p h. d5 pfp)
            (-q h. c5 pp) (h. gs3 0<ppp>0 ponte -e a4 p< tasto)
            (h. fs5 mp q bb3 0<pp>0 ponte)
            (q c5 p tasto h. e4 pfp) (-e)
            (q cs4 fp h d5 pp>pppp) (h. f4 pp>pppp)))
     
    GM sound set:
     
    (def-score dynamic
               (:key-signature 'chromatic
                :time-signature (get-time-signature omn)
                :tempo 32
                :layout (violin-layout 'vln))
     
      (vln
       :omn omn
       :channel 1
       :sound 'gm
       :volume 127
       :program 'violin
       :controllers (11 (gen-dynamic-controller omn)))
      )
      
    VSL sound set:
     
    (def-score dynamic
               (:key-signature 'chromatic
                :time-signature (get-time-signature omn)
                :tempo 32
                :layout (violin-layout 'vln))
      
      (vln
       :omn omn
       :port 0
       :channel 1
       :sound 'vsl-violin-solo
       :volume 127
       :controllers (11 (gen-dynamic-controller omn)))
      )
     
    ---
    best wishes,
    Janusz
  18. Like
    ydepps reacted to rme in using Emacs and SLIME with Opusmodus   
    If you want to use Emacs and SLIME with Opusmodus, that is possible.
     
    Here are steps that work:
    If you haven't already done so, install Quicklisp. Evaluate (ql:quickload "quicklisp-slime-helper"). Follow its instructions and put (load (expand-file-name "~/quicklisp/slime-helper.el")) into your ~/.emacs file. Start Opusmodus, and evaluate (cl-user::start-swank). This should print something like ";; Swank started at port: 4005". Now, start your Emacs.  Type M-x slime-connect and you'll be prompted for a host (use the default, which is 127.0.0.1) and then a port. The port needs to match the port (default 4005) that was printed out earlier. You are now connected to Opusmodus. You should be able to say stuff like (list-plot '(1 2 3)) from the SLIME repl and have it work.
     
    The function cl-user::start-swank basically does (load "home:quicklisp;setup") and then (ql:quickload :swank) and then (swank:create-server :port 4005 :dont-close t), so there's no magic going on there.
     
    If you run into trouble, let me know and I'll try to help out.
     
  19. Like
    ydepps reacted to opmo in Variations on Variations (2019)   
    Variations on "Webern Variationen Fuer Klavier Op.27, I" (2019) by JP
     
       
     
     
    Instrument: VSL Steinway D
  20. Like
    ydepps reacted to JulioHerrlein in Combinatorial Voice-Leading of Hexachords   
    Dear All,
     
    HAPPY 2018 !!
     
    With the new PCS organization in Opusmodus is possible to implement a concept of my book, called Combinatorial Voiceleading of Hexachords.
    From a Hexachord Set, is possible to find 10 different ways to combine the notes in the for of voice-leading sets. Each hexachord is divided in (3 + 3) way.
     

     
    This expression:
     
    (setf hexavl (mclist (chordize-list (integer-to-pitch (remove-duplicates (sort-asc (gen-divide 3 (flatten (permute (pcs '6-32))))) :test #'equal)))))  
    Will result in this combination of the 6-32 hexachord, similar to the idea in the book.
     

     
    In the book, the material is organized in 70 pages of melodic and harmonic exercises.
     
    Here is a litte sample:
    CH_HERRLEIN.pdf
     
    The entire book:
    https://www.melbay.com/Products/Default.aspx?bookid=30042BCDEB
     
    Best !
    Julio Herrlein
  21. Like
    ydepps reacted to Stephane Boussuge in Brin d'Or   
    Here's a short piece for violin solo and Strings ensemble with Fibonacci based harmony.
    Full score attached to this post fully commented but in French 🙂
     

     
    SB.
     
    BrinD'or-V04.opmo
  22. Like
    ydepps reacted to opmo in Opusmodus with sound synthesis package (CLM)   
    Since some time we are working on implementing Bill's Schottstaedt 'Synthesis package CLM' into Opusmodus.
    As expected we make the CLM working with OMN form sequence or with single parameters - example below.
     
    The score is using partials from The Bells of the Campanile: La Marangona.
    Below you will find an audio file of the score which is rendered each time you make evaluation.
     
    Best wishes to all,
    Janusz
    ;; --------------------------------------------------------- ;; MARANGONA ;; --------------------------------------------------------- ;; Parameters (defparameter count 50) (setf partials1 (library 'marangona-partials 'partials nil :random 50)) (setf partials2 (library 'marangona-partials 'partials nil :random 50)) (setf partials3 (library 'marangona-partials 'partials nil :random 50)) (setf partials4 (library 'marangona-partials 'partials nil :random 50)) (setf par1 (rnd-sample count (partial :freq (flatten partials1)))) (setf par2 (rnd-sample count (partial :freq (flatten partials2)))) (setf par3 (rnd-sample count (partial :freq (flatten partials3)))) (setf par4 (rnd-sample count (partial :freq (flatten partials4)))) (defparameter freq1 (gen-divide (rnd-sample count '(2 3 4 5)) par1)) (defparameter freq2 (gen-divide (rnd-sample count '(1 2 3 4 5)) par2)) (defparameter freq3 (gen-divide (rnd-sample count '(1 2 3 1 4 5)) par3)) (defparameter freq4 (gen-divide (rnd-sample count '(1 2 3 1 4 5)) par3)) (defparameter len1 (list (length-span 42 (rnd-sample count '(w h q w))))) (defparameter len2 (list (length-span 42 (rnd-sample count '(d h h))))) (defparameter len3 (list (length-span 42 (rnd-sample count '(h. w q))))) (defparameter len4 (list (length-span 42 (rnd-sample count '(d d h))))) (do-timeline '( len1 (---xxx-xx- ---xxx---- --x--xx--- ---x------ x-) len2 (---xxx-xx- ---xx-x--- --x--xx--- ---x------ x-) len3 (---xxx-xx- ---xx--x-- --x--xx--- ---x------ --) len4 (---xxx-xx- ---xx---x- --x--xx--- ---x------ --) ) '(gen-pause x) :time '(w)) (defparameter dur1 (omn :length (flatten len1))) (defparameter dur2 (omn :length (flatten len2))) (defparameter dur3 (omn :length (flatten len3))) (defparameter dur4 (omn :length (flatten len4))) (defparameter amp1 (rnd-number count 0.05 0.43)) (defparameter amp2 (rnd-number count 0.05 0.43)) (defparameter amp3 (rnd-number count 0.05 0.43)) (defparameter amp4 (rnd-number count 0.05 0.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))) ;; --------------------------------------------------------- ;; Score (with-sound (:play nil :reverb jc-reverb :scaled-to .7 :statistics t :channels 2 :output "marangona-series") (fmviolin-synth dur1 freq1 amp1 :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) :fm1-rat (rnd-number count 0.00 6.718) :fm2-rat (rnd-number count 0.00 4.414) :fm3-rat (rnd-number count 0.00 1.141) :glissando-amount (rnd-number count 0.00 0.8) ) (fmviolin-synth dur2 freq2 amp2 :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) :fm1-rat (rnd-number count 0.00 4.718) :fm2-rat (rnd-number count 0.00 6.414) :fm3-rat (rnd-number count 0.00 1.141) :glissando-amount (rnd-number count 0.00 0.8) ) (fmviolin-synth dur3 freq3 amp3 :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) :fm1-rat (rnd-number count 0.00 1.718) :fm2-rat (rnd-number count 0.00 4.414) :fm3-rat (rnd-number count 0.00 6.141) :glissando-amount (rnd-number count 0.00 0.8) ) (fmviolin-synth dur4 freq4 amp4 :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) :fm1-rat (rnd-number count 0.00 4.718) :fm2-rat (rnd-number count 0.00 6.414) :fm3-rat (rnd-number count 0.00 1.141) :glissando-amount (rnd-number count 0.00 0.8) ) )  
    Score with omn-form sequence:
    (with-sound (:play nil :channels 2 :reverb jc-reverb :scaled-to .6 :statistics t :output "quartet") (fmviolin-omn vn1 :reverb-amount 0.20 :bpm 44) (fmviolin-omn vn2 :reverb-amount 0.20 :bpm 44) (fmviolin-omn va :reverb-amount 0.20 :bpm 44) (fmviolin-omn vc :reverb-amount 0.20 :bpm 44) )  
       
  23. Like
    ydepps reacted to opmo in Opusmodus 1.3 release   
    Whats new in version 1.3
     
    Compatibility with macOS Mojave
    
macOS 10.14 Dark Mode
    
CLM added

    OSC added
    
MIDI player improvements
     
    New functions:
    binary-to-attribute
    merge-attributes
    circle-pitch-plot

    circle-rhythm-plot
    xy-plot
    pcs-rhythm

    edit-events
    find-max-span
    fit-to-span

    gen-osc-data

    osc-thread
    
stop-osc-threads
     
    Enhancements and fixes:
    quantizer returns now the count of given length-notes
    single-events returns given type
    don't join dissimilar rests
    fixed rest grouping
    fixed tied 8va or 8vb tuplets
      Installation:
    There are some changes to the Opusmodus user system folder.
    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.
     
    New Opusmodus folder:
     


    Upgrade:
    Opusmodus 1.3 requires a new serial number to run.
    When purchasing upgrade 1.3 the current user will need to provide an Opusmodus 1.2 serial number.
    After the confirmation which takes a few seconds only, you will be redirected to the purchase page.
    Following the purchase a new serial number will be sent to you by email.
     
    Happy New Year 2019
     
    Yours,
    Janusz Podrazik
×
×
  • Create New...