MC Recipe 05: EvolvingTrain

MC Concepts
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.
Commentary
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.
Ingredients
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.
Learn More: See all the articles in this series
by Darwin Grosse on November 21, 2018