Hi.
maby its because you call tlc.Write() 16 times, each time led() is called.
you only need to do it once.
its like a buffer first you make all the changes into the buffer.
and then you send everything thats inside the buffer.
but now when 1 RGB led has changed settings, you send all! the data.
in your case:
48 channels * 12 bits = 576 a pin goes HIGH or low.
but its not 1 pin but 3 HIGH or LOWS every Bit you send.
CLOCK
DATA
CLOCK
so 576 * 3 = 1728 high and lows for all the data.
for a pin to turn HIGN or LOW takes +-4.5 Micros
1728 * 4.5 = 7776 Micros and you are doing it 16 times
7776 * 16 = 124416 Micros or 124 millis
1000 millis (1sec) / 124 millis to execute 16 time the Write function.
means a frame rate of 8FPS
i made a similare system you made.
only i can control Variable fadetime, and variable scenetime for each led. and it calculates the differnce between the old value and new value / fadetime to create a fademultiplier.
yours are fixed.
so you dont need to have prev_time_ch as a Array. its all fixed they change colors all at the same time.