Jump to content

AM

Members
  • Posts

    795
  • Joined

  • Last visited

Posts posted by AM

  1. ...technically, such pattern-match-things are - for my opinion - interesting when you write one value after the other (step by step with all paramters parallel), and then check all the time (every gen-cycle) the output on PATTERNS, and when there is a match you can change the gen-rules... 

     

    data-structure with EVENTS like that...

     

    (defstruct event duration pitch velocity rhy reading_rate optional_data)
    (setf bot-1 (make-event))

    ...

     

    and in every cycle you could write/GENERATE an EVENT

     

    (Excerpt)

    do (setf bot-1 (make-event 
                    :duration data
                     :pitch (setq pitch-1 (nth seq-cnt-1 pitchfield))
                     :velocity (rnd-walk-in-chord '(1 0 -1) velocityfield velocity)
                     :rhy (rnd-walk-in-chord '(1 -1) rhyfield rhy-1)
                     :reading_rate 1; (rnd-pick'(1 2 3))
                     :optional_data (rnd-pick '(a b c d e))))

     

    and then you check it (every cycle) for patterns... and if MATCH you could change the GEN-part the GEN-rules

    ...

     

    like a small robot who tries "to move in the world or to recognize the world"...

  2. dear rangarajan

     

    i think the motif-map-function has a PATTERN-MATCH inside, but it "replaces the MATCH", (like in a contextual-rewrite), but perhaps i don't use the name/expression "pattern-match" in a wright/correct way... i'm more composer/musician then programmer :-)


    here's a very basic example for am SIMPLE/PURE PATTERN MATCH:
    a rnd-gen-value-list (to show how you could use it), with a PATTERN-MATCH-prog who scans it. 
    the next value - after a complete match - will be changed into a rest... but you also could start a sub-function then who do what ever you want...? (when you change the code)

     

    in a concrete project i coded it also in a more complex way - kind of "nontrivial-machines" (as an experiment) -> PATTERNmatch in pitches changes the DURATIONS, PATTERNmatch in durations changes pitches or timbre... and so on... like a "dynamic-interaction-network"...

     

    sorry for my bad english...

    regards
    andré

     

    FUNCTION - FOR A SIMPLE EXAMPLE

    (defun pattern_cogn (liste pattern) 
      (loop for z in liste
        with cnt = 0
        with pattern_cnt = 0
      
        collect z   
        
        ;;;check a value - if it's a match -> incf counter
        when (or (eq  (nth cnt pattern) z)  (eq '? (nth cnt pattern)))
        do (incf pattern_cnt)
        and do (incf cnt)
        else do (setq cnt (setq pattern_cnt 0))
        
        ;;; if the pattern is MATCHED (=> counter = length pattern)  -> the output changes ... for example, the next value will be a rest
        ;;; = consequence
        when (eq pattern_cnt (length pattern))
        collect (* z -1)
        and do (setq cnt (setq pattern_cnt 0))))

     

    FUNCTION-EVAL

    (pattern_cogn (loop repeat 100
                    collect (1+ (random 5))) ; generates rnd-values ->  TO SEARCH IN IT
                  '(4 ? 2)) ; pattern to search (here with wildcard)

     

    WHEN PATTERN MATCH THEN NEXT VALUE (* -1)

  3. short question (i didn't read the whole documentation)... when i use/work with pattern-matching, i've done it with WILDCARDS ... is there any aspect of that in the motif-map function? or is a "ordinary pattern-matching-function" in OM?

     

    like that: pattern to search/replace 

    '(0 1 ? 3)

     

    this is musically interesting, because it works with "fuzziness"....

     

    regards,

    andré

     

     

  4. okay, i understand... i'm "not working" with '(q e q...), i'm always working with NUMBERS (with pitches too). it's easier to write/handle the values, easier to do my own specific code (and multipy, add... whatever) - only on "def-score" i'm changing the representation by generating OMN...

     

    regards,

    andré

  5. hi all

     

    i would like to MERGE/FIT the following 3-layer-voices(-EXAMPLE) into a ONE-layer-voice (with complex rhythms) - is it possible in OPUSMODUS?

    thanx for help!

    andré

     

    EXAMPLE:

    (setf voices (merge-voices (make-omn :length (gen-length '(1 2 3 4 5 6 7 8) 1/20)
                                         :pitch '(c4)
                                         :velocity '(pppp ppp pp p))
                               
                               (make-omn :length (gen-length '(1 2 3 4 5 6 7 8) 1/8)
                                         :pitch '(c5)
                                         :velocity '(pppp ppp pp p))
                               
                               (make-omn :length (gen-length '(1 2 3 4 5 6 7 8) 1/12)
                                         :pitch '(c6)
                                         :velocity '(pppp ppp pp p))))


    (def-score example
               (:key-signature 'atonal
                               :time-signature '(4 4)
                               :tempo '(96)
                               :layout (treble-layout '3-layers))
     (3-layers
      :omn voices
      :channel 1
      :sound 'gm
      :program 1))

  6. interesting bug: have a look at the 1/20-layer (c6) -> midi sounds correct (!), notation is wrong

     

    ;;;;;;;;;;;;;;;;;;;;


    (setf duration1 '(8 5 3 2 3 5 8))
    (setf duration2 '(8 5 3 2 3 5 8)) 
    (setf duration3 '(8 5 3 2 3 5 8))

    (setf voices (merge-voices (make-omn :length (gen-length duration1 1/20)
                                         :pitch '(c6))
                               (make-omn :length (gen-length duration2 1/32)
                                         :pitch '(b4))
                               (make-omn :length(gen-length duration3 1/8)
                                         :pitch '(as2))))


    (def-score voices
               (:key-signature '(c maj)
                               :time-signature '(4 4)
                               :tempo '(60))
      
      (piano
       :omn voices
       :channel 1
       :sound 'gm
       :program 0))

    (display-midi (compile-score 'voices) :display :quick-view)

     

    ;;;;;;;;;;;;;;;;;;;;

     

    56ddeae86b1c7_OhneTitel.thumb.jpg.22c4cd

  7. thanx, but midi don't like such VALUES  :-( - so it works only for notation (or sibelius/finale)...

     

    for the future it would be nice for my work (and perhaps interesting for other composers), when the time/rhythm-things could be more flexible - i think the biggest bounderies in opusmodus are the time/rhythm-things and it's notation (paper/pencil is the most flexible way, and i don't want to be a limited by software). if you work really "experimental" you want to map rhythm-values in a complexer way...

     

    for me it would be great and very nice, when it would be possible to notate/play such rhy-sequences like '(1/4 1/4 1/12 1/12 3/16 1/16....) with values that are not completing 1/4. at the moment OPUSMODUS is "correcting" this... (would be nice to have irregular time-signatures or bars with no time-signature!!!)....  

     

    in my work for example: i have programmed BOTS/non-trivial-machines, who are generating values "step-by-step" and the inner-state of the non-trivial-machine always changes its datas/memory (in a rnd-way). the result is, that the rhythm-values all the times are changing (more or less like in the special-bars-examples). and because it's not possible to calculate the output of the non-trivial-machine (that's the natural constitution of them), it's not possible to "fit the rhyhm-values" into prefiexed-bar-structures. that's a problem for my work and so i have to write such strange programs who fix the complicated rhy-changes :-)

     

    thanx for your great work!!!

    andré

     

  8. a solution: perhaps it's interesting for anyone (or as an example for OPMUSMODUS-implementation) - a simple function (programmed by a friend and myself)  - not very smart but it (should) work(s) :-)

    greetings

    a.

    (defun time-sign-changes (durations rhys &key (complex-bars 'nil))
      (if (equal complex-bars 'nil)
          (loop 
            for i in durations
            for j in rhys
            with sum = 0
            with last-j = (first durations)
            when (and (/= j last-j) (/= sum 0))
            collect (list (numerator sum) (denominator sum) 1) into bag and do (setq sum 0)
            do (setq sum (+ sum (abs (* i j))))
            when (> sum 1/4)
            collect '(1 4 1) into bag and do (setq sum (- sum 1/4))
            do (setq last-j j)
            finally (return (append bag (list (list (numerator sum) (denominator sum) 1)))))
        (loop 
          for i in durations
          for j in rhys
          with sum = 0
          with last-j = (first durations)
          when (and (/= j last-j) (/= sum 0))
          collect (list (numerator sum) (denominator sum) 1) into bag and do (setq sum 0)
          do (setq sum (+ sum (abs (* i j))))
          when (> sum 1/2)
          collect '(1 2 1) into bag and do (setq sum (- sum 1/2))
          do (setq last-j j)
          finally (return (append bag (list (list (numerator sum) (denominator sum) 1)))))))

     

    (setq durations '(-1 2 3 4 3 2 -5 4 3 2 4 3 1 7)) 
    (setq rhythms '(1/32 1/32 1/32 1/32 1/20 1/20 1/20 1/20 1/20 1/12 1/12 1/12))
    
    ;;creating the lengths
    (setq lengths (loop 
                    for i in durations
                    for j in rhythms
                    collect (* i j)))
    
    ;; creating the bar-changes -> :complex-bars 'nil or 't
    (setq bars (time-sign-changes durations
                                  rhythms
                                   :complex-bars 'nil))

     

    (def-score solo 
               (:title "example" 
                       :key-signature 'atonal
                       :time-signature bars
                       :tempo '90 
                       :layout (treble-layout 'example)) 
      (example 
       :omn  (make-omn
             :pitch '(c4)      
             :length lengths)
       :channel 1  
       :volume 100 
       :sound 'gm))

     

  9. seems to be a bug...

    evaluate this: 

    (make-omn
             :pitch '(c5 c3 c2 c3 c4)
             :length '(-2/12 2/12 -1/12 6/12 -1/12 3/12 1/12)                           
             :velocity '(mf))

     

    after the 6/12 the next value -1/12 is shown as -1/8 in the score

    score 
    exa.thumb.jpg.d3953e489ff5da45f0eb5f85da

  10. when i evaluate this:

    (make-omn
             :pitch '(c5)
             :length '(3/12 -1/12 4/12 -1/20 3/20 1/20)                           
             :velocity '(mf))

     

    the result is wrong (look at (3/12 -1/12 4/12).... but i would like to notate something like valeur ajoutée

    isn't it possible? thanx a.

     

    example.thumb.jpg.70547778e4c126771e3f34

     

  11. little lisp-problem/question with &optionel / &key... 

    here are two test-programs to explore keyword and optional paramters

     

     

    this test-program works

     

    (defun test1 (liste  add  &key (add-on/off))
      (loop for i in liste 
        when (equal add-on/off 'on)
        collect (+ i add)
        else collect i))
     
    (test1 '(1 2 3 4 5) 100 :add-on/off 'on)
     
     
    this version with &optional don't work... why? 
     
    (defun test2 (liste  add &optional (x 10) &key (add-on/off))
      (loop for i in liste 
        when (equal add-on/off 'on)
        collect (+ i add x)
        else collect i))
     
    (test2 '(1 2 3 4 5) 100 :add-on/off 'on)
     
    > Error: While compiling test2 :
    >        Bad lambda list : (liste add &key add-on/off &optional (x 10)), in process Listener-1(7).
     
     
     
    thanx for help
    andré
     
     
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy