• 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..." biglaugh.png

    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. biglaugh.png
    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]
     

  • Bueno, hay novedades. Ayer termine lo que vendria a ser propiamente el sintetizador, es decir todas las rutinas de los fonemas con casi las mismas tablas de ondas que la version C64. Todavia queda por implementar la rutina que traduce de texto a fonema, pero ya puedo poner frases armadas manualmente en el programa.
    Me detuve hoy a hacer unos ajustes a la parte del programa que traduce un numero de 4 bits (una muestra, o sample) a sonido analogico por medio de modulacion de ancho de pulso (PWM en ingles), ya que el sonido era muy pobre y con mucha distorsion. Llegue a la conclusion de que la velocidad del procesador no es suficiente, asi que para duplicar la velocidad tuve que reducir la calidad del sonido a 3 bits. El sonido pierde un poco pero mejora sustancialmente el tema de la distorsion, ahora practicamente no se nota, al elevarla a frecuencias no audibles.
    Todavia se pueden hacer algunos ajustes, ya que por un tema de reduccion de codigo en la version C64 utilice parte del programa como tabla de ondas, pero se ve que el codigo de maquina del Z80 no "suena" tan bien como el del 6502. biglaugh.png
    Hice un archivo .tap para el que quiera probar como sale el sonido, en la CZ Spectrum sale aceptable, drasticamente mucho mejor que la version anterior.
    El programa dice siempre lo mismo una vez que se presiona una tecla, que seria:

    Saludos, comunidad de retrocomputacion.com
    Texto a voz ZX

    (esta impreso en la pantalla al final)

    ]prueba3.tap[/file]
     

  • Pude hacer una filmacion del programa cargando y ejecutandose, el sonido depende del parlante, en algunos suena mal y en otros peor. biglaugh.png
    Le maximice el volumen al audio del video en la parte donde habla, para que se pueda bajar el volumen al ver el video, porque el ruido de la carga es un poco molesto. Cargue el programa desde la notebook usando el WinTZX para reproducir el .TAP
    No se si va a quedar bien o ser util, pero al menos el programa va a quedar ya hecho en Z80, por lo cual portarlo a cualquier otra maquina con Z80 no va a ser dificil, solo hay que cambiar el "driver" de emision de sonido, que en este caso emite usando PWM.

     

  • Genial!!, suena bastante bien!, me hizo acordar viejos tiempos cuando cayo a mis manos el cassette Microhobby Nº1, en éste hay un sintetizador de voz, no muy bueno que digamos aunque dentro de todo se entiende.
    Muy bueno! lo tuyo Jorge. 
     

  • Lo probe en emulador a ese sintetizador, suena bastante bien para ser sonido de 1 bit, algunas cosas salen muy bien, otras no se entiende mucho, pero es mejor que otros de 1 bit que probe.
    Recien estuve investigando sobre la ZX81 y llegue a la conclusion de que al menos en teoria se puede convertir este mismo programa para emitir sonido por el TV en la misma calidad. Ahora queda ver como hago para ensamblar y cargar un programa para ZX81, pero ya llegara el momento de averiguarlo.
    Me detuve antes a investigar la TS2068, cargue el programa pero al terminar se reseteo olimpicamente, me habia olvidado que usa rutinas de la ROM solamente para mostrar el texto al comienzo, pero por lo demas la emision de sonido no deberia presentar problemas ya que el hard en ese sentido es identico. Pense que la ROM de la TS2068 tenia las mismas rutinas de la Spectrum cambiadas de lugar, pero me sorprendi gratamente al enterarme de lo avanzado de la estructura de la ROM de esa maquina, va a ser interesante programar algo para esa mas adelante.
    Por ahora ando tratando de compatibilizar el trabajo con estas pruebas, no me queda mucho tiempo y cuando puedo investigo en vez de terminar el programa, voy a ver si lo puedo terminar asi ya se puede probar. Mi idea para la Spectrum es que el codigo se cargue al final de la memoria, y que se pueda usar desde el BASIC cargando el texto en la variable Z$, para luego con un RANDOMIZE USR llamar al sintetizador, que si encuentra la variable interpretaria el texto y lo hablaria antes de retornar el control al programa. Tengo la informacion para hacer eso, y si no me aburro antes por ahi quede de esa manera, sino quedara como un programa cerrado que solo sirve para tipear en el mismo.
     

  • Para evitar cambiar las direcciones de las rutinas de display entre las distintas maquinas podes usar RST10 que es la entrada estandard de display de caracteres.
    Saludos.

     

  • ¡Excelente proyecto! Felicitaciones. Y aparte, anda muy bien, ¡ne gustó mucho en serio! Y mientras escribía veo el mensaje de Master Po, es cierto que con las rutinas RST probablemente puedas evitar problemas de compatibilidad.
     

  • Alguno lo probo en emulador o la maquina real?
    Hay que conectar algun parlante a la salida MIC para escucharlo bien, en el parlantito de la maquina se escucha tambien pero bajisimo.
    En cuanto a la ROM, use RST $10 y no la rutina de impresion directa, pero tambien use CLS, creo que ahi esta el problema porque en la TS2068 se accede de forma mas indirecta todavia que RST.
     

  • Excelente en la máquina real. Subo video en mi +2A:



    Ya había visto otros sintetizadores de voz por soft en Spectrum, pero pastbytes, el tuyo es el mejor lejos! El sonido es muy claro.
     

  • Impresionante como suena en la +2, nada que ver con mi humilde CZ Spectrum. confused.png
    El sonido es mas o menos igual, pero tengo un zumbido en la salida.
    Que bueno que tenga aceptacion, ya pense que esto era un monologo. biglaugh.png
    Lastima que tuve que reducir el sonido a 3 bits, pero con 4 bits salia bastante distorsionado, igual en algun momento lo voy a volver a intentar, lo que puede afectar es que el zumbido de fondo tenga menor frecuencia y por lo tanto se note mas, pero se tendrian 4 bits de resolucion otra vez. Internamente como dije el sonido se sigue generando en 4 bits, asi que la posibilidad todavia esta.
    Los efectos de colores de borde me sorprendieron, en el emulador sale tremendamente colorido, como se genera un color cada 2 lineas de barrido aproximadamente, la mezcla hace parecer que hay mas colores de los que puede generar la maquina. En la CZ Spectrum sin embargo la realidad es mucho menos colorida.
    Lo que hacia el programa originalmente (cuando emitia 4 bits) con los colores es mostrar el nivel de volumen, una onda luces audiorritmicas, el sonido siempre termina centrado a mitad de tension, es decir los valores 7 y 8 (porque el volumen va de 0 a 15), asi que en ese caso donde seria volumen medio, el borde se mostraba en negro. Cuando el volumen llegaba a 15 o bajaba a 0, mostraba el borde blanco. En los niveles de volumen intermedio, a medida que crecia o decrecia desde la mitad, aumentaba el numero de color de borde, que por suerte estan mas o menos ordenados segun brillo en la Spectrum. Cuando reduje a 3 bits, tuve que asignar 4 colores al audio positivo (encima del nivel medio) y 4 colores al negativo (por debajo del medio). Asi que el borde refleja mas o menos las ondas vistas desde arriba y escribiendose de arriba hacia abajo de la pantalla, con mas brillo cuanto mas volumen (positivo o negativo) tenga, no son colores al azar. Esto permite apreciar la frecuencia del sonido, las barras van a estar mas separadas cuanto menor sea la frecuencia, y mas juntas cuanto mayor sea, aunque va a tener mas gracia cuando uno pueda tipear el texto que quiera.
     

Moderador (s): homecomputer, Selandari, pastbytes, Palamar, phd, Durandal