- Produce polyrhythmic pulses whose rates are controlled by a multichannel breakpoint function.
- Use each pulse to activate a resonator, with tuning controlled by the same function as the pulse rate.
The mc.evolve~ object can be viewed as a multichannel signal generator that synchronizes activity across output channels. In this recipe, we use breakpoint functions to control the rate of a set of pulse trains and the central frequency of resonant filters by scaling the mc.evolve~ output.
Note that mc.evolve~ creates four simultaneous outputs on four channels; each controls the rate and pitch of a unique mc.train~/mc.reson~ pairing.
- mc.evolve~ : A multichannel breakpoint function generator
- multirange : Used for creating the function values output by mc.evolve~
- mc.scale~ : An MC-wrapped version of the scale~ object, used to properly format the mc.evolve~ output into useful values for the rate of mc.train~ and frequency of mc.reson~
Things to Note:
- The Scroll~ subpatcher contains a phasor~ object whose output is used as a sync signal for mc.evolve~. This signal tells mc.evolve~ to output the function values for a given index position within the range of 0.0 - 1.0. By adding a few controls (duration, scrolling on/off and manual positioning), you can easily create your own playback transport.
- The multirange object was designed to provide a UI for multichannel objects like mc.evolve~. Each time the object is edited, a dump message tells the object to output a multichannel breakpoint function (in a list) to be used by mc.evolve~. You can edit the multirange content by click-dragging points, click to add breakpoints, and shift-clicking to delete ranges. (Note: in this patch, a mostly-transparent slider, with click disabled, is placed over the multirange to mimic a transport cursor.)
- When mc.evolve~ receives a list message, it calculates a set of functions for the number of channels it must output. When it receives a signal, it uses that as the X index (horizontal location), and outputs the Y values (vertical location) for each of the channels. Notice the four values displayed in the scope~, which shows the spread of values across the space displayed in the multirange UI object.
- The four values generated by mc.evolve~ are used to generate four pulse trains using the mc.train~ object. The output values (from 0.0 to 1.0) are scaled to the rate values for each channel, and the pulse trains are displayed on the small individual scope~ objects.
- Each of the four resonators contained in the mc.reson~ object receives one channel of the pulsed trains. In order to set a separate pitch for each train/resonator, we've reused the function output of mc.evolve~, but scaled it to the frequency range we want to use. In this way, the pitch is mapped to the rate of the pulse, with faster pulses featuring higher pitches.