Jump to content


  • Content Count

  • Joined

  • Last visited

Posts posted by AM

  1. dear all


    here's an example (from my current work)...


    this little video shows how i generate/display SCORE (instrumental parts) on a screen + virtual conductor (piano part). the example is "nonsense", but shows how it looks/works... you see the bars (generating), the cue, beat... and the arrow (that shows you where to read/play) ...also you hear some bad (sry) sound-simulation of the setup.


    in this way i can generate a whole piece in realtime on STAGE (all musicians will read their part from their own screen). this one will be for 5 instruments, ePlayer and modular synthesizer. during the performance an algorithm (or some data-streams) will generate the piece in OPMO. with OSC i can send all datas (score, beat, tempo..)  from OPMO to POLYTEMPO-NETWORK  (https://polytempo.zhdk.ch) and work and coordinate different independent tempo layers, conducting etc...


    for more POLYTEMPO informations... have a look here: https://polytempo.zhdk.ch






  2. here is a sketch for an alternative "binary-(or element-)layer-FUNCTION


    (defun element-layer (lists &key (rnd nil))
      (let ((lists (if (null rnd)
                     (rnd-order lists :list t))))
          (loop for x in (rest lists)
            with list = (car lists)
            collect (setf list (loop for i in list
                                 with cnt = 0 
                                 when (equal i 0)
                                 collect (nth cnt x)
                                 and do (incf cnt)
                                 else collect i)))))))
    (element-layer  (list  '(1 0 0 1 1 0 0 1 0 0 0 0)
                           '(0 2 3 0 4 5 0 6 0 7 8 0)
                           '(11 12 13 14 15 16 17))
                    :rnd nil)
     => (1 11 2 1 1 3 12 1 4 5 13 6)
    ;;; hierarchic: every 0's will be replaced by the values from the next/sub-list...


  3. you want to map some integers (in your case pc..) to attributes? like that?


    (position-filter  '(0 1 2 3 4 5)  '(pizz arco ponte molto-ponte stacc stacc+pizz ten+arco ten+molto-ponte))
    => (pizz arco ponte molto-ponte stacc stacc+pizz)
    (position-filter  (pcs '6-Z10) '(pizz arco ponte molto-ponte stacc stacc+pizz ten+arco ten+molto-ponte))
    => (pizz arco molto-ponte stacc stacc+pizz ten+molto-ponte)
    or in pure CCL
      for i in '(0 1 2 3 4 5)
      with attr-list = '(pizz arco ponte molto-ponte stacc stacc+pizz ten+arco ten+molto-ponte)
      collect (nth i  attr-list))
    => (pizz arco ponte molto-ponte stacc stacc+pizz)


  4. you're welcome!!


    i think for specific solutions it helps a lot to learn some LISP-basics (loops/conditionals/car/cons/...), then you have the possibility to make your own additional functions/libraries in OPMO. and OPMO is really great for such things!! 😎




  5. like that..?... some code...




    (defun replace-velocities-in-a-seq (omn-list &key pitch velocity-list)
         with cnt = 0
         for i in (single-events omn-list)
         when (equal (cadr i) pitch)
         collect (omn-replace :velocity (nth cnt velocity-list) i)
         and do (incf cnt)
         else collect i
         when (> cnt (length velocity-list))
         do (setf cnt 0))))
    (replace-velocities-in-a-seq '(e c4 ppppp d4 d4 e4 f4 d4 d4 g4 b4 d4 d4 d4 d4)
                                 :pitch 'd4
                                 :velocity-list '(p mp mf f ff))
    ;=> (e c4 ppppp e d4 p e d4 mp e e4 ppppp e f4 ppppp e d4 mf e d4 f e g4 ppppp e b4 ppppp e d4 ff e d4 ppppp e d4 p e d4 mp)
    ;; if there are more 'd4's then velocity-values, -> it starts again with first velocity-value (= cycle)


  6. dear janusz


    at the moment i'm working with AUDULUS 3 and OPMO, work's fine.

    but there are some problems with the articulation. is it possible that in ord. there is a little "overlapping" between two notes? in this case AUDULUS don't "recognize" a change of velocity etc... with stacc it works fine (but with a gap).


    is there a "non-overlapping"-articulation with almost no gap between the notes?






  7. for my needs it's not necessary to use opusmodus in MAX. for me it's just easier to code LISP then in other languages (i need no library) 🙂 i will not do algorithmic comp... there, i will simply manage my "real-time/virtual-conducting/modular-form THING" from the POLYTEMPO-NETWORK in ONE language (lisp)... 


    (i also found a solution for me without MAX, lisp only. a bit steam-punky, but works 😉 will be my next ensemble piece)


    thanx to you!






  8. i received the following message from julien vincenot for maxmsp+lisp



    this system now allows users to generate and run Lisp code in Max, and to work in real time






    Dear Friends,


    Welcome to the MOZ’Lib mailing-list !

    First of all, I wish you a wonderful, fun and creative 2020. 


    What’s new?

    MOZ now exists as a Max package, fully documented in English, and compatible with Max 7 and 8.

    Documentation also includes a detailed overview and new modules for the PWforMax system (Mac-only for now).

    Previously hidden in the background of a few MOZ modules, this system now allows users to generate and run Lisp code in Max, and to work in real time with any library from the PatchWork / Open Music / PWGL family.

    Other updates are detailed in the history.txt of the package.


    How to install ?

    1) First your need to download the package itself :



    2) You will also need the packages bach, cage and dada by Andrea Agostini and Daniele Ghisi, 

    you can download directly from the Package Manager in Max (File menu).


    3) Then follow the remaining instructions in the READ-ME.txt — this is very important in particular for more recent OS versions like Catalina.


    I hope you will enjoy using MOZ, and I’m really looking forward to your comments, 

    suggestions about the library as a whole (ergonomy, documentation, etc.) and inevitable bug reports !


    All the best,


    Julien Vincenot



  9. it could work like this... because of the RANGE of the "chromatic mapping of your gen-sin", you have to set :root  d3, otherwise you will get pitches like "a-1", which is not possible. so you have to shift your root to d3.

    (tonality-map '(phrygian :root d3) pitchvec)

    i never used <tonality-map> before, i just read the documentation of the function - so it's quiet simple 🙂




  10. you could do it like this, check the function TONALITY-MAP

    (pitch-transpose 2 (tonality-map '(phrygian :map step) pitchvec))

    but mapping on (other) tonalities could be musically a bit tricky - perhaps you have to "eliminate some pitch repetitions" (has to do with quantification), or sometimes you have some troubles with the ambitus (that's the reason why i added <pitch-transpose>)...


    but perhaps there are some other solutions...?




  11. ;;; ...an idea
    ;;; how to import some TEXT and translate it to integer-sequences to use this data
    ;;; for LIVE-CODING. also possible without .txt, but i tried to IMPORT it. perhaps
    ;;; in your live-coding session a friend of you is writing the text in a different
    ;;; location and you could share it (the path) via CLOUD :-D
    ;;; i know, this kind of data... is not very smart, but a little bit steam-punky :-)
    (defparameter *map-integer1*
      '(((a à á â ã ä å æ ą) 0)
        (b 1)
        ((c ç ć) 2)
        (d 3)
        ((e è é ê ë ę) 4)
        (f 5)
        (g 6)
        (h 7)
        ((i ì î ï) 8)
        (j 9)
        (k 10)
        ((l ł) 11)
        (m 12)
        ((n ñ ń) 13)
        ((o ò ó ô õ ö) 14)
        (p 15)
        (q 16)
        (r 17)
        ((s ś ß) 18)
        (t 19)
        ((u ù ú û ü) 20)
        (v 21)
        (w 22)
        (x 23)
        ((y ý ÿ) 24)
        ((z ż ź) 25)))
    ;;; 1) open/write a .txt-file
    ;;; 2) define your path (inside the loop)
    ;;; 3) start the loop 
    ;;; 4) write/change your .txt, and SAVE it
    ;;; => every 2 seconds it will be read by the code
    (loop repeat 60
      do (progn
           (print (progn
                    (setf x (string-to-list (let ((in (open "/Users/meierandre/Desktop/test.txt"))) ;; use your own path!!
                                              (read-line in))))
                    (text-map *map-integer1* (loop for i in x append (explode i)))))
           (print x))
      do (sleep 2)) ;;; every 2 seconds the loop is reading your .txt, change variable x and PRINT it


    for this example i used PRINT (so you see what is happening), but you could also "rewrite" a variable inside your sound-live-coding-CODE/FUNCTION




  • Create New...

Important Information

Terms of Use Privacy Policy