Muchas gracias!
Con respecto a la sincronización, utilicé el AnimationPlayer de Godot para interpolar propiedades y ejecutar métodos en momentos específicos, además de los process loops normales. El problema es que el Audio en web va en un thread separado y algunas cosas (ej. dejar la ventana del browser en segundo plano) causan que se desincronice de los frames. Pero para una jam, creo que es aceptable.
Particularmente me interesaba para la transición entre los "rezos" en la escena del cáliz (que se repiten) y la canción principal. Intenté al principio, pero no encontré buenos ejemplos y no tenía demasiado tiempo para investigar y probar.
Al final puse los rezos en un AudioStreamPlayer en loop, y cuando sujetas el cáliz le deshabilito el loop, espero el finished() y ya luego inicio la canción en otro AudioStreamPlayer:
chant_player.stream.loop_mode = AudioStreamWAV.LOOP_DISABLED await chant_player.finished chant_player.stop() chant_player.stream.loop_mode = AudioStreamWAV.LOOP_FORWARD scene.start_phase(scene.summon_phase)
Algo importante, no me funcionaba bien en web: nunca paraba de reproducirse el rezo. Se ve que no le gustaba que cambiara el loop_mode en tiempo de ejecución. Se solucionó fijando el Playback Type del AudioStreamPlayer ese como "Stream".