dcrespo3d escribió:Parece que lo tienes mucho más claro que yo, sigue explorando ese camino. Sólo me puse a mirarlo porque ví que en tu lista de prioridades esto del sonido lo tenías lo último

Me dio por echarle un vistazo al asunto y, para cuando quise darme cuenta, ya era mi único propósito en la vida
dcrespo3d escribió:No tiene sentido que estemos los dos trabajando en lo mismo en paralelo ...
Toda la razón. En adelante procuraré que nos coordinemos mejor que cuesta poco y redundará en un mejor emu para todos.

zx81 escribió:El sonido, el puñetero sonido... el tema da como para escribir un libro y/o cortarse las venas.
Yo me las voy a dejar largas por ahora pero he estado considerando la opción
zx81 escribió:Lo que veo ahí no me hace presagiar nada bueno. Siento ser tan claro y directo, pero es lo que pienso.
Tranquilo hombre ¡Que no "panda el cunico"! Lo que ves ahi es "guarreo" puro y duro para ir probando cosas e ir testando conceptos y posibilidades (De hecho hasta me he dado cuenta que hay una línea mal puesta). Realmente, las piezas del puzzle ya las tenemos: procesador, pantalla y sonido funcionan y se sincronizan bien. El problema ahora es que las tres versiones actuales de cada pieza juntas superan la capacidad de proceso que tenemos. Con algo mas de potencia de proceso ya estaría concentrandome en otras cuestiones pero la potencia es la que es. Ese es el problema a superar. Igual parece que no pero aun con mis limitaciones y posibles errores, y gracias por supuesto a vuestra ayuda e información, sé lo que me hago

zx81 escribió:A riesgo de acabar en "tocho inside", haré las siguientes consideraciones:
"Tocho"

Esa es la palabra que queria oir de ti ¡Voy a por el bloc de notas!
zx81 escribió:1.- Una frecuencia de 48 kHz parece muy chachi, pero es innecesaria. Serviría, en principio, para poder reproducir señales de hasta 24 kHz, 2000 Hz por encima del rango audible modelo "lush life", que casi nadie tiene. El beeper del Spectrum fijo que no llegaba muy por encima de 8 Khz, y posiblemente ni eso. O sea, con una frecuencia de 32 kHz se va más que sobrado.
Ahí disiento ligeramente. Cuanto mayor sea la frecuencia de muestreo, mas calidad de sonido vamos a obtener ya que, como comentabas en un post anterior, hay juegos o demos que pueden generar sonido cada 40 t-states o menos. Eso son 87360 Hz. Lógicamente, no tengo potencia para muestrear y reproducir a 96 Khz así que, en la versión actual, que ya empieza a sonar muy bien, uso 31200 hz.
zx81 escribió:2.- Una cosa muy puñetera del sonido es que se deben generar la cantidad de muestras necesaria, ni muchas, ni pocas. Eso de calcular a ojímetro un sample cada 73 t-states, produce una frecuencia de sampleo de 47.945,2 Hz. Mal asunto ese. Ya de por sí, es casi imposible cuadrar un número de muestras exactas por frame aunque, en el peor de los casos, al menos cuadrará una vez por segundo, o debería. Y si no cuadra, se oye, os aseguro que se oye, o más bien se sufre. Nada de descartar cachitos, por pequeños que sean. 47945,2 / 50 = 958,904 samples por cuadro y lo que hay detrás de la coma no se puede descartar, que es casi un sample completo. Ese "if (audioCnt >= 73)" me pone los pelos de picos pardos.
Como dije, codigo de prueba y guarreridas varias. Nada que un poquito de Excel no pueda solucionar. Ahora uso 31200 hz que dan 624 muestras exactas a cada frame (siempre he obtenido las mismas muestras a cada frame en todo caso) y ese if ahora termina en un maravilloso 112 que es mucho mas coder-friendly

zx81 escribió:3.- Para usar menos CPU, se puede hacer al contrario, contar los ciclos transcurridos entre dos cambios del bit de beeper (falso, también es necesario el bit de mic, pero por simplificar) y generar un número de muestras proporcional a los ciclos pasados entre cambios. Salvo voces polifónicas, muchas melodías dejan pasar cientos de t-states entre cambios de estado del bit del beeper. Vuelvo a insistir vehementemente en que no es posible de ningún modo descartar o añadir nada, porque luego se escucha todo. Lo "mejor" es cuando empieza a producirse aliasing, la cacofonía puede llegar a ser indescriptible.
Esa idea es interesante y puede que la pruebe aunque la captura de muestras, en su versión actual, no tiene un efecto exagerado en el ciclo. El aliasing supongo que me lo he encontrado a determinadas frecuencias. La sinfonia de chirridos y resultados extravagantes que me he metido en vena estas ultimas horas es pa quedarse chalao
zx81 escribió:4.- Cuantos más filtros pongas, da igual que sean filtros FIR o IIR, menos suena a Spectrum.
Sin problema. La versión actual ya prescinde de filtrados y cálculos innecesarios.
zx81 escribió:Lo de las pesadillas para cuadrar los samples generados por el beeper, con los generados por el AY, lo dejo para otro día.
Mejor, un infierno cada vez por favor
Un saludo y gracias a los dos por vuestros comentarios
Respecto a los últimos avances, os cuento:
He creado otra rama que usa una librería de audio que me ha dado resultados mas que interesantes:
https://docs.espressif.com/projects/esp ... audio.htmlBásicamente, es un driver de sonido a través del DAC, se definen parámetros del stream y se va alimentando al motor de audio. Tiene impacto en el rendimiento como es lógico pero es, hasta el momento, lo que mejor resultado me ha dado. Me ha permitido, además, añadirle control de volumen de 32 niveles al emu (Teclas F9 y F10).
Ahora no hay que usar CPU_PER_INSTRUCTION_TIMING. La temporización ahora mejor con VIDEO_FRAME_TIMING. Asi, si el ciclo de Audio + CPU + Video no supera los 20ms. todo va bien. Cuando se superan se produce buffer underrun y se ensucia el sonido. Si se desactiva el video (con NO_VIDEO en hardconfig.h) y se lanzan cosas como Arkanoid o Zorro, se aprecia que la calidad de sonido no está nada mal.
En resumen: optimizar mas y mas y mas y mas y mas ...
Disponible en:
https://github.com/EremusOne/ZX-ESPectr ... audiotest2