#include <FastLED.h>
#define HEIGHT 6
#define WIDTH 64
#define NUM_LEDS WIDTH * HEIGHT
#define MATRIX_TYPE 1
// LEDs pin
#define DATA_PIN 2
// LED brightness
#define BRIGHTNESS 255
// Define the array of leds
CRGB leds[NUM_LEDS];

CRGB FirePalColor(uint8_t temp, uint8_t col){
  CRGB TEMP_COL;
  uint8_t* colIndex[3]{(col/2)+(uint8_t*)&TEMP_COL,  //1 channel RRGGBB
  ((col/2+1+col%2)%3)+(uint8_t*)&TEMP_COL,           //2 channel GBBRRG
  (3-(col/2+(col/2+1+col%2)%3))+(uint8_t*)&TEMP_COL};//3 channel BGRBGB
  uint8_t t192 = scale8_video( temp, 191);

    // calculate a value that ramps up from
    // zero to 255 in each 'third' of the scale.
    uint8_t heatramp = t192 & 0x3F; // 0..63
    heatramp <<= 2; // scale up to 0..252
    if( t192 & 0x80) {//to white
        *colIndex[0] = 255;
        *colIndex[1] = 255;
        *colIndex[2] = heatramp;
    } else if( t192 & 0x40 ) {//2 channels
        *colIndex[0] = 255;
        *colIndex[1] = heatramp;
        *colIndex[2] = 0;
    } else {//1 channel
        *colIndex[0] = heatramp;
        *colIndex[1] = 0;
        *colIndex[2] = 0;
    }
  return TEMP_COL;
}

void setup() {
  // put your setup code here, to run once:
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  Serial.begin(9600);
}
uint16_t a;
void loop() {
  a+=8;
  for(uint8_t y = 0; y< HEIGHT; y++){
    for(uint8_t x = 0; x < WIDTH; x++){
  leds[XY(x,y)] = FirePalColor(constrain(inoise8(x*32-a,y*128)-x*(255/WIDTH),0,255),y);
}}
FastLED.show();
}

uint16_t XY (uint8_t x, uint8_t y) {
  return (y * WIDTH + x);
}