Jump to content

torstenanders

core_group_3
  • Content Count

    334
  • Joined

  • Last visited

  • Days Won

    60

Reputation Activity

  1. reaction_title_1
    torstenanders reacted to opmo in Opusmodus 1.3 Upgrade   
    Developers Progress
    The Opusmodus development team is making progress on the new release of our Opusmodus 1.3 software. We are planning to have 1.3 version ready for release on December 1st with the upgrade price of EUR 145.
     
    Opusmodus Prices Going Up
    In the meantime, for those of you who have not yet purchased Opusmodus 1.2 the price will increase to EUR 399 for personal and EUR 250 for academic licence on December 1st so now is the time to buy. 
     
     Are you Eligible for a Free Upgrade?
    If you purchased an Opusmodus license on or after July 1st, 2018 you are entitled to the upgrade to version 1.3 at no charge.
     
    Opusmodus 1.3 December 1st
     

     
    Whats new in version 1.3
    Compatibility with macOS Mojave
    macOS 10.14 Dark Mode
    CLM integration
    OSC integration
    MIDI player improvements
     
    New functions
    circle-pitch-plot
    circle-rhythm-plot
    pc-thythm
    xy-plot
    edit-event
    process-omn
    fit-to-span
    osc-thread
    osc-stop-threads
    osc-data
     
    Enhancement
    single-events
    quantize
    and bug fixes.
     
    Best wishes,
    JP

  2. reaction_title_1
    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 🙂
     
  3. reaction_title_1
    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.
  4. reaction_title_3
    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
  5. reaction_title_1
    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
  6. reaction_title_1
    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
     
  7. reaction_title_1
    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.
  8. reaction_title_1
    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.
  9. reaction_title_1
    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é
  10. reaction_title_1
    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 (())
     
  11. reaction_title_1
    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
     
  12. reaction_title_1
    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
     
  13. reaction_title_1
    torstenanders reacted to opmo in Circle-Pitch-Plot   
    (-e e q e q e)                                                                 (e q e q q) 
  14. reaction_title_1
    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. 
  15. reaction_title_2
    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
  16. reaction_title_1
    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
  17. reaction_title_2
    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 🙂
  18. reaction_title_1
    torstenanders got a reaction from lviklund in Updated library of many custom Opusmodus functions   
    > all your hard work to document
     
    I actually do such detailed documentation for my own benefit as well. I once spent several months on developing some personal library that I used for composing some piece, but when I wanted to re-use it some two years later, I could not really understand my own functions anymore. Since then I better err on the side of overdoing the docs 🙂
     
    Best,
    Torsten
     
  19. reaction_title_1
    torstenanders got a reaction from lviklund in Updated library of many custom Opusmodus functions   
    > all your hard work to document
     
    I actually do such detailed documentation for my own benefit as well. I once spent several months on developing some personal library that I used for composing some piece, but when I wanted to re-use it some two years later, I could not really understand my own functions anymore. Since then I better err on the side of overdoing the docs 🙂
     
    Best,
    Torsten
     
  20. reaction_title_1
    torstenanders got a reaction from lviklund in Updated library of many custom Opusmodus functions   
    > all your hard work to document
     
    I actually do such detailed documentation for my own benefit as well. I once spent several months on developing some personal library that I used for composing some piece, but when I wanted to re-use it some two years later, I could not really understand my own functions anymore. Since then I better err on the side of overdoing the docs 🙂
     
    Best,
    Torsten
     
  21. reaction_title_1
    torstenanders got a reaction from opmo in Updated library of many custom Opusmodus functions   
    Good to hear things are working for you 😉
     
    Note that dependencies of this library are of interest on their own for computer-aided composition. This is particularly true for the constraint library cluster engine and its extension cluster rules, as well as the library fenv. 
     
    Torsten
  22. reaction_title_1
    torstenanders got a reaction from opmo in Updated library of many custom Opusmodus functions   
    > I like the Carnatic Stuff.
     
    To best understand what those functions offer I recommend the book referenced in the doc (Reina, 2016), which was quite an eye-opener for me. There is a partial preview at Google Books (https://books.google.co.uk/books?id=4RSrCwAAQBAJ&printsec=frontcover#v=onepage&q&f=false), and further information is available at the associated websites (http://www.contemporary-music-through-non-western-techniques.com and http://www.rafaelreina.org/book-online-material.html).
     
    Best,
    Torsten
     
    References
    Reina, R. (2016) Applying Karnatic Rhythmical Techniques to Western Music. Routledge. added 8 minutes later I just noticed the perhaps most important Karnatic function so far, gen-karnatic-cell, is not contained in the automatically generated documentation, because the documentation tool seemingly skips functions that are not defined at the top level. I may fix that at some stage, but for now you can read the documentation in the doc string of the function in its source file (rhythm.lisp), or you evaluate the following line and read it in the listener.
     
    (documentation 'gen-karnatic-cell 'function)
     
    Best,
    Torsten
     
  23. reaction_title_1
    torstenanders got a reaction from Stephane Boussuge in Updated library of many custom Opusmodus functions   
    > I got just four 16th notes.
     
    This function allows for various controls that you did not use – Of course this function also allows for plain sequences of 1/16-notes, when you select its arguments accordingly 🙂   I am interested in CAC as a means of control on a higher level instead of some automatic "magic".
     
    You might want to run the examples below in Opusmodus to get music notation outputs, which are likely more easy to read than the OMN expressions, but nevertheless I provide the OMN expressions for completeness as well.
     
    The argument position (3rd argument) controls the kind of rhythmic cell that you get, see the doc for details. Here is an example where different rhythmic cells are returned. Note that by default all returned cells carry potentially a durational accent. 
     
    (gen-karnatic-cell 4 4 '(0 4 3 2 1 0))
    => ((1/4) (1/16 1/16 1/16 1/16) (1/8 1/16 1/16) (1/8 1/8) (3/16 1/16) (1/4))
     
    Now, if you use the same positions but different gati or jathi settings then you get a somewhat similar rhythm in that different gati/jathi. Below I slightly adapted the positions to make the results even more similar. 
     
    (gen-karnatic-cell 4 5 '(0 6 3 2 1 0))
    => ((5/16) (1/16 1/16 1/16 1/16 1/16) (3/16 1/16 1/16) (3/16 1/8) (1/4 1/16) (5/16))
     
    You can, of course, use these in a different time signature (e.g., the tala of your choice).
     
    (omn-to-time-signature (gen-karnatic-cell 4 5 '(0 6 3 2 1 0)) '(4 4))
    => ((q c4 tie s s s s s s e. s s s tie) (e c4 c4 q s q tie s))
     
    If you want to keep track of where the accents are located, you could mark them before this transformation (the function articulate-phrase is defined below this post). You could then manually later revise the notation to instead you the beam-breaking that Reina recommends. 
     
    (omn-to-time-signature 
     (articulate-phrase (gen-karnatic-cell 4 5 '(0 6 3 2 1 0))
                        :accent 'marc)
    '(4 4))
    => ((q c4 tie+marc s marc s marc s s s s e. marc s s s tie+marc) (e c4 c4 q marc s q tie+marc s marc))
     
    After the changed jathi above, here is a different gati. Results are more similar, because the underlying data is the same with different gati but the same jathi. Here is an example with quintuplets. 
     
    (gen-karnatic-cell 5 4 '(0 4 3 2 1 0))
    => ((1/5) (1/20 1/20 1/20 1/20) (1/10 1/20 1/20) (1/10 1/10) (3/20 1/20) (1/5))
     
    Here is the same with triplets -- exactly the same, only slower. 
     
    (gen-karnatic-cell 3 4 '(0 4 3 2 1 0))
    => ((1/3) (1/12 1/12 1/12 1/12) (1/6 1/12 1/12) (1/6 1/6) (1/4 1/12) (1/3))

    You can also change the jathi (or even gati) on the fly in a phrase. The given pattern is then 'cycled through'.
     
    (gen-karnatic-cell 4 '(5 5 3 3) '(0 6 3 2 1 0))
    => ((5/16) (1/16 1/16 1/16 1/16 1/16) (1/16 1/16 1/16) (1/16 1/16 1/16) (1/4 1/16) (5/16))

    You can also randomise your position
     
    (gen-karnatic-cell 4 5 '(0 1 ? ? 0))
    => ((5/16) (1/4 1/16) (3/16 1/8) (3/16 1/16 1/16) (5/16))

    And I did not even start discussing the other parameters yet. For example, you can set whether or not cells start with a durational accent (not a karnatic concept, but very useful notion for Western ears when dealing with rhythm). 
     
    (gen-karnatic-cell 4 5 '(3 3 3 3) :accented? '(T nil nil T))
    => ((3/16 1/16 1/16) (1/16 3/16 1/16) (1/16 3/16 1/16) (3/16 1/16 1/16))
     
    You can filter in various ways want kind of rhythm you want, e.g., set the minimum or maximum number of notes per cell. 
     
    (gen-karnatic-cell 4 5 '(? ? ? ?) :min-number '(3 3 3 3) :seed 1)
    =>((1/8 1/8 1/16) (3/16 1/16 1/16) (1/16 1/16 1/16 1/16 1/16) (1/8 1/8 1/16)) 
     
    EDIT: Oops, that are is seemingly not fully working as expected.
     
    I stop here and refer you do the documentation for more details: there are several more arguments that I did not even mention yet. I know that my documentation is rather concise and not a textbook, but it briefly discusses every detail. I said from the beginning, I wrote this for myself, so you might want to first spend a bit of time with the doc 🙂
     
    As you hopefully can see, this function alone allows for a rather rich world of rhythm with rather precise control that allows varying some rhythmic idea in various ways. I am interested here in clearly perceivable rhythmic similarities, e.g., between rhythms in different gati and jathi combinations in the Western tradition of thematic variation.  
     
    Of course, you can also process the result further in various ways. E.g., I am adding ties after long notes and/or subdivide short notes to increase the rhythmic contrast, and I am turning certain notes into rests...
     
    Best,
    Torsten
     
    (defun articulate-phrase (sequence &key (accent 'marc))
      "Add articulations to phrase for more clear rhythmic accents, e.g, an accent on every first beat.
      
      NOTE: This function assumes that `sequence' is a purely rhythmic OMN expression with only length values and perhaps ties. However, a sequence with (constant) pitches is returned, because certain Opusmodus functions do not support an OMN sequence without pitches.
      Examples:
      (articulate-phrase '((h h) (q q q q tie) (q q q q) (-q q) (q q q q)) :accent 'marc)
      => ((h marc h) (q marc q q q tie) (q q q q) (-q q) (q marc q q q))
      "
      (cons 
       ;; First bar
       ;;; NOTE: code repetition...
       (let ((bar1 (first sequence)))
         (if (length-notep (first bar1))
           (if (and (= (count-notes bar1) 1)
                    (eql (first (last bar1)) 'tie))
             (tu:replace-element (merge-articulations (list accent 'tie)) 1 bar1)
             (tu:insert-after bar1 0 accent))
           bar1))
       ;; other bars
       (loop :for (bar1 bar2) :on sequence :while bar2
         ;;; NOTE: code repetition
         :collect (if (and (length-notep (first bar2))
                           (not (eql (first (last bar1)) 'tie)))
                    (if (and (= (count-notes bar2) 1)
                             (eql (first (last bar2)) 'tie))
                      (tu:replace-element (merge-articulations (list accent 'tie)) 1 bar2)
                      (tu:insert-after bar2 0 accent))
                    bar2))))
     
  24. reaction_title_1
    torstenanders got a reaction from Stephane Boussuge in Updated library of many custom Opusmodus functions   
    > I got just four 16th notes.
     
    This function allows for various controls that you did not use – Of course this function also allows for plain sequences of 1/16-notes, when you select its arguments accordingly 🙂   I am interested in CAC as a means of control on a higher level instead of some automatic "magic".
     
    You might want to run the examples below in Opusmodus to get music notation outputs, which are likely more easy to read than the OMN expressions, but nevertheless I provide the OMN expressions for completeness as well.
     
    The argument position (3rd argument) controls the kind of rhythmic cell that you get, see the doc for details. Here is an example where different rhythmic cells are returned. Note that by default all returned cells carry potentially a durational accent. 
     
    (gen-karnatic-cell 4 4 '(0 4 3 2 1 0))
    => ((1/4) (1/16 1/16 1/16 1/16) (1/8 1/16 1/16) (1/8 1/8) (3/16 1/16) (1/4))
     
    Now, if you use the same positions but different gati or jathi settings then you get a somewhat similar rhythm in that different gati/jathi. Below I slightly adapted the positions to make the results even more similar. 
     
    (gen-karnatic-cell 4 5 '(0 6 3 2 1 0))
    => ((5/16) (1/16 1/16 1/16 1/16 1/16) (3/16 1/16 1/16) (3/16 1/8) (1/4 1/16) (5/16))
     
    You can, of course, use these in a different time signature (e.g., the tala of your choice).
     
    (omn-to-time-signature (gen-karnatic-cell 4 5 '(0 6 3 2 1 0)) '(4 4))
    => ((q c4 tie s s s s s s e. s s s tie) (e c4 c4 q s q tie s))
     
    If you want to keep track of where the accents are located, you could mark them before this transformation (the function articulate-phrase is defined below this post). You could then manually later revise the notation to instead you the beam-breaking that Reina recommends. 
     
    (omn-to-time-signature 
     (articulate-phrase (gen-karnatic-cell 4 5 '(0 6 3 2 1 0))
                        :accent 'marc)
    '(4 4))
    => ((q c4 tie+marc s marc s marc s s s s e. marc s s s tie+marc) (e c4 c4 q marc s q tie+marc s marc))
     
    After the changed jathi above, here is a different gati. Results are more similar, because the underlying data is the same with different gati but the same jathi. Here is an example with quintuplets. 
     
    (gen-karnatic-cell 5 4 '(0 4 3 2 1 0))
    => ((1/5) (1/20 1/20 1/20 1/20) (1/10 1/20 1/20) (1/10 1/10) (3/20 1/20) (1/5))
     
    Here is the same with triplets -- exactly the same, only slower. 
     
    (gen-karnatic-cell 3 4 '(0 4 3 2 1 0))
    => ((1/3) (1/12 1/12 1/12 1/12) (1/6 1/12 1/12) (1/6 1/6) (1/4 1/12) (1/3))

    You can also change the jathi (or even gati) on the fly in a phrase. The given pattern is then 'cycled through'.
     
    (gen-karnatic-cell 4 '(5 5 3 3) '(0 6 3 2 1 0))
    => ((5/16) (1/16 1/16 1/16 1/16 1/16) (1/16 1/16 1/16) (1/16 1/16 1/16) (1/4 1/16) (5/16))

    You can also randomise your position
     
    (gen-karnatic-cell 4 5 '(0 1 ? ? 0))
    => ((5/16) (1/4 1/16) (3/16 1/8) (3/16 1/16 1/16) (5/16))

    And I did not even start discussing the other parameters yet. For example, you can set whether or not cells start with a durational accent (not a karnatic concept, but very useful notion for Western ears when dealing with rhythm). 
     
    (gen-karnatic-cell 4 5 '(3 3 3 3) :accented? '(T nil nil T))
    => ((3/16 1/16 1/16) (1/16 3/16 1/16) (1/16 3/16 1/16) (3/16 1/16 1/16))
     
    You can filter in various ways want kind of rhythm you want, e.g., set the minimum or maximum number of notes per cell. 
     
    (gen-karnatic-cell 4 5 '(? ? ? ?) :min-number '(3 3 3 3) :seed 1)
    =>((1/8 1/8 1/16) (3/16 1/16 1/16) (1/16 1/16 1/16 1/16 1/16) (1/8 1/8 1/16)) 
     
    EDIT: Oops, that are is seemingly not fully working as expected.
     
    I stop here and refer you do the documentation for more details: there are several more arguments that I did not even mention yet. I know that my documentation is rather concise and not a textbook, but it briefly discusses every detail. I said from the beginning, I wrote this for myself, so you might want to first spend a bit of time with the doc 🙂
     
    As you hopefully can see, this function alone allows for a rather rich world of rhythm with rather precise control that allows varying some rhythmic idea in various ways. I am interested here in clearly perceivable rhythmic similarities, e.g., between rhythms in different gati and jathi combinations in the Western tradition of thematic variation.  
     
    Of course, you can also process the result further in various ways. E.g., I am adding ties after long notes and/or subdivide short notes to increase the rhythmic contrast, and I am turning certain notes into rests...
     
    Best,
    Torsten
     
    (defun articulate-phrase (sequence &key (accent 'marc))
      "Add articulations to phrase for more clear rhythmic accents, e.g, an accent on every first beat.
      
      NOTE: This function assumes that `sequence' is a purely rhythmic OMN expression with only length values and perhaps ties. However, a sequence with (constant) pitches is returned, because certain Opusmodus functions do not support an OMN sequence without pitches.
      Examples:
      (articulate-phrase '((h h) (q q q q tie) (q q q q) (-q q) (q q q q)) :accent 'marc)
      => ((h marc h) (q marc q q q tie) (q q q q) (-q q) (q marc q q q))
      "
      (cons 
       ;; First bar
       ;;; NOTE: code repetition...
       (let ((bar1 (first sequence)))
         (if (length-notep (first bar1))
           (if (and (= (count-notes bar1) 1)
                    (eql (first (last bar1)) 'tie))
             (tu:replace-element (merge-articulations (list accent 'tie)) 1 bar1)
             (tu:insert-after bar1 0 accent))
           bar1))
       ;; other bars
       (loop :for (bar1 bar2) :on sequence :while bar2
         ;;; NOTE: code repetition
         :collect (if (and (length-notep (first bar2))
                           (not (eql (first (last bar1)) 'tie)))
                    (if (and (= (count-notes bar2) 1)
                             (eql (first (last bar2)) 'tie))
                      (tu:replace-element (merge-articulations (list accent 'tie)) 1 bar2)
                      (tu:insert-after bar2 0 accent))
                    bar2))))
     
  25. reaction_title_1
    torstenanders got a reaction from Stephane Boussuge in Updated library of many custom Opusmodus functions   
    > I got just four 16th notes.
     
    This function allows for various controls that you did not use – Of course this function also allows for plain sequences of 1/16-notes, when you select its arguments accordingly 🙂   I am interested in CAC as a means of control on a higher level instead of some automatic "magic".
     
    You might want to run the examples below in Opusmodus to get music notation outputs, which are likely more easy to read than the OMN expressions, but nevertheless I provide the OMN expressions for completeness as well.
     
    The argument position (3rd argument) controls the kind of rhythmic cell that you get, see the doc for details. Here is an example where different rhythmic cells are returned. Note that by default all returned cells carry potentially a durational accent. 
     
    (gen-karnatic-cell 4 4 '(0 4 3 2 1 0))
    => ((1/4) (1/16 1/16 1/16 1/16) (1/8 1/16 1/16) (1/8 1/8) (3/16 1/16) (1/4))
     
    Now, if you use the same positions but different gati or jathi settings then you get a somewhat similar rhythm in that different gati/jathi. Below I slightly adapted the positions to make the results even more similar. 
     
    (gen-karnatic-cell 4 5 '(0 6 3 2 1 0))
    => ((5/16) (1/16 1/16 1/16 1/16 1/16) (3/16 1/16 1/16) (3/16 1/8) (1/4 1/16) (5/16))
     
    You can, of course, use these in a different time signature (e.g., the tala of your choice).
     
    (omn-to-time-signature (gen-karnatic-cell 4 5 '(0 6 3 2 1 0)) '(4 4))
    => ((q c4 tie s s s s s s e. s s s tie) (e c4 c4 q s q tie s))
     
    If you want to keep track of where the accents are located, you could mark them before this transformation (the function articulate-phrase is defined below this post). You could then manually later revise the notation to instead you the beam-breaking that Reina recommends. 
     
    (omn-to-time-signature 
     (articulate-phrase (gen-karnatic-cell 4 5 '(0 6 3 2 1 0))
                        :accent 'marc)
    '(4 4))
    => ((q c4 tie+marc s marc s marc s s s s e. marc s s s tie+marc) (e c4 c4 q marc s q tie+marc s marc))
     
    After the changed jathi above, here is a different gati. Results are more similar, because the underlying data is the same with different gati but the same jathi. Here is an example with quintuplets. 
     
    (gen-karnatic-cell 5 4 '(0 4 3 2 1 0))
    => ((1/5) (1/20 1/20 1/20 1/20) (1/10 1/20 1/20) (1/10 1/10) (3/20 1/20) (1/5))
     
    Here is the same with triplets -- exactly the same, only slower. 
     
    (gen-karnatic-cell 3 4 '(0 4 3 2 1 0))
    => ((1/3) (1/12 1/12 1/12 1/12) (1/6 1/12 1/12) (1/6 1/6) (1/4 1/12) (1/3))

    You can also change the jathi (or even gati) on the fly in a phrase. The given pattern is then 'cycled through'.
     
    (gen-karnatic-cell 4 '(5 5 3 3) '(0 6 3 2 1 0))
    => ((5/16) (1/16 1/16 1/16 1/16 1/16) (1/16 1/16 1/16) (1/16 1/16 1/16) (1/4 1/16) (5/16))

    You can also randomise your position
     
    (gen-karnatic-cell 4 5 '(0 1 ? ? 0))
    => ((5/16) (1/4 1/16) (3/16 1/8) (3/16 1/16 1/16) (5/16))

    And I did not even start discussing the other parameters yet. For example, you can set whether or not cells start with a durational accent (not a karnatic concept, but very useful notion for Western ears when dealing with rhythm). 
     
    (gen-karnatic-cell 4 5 '(3 3 3 3) :accented? '(T nil nil T))
    => ((3/16 1/16 1/16) (1/16 3/16 1/16) (1/16 3/16 1/16) (3/16 1/16 1/16))
     
    You can filter in various ways want kind of rhythm you want, e.g., set the minimum or maximum number of notes per cell. 
     
    (gen-karnatic-cell 4 5 '(? ? ? ?) :min-number '(3 3 3 3) :seed 1)
    =>((1/8 1/8 1/16) (3/16 1/16 1/16) (1/16 1/16 1/16 1/16 1/16) (1/8 1/8 1/16)) 
     
    EDIT: Oops, that are is seemingly not fully working as expected.
     
    I stop here and refer you do the documentation for more details: there are several more arguments that I did not even mention yet. I know that my documentation is rather concise and not a textbook, but it briefly discusses every detail. I said from the beginning, I wrote this for myself, so you might want to first spend a bit of time with the doc 🙂
     
    As you hopefully can see, this function alone allows for a rather rich world of rhythm with rather precise control that allows varying some rhythmic idea in various ways. I am interested here in clearly perceivable rhythmic similarities, e.g., between rhythms in different gati and jathi combinations in the Western tradition of thematic variation.  
     
    Of course, you can also process the result further in various ways. E.g., I am adding ties after long notes and/or subdivide short notes to increase the rhythmic contrast, and I am turning certain notes into rests...
     
    Best,
    Torsten
     
    (defun articulate-phrase (sequence &key (accent 'marc))
      "Add articulations to phrase for more clear rhythmic accents, e.g, an accent on every first beat.
      
      NOTE: This function assumes that `sequence' is a purely rhythmic OMN expression with only length values and perhaps ties. However, a sequence with (constant) pitches is returned, because certain Opusmodus functions do not support an OMN sequence without pitches.
      Examples:
      (articulate-phrase '((h h) (q q q q tie) (q q q q) (-q q) (q q q q)) :accent 'marc)
      => ((h marc h) (q marc q q q tie) (q q q q) (-q q) (q marc q q q))
      "
      (cons 
       ;; First bar
       ;;; NOTE: code repetition...
       (let ((bar1 (first sequence)))
         (if (length-notep (first bar1))
           (if (and (= (count-notes bar1) 1)
                    (eql (first (last bar1)) 'tie))
             (tu:replace-element (merge-articulations (list accent 'tie)) 1 bar1)
             (tu:insert-after bar1 0 accent))
           bar1))
       ;; other bars
       (loop :for (bar1 bar2) :on sequence :while bar2
         ;;; NOTE: code repetition
         :collect (if (and (length-notep (first bar2))
                           (not (eql (first (last bar1)) 'tie)))
                    (if (and (= (count-notes bar2) 1)
                             (eql (first (last bar2)) 'tie))
                      (tu:replace-element (merge-articulations (list accent 'tie)) 1 bar2)
                      (tu:insert-after bar2 0 accent))
                    bar2))))
     
×