Here is a much more efficient version and it allows you to use all utility color functions without rewriting them.
#include <FastLED.h>
#define NUM_STRIPS 3
#define NUM_LEDS_PER_STRIP 81
#define NUM_LEDS_PER_PART 27
#define NUM_PARTS 8
#define NUM_LEDS NUM_LEDS_PER_PART * NUM_PARTS
#define BRIGHTNESS 255
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
CRGB leds[NUM_STRIPS * NUM_LEDS_PER_STRIP];
void setup() {
// LED LIGHTING SETUP
FastLED.addLeds<LED_TYPE, 3, COLOR_ORDER>(leds, NUM_LEDS_PER_PART * 0, NUM_LEDS_PER_PART * 3);
FastLED.addLeds<LED_TYPE, 5, COLOR_ORDER>(leds, NUM_LEDS_PER_PART * 3, NUM_LEDS_PER_PART * 2);
FastLED.addLeds<LED_TYPE, 6, COLOR_ORDER>(leds, NUM_LEDS_PER_PART * 5, NUM_LEDS_PER_PART * 3);
}
void loop() {
for (int i = 0; i < NUM_LEDS; i++) {
fill_gradient(leds, 0, CHSV(0, 255, 255), i, CHSV(160, 255, 255));
hRemap(); // Remap so gradient works horizontally
FastLED.show();
fadeToBlackBy( leds, NUM_LEDS, 255);
delay(10);
}
}
void hRemap() {
CRGB tempLeds[NUM_LEDS_PER_PART];
// Horiz -> Vert (HW) mapping
// ------------------------------
// Part 0 -> Part 0
// Part 1 -> Part 3
// Part 2 -> Part 5
// Part 3 -> Part 1
// Part 4 -> Part 4
// Part 5 -> Part 6
// Part 6 -> Part 2
// Part 7 -> Part 7
// Part 0 -> Part 0
//memcpy(leds, leds, NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 3 -> Part 1
memcpy(tempLeds, &leds[NUM_LEDS_PER_PART], NUM_LEDS_PER_PART*sizeof(CRGB));
memcpy(&leds[NUM_LEDS_PER_PART], &leds[NUM_LEDS_PER_PART*3], NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 1 -> Part 3
memcpy(&leds[NUM_LEDS_PER_PART*3], tempLeds, NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 4 -> Part 4
//memcpy(&leds[NUM_LEDS_PER_PART*4], &leds[NUM_LEDS_PER_PART*4], NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 6 -> Part 2
memcpy(tempLeds, &leds[NUM_LEDS_PER_PART*2], NUM_LEDS_PER_PART*sizeof(CRGB));
memcpy(&leds[NUM_LEDS_PER_PART*2], &leds[NUM_LEDS_PER_PART*6], NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 5 -> Part 6
memcpy(&leds[NUM_LEDS_PER_PART*6], &leds[NUM_LEDS_PER_PART*5], NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 2 -> Part 5
memcpy(&leds[NUM_LEDS_PER_PART*5], tempLeds, NUM_LEDS_PER_PART*sizeof(CRGB));
// Part 7 -> Part 7
//memcpy(&leds[NUM_LEDS_PER_PART*7], &leds[NUM_LEDS_PER_PART*7], NUM_LEDS_PER_PART*sizeof(CRGB));
}