Jump to content

torstenanders

Members
  • Posts

    496
  • Joined

  • Last visited

Reputation Activity

  1. Like
    torstenanders reacted to opmo in Opusmodus 1.3.24805   
    1.3.24805 
     
    – New functions:
     closest-path  comparative-closest-path  relative-closest-path  
    – Changes:
     CHORD-CLOSEST-PATH renamed to COMPARATIVE-CLOSEST-PATH.
     CHORD-RELATIVE-PATH renamed to RELATIVE-CLOSEST-PATH.
     A new keyword :lc (live coding) added to PS function.
     The default DEF-UNFOLD-SET set name renamed to om.
    :variant and :relative keywords removed from HARMONIC-PROGRESSION function.
     
    – Fixed:
     HARMONIC-PROGRESSION
     HARMONIC-PATH
     PITCH-VARIANT
     PITCH-ROW 
     
    – Documentation updates.
    – 'Quick Start' workspace update.
     
     
    VOICE LEADING FUNCTIONS
     
    CLOSEST-PATH
     
    The function CLOSEST-PATH returns a series of chords taking the closest path to the previous chord.
     
    (closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4))
    (closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5))  

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

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

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

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

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

     
     
     
     
    COMPARATIVE-CLOSEST-PATH
     
    The function COMPARATIVE-CLOSEST-PATH returns a series of chords taking the comparatively closest path to the previous chord, derived from randomising the pitch order of a given chord before the ‘find closest interval’ process.
     
    (comparative-closest-path '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4))
     
     
    Etc…
     
    (comparative-closest-path '(c4e4g4 c5e5a5 e5fs5a5b5 d5f5bb5d6 g4c5d5f5))  

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

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

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

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

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

     
     
    Etc…
     
    With seed and 4 results:
    (gen-eval 4 '(comparative-closest-path               '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)               :start '(c3c4c5c5)) :seed 23)  

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


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

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

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

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

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

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

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

     
     
     
     
    Live Coding option in PS function

    The :play :lc (live coding) option allows you to send the result of a PS function to ‘Live Coding Instrument’ in a live coding performance.
     
    (progn   (setf    mat '((-w.)          (h. eb4 pp q g3 -e q gs4 mf -s a5 p tie)          (e. a5 -e q bb4 mf -s q cs5 p -s q. e5 mf -e.)          (q cs5 p h. d5 mf -q c5 pp tie)          (h c5 pp h. gs3 -e a4 p<)          (h. fs5 mp q bb3 c5 p e4 mf tie)          (h e4 -e q cs4 mp h d5 p e f4)          (q d4 pp s eb4 < leg g4 < leg bb4 < leg a4 q. cs5 mf -e             3q gs5 > leg fs5 > leg c5 > b4 > leg f4 leg e4)          (t d4 p< leg eb4 < leg g4 f leg bb4 q. a4 marc             t fs4 mf leg gs4 leg e. c5 e b4 t f5 leg e5 leg d5 leg eb5             3q bb5 > a4 > bb5 > e a4 pp stacc -e)))      (setf    v1 (filter-density '(0.7 0.1 0.2 0.0 0.2 0.3 0.3) mat :type :length)    v2 (filter-density '(0.0 0.2 0.0 0.2 0.2 0.4 0.3) mat :type :length)    v3 (filter-density '(0.2 0.7 0.2 0.2 0.2 0.3 0.2) mat :type :length)    v4 (filter-density '(0.0 0.2 0.2 0.7 0.2 0.2 0.7) mat :type :length))      (setf    vn1 (unfold 'om '(t7 dyn bti vn) v1)    vn2 (unfold 'om '(t7 v? dyn bti vn) v2)    vla (unfold 'om '(v? ra dyn bti va) v3)    vlc (unfold 'om '(t-12 t-5 v? a-12-12 dyn bti vc) v4))      (ps 'gm :sq (list vn1 vn2 vla vlc) :tempo 68 :play :lc)   )  
     
     
    QUICK START WORKSPACE

    To update your 'Quick Start' workspace to the latest version you need to delete the 'Quick Start' folder from the Opusmodus directory first.
    After the deletion go to the Opusmodus menu 'Help' and select 'Install Quick Start Workspace'.
    To open the new 'Quick Start' workspace file simply select 'Open Quick Start Workspace' form the 'Help' menu.
     
    That's all for now,
    best wishes,
    Janusz
  2. Thanks
    torstenanders 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
  3. Like
    torstenanders got a reaction from ydepps in Providing code examples to students   
    > While I can create a canon, counterpoint and a fugue myself with a bit of time, it would be much less time-consuming for me if I were able to use existing examples. Is there an existing library of OMN examples of these types of compositions?
     
    I cannot offer ready-made examples, but a constraint-based library with various counterpoint (and also harmony) rules ready-made.  
     
    Cluster engine implements the constraint solver, and many functions for applying user-defined rules to various score contexts in a flexible way (e.g., consecutive notes in certain voices, simultaneous notes across voices at certain metric positions etc). 
    https://github.com/tanders/cluster-engine
     
    Cluster rules provides a collection of ready-made rules for the cluster engine library.
    https://github.com/tanders/cluster-rules
     
    Both libraries were initially developed for PWGL, but we ported them to plain Common Lisp to make them usable, e.g., in Opusmodus (where I already used both) and the Max<->Lisp interface I just mentioned in other message.
     
    There are some demo/test examples that come with the library (https://github.com/tanders/cluster-rules/blob/master/tests/first-tests.lisp). More extensive documentation (tutorials) are available with the original PWGL versions of the libraries.
     
    Some code to smoothly interface the Cluster Library with Opusmodus is part of my tot library (e.g. in the file https://github.com/tanders/tot/blob/master/sources/constraints.lisp). For example, there are means to transform Cluster Library scores into Opusmodus scores (actually, my variant of it, see the docs) and some more complex functions that could be seen as example use cases. For example, the function revise-score-harmonically, expects an existing score that you might create with whatever Opusmodus methods, and some underlying harmony definitions, and that re-harmonises the score accordingly, taking some counterpoint rules etc. into account.
     
    I hope the available doc of these packages helps (of which there is also some HTML version online). I cannot provide any more help at this stage, as I am currently extremely busy in my new job...
     
    Best,
    Torsten
  4. Like
    torstenanders got a reaction from AM in maxmsp and lisp?   
    Here are some links to another project working on a bridge between Max and Common Lisp. They are calling SBCL in the background using the shell interface of Max, if I recall correctly. The project is not yet very mature, but they have several OpenMusic/PWGL libraries running with a Max interface for pedagogic purposes. 
     
    LISP in Max: Exploratory Computer-Aided Composition in Real-Time
    QUOD.LIB.UMICH.EDU  
     
    MOZ’Lib | bach
    WWW.BACHPROJECT.NET MOZ’Lib is a set of pedagogical tools designed to explore, at the same time: musical writing, creation and computer programming. It is currently developed by two composers based in Paris, Julien Vi…  
    It is tricky to get recent sources of this work online. If you are interested, I suggest you best contact the developers directly, e.g., Julien Vincenot
     
    Bio | Julien Vincenot
    JULIENVINCENOT.COM  
    Say hello from me 🙂
     
    Best,
    Torsten
  5. Like
    torstenanders got a reaction from Stephane Boussuge in Providing code examples to students   
    > While I can create a canon, counterpoint and a fugue myself with a bit of time, it would be much less time-consuming for me if I were able to use existing examples. Is there an existing library of OMN examples of these types of compositions?
     
    I cannot offer ready-made examples, but a constraint-based library with various counterpoint (and also harmony) rules ready-made.  
     
    Cluster engine implements the constraint solver, and many functions for applying user-defined rules to various score contexts in a flexible way (e.g., consecutive notes in certain voices, simultaneous notes across voices at certain metric positions etc). 
    https://github.com/tanders/cluster-engine
     
    Cluster rules provides a collection of ready-made rules for the cluster engine library.
    https://github.com/tanders/cluster-rules
     
    Both libraries were initially developed for PWGL, but we ported them to plain Common Lisp to make them usable, e.g., in Opusmodus (where I already used both) and the Max<->Lisp interface I just mentioned in other message.
     
    There are some demo/test examples that come with the library (https://github.com/tanders/cluster-rules/blob/master/tests/first-tests.lisp). More extensive documentation (tutorials) are available with the original PWGL versions of the libraries.
     
    Some code to smoothly interface the Cluster Library with Opusmodus is part of my tot library (e.g. in the file https://github.com/tanders/tot/blob/master/sources/constraints.lisp). For example, there are means to transform Cluster Library scores into Opusmodus scores (actually, my variant of it, see the docs) and some more complex functions that could be seen as example use cases. For example, the function revise-score-harmonically, expects an existing score that you might create with whatever Opusmodus methods, and some underlying harmony definitions, and that re-harmonises the score accordingly, taking some counterpoint rules etc. into account.
     
    I hope the available doc of these packages helps (of which there is also some HTML version online). I cannot provide any more help at this stage, as I am currently extremely busy in my new job...
     
    Best,
    Torsten
  6. Like
    torstenanders 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
  7. Like
    torstenanders got a reaction from Stephane Boussuge in Polyphonic preview?   
    Dear Janusz, 
     
    To be clear: I do not expect that there will be a keyboard shortcut for every user added to Opusmodus. Instead, if you just share an example of code how to add a short key (and ideally a menu entry) to the Hemlock editor, that would be great.
     
    Thanks again!
     
    Best,
    Torsten 
  8. Like
    torstenanders got a reaction from ydepps 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
     
  9. Thanks
    torstenanders got a reaction from JulioHerrlein 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
     
  10. Like
    torstenanders 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.
  11. Like
    torstenanders reacted to AM in Creating Custom Chord Symbols   
    i think it's good and important to see that opusmodus is not a notation software (like sibelius/finale/dorico...). the potential is rightly in another area and i believe that it is important to keep the basic idea of opusmodus in focus (it's important to have restrictions/limitations) - and i think the development team is very aware of that .
    you can not have everything, but what is possible should be very very smart in its kind.
     
    the longer i work with opusmodus, the more i realize, for what i can use it ...and when I have to switch to another platform. 
    and because it is so open, it is then possible for me to find solutions for my specific needs, by being able to program myself and not simply having to do what the existing tools / functions allow.
     
    okay i admit i'm a big fan of opusmodus, although i do not even compose with it but can try/simulate basic ideas of my work - doing abstract/new things and see what happens - like working in an LAB 🙂
     
  12. Like
    torstenanders reacted to opmo in conTimbre library + pitchbend   
    We will delay the midi note-on events that start at time 0 by 5 ticks this might will solve the problem.
  13. Haha
    torstenanders reacted to JulioHerrlein in Resetting Articulations and Dynamics to none   
    Thank you, SB !
     
    Sometimes we need to comunicate with machines, instead of musicians.
    Best,
    Julio
  14. Like
    torstenanders got a reaction from JulioHerrlein in Resetting Articulations and Dynamics to none   
    In common music notation, if you use some "sticky" playing technique and you want to "disable" it later, then you should tell so the performer, should you not?
     
    Best,
    Torsten
  15. Like
    torstenanders reacted to opmo in write tuning-cents into omn / extract them   
    The future pitch (v1.4) will look like: c4 c4[50] fs4[50] d6[-30] etc... chord c4fs5[50]
    Every cents value which falls into microtonal notation (50, 30 -50 -75 ...) will be part of the notation all others will be written above the note: -43c
     
  16. Like
    torstenanders reacted to Stephane Boussuge in MIDI-pitch-bend-messages   
    I own the 2 library and for me ConTimbre is indeed much better (much complete)  than IRCAM instruments lib.
     
    SB.
  17. Like
    torstenanders reacted to AM in MIDI-pitch-bend-messages   
    I do not work / almost never with DAW's. OPMO (before pwgl) and sibelius.
    i think the conTimbre library is much better - not all samples are quite perfect, but the selection of playing techniques eg. in the strings or in the drums is just very good. my last piece was for ensemble, virtual conductor and e-player (a piece whitch generates its form in quasi-realtime (completely new every time) - by sochastic/markov-procedures)
     
     
    - it was possible to play the add-SCORE from the library directly at the concert (midi-files read out with flexible tempo and played on CT) without any problems - mix extremely well with the live instruments. 
     
    I do not think the library is very user-friendly, but I do not produce music (i compose, which - in my view - is a different kind of thinking), so that's not so important for me. but it contains many extra features and (or information about sound analysis (and apparently a direct access to LISP to make algorithmic orchestrations)
    as I said, not quite smart designed, but the possibilities (compared to the IRCAM library) I feel as much bigger. CT can now also play well from SIBELIUS / FINALE over VST.
     
    so I would be much happier if CT ran so well (with microtonal stuff) on OPUSMODUS.
  18. Like
    torstenanders reacted to AM in add tuning float to single-events?   
    dear janusz
     
    is there an OPMO-solution to put the FLOAT for tuning in every event (with pitch) . some times ago i coded such an "add-data-to-event"-function for my own, but a OPMO-one would be more professional 🙂
     
    greetings
    andré
  19. Like
    torstenanders reacted to Andy in IDE..powerful stuff   
    So I didn't really know what an IDE was..it's an Integrated Development Environment..is that right?
    Well anyhow I just wanted to share my enthusiasm for Opusmodus' idea of an integrated workspace...being able to have pdf books available full screen with a shortcut is amazing...and pictures and audio etc. I am a big fan of Wooden Books for instance and bam..there they are in my composing space for reference. 
    I'm kind of thinking this is how all "composing" software should be..but mostly now it seems to me to be about a graphical interface that is irrelevant alongside a multitrack recorder paradigm.
     
    Anyhow happy to be on this journey (())
     
  20. Like
    torstenanders got a reaction from JulioHerrlein in gen-rotate extension   
    > i'm musician but only an "amateur programmer" 
     
    I think the most important part is the musical knowledge encoded, and that your definitions work as described. How that is implemented is secondary for its use for others. (Clean implementations can make a big difference, though, for the maintainability of your code.) 
     
    > I have no idea how to do that professionally with GitHub
     
    I am pretty busy at this stage of the academic year, but in a few weeks, I would be happy to help you with that, if you want. What I cannot do, is documenting your definitions, but I can also show you, once you added some documentation in the form of doc strings added to your function etc. defs, how to automatically turn that into HTML docs. 
     
    > as ORDINARY text - no problem. perhaps i will share it like that on my website...
     
    If such a straightforward approach makes you feel you are more in control, then why not? However, in your place, I would add some doc strings that explain what a function is supposed to do. That makes it also more easy for yourself to re-use these functions at some later time. 
     
    Best,
    Torsten
     
  21. Like
    torstenanders got a reaction from Stephane Boussuge in gen-rotate extension   
    I agree that this is useful, and therefore I also implemented a similar functionality in my function rotate-omn 🙂  You can find its documentation at https://tanders.github.io/tot/sources/form.html#_g229430 and download the whole library at https://github.com/tanders/tot.
     
    BTW: You meanwhile should also have quite a sizeable collection of custom functions for Opusmodus. While not sharing them together in some kind of library as well? 
     
    Best,
    Torsten
     
  22. Like
    torstenanders got a reaction from opmo in Seed numbers?   
    > the random state number.
     
    Seed values are only relevant for functions that do some random operations. In layman's terms, think of rolling a dice. You want to ensure that the dice always rolls the same number, and for that purpose, you put some glue on one of its sides. The seed number effectively controls on which side of your dice you put the glue. It is not the same as the number that is the result, but controls which number will be the result. Now think of having some more complex algorithm than just a dice, where you have a similar mechanism to control what the output should be and that way fixing the output to a static value that can be re-computed multiple times. 
  23. Thanks
    torstenanders got a reaction from Andy in Help with seed and semi-colons   
    > but (((((((  ))))))))) drives me nuts!
     
    Actually, the editor helps you there. Just place the cursor directly before an opening or after a closing parenthesis, and the matching parenthesis is shown.
     
    Now, I am probably biased after using Lisp for quite some time, but I actually appreciate this simple syntax. I also programmed in various other languages, and I meanwhile prefer the Lisp syntax...
     
    Best,
    Torsten
  24. Like
    torstenanders reacted to opmo in Circle-Pitch-Plot   
    A new CIRCLE-PITCH-PLOT function (examples below) will be part of the forthcoming Opusmodus 1.3.
     
    The function CIRCLE-PIOTCH-PLOT returns a geometrical representation of relationships among the 12 pitch classes of the chromatic scale in pitch class space and provides an easy way to identify patterns and similarities between harmonic structures.
     
    Clockwise motion represents ascending pitch motion, and counterclockwise motion represents descending pitch motion.
     
    Examples:
     
    Major Triad
    (circle-pitch-plot '(c4e4g4))
     
    Minor Triad
    (circle-pitch-plot '(c4f4ab4))
     
    Augmented Triad
    (circle-pitch-plot '(c4e4gs4))
     
    All 4 augmented triads
    (circle-pitch-plot '(c4e4gs4 db4f4a4 d4fs4bb4 eb4g4b4))
     
     
    With :style :fill
    (circle-pitch-plot '(c4e4gs4 db4f4a4 d4fs4bb4 eb4g4b4) :style :fill)
     
    Example with chord names.
    Fully-Diminished 7th Chord
    (circle-pitch-plot 'dim7)
     
    All 3 fully-diminished 7th chords
    (circle-pitch-plot '((c4 dim7) (cs4 dim7) (d4 dim7)))
     
    Whole-Tone Scale
    (circle-pitch-plot '(0 2 4 6 8 10))
     
    The complex of 2 Whole-Tone Scale
    (circle-pitch-plot '((0 2 4 6 8 10) (1 3 5 7 9 11)) :style :fill)
     
    Chromatic Scale
    (circle-pitch-plot 'chromatic :point-radius 4)
     
    The complex of 6 tritones
    (circle-pitch-plot '((0 6) (1 7) (2 8) (3 9) (4 10) (5 11)) :point-radius 4)
     
    Tonalities
    (circle-pitch-plot 'mixolydian-greek :point-radius 4)
    (circle-pitch-plot 'bartok :point-radius 4)
    (circle-pitch-plot 'messiaen-mode3 :point-radius 4)
    (circle-pitch-plot 'hyojo :point-radius 4)
     
    Contrary Motion
    (circle-pitch-plot '(0 1 11 2 10 3 9 4 8 5 7 6)              :sort nil :join-first nil)
    (circle-pitch-plot '((0 1) (0 2) (0 3) (0 4) (0 5) (0 6)                (0 7) (0 8) (0 9) (0 10) (0 11)) :point-radius 4)
     
    Example with Forte notation
    (circle-pitch-plot '(6-32 6-7))
     
    Example with omn-form sequence and :type :pitches
     
    (circle-pitch-plot '(((leg s g2 p dbow+sul d3 sul b3 dig1 a3 b3 d3 b3 d3)                 (leg g2 d3 b3 a3 b3 d3 b3 d3)))              :type :pitches)  

     
    Circle types
    (circle-pitch-plot '((4 9 11) (3 5 10) (0 3 6 9)) :style :fill)
    (circle-pitch-plot '((4 9 11) (3 5 10) (0 3 6 9))              :type :pitches :style :fill)  

    (circle-pitch-plot '((4 9 11) (3 5 10) (0 3 6 9))              :type :fifths :style :fill)  

     
    Examples with :sort and :remove-duplicates set to nil
    (circle-pitch-plot '(0 2 6 0 3 7 0 4 8))
    (circle-pitch-plot '(0 2 6 0 3 7 0 4 8) :sort nil)
    (circle-pitch-plot '(0 2 6 0 3 7 0 4 8)              :sort nil :remove-duplicates nil)
    (circle-pitch-plot '(0 2 6 0 3 7 0 4 8)              :sort nil :remove-duplicates nil :join-first nil)  

    (circle-pitch-plot '(8 4 2 0 10 2 8 10 4 6 8)              :sort nil :remove-duplicates nil)
     
    Best wishes,
    Janusz
  25. Thanks
    torstenanders got a reaction from hujairi in Updated library of many custom Opusmodus functions   
    Dear all,

    I updated my library tot (https://github.com/tanders/tot) in various ways. In particular, there are many new functions available.

    You can now read the documentation online at https://tanders.github.io/tot/. However, remember that you can directly evaluate the many examples in the documentation when (after installing the library) you drag the library folder into your Opusmodus project navigator and open the documentation within Opusmodus.
     
    If you are interested in the details of how the library developed, you can see a changelog at https://github.com/tanders/tot/commits/master .

    NOTE: When you install/upgrade this library, make sure you also install/upgrade all its dependencies, as described in the detailed installation instructions at https://github.com/tanders/tot. 
     
    Best,
    Torsten
     
    PS: This is not an official release. As I am primarily developing this library for my own purposes, I keep it rather informal and extend it on a continuous basis for my own composition projects. Anyway, I thought at least some of you might be interested to learn that there have been many developments 🙂
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy