Comienzo este tema para ir publicando las novedades futuras sobre la version para Spectrum del sintetizador de voz que ya publique en la seccion de C64.
Advertencia: sigue "breve" resumen del proyecto entero, se recomienda comprar pochoclos y buscar alguna bebida para no deshidratarse, o saltar a donde dice "Mientras tanto, en la actualidad..."
Hace mucho tiempo, en una plataforma muy lejana...
El programa original del sintetizador corre en un PIC16F648A, emite sonido digital de 8 bits a 7,1KHz (la primera version emitia a 7,8KHz y con sonido de 7 bits), utiliza sonido digitalizado y sonido generado por programa, en particular todo lo que es ruido, y esta hecho exclusivamente para castellano con sonidos limitados a Argentina. Algun dia tal vez lo expanda para que tenga el resto de los sonidos, pero por ahora ese es el programa de referencia para las otras versiones.
Este chip lo conecte exitosamente a la C64 en el puerto del usuario y a otras maquinas a traves de RS232. Luego decidi experimentar haciendo versiones por soft en plataformas retro, el primer experimento fue en BASIC de C64, luego en BASIC de MSX, ambas con mejores resultados de lo esperado, despues hice unas pruebas en assembler de C64 y ultimamente me dedique a terminar esa version en particular.
El programa para C64 termino ocupando 4K de RAM y emitiendo sonido digital de 4 bits, habiendo pasado por una etapa donde emitia sonido analogico, utilizando 2 o 3 ondas del SID en cada sonido.
Este programa es el que ahora tomo de referencia para empezar una version Z80, que inicialmente iba a estar apuntado a la MSX y el chip AY-3-8910, que despues se podria implementar en Spectrums con chip de sonido, pero desisti de empezar por MSX por un par de razones. La primera es la complejidad del sistema, que no es tanta pero tampoco se puede programar con tanta libertad si se quiere tener compatibilidad con todos los modelos. La segunda es que salvo algun ejercicio en papel en la secundaria, jamas hice un programa en assembler de Z80, y por lo tanto tengo que aprender en el camino la arquitectura del microprocesador, la arquitectura de la maquina, y el manejo del programa ensamblador. Ninguno de estos dos inconvenientes es un obstaculo tan grande, pero combinados retrasarian bastante el desarrollo, y no pienso vivir del desarrollo de programas para maquinas Z80 como para que valga la pensa invertir tanto tiempo. Para mi cada prueba de este programa con una plataforma, lenguaje o algoritmo distinto es un experimento interesante, y si se tarda demasiado en cada una deja de serlo.
Asi es como decidi intentar otra cosa. Previa investigacion de programas de sintesis de voz disponibles en MSX y Spectrum, vi que muchos usan sonido de 1 bit, algo que hasta una ZX81 puede hacer. El proyecto original con PIC usa PWM para emitir sonido, a traves de una salida que solo emite ceros y unos pero pasa por un filtro RC que no hace mas que dejar pasar las frecuencias hasta 4KHz (la misma calidad que la linea telefonica, audio de 8KHz para ser mas exacto). Buscando en la red acerca de la Spectrum y sonido PWM, encontre ejemplos interesantes de sonido muy similar al que genera el AY-3-8912, pero hecho con el parlante interno (o la salida MIC que es practicamente lo mismo). Una vez que supe que era posible obtener resultados razonables, me empezo a interesar mas el camino del sonido digital por PWM que el uso del chip de sonido.
Lo primero que se me ocurrio es si era posible hacer sonido en la ZX81 antes que en la Spectrum, ya que ahi si seria un verdadero desafio, y por otro lado, cuanto menos hard haya mas facil es desarrollar un programa con total libertad. Hice unas pruebas muy simples emitiendo un tono por la salida MIC, y funciono bien, pero me encontre con el problema de que el video genera interferencia en el sonido, lo que obliga a desactivarlo. Esto no seria el problema, sino el hecho de que necesito tambien el video cuando el usuario ingresa la frase a sintetizar, ya que tendria una interferencia molesta casi todo el tiempo, salvo al reproducir la voz. Por esta razon decidi volver a la Spectrum y probar ese metodo (PWM) para tener una idea de que tal suena, ya que tal como en el PIC, se necesitaria un filtro a la salida que no va a estar presente en este caso.
Mientras tanto, en la actualidad...
Asi llegamos a la primera prueba, que repito aca porque se hablo de esto en el foro de Commodore (por ser una derivacion de ese proyecto anterior). Este programa tiene solamente 3 fonemas porque lo unico que hace es decir HOLA, pero los sonidos estan extraidos directamente de la version C64, tambien la resolucion es la misma, 4 bits y 7,8KHz de muestreo.
Adjunto nuevamente el archivo .TAP para Spectrum 48K, tiene un cargador en BASIC que se encarga de cargar y ejecutar el programa en codigo maquina. Lo unico que hace es decir HOLA cada vez que se presione una tecla, el sonido es audible por el parlante de la maquina y tambien por la salida MIC, da mejores resultados usando unos parlantes amplificados de PC, ajustando el tono hacia los graves para eliminar lo mas posible la interferencia de la señal base de PWM que debe andar por los 125KHz. Lo que se escucha como interferencia no es precisamente eso, ya que es ultrasonido, sino frecuencias resultantes de esa, por armonicas, resonancia del parlante, filtrado de los componentes de la salida MIC, manchas solares, variacion del dolar y quien sabe que mas. En resumen, es un ruido bastante impredecible.
Hernan hizo una prueba en la Spectrum +2 y al parecer, al menos segun lo que se escucha en el video que filmo, la interferencia no es tan notoria en esa maquina.
Ahora me queda hacer el resto de los sonidos, cosa que ya esta hecha en 6502, el programa no es muy dependiente de la plataforma, en la C64 solo usa la ROM para ingresar el texto del usuario e imprimir en pantalla, pero mientras reproduce sonido no utiliza el hard mas que para colocar la muestra en el volumen del SID y el color de borde de la pantalla.
En el caso de la Spectrum, con cada muestra se debe ejecutar una rutina diferente para cada valor, que emite el voltaje correspondiente usando PWM, pero el resto del programa no usaria la ROM mas que para entrar el texto e imprimirlo, algo que bien se podria hacer en BASIC si se complica entender las rutinas de la ROM.
El programa esta hecho completamente en ZXSpin, y en mi CZ Spectrum suena muy similar a como sale en el emulador.
Adjunto tambien nuevamente una captura en wav de como suena en la CZ.
]prueba1.tap[/file]
]prueba1cz.zip[/file]