Need a different way of thinking here:
void snowFlake() {
if (flakePause > 0) {
if (millis() - lastRun > ((flakeCnt > 0) ? flakeSpeed : flakePause)) {
pushString(0); // push pixels down the string
leds1[NUM_LEDS - 1].r = flakeColor;
leds1[NUM_LEDS - 1].g = flakeColor;
leds1[NUM_LEDS - 1].b = flakeColor;
LED1.showRGB((byte*)leds1, NUM_LEDS);
lastRun = millis();
flakeColor >>= 1;
flakeCnt++;
if (flakeCnt > ((NUM_LEDS - 1) + 8)) {
// flake reached bottom
flakeCnt = 0;
flakeColor = random(20, 256);
flakePause = random(250, 1000);
flakeSpeed = random(15, 51);
}
}
} else {
flakePause = random(500, 3000);
flakeSpeed = random(15, 51);
flakeColor = random(20, 256);
}
}
It does what it’s called, a snowflake … falling, at different speed, random interval, and random brightness (which also affects the trail length.) Problem is, this gets rather convoluted when you have multiple strings on the same AVR as I now have to keep track of multiple variables for each string (otherwise they all display the same exact thing and that just isn’t nice.)
So, suggestions anyone?
You want to make a class to represent a line of snowflakes - something like this:
class Snowflake {
long lastRun;
int flakeCnt;
int flakeSpeed;
int flakePause;
CRGB *myLeds;
int numLeds;
public:
Snowflake(CRGB *baseLeds, int firstLeds, int ledCount) {
myLeds = baseLeds + firstLeds;
numLeds = ledCount;
reset();
}
void reset() {
flakePause = random(500, 3000);
flakeSpeed = random(15, 51);
flakeColor = random(20, 256);
flakeCnt = 0;
}
void pushString(int led) {
while(led < (numLeds-1)) {
myLeds[led] = myLeds[led+1];
}
}
// run a snowflake cycle, returns whether or not it changed anything
bool runSnowflake() {
if( (millis() - lastRun) > ((flakeCnt > 0) ? flakeSpeed : flakePause)) {
leds[numLeds-1].r = leds[numLeds-1].g = leds[numLeds-1].b = flakeColor;
lastRun = millis();
// compiler will turn this into a shift automatically, this makes it
// clearer why you're doing this
flakeColor /= 2;
flakeCnt++;
if(flakeCnt > ( (numLeds-1) + 8 )) {
reset();
}
return true;
} else {
return false;
}
}
};
#define NUM_LINES 5
Snowflake *flakes[NUM_LINES];
CRGB leds[NUM_LINES][NUM_LEDS];
CLedController *controllers[NUM_LINES] = { &LED1, &LED2, &LED3, &LED4, &LED5 };
void setup() {
// do the led setup
// …
// now setup the snowflakes
int offset = 0;
for(int i = 0; i < NUM_LINES; i++) {
flakes[i] = new Snowflake(leds[i], 0, NUM_LEDS);
}
}
void loop() {
for(int i = 0; i < NUM_LINES; i++) {
// if any of these calls change led data, changes will become true
if(flakes[i]->runSnowflake()) {
controllers[i]->showRgb(leds[i], NUM_LEDS);
}
}
}
damnit, g+ destroyed my indentation 
How does that keep track of the individual strings though? It’s not meant to be one-string-at-a-time. All strings can, at any given point, have a flake going across them, at a random speed, and brightness.
So that’s the great thing about classes, each object had its own set of variables in the class, so there’s five sets of counts, speeds , etc… And because each object sets those values independently, you can have different strings at different speeds 
Ill explain more when not on my phone in a bit.
So basically - what that code does is create 5 snowflake objects, each with its own string of led data to play with, and its own set of values for things like speed and color and such.
This is what I do with my own projects. I create objects for the different types of things that I want to do - and those objects only know about the portion of CRGB array that they’re told about. Then, in my loops I have each pattern object do whatever it wants to do with the leds (if anything, on that round), and then I show all the led data.
Ok, that all makes sense. I’ll try it out and work some magic. This will give me a good reason to start working with classes for some of the other stuff. Normally I end up with either a single string (SPI) or two strings (bitbang, and that too gets funky.) Now that I can more easily run multiple strings on the same AVR, I need to start rewriting the code …
Yeah, that didn’t work. However, I blame myself for not understanding classes and what not. So this’ll call for some more screwing around on my part …
Email me your code - what I threw out was off the cuff before running back out the door - it may have some flaws in it.
I will. But, let me try to figure things out first. I’m not ready to give up yet. If I can’t figure it out, expect an e-mail. 