No and yes.
You can’t run two different patterns from the playlist, but you can run one pattern with multiple sets of beforeRender()
and render()
functions, renamed to avoid collisions. @zranger1 did a deluxe multi-segment pattern which is in the pattern library, but below is a simple example to illustrate the basic principle:
////////////////////////////////////////////////////////////////////////////////
//
// Simple Segments: different patterns running on different segments.
//
////////////////////////////////////////////////////////////////////////////////
// Simple sample patterns. But you're not limited to these; size permitting, any
// freestanding pattern can be used within the segments. To do so requires copying
// the pattern code into this section, renaming the pattern's "beforeRender()" and
// "render()" functions to something unique (like "beforeRender_{patternName}" and
// "render_{patternName}"), and assigning it a timeslot. If the pattern contains
// additional functions or variables outside the "beforeRender()" and "render()"
// functions, they may also need to be renamed to avoid collisions and confusions.
//
// Sample pattern #1: This pattern runs on the first segment of the strand.
var t1;
function beforeRender_Segment1(delta) { t1 = time(0.05); }
function render_Segment1(index) { rgb(t1 + index/pixelCount, 0, 0); }
// Sample pattern #2: This pattern runs on the second segment of the strand.
var t2;
function beforeRender_Segment2(delta) { t2 = time(0.03); }
function render_Segment2(index) { rgb(0, t2 + index/pixelCount, 0); }
// Sample pattern #3: This pattern runs on the third segment of the strand.
var t3;
function beforeRender_Segment3(delta) { t3 = wave(time(0.05)); }
function render_Segment3(index) { rgb(0, 0, t3 + index/pixelCount); }
////////////////////////////////////////////////////////////////////////////////
//
// The segments.
//
// The "beforeRenderer" and "renderer" columns refer to the renamed "beforeRender()" and "render()"
// functions of the particular pattern to be run in this segment.
//
export var segments = [
// [0] [1] [2] [3]
// beginIndex, endIndex, beforeRenderer, renderer
// ----------- --------- --------------- --------
[ 0, pixelCount/3, beforeRender_Segment1, render_Segment1 ],
[ pixelCount/3, pixelCount*2/3, beforeRender_Segment2, render_Segment2 ],
[ pixelCount*2/3, pixelCount, beforeRender_Segment3, render_Segment3 ],
];
////////////////////////////////////////////////////////////////////////////////
//
// There's no need to edit anything below this line.
//
export var savePixelCount;
export function beforeRender(delta) {
// Call the beforeRender() function for each segment's pattern.
for (var segment = 0; segment < segments.length; segment++) {
savePixelCount = pixelCount; pixelCount = segments[segment][1] - segments[segment][0];
segments[segment][2](delta);
pixelCount = savePixelCount;
}
}
export var minIndex = array(segments.length), maxIndex = array(segments.length);
minIndex.mutate((v, i, a) => pixelCount+1); maxIndex.mutate((v, i, a) => -1);
export function render(index) {
// Find which segment this pixel belongs to, and call the appropriate render() function.
for (var segment = 0; segment < segments.length; segment++) {
var beginIndex = segments[segment][0]; var endIndex = segments[segment][1];
if ((index >= beginIndex) && (index < endIndex)) {
var relativeIndex = (index - segments[segment][0]);
minIndex[segment] = min(minIndex[segment], relativeIndex); maxIndex[segment] = max(maxIndex[segment], relativeIndex);
savePixelCount = pixelCount; pixelCount = segments[segment][1] - segments[segment][0];
segments[segment][3](relativeIndex);
pixelCount = savePixelCount;
return;
}
}
}