data structures for scores in MAX


    May 17 2006 | 1:24 pm
    Hi,
    I'm planning to use the coll object to process 'scores' which control a
    large number of performance related parameters in a complex patch.
    The idea is to have an entry on each list stored in coll which could
    determine which part of sequence to play, another to start the relevant
    sequencer, others to determine which devices are synch'ed with what, another
    to control javascript programs which manipulate note arrays. Inputting the
    index would cause coll to output the instructions to the rest of the patch.
    The list could also feed probabilities to a prob object to be used in a
    markov chain.
    Somethinng like this seems at first sight to be a good answer to the problem
    of how to control a lot of parameters in performance. For example, the same
    score could be used for different improvised note sequences - so some
    flexibility could be preserved.
    One potential drawback is that my lists would probably need to have about 50
    elements. So I'll probably need to design a score editor to cope!
    However, I was wondering if other's have gone down this path or have decided
    on a different philosophy of performance.
    I await your responses with interest!
    Best wishes,
    David Roden

    • May 17 2006 | 2:15 pm
      you said you need to edit the lists ... where
      do you edit them?
      i often use a 2 messagebox system ... one dynamic
      box and the other one set by the first one ...
      ($1 $2 $3 $4) - [prepend set] - []
      the second one is the one i bang when i need
      the current status ...
      coll is slow ... what about [mtr] or [mslider]
      to store the values? or even messageboxes?
      multisliders can be cool bc they give you visual
      feedback, even when put in a sub ... mtr can
      be cool for playing data bc it can "play two notes
      at a time" without custom programming.
      -110
    • May 17 2006 | 3:11 pm
    • May 17 2006 | 3:35 pm
      I am currently working on a similar project and have found qlist to be
      valuable. You'll want to look at the references but briefly...
      Lines in qlist are of two kinds:
      If the line begins with a word (symbol) it is understood to be the name of a
      receive object somewhere in your patch.
      If the line begins with a number it represents a delay time between
      messages.
      You can play a qlist or step through it.
      The main advantage I have found is that it has eliminated lots of routing
      and parsing of data.
      Here is sample from WW quartet:
      tutti chaosSeed 0.5 3.9;
      tutti beatSubdivisions 8;
      tutti beatDenominator 4;
      tutti pitchSieve 0 1 4;
      tutti dynamicShape 0.5 0.8 0.6;
      tutti pitchShape 0.8 0.;
      tutti tempo 90;
      tutti phraseBeats 13;
      tutti attackSequence 1 0 2 0 1 -2 1 0;
      tutti maximumDuration 2;
      tutti start;
      wait 16;
      16;
      clarbassoon chaosSeed 0.5 3.9;
      clarbassoon beatSubdivisions 4;
      clarbassoon beatDenominator 4;
      clarbassoon pitchSieve 0 4 7;
      clarbassoon dynamicShape 0.5 0.8 0.6;
      clarbassoon pitchShape 0.8 0.;
      clarbassoon tempo 90;
      clarbassoon phraseBeats 13;
      clarbassoon attackSequence 1 0 2 0 1 -2 1 0;
      clarbassoon maximumDuration 2;
      clarinet attackSequence 1 0 1 1 1;
      bassoon attackSequence 1 1 0 1 1 0 1;
      clarbassoon start;
      wait 13;
      13;
      flute start;
      wait 2;
      2;
      oboe start;
      flute, oboe, clarinet and bassoon are receive objects. Tutti is a receive
      that sends messages to all of them. Clarbassoon - well you get the idea.
      By using rewind and next messages I can sequence blocks of data. Here there
      are two blocks. With next, the lines beginning with numbers function as
      data block delimiters. The wait mess gets send to an object that wait some
      number of beats before issuing a next message to qlist.
      Cheers,
      Gary Lee Nelson
      TIMARA Department
      Oberlin College
      www.timara.oberlin.edu/GaryLeeNelson
    • May 17 2006 | 4:10 pm
      A follow-up to my recent message...
      It was tedious to have to retype the names of receive objects so I made a
      little abstraction to help:
      It parses out the words player, wait and clear. Player gets prepended to
      all other messages that come through. Wait generates two lines in the
      qlist.
      The output is attached to a qlist.
      The input is text. For small sets of data I use a message box with commas
      to separate. I use text objects to gather blocks of messages and then dump
      them into the qlist through the abstraction above. I prefer text over coll
      because I don't need the pesky ";" at the end of each line. In addition, I
      am generating some of these messages sets algorithmically with programs
      external to max.
      Cheers,
      Gary Lee Nelson
      TIMARA Department
      Oberlin College
      www.timara.oberlin.edu/GaryLeeNelson
    • May 17 2006 | 7:59 pm
      My reflection on coll is that it is great for some things but clumsy for
      sequencing. See my recent posts about qlist.
      Cheers,
      Gary Lee Nelson
      TIMARA Department
      Oberlin College
      www.timara.oberlin.edu/GaryLeeNelson
    • May 18 2006 | 11:13 am
      Many thanks to all the respondents to this post(so far) for sharing their
      experiences - you've already given me a lot to think about.
      Kind regards,
      David