Música y danza, funcionan al revés

Muy buenas, estoy realizando un proyecto en el que un buzzer crea música y un servo mueve un muñequito como una cajita de música, solo que está funcionando al revéz.

Cuando está en silencio el muñequito baila, pero cuando ésta suena el baile se detiene, necesito ejecutar las dos funciones al tiempo, aunque pareciera que no es posible.

Si alguien me puede ayudar, se lo agradecería mucho. Aquí adjunto el código:

void loop() {
  danza();
  if (Serial.available()){
    char melodia = Serial.read();

      if (melodia == 'a'){
        digitalWrite(ledRojo, LOW);
        digitalWrite(ledVerde, HIGH);
        
        enlagranjadepepin();
        
        digitalWrite(ledRojo, HIGH);
        digitalWrite(ledVerde, LOW);
        
      }else if (melodia == 'b'){
        digitalWrite(ledRojo, LOW);
        digitalWrite(ledVerde, HIGH);
        
        elcirco();
        
        digitalWrite(ledRojo, HIGH);
        digitalWrite(ledVerde, LOW);
        
      }else if (melodia == 'c'){
        digitalWrite(ledRojo, LOW);
        digitalWrite(ledVerde, HIGH);
        
        elreloj();
        
        digitalWrite(ledRojo, HIGH);
        digitalWrite(ledVerde, LOW);
        
      }else if (melodia == 'd'){
        digitalWrite(ledRojo, LOW);
        digitalWrite(ledVerde, HIGH);
        
        carnaval();
        
        digitalWrite(ledRojo, HIGH);
        digitalWrite(ledVerde, LOW);
        
      }else if (melodia == 'e'){
        digitalWrite(ledRojo, LOW);
        digitalWrite(ledVerde, HIGH);
        
        navidad();
        
        digitalWrite(ledRojo, HIGH);
        digitalWrite(ledVerde, LOW);
      }   
  }
}

void setup() {

  Serial.begin(9600);
  
  Serial.println("Proyecto caja de música");
  Serial.println("Por Juan José Medina y Laura Montenegro");
  Serial.println();
  Serial.println("Eliga la melodia que desee escuchar ingresando su letra correspondiente");
  Serial.println("a. En la granja de Pepín");
  Serial.println("b. El circo ");
  Serial.println("c. El reloj ");
  Serial.println("d. Carnaval ");
  Serial.println("e. Navidad ");
  
  
  pinMode(ledRojo, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  digitalWrite(ledRojo, HIGH);
  
  baile.attach(7);
}



void danza(){
    for(ang = 0; ang < 180; ang++){
    baile.write(ang);
    delay(20);
  }
  for(ang = 180; ang > 0; ang--){
    baile.write(ang);
    delay(20);
  }
}

Gracias, buenas noches

A ver, si tu programas que primero baile y después toque la melodía, va a bailar primero y luego tocar la melodía.

Ahora vamos por partes.
Si danza() tiene 2 lazos for() no va a salir de la función hasta que se terminen los 2 lazos, y para empeorarla usaste delay() por lo que danza() dura unos módicos 7.2 segundos.

Del resto no opino porque el código está incompleto.

La gran pregunta es:
¿No se aburren de que a cada rato tengamos que decir "No uses delay(), usa millis()?