Need help getting a program to loop

Here is the OP's code, with a little formatting to make it readable

#include "FastLED.h"
    // the milliseconds to give each letter
#define MILLIS_PER_LETTER 1750
    // number of LEDs in the strip
#define NUM_LEDS 50
    // the data pin 
#define DATA_PIN 11
    // an array to keep track of the LEDs
CRGB leds[NUM_LEDS];
    // the message we will display
String message;
    // the time we received the message
unsigned long received;
    // we"ll use all 26 letters of the alphabet
#define NUM_LETTERS 26
    // the LED number (start counting from 0) that we light up to show our message
const int LETTER_LEDS[NUM_LETTERS] = {
     /*A*/ 7
    ,/*B*/ 8
    ,/*C*/ 9
    ,/*D*/ 10
    ,/*E*/ 11
    ,/*F*/ 12
    ,/*G*/ 13
    ,/*H*/ 14
    ,/*I*/ 32
    ,/*J*/ 31
    ,/*K*/ 30
    ,/*L*/ 29
    ,/*M*/ 28
    ,/*N*/ 26
    ,/*O*/ 25
    ,/*P*/ 24
    ,/*Q*/ 23
    ,/*R*/ 38
    ,/*S*/ 39
    ,/*T*/ 40
    ,/*U*/ 41
    ,/*V*/ 42
    ,/*W*/ 44
    ,/*X*/ 45
    ,/*Y*/ 46
    ,/*Z*/ 47
};
// how many colors to cycle through for the lights
#define NUM_COLORS 4


void setup() {
        // send print statements at 9600 baud
     Serial.begin(9600);
        // initialize the LEDS
     FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
        // set them all to be off
     fill_solid(leds, NUM_LEDS, CRGB::Black);
     FastLED.show();
        // connect to wifi.
        // this message will show until it is overwritten from Firebase and shown if Firebase fails
     message = "welcome to specs";
     received = millis();
}


void loop() {
        // how many milliseconds have elapsed since the last message came in
    unsigned long elapsed = millis() - received;

        // assuming MILLIS_PER_LETTER, what letter (index) ofthe message should we be on?
     int index = elapsed/MILLIS_PER_LETTER;
        // if the letter we should technically be on is within the bounds of the message
     if(index < message.length()) {
            // get the character letter we should print
         char letter = message.charAt(index);
            // if the character is between 'a' and ‘z" (no numbers, spaces, or punctuations)
         if(letter >= 'a' && letter <= 'z'){
                // how bright to make this LED from 0 to 1, this is what makes them fade in and out
                // it calculates what percent we are completed with the letter, and makes it fade in from 0–50% and fade out from 50–100%
                // the formula can be visualized here: https://www.desmos.com/calculator/5qk8imeny4
             float brightness = 1-abs((2*(elapsed%MILLIS_PER_LETTER)/((float)MILLIS_PER_LETTER))-1);
             uint8_t value = 255 * brightness;
             
                // get the LED number the letter should be in, assuming our array starts at ‘a" and ends at ‘z"
             int letter_index = letter-'a';
             int led = LETTER_LEDS[letter_index];
                // get a rotation of colors, so that every NUM_COLORS lights, it loops
                // e.g. red, yellow, green, blue, red, yellow green blue
             uint8_t hue = (letter_index%NUM_COLORS*255)/NUM_COLORS;
                // set that LED to the color
             leds[led] = CHSV(hue, 255, value);
             FastLED.show();
                // set it to black so we don’t have to remember the last LED we turned on
             leds[led] = CRGB::Black;
             
             Serial.print(letter);
             Serial.print("\t!");
             Serial.print(led);
             Serial.print("\t=");
             Serial.print(brightness);
             Serial.print("\t@");
             Serial.print(elapsed);
             Serial.println();
         } else {
                // if the letter wasn’t a-z then, we just turn off all the leds
             FastLED.show();
         }
     } else {
            // if the letter is beyond the bounds of the message, we just turn off all the leds
        FastLED.show();
     }
}

...R