So first of all, it’s trivial to change this code to use a different time base. There are only two calls to millis(), and both could be augmented with something else, like an RTC timebase, if needed.
But before we dive in there, it’s important to consider the intended scope here. These are all DELTA times, all relative to ‘the start of the performance’, which in this particular case (Hi, again, @Erin_St_Blaine !) is envisioned to be roughly as long as a few pop songs, e.g., less than an hour. If the performers all push their “start button” at the start of each song or performance piece, the amount that the clocks will de-sync over the course of the song is probably too small to worry about.
But this all turns us to the question of “clock drift”, and how much your typical Arduino’s millis() timer drifts over time. And for that, I always refer to this page:
“Arduino clock frequency stability”
http://jorisvr.nl/arduino_frequency.html
I’d sum up his (very detailed!) findings thus: if you have a crystal oscillator on your Arduino board, the timing of millis() is likely to be accurate to roughly one part in 10,000, or to put it another way, accurate to 99.99%.
So in a one-hour (3,600-second) performance, you probably will drift less than a third of a second using the internal timebase, so it’s probably totally sufficient for that. Over the course the KLF’s “What Time Is Love?”, which is 00:05:07 long, you can expect the clock to drift no more than about 30 milliseconds.
So while that’s probably fine for a delta-time for a performance with a synchronized start, as you found out, it’s definitely NOT good enough for a wall clock. One part in 10,000 is about nine seconds per day, or nearly a minute off per week, or half an hour off per month, aka terrible,-- and that’s assuming it’s calibrated to start with, which it isn’t. And FastLED disables interrupts on AVR chips, and performs a fix-up on the internal timer values afterwards, so there’s another small source of drift there.
So for a wall clock? You need a real-time chip. To synchronize two performers for ten minutes? A “Start!” button is probably sufficient.
As for real-time clocks, this shootout
“Benchmarks: Real Time Clocks – Results for Raspberry Pi/Arduino”
http://www.switchdoc.com/2014/09/real-time-clock-comparison-results/
seems to confirm what I’ve subjectively found myself: the DS3231 is great. Adafruit has them on breakout boards (as “Chronodots”) for US$17.50. Both wall clocks that I’ve built have used the DS3231, and both seem rock steady on timing.