Tendency Masks
Hey,
I'm looking to implement (something similar to Koenig's) Tendency Masks as a means to generate weighted random values in a patch... trouble is I'm a little lost on how to go about actualising it in Max. Whilst I'm fine with the concept of the Mask (Rob Rowe's section in 'Machine Musicianship is particularly helpful in breaking it all down), it's the nuts and bolts of getting various data handeling methods to play nice.
As for a general plan - I figured [multislider]s (or a series of [rsliders] could be a simple way to go - but that ties me into pairing upper and lower bounds, whereas I would prefer to use some kind of breakpoint (ie [function]) to allow de-coupled points... If I go down the [function] route, I am unsure how to deal with these breakpoints and transform them into a useful set of index/value points to compare the range etc.
Anyone got any experience working with these Masks in Max? Thoughts on ways of approaching this? Closest example I've found so far is a Pd mailing list thread, but the list handling is confusing the hell out of me. Apologies if I've missed some really method that will let me do this easily, but banging my head against a wall here.
O.
Maybe these articles are relevant...Limiting the range of random choicesMoving range of random choicesA simple probabilistic decisionProbability distribution
Thanks Christopher! I've come across your blog a number of times in the past but hadn't consulted it in this matter yet. Will read those articles now!
Good reads, nice introductions to working with weighted/masked random generators. Thanks Christopher.
What I'm particularly interested in is the implementation of the 'manually' drawn Tendency Masks, as opposed to randomly generated. In working with breakpoint methods, I'm hoping to be able to adopt some more complex timing behaviours, and begin to explore density within the masked boundaries.
You certainly could use the function object for making tendency masks with breakpoint line segment functions (à la Koenig and as explained by Rowe). I would suggest using line or counter to progress through the functions that describe the minimum and maximum of your range.
Here's an example of what I mean. The function objects (with y ranging from 0 to 1) describe the minimum and maximum of the random range, and the line object steps through those functions (i.e., provides x values from 0 to 1000) in 15 seconds (or whatever number of milliseconds you specify with the number box). The random numbers generated in the randomfloat subpatch are mapped into that range, then mapped into the range of pitches (in this case I chose the range of the piano, MIDI notes 21 to 108), then converted to frequency for the cycle~ object. (Notice that this works even when the maximum function dips below the minimum function.) I hope that's helpful.
Christopher, thats exactly what I was after! Thank you!
Not that familiar with the behaviour of [function] so great to see such a simple but effective execution.
I also liked how you hooked it up to the cycle~ like that. Simple, but sounds great!
O.
Note also that you can do your random operations at signal rate. Sometimes it's less efficient, _but_ you can do some really fun processes on the control data. Here I'm using interpolation and feedback delay on the pitch. You can get some pretty wild sounds out of this by just adjusting the feedback levels.
If you wanted to be really thorough, I'd modify it so that the right inputs to scale~ are using sah~ driven off the phasor as well.
Had so much fun with that, figured I'd make some presets. Obviously this is not ideal for feeding into a sequencer, but it could be very cool as a signal processor in a modular synth...
I've been having fun using the Mask value to control spatialisation of sound. In this way, the tighter masked areas result in a defined move across a speaker array, whilst opening the bounds out allows sound to be diffused across a wider section of space.
In the little example here, I'm using Ville Pulke's [vbap], and I also added a little basic density control which runs off another breakpoint. The pitch generation from Christopher's patch is also used just to give a better idea of the density...