Effetto Onda con Servomotori

Ho fatto una prova e sono riuscito ad ottenere l'effetto desiderato, utilizzando millis().
Il problema è che il codice è proprio brutto da vedere e sono sicuro che si potrebbe snellire in qualche operazione.
Di questo ne risente il movimento dei servo che non è fluido quando si stanno muovendo tutti e 5.
Avete qualche consiglio?

int start[9][5] =  { ...  {50,  50,  30, 130, 95}  ... };
int finish[9][5] =  { ... {140,  180,  150, 30,  1} ... }
int angle[5];
int servodelay = 50;
int servostep = 1;
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period[5] = {20000, 20000, 20000, 20000, 20000}; \\ durata del movimento
int interval[5] = {0, 2000, 4000, 6000, 8000}; \\ instanti di partenza


void setup() {
  s1.attach(13);  s1.write(start[0][0]);
  s2.attach(12);  s2.write(start[0][1]);
  s3.attach(9);   s3.write(start[0][2]); 
  s4.attach(10);  s4.write(start[0][3]);
  s5.attach(11);  s5.write(start[0][4]); 
}
void loop() {
...

  startMillis = millis();

...

while ((angle[0] < finish[6][0]) || (angle[1] < finish[6][1]) || (angle[2] < finish[6][2]) || (angle[3] > finish[6][3]) || (angle[4] > finish[6][4]) ) {
          currentMillis = millis();  //get the current time
          if ((currentMillis - startMillis > interval[0]) && (currentMillis - startMillis < period[0] + interval[0])) {
            s1.write(angle[0]);
            delay(servodelay);
            angle[0] += servostep;
            currentMillis = millis();
          }
          if ((currentMillis - startMillis > interval[1]) && (currentMillis - startMillis < period[1] + interval[1])) {
            s2.write(angle[1]);
            delay(servodelay);
            angle[1] += servostep;
            currentMillis = millis();
          }
          if ((currentMillis - startMillis > interval[2]) && (currentMillis - startMillis < period[2] + interval[2])) {
            s3.write(angle[2]);
            delay(servodelay);
            angle[2] += servostep;
            currentMillis = millis();
          }
          if ((currentMillis - startMillis > interval[3]) && (currentMillis - startMillis < period[3] + interval[3])) {
            s4.write(angle[3]);
            delay(servodelay);
            angle[3] -= servostep;
            currentMillis = millis();
          }
          if ((currentMillis - startMillis > interval[4]) && (currentMillis - startMillis < period[4] + interval[4])) {
            s5.write(angle[4]);
            delay(servodelay);
            angle[4] -= servostep;
            currentMillis = millis();
          }
        }

Dove ci sono i puntini (...) è perchè ci sono altri pezzi di codice che servono per altro.

--- ti rammento che, da regolamento, è permesso fare "up" solo dopo 48 ore dall'ultimo post. Grazie - gpb01