#include <FastLED.h>

//FASTLED 
#define LEDstripPin 4                          
#define NUM_LEDS 60
#define COLOR_ORDER GRB
#define CHIPSET WS2812B

CRGB leds[NUM_LEDS];

bool BeatTrigger = false;

CRGBPalette16 currentPalette = Rainbow_gp;

void setup() 
{
  FastLED.addLeds<WS2812B,LEDstripPin , GRB>(leds, NUM_LEDS);

  fill_solid(leds, NUM_LEDS, CRGB( 0, 0, 0));
  FastLED.show();
  FastLED.setBrightness(255);
}


void loop() 
{
  BeatTrigger = true;
  Paintball();
}

void Paintball(){
  int randomLED = random8(0,NUM_LEDS-1);
  int randomColor = random8();
  int paintballWidth = 2;
  int paintballBrightness = 255;
  int Fadetime = 40;
  int calc = 0;
  float spreadmultiplier = 1; //0.8

    if (BeatTrigger == true ){ 
    leds[randomLED] = ColorFromPalette(currentPalette,randomColor,paintballBrightness,LINEARBLEND);
      for(int i = 1; i <= paintballWidth; i++){
          paintballBrightness = paintballBrightness*spreadmultiplier ;

        if (randomLED-i < 0){
          calc = (randomLED-i)% NUM_LEDS;
          calc = NUM_LEDS - abs(calc);
          leds[calc] = ColorFromPalette(currentPalette,randomColor,paintballBrightness,LINEARBLEND);
        } 
        
        if(randomLED+i >= NUM_LEDS-1){
          leds[(randomLED+i)%NUM_LEDS] = ColorFromPalette(currentPalette,randomColor,paintballBrightness,LINEARBLEND);  
          leds[randomLED-i] = ColorFromPalette(currentPalette,randomColor,paintballBrightness,LINEARBLEND);

        }else{
          leds[randomLED-i] = ColorFromPalette(currentPalette,randomColor,paintballBrightness,LINEARBLEND);
          leds[randomLED+i] = ColorFromPalette(currentPalette,randomColor,paintballBrightness,LINEARBLEND);
                                                      
        }
      } 
  BeatTrigger = false;
  }
  fadeToBlackBy(leds,NUM_LEDS,Fadetime);
  FastLED.show();
}