One PB driving two different size matrix

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;
    }
  }
}
2 Likes