ZX81 escribió:Hola,
Estoy intentando poner sonido al emulador, pero no me funciona bien, el sonido va como 8 veces más acelerado de lo normal, cuando la velocidad del emulador es más o menos normal. Por ejemplo, cuando cargo el Abu Simbel la melodía va súper rápido .
La frecuencia de muestreo que he puesto es de 48000Hz, y cada 20.8us envío una muestra a la tarjeta de sonido, que por 960(48Khz/50Hz) dan 20ms, un campo de TV.
Con el método setValor guardo el dato OUT que envía el Z80, para que mas tarde lo pueda guardar el método guardarMuestra cada 73 T-States, y el método play reproduce el sonido cada 69888 T-States.
Ojalá fueran las cosas tan simples...
3.500.000 / 48000 = 72.91 t-states por sample.
¿Has oído decir alguna vez eso de que el demonio está en los detalles?. Pues créeme si te digo que esta es una de esas ocasiones. Quita los decimales por exceso o defecto y nunca sonará bien.
Por otro lado, 69888 * 50 = 3.494.400 Hz, te faltan cosas ahí. La frecuencia exacta de refresco son 3.500.000 / 69888 = 50.08 Hz.
Y de paso, (1 / 3.500.000) * 69888 = 0.011968, o sea, 19.968 ms por cuadro, nada de 20 ms. Y los decimales, vuelven a contar y mucho.
Al final, todo depende de la precisión que quieras conseguir. Pero lo que no tolera la más mínima tontería es el sonido porque, por desgracia, es lo único que funciona quasi en tiempo real (con algún frame de retraso), en cuando el buffer de audio se te vacía 1ms, ya oyes aliens llamándote a cenar.
Lo de la velocidad debe ser una cosa trivial. Lo de que suene bien es otra cosa. Tienes que ser coherente al final, si vas a ajustarlo todo a 20ms por cuadro, ajusta todo lo demás. El sonido se escuchará ligerísimamente fuera de tono, pero no mal y mucha gente ni lo apreciará a menos que tenga un oído entrenado en música.
Y si solo almacenas valores de sample que tengan máximo y mínimo valor, tampoco sonará bien. Necesitas algún tipo de suavizado, para que la señal suba y baje más lentamente. No hace falta un filtro de la pera, pero sí algo modere los cambios bruscos.
Ni te imaginas los meses que tardé en tener una rutina de BEEP que sonara a BEEP. Melodías sencillas pueden dar muchísima guerra, por ejemplo, la del Babaliba. Por no hablar de la voz digitalizada del Cobra's Arc.
Si supieras donde te has metido... habrías preferido aprender sanscrito.