Autor Tema: Proyecto de sintetizador de voz por hard  (Leído 37514 veces)

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #30 en: Febrero 11, 2016, 00:50:53 »
Seria interesante ver eso.
A mi de todo lo que vi en 8 bits me gusta el juego Parsec corriendo en un Texas Instruments TI-99/4A con modulo de voz. Hay otros cartuchos de voz para 8 bits mas realistas, porque usan voz real, pero tienen vocabulario limitado, en cambio el chip de Texas podria verse como una especie de descompresor de mp3 (no usa ese formato pero es para que se entienda), tiene los fonemas incluidos pero no son mas que datos de voz comprimidos. Hay gente que descubrio la manera de comprimir audio digitalizado con el mismo formato que usa el chip, y que logro reproducir perfectamente el audio con el Texas y el modulo de voz. Es una lastima que sea un modulo poco aprovechado.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #31 en: Febrero 15, 2016, 10:55:11 »
Acabo de publicar esto en retrocomputacion, lo publico tambien aqui, por si alguien tiene interes en RS232, o entradas/salidas en general, y asm.
El que no sabe mucho de asm o de RS232, puede saltarse algunas partes tecnicas.
Hace tiempo que estaba buscando la manera de que el sintetizador de voz sirviera para algo mas que programas en BASIC, cuando diseñe la placa, la pense para que pudiera usarse con el puerto RS232 implementado en la ROM de los Commodore y que se conecta al puerto del usuario. Los parametros de OPEN para abrir el puerto varian levemente entre maquinas, no son los mismos para C64/128 que para C16 o Plus/4, y supongo que tambien difieren en VIC20, sin embargo, la conexion electrica es la misma, ya que Commodore se aseguro de que un modem funcionara de forma directa en todos los modelos. Esto implica que al diseñar la placa del sintetizador de una manera compatible con el puerto RS232 de Commodore, me aseguraba que la misma se pudiera usar en toda la linea.
Pero si bien la diferencia entre modelos no implica un cambio de placa, si requiere algunos ajustes a la parte del soft y a la configuracion de la velocidad de comunicacion con el PIC.
Como dije, los parametros para abrir el puerto RS232 difieren levemente, pero una vez hecho esto ya se hace todo de manera similar en cualquier modelo.
El otro cambio tiene que ver con la velocidad de transmision que permite el hard de cada maquina. En C64 no se suele usar mas de 1200 bps, porque tanto la transmision como la recepcion estan implementadas por soft, y hay un limite en el proceso que se puede dedicar a esto mientras se tiene activada la pantalla. Para C64 existe una solucion intermedia, que usa en parte hard y en parte soft, es la interfaz UP9600 y su correspondiente driver, que permiten enviar y recibir a 9600 bps sin hard adicional. La desventaja es que utiliza otros pines del puerto del usuario para aprovechar los conversores paralelo-serie y serie-paralelo de las CIA.
Estuve considerando un tiempo adoptar esta conexion, pero esto implicaba que habia dos opciones con respecto a la placa: podiamos hacer una placa para C64 y otra para C16-Plus/4, o complicar el diseño para que soporte los dos tipos de conexion (UP9600 en C64 y RS232 estandar de Commodore en los otros modelos).
El problema de adoptar el estandar UP9600, es que esta es una mejora especifica de C64, que no funcionaria en Plus/4, mientras que usando la conexion RS232 estandar, funcionaria tanto en C64 (aunque a solo 1200 bps) como en Plus/4, que gracias a que tiene un chip de comunicaciones, puede enviar y recibir a hasta 19200 bps.
Como no pude decidirme a abandonar la compatibilidad de hard, solo quedaba una opcion: mejorar la velocidad de transferencia en C64. Se me ocurrio que no necesitamos enviar tantos bytes por segundo al sintetizador, pero si necesitamos usar la menor cantidad de tiempo posible en el envio, para que esto se pueda integrar en un juego en asm, de forma de que sobre proceso para un juego promedio.
La idea es enviar los comandos al sintetizador, de a 1 byte por cada cuadro del video, lo que deberia ser suficiente para mensajes hablados. Hay que tener en cuenta que el chip tiene un buffer, por lo que no importa a que velocidad se envie, siempre que haya otro comando en el buffer cuando se termina de procesar el anterior.
Para que esto funcionara, habria que sincronizarse con el inicio del borde inferior de la pantalla, ya que durante los bordes el VIC no interrumpe al 6510 y por lo tanto se puede ejecutar codigo con tiempos muy precisos. Esto no es problema porque el VIC permite generar una interrupcion en la linea de video que nos convenga.
El inconveniente mas grande es la velocidad, a 19200 bps un byte tarda casi 521 microsegundos en enviarse, que no esta mal pero puede ser demasiado para algunos juegos, teniendo en cuenta que es aqui donde se suele ejecutar el codigo de un reproductor de ".sid", y se necesita poder ejecutar todo antes de que termine el borde superior del siguiente cuadro de la imagen.
A 1200 bps la cosa es peor, un byte tarda en enviarse 8,3 milisegundos, cerca de la mitad del tiempo total entre dos cuadros.
La duda que tenia era si se podia enviar mas rapido, y como el sintetizador solo dispone de una velocidad mas rapida que 19200 bps, esa era la unica opcion posible: enviar a 57600 bps.
El fin de semana puse manos a la obra, busque todo el material tecnico, el ensamblador ACME, y como referencia viejos programas que habia hecho hace unos años, porque ya hacia tiempo que no programaba en asm de 6502.
Hecha toda la investigacion, ayer hice varias rutinas que tenian que cumplir con una condicion: el tiempo de envio de un bit debia ser de 17 microsegundos, sin importar si era un 0 o un 1. Habia leido que hubo gente que logro recibir a 57600 bps, por lo que al menos sabia que tendria que ser posible enviar a esa velocidad.
Despues de varias versiones que ni siquiera llegue a probar, porque ya no daban los tiempos en papel (o mas bien pantalla), pude lograr una rutina que cumplia con exactitud el requisito, 17 microsegundos por bit, sin tener que usar codigo automodificable o precalcular valores. Ni siquiera hay NOPs, al menos durante los bits de datos,ya que el tiempo necesario para calcular el siguiente bit es justo 17 us, solo se usan NOPs al final de la transmision, porque ya no hay nada mas que calcular.
Ahora, si bien la rutina funciono a la primera prueba, haciendo que el sintetizador emitiera un HOLA, las siguientes ejecuciones no siempre andaban bien. Con la ayuda tecnica de the woz, se pudo solucionar esto, que era lo que sospechaba, por alguna razon el VIC o la interrupcion de la CIA no quedaban deshabilitados durante la transmision.
La conclusion es que ya pude dar el primer paso del plan, lo que sigue es integrar esta rutina con la interrupcion de 50/60 Hz, y luego escribir rutinas de manejo de un buffer de envio de secuencias al sintetizador. Cuando este implementado, el programador se limitaria a llamar a una rutina con un texto cargado, la rutina agregaria esta secuencia al buffer en RAM, y la rutina de interrupcion iria enviando como "tarea de fondo" estos bytes a un ritmo de 50 o 60 caracteres por segundo, segun el modelo de C64/128.
Todo esto permitiria que se pudieran hacer juegos en asm con soporte de voz, sin agregar un excesivo consumo de proceso.
Al final del camino va a haber un pequeño juego de demostracion, no va a ser gran cosa, solo una prueba con todo funcionando.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #32 en: Febrero 15, 2016, 11:00:34 »
Adjunto el codigo fuente y el .prg de la prueba, lo unico que hace es enviar el texto "OLA." por RS232 a 57600 bps, el que tiene una placa armada con el sintetizador HR4, tiene que configurar los jumpers a 57600 bps (JP0 y JP1 a 1). Tambien se podria probar con una interfaz serie, de las que se usan para conectar un modem estandar o para conectarse a un PC, habria que abrir una terminal en el PC y configurarla a 57600 bps, 8N1, y se deberia recibir ese texto al ejecutar el programa con RUN en el C64.
La prueba la hice en el C128, pero deberia andar igual en cualquier modelo de C64 a pesar de las diferencias de velocidad del 6510.
Cuando estaba viendo por que no funcionaba siempre igual la rutina, se me ocurrio capturar la salida de datos del puerto del usuario como si fuera audio, para usar GoldWave como un osciloscopio improvisado. Tuve que capturar a 352800 Hz porque a 44100 Hz se perdian detalles, aunque igual la Audigy 2 filtra las ondas cuadradas y cuesta medir los tiempos exactos. En esta captura de pantalla se puede ver lo que se envia, estan marcados los caracteres.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #33 en: Febrero 15, 2016, 11:30:22 »
Bajado código para estudiar y aprender algo bueno de una vez  :D.

¿La "H"?.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #34 en: Febrero 15, 2016, 11:34:11 »
No suena, el sintetizador la ignora excepto que venga despues de S o C, asi que no la envio.
El codigo esta comentado casi linea por linea, asi que deberia poder entenderse bastante, me olvidaba de aclarar que los numeros con los que empiezan algunos comentarios son los ciclos de reloj que requiere esa instruccion.
Tambien me olvide de decir que segun esa captura de audio, el tiempo aproximado entre un byte y el siguiente es de 193 microsegundos, que serian los 170 del byte mas la inicializacion previa de cada byte. Esto se podria optimizar para que en lugar de ejecutar NOPs al final, vaya preparando el siguiente envio, pero esta rutina solo se va a usar para enviar 1 byte, y de hecho ni siquiera es necesario enviar el bit de stop, ya que ese bit no tiene diferencia con el estado de reposo de la linea TX. En el codigo solo se espera antes de retornar, por si se envia un byte a continuacion.
« última modificación: Febrero 15, 2016, 11:40:38 por pastbytes »

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #35 en: Marzo 05, 2016, 23:00:05 »
No me acuerdo si por aqui publique el esquema del sintetizador de voz para Commodore, de todas maneras para que quede todo en un solo lugar lo adjunto.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #36 en: Abril 01, 2016, 12:38:02 »
Esto no tiene que ver con Commodore pero tal vez a alguno le interese verlo.
Para variar un poco, queria probar algun juego en BASIC pero en PC, y que tuviera algo de graficos. Ademas buscaba que corriera en un XT de 4,77 MHz, lo cual limitaba mucho las posibilidades. No encontre juegos de naves que era lo que me parecia que iba a quedar mejor (esta lleno de juegos de aventuras y de estrategia, todo en modo texto), hasta que di con el juego de Bill Gates: donkey.bas.  ;D
No es un gran juego, pero cumple con las condiciones: va bien en un XT original, tiene algo de graficos, y se adapta al agregado de voz y efectos de sonido.
En un rato de modificarlo ya estuvo andando, lo probe en mi Fujitsu PoqetPC Plus, primero a 4 MHz para aproximar la velocidad a un IBM XT, ya que la maquina tiene un NEC V30 que puede funcionar en 4 velocidades: 2, 4, 8 y 16 MHz. El video es CGA pero en pantalla LCD monocromo (y con los "colores" invertidos). La prueba la hice con la placa del sintetizador que se alimenta del puerto RS232, pero en este caso actualizada a HR6.
Despues probe el juego con DOSBox en el PC con Linux, y selecciono el audio original del juego y el audio del sintetizador, que en esta ocasion es el HD1.
El video tiene notas que van explicando lo que se hace.

https://www.youtube.com/watch?v=v1qTxO9rXqs

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #37 en: Septiembre 07, 2016, 13:08:54 »
Bueno, en los ultimos meses estuve poniendo al dia los 3 sintetizadores de voz en desarrollo, ahora el HR4 esta en la version 1.1, se le hicieron algunas correcciones:

-  Se ajustaron las duraciones y volumen de los fonemas para que se correspondan con los de los sintetizadores HD1 y HR6, que estaban mas avanzados.
- Se agrego un jumper para seleccionar si la salida de audio vuelve a media tension (lo normal hasta ahora) o a masa, una vez que finaliza la emision de sonido. Esto solo importa si se va a armar la placa amplificada directamente con un transistor, como el audio siempre volvia a mitad de tension, cuando emitia silencio el transistor quedaba conduciendo siempre, calentandose innecesariamente. Ahora si se va a usar de esa manera, se ajusta ese jumper y la salida de audio vuelve a masa alrededor de 1 segundo despues de terminar la reproduccion de sonido.
- Se reformo el arranque del programa, el texto que se hablaba al arrancar, que estaba codificado en el programa (sintetizador listo), ahora se traslado a la memoria EEPROM, logrando asi dos cosas, la primera es que el usuario puede modificar este texto para personalizar el sintetizador a los requerimientos de su proyecto, y la segunda es que se amplio la cantidad de caracteres, que ahora es de 58.
- Se cambiaron algunos pines de lugar para reservar dos pines para futuras ampliaciones. Esto implica que cualquier placa armada tiene que ser modificada para funcionar con esta version.
- Se agrego un comando para consultar el modelo de sintetizador y la version del firmware.

El chequeo de version era una de las cosas mas importantes. No es algo tan importante en este momento pero lo va a ser en el futuro, cuando los comandos soportados difieran mas entre sintetizadores, por lo que va a ser necesario que el programa sepa de que comandos dispone.
Acabo de probar exitosamente el chequeo de version en el Commodore 64, enviando y recibiendo a 57600 bps, el chequeo es casi instantaneo, diseñe el protocolo para que se pudiera consultar de forma comoda tanto desde una maquina rapida (PC, raspberry pi, microcontrolador) como desde una maquina de 8 bits, que tiene que trabajar en half duplex, ya que no puede enviar y recibir simultaneamente a 57600 bps.
Me queda implementar una rutina de interrupcion para que el envio y recepcion se hagan como tarea de fondo, asi ya se puede probar con alguna aplicacion de ejemplo.
Esta version va a estar a prueba por un tiempo, pero si no da ningun problema va a pasar la version final, y va a ser publica. De todas maneras todavia falta escribir y adaptar programas de demostracion, reescribir el manual de la v1.0, escribir manuales extra especificamente para equipos de 8 bits, y poner al dia los drivers y demos para las otras plataformas (MSX y Spectrum).

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #38 en: Septiembre 07, 2016, 15:19:10 »
En este video se puede ver la prueba con los dos sintetizadores, HR4 y HD1, no es gran cosa, el programa deshabilita el video y las interrupciones, y chequea la version del sintetizador y firmware enviando 7 bytes y recibiendo 6, 3 son del modelo (HR4, HD1, etc.) y 3 de la version del firmware. Todo esto a 57600 bps.

https://www.youtube.com/watch?v=Ltl4yTkmb_Y

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Proyecto de sintetizador de voz por hard
« Respuesta #39 en: Septiembre 07, 2016, 19:21:42 »
no entiendo mucho los cambios que se hicieron, pero se ve/oye muy bien che!

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #40 en: Septiembre 07, 2016, 23:13:10 »
No hay cambios que se noten, el trabajo de los ultimos meses fue para darle forma de producto final.
Los 3 sintetizadores que estoy desarrollando tienen formas distintas de generar la voz, y en cada uno voy probando cosas, entonces era necesario que pudieran ser intercambiables. Se puede armar secuencias para que el sintetizador cante o genere musica, y si uno tarda mas en reproducir una secuencia que otro, el desarrollo de programas que usen voz se complicaria, porque habria que tener una secuencia distinta para cada uno. Ahora los tiempos y fonemas estan ajustados para que suenen lo mas parecido posible en los 3.
Otro tema que me parecia importante es que el usuario pudiera ponerle su propio mensaje hablado de inicio, que hasta ahora era "sintetizador listo". Ya que no voy a distribuir el codigo fuente del programa, necesitaba trasladar el texto ese a la memoria EEPROM de datos del PIC, por lo que el usuario va a poder modificar lo que dice al arrancar, y las ondas de los 3 instrumentos musicales del sintetizador, que tambien estan en EEPROM. En el video se puede escuchar que un chip dice "Commodore 64", y el otro "Sintetizador listo", en ambos casos con efecto de eco.
Y por ultimo, como esta va a ser la primera version publica, era necesario implementar algun comando de reporte de version para que las aplicaciones pudieran saber si hay un sintetizador conectado, y de ser asi, que modelo es y que version de firmware tiene. En este momento para lo que sirve es para detectar si hay un sintetizador conectado (si no recibe respuesta del comando es que no hay uno), y si por ejemplo el HD1 fuera publico, tiene un par de diferencias con respecto al HR4, la primera es que soporta una octava mas para voz y musica, la otra es que emite sonido a 15KHz en lugar de 8,6KHz, lo que afecta al comando para cargarle una onda definida por el usuario, ya que en el HR4 hay que enviar una onda de 66 muestras y en el HD1 debe tener 128. En este momento no son grandes diferencias desde el punto de vista de la aplicacion, pero en el futuro van a agregarse cosas y era importante contar con el chequeo de version desde ahora.

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Proyecto de sintetizador de voz por hard
« Respuesta #41 en: Septiembre 08, 2016, 16:15:08 »
que tenes pensado hacer una vez que este pulido el producto?
venderlo como un producto completo, todo armado? o vender un Kit donde uno se lo arma? o hacerlo open source/ open hardware?

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #42 en: Septiembre 08, 2016, 21:00:09 »
Voy a publicar el .hex para grabar el PIC, el circuito, el manual y el soft para controlarlo desde C64, MSX y Spectrum.
Cualquiera va a poder armarlo, yo no creo que pueda ponerme a armar placas.
Si queres armarte uno avisame y te paso el .hex para que lo pruebes, el manual de la v1.0 esta en la web: www.pastbytes.com/apps/picsynth/ManualHR4.zip
El circuito ya no es valido porque cambie unas señales de lugar, pero solo hay que conectarlas en otros pines, y se agrega un jumper mas. El lenguaje de comandos es el mismo, solo falta algun comando nuevo que no esta explicado. Si lo armas para conectarlo a una raspberry pi o PC por RS232 lo podes probar desde una terminal, le activas el jumper ECHO y te devuelve lo que tipeas.


riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Proyecto de sintetizador de voz por hard
« Respuesta #43 en: Septiembre 09, 2016, 00:45:15 »
si, gracias. en el futuro (en algunos meses) me gustaría armarme una placa. ahora no tendría el tiempo, pero si, suena a proyecto divertido.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #44 en: Septiembre 11, 2016, 11:24:21 »
La version 1.1 del sintetizador HR4 paso a beta 1, el circuito ahora es diferente porque cambian unos pines de lugar, asi que las placas anteriores tienen que modificarse ligeramente para funcionar con esta nueva version.
El nuevo circuito es este:



Lo que cambia es que se movieron las entradas JP0 (pin 17) y JP1 (pin 18) a los pines 6 y 13, se movio la salida NOT_READY/CTS del pin 13 al 10, se agrego la entrada JP4 en el pin 3, que antes no estaba conectada, y los pines 17 y 18 ahora se conectan a masa.
Si se coordina entre varios se podrian armar placas para los que quieran probarlo, si es que se consiguen ahi los PIC16F648A y los conectores para el puerto del usuario, el resto de los componentes son bastante comunes.
« última modificación: Septiembre 11, 2016, 11:45:06 por pastbytes »