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

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #60 en: Octubre 17, 2016, 01:41:18 »
El plano por ahora es este, le puse version preliminar porque puede cambiar, y al haber tantos planos publicados puede ser confuso saber cual es el definitivo. Yo uso un CD4093 en lugar del 7400, pero deberia andar mejor el 7400.



La placa la probe en BASIC a 1200 bps que es la velocidad que maneja el BASIC, y funciona bien, cambiando el estado de DTR se habla con uno u otro modulo. No encontre una opcion en Novaterm ni en Striketerm para controlar la linea DTR, por lo que siempre hablan con el modulo wifi, por ahora solo puedo probar la seleccion desde el BASIC, o asm.
Ahora queda probar la comunicacion con el modulo wifi a 57600 bps y ver si puedo enviar y recibir durante la interrupcion de video sin perder datos, asi si funciona ya manejaria los dos modulos con las mismas rutinas.

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 #61 en: Octubre 18, 2016, 16:50:43 »
buenisimo!

Sin saber casi nada del pic, ¿se podría reemplazar el pic directamente con el esp8266? ¿o mande fruta?

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #62 en: Octubre 18, 2016, 22:56:16 »
Decis de hacer un firmware especial para el ESP que tenga sintesis de voz tambien? Por lo que lei del hard, tiene salida PWM por lo que se podria generar audio, y potencia le sobra, pero son dos aplicaciones que requieren tiempo real, la red y la voz, no se si se pueden hacer juntas. Y por otro lado, no hablamos de cargarle un script a cierto firmware ya hecho, sino de hacer un firmware nuevo, requeriria conocer bien el procesador y el resto del hard.
Yo hice la placa asi simplemente porque tenemos un solo puerto del usuario, para que si alguien armara el sintetizador de voz o el modulo wifi, no tuviera que andar desconectando, y que existiera una forma de compartirlos. La idea es que el soft detecte lo que hay conectado y se adapte o de el aviso correspondiente si falta lo que pide, pero que cada uno pueda armar la parte que quiere y el soft ya tenga en cuenta que puede haber uno o los dos conectados.

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 #63 en: Octubre 19, 2016, 00:11:12 »
Decis de hacer un firmware especial para el ESP que tenga sintesis de voz tambien? Por lo que lei del hard, tiene salida PWM por lo que se podria generar audio, y potencia le sobra, pero son dos aplicaciones que requieren tiempo real, la red y la voz, no se si se pueden hacer juntas.

si, algo asi. probablemente con el esp8266 no puedas tener voz y red a la vez.
no se en que esta programado el pic, pero el esp8266 se puede programar en C++ con una API muy similar a la del arduino.

por si te interesa, hace poco salió el ESP32 (el sucesor del esp8266) que tiene dos procesadores: uno decicado a la red y otro para lo que quieras y con ese si se podría tener voz y red a la vez.
Además este chip viene con bluetooth y más GPIOs y algunas otras cosas más. En Aliexpress esta más a o menos a 5 dólares.



pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #64 en: Octubre 19, 2016, 01:00:22 »
No conocia ese modulo, si encima vale apenas un poco mas que el otro me parece que se va a empezar a usar este ahora.
Lo de bluetooth era algo que estaba haciendo falta, tener todo en un mismo modulo esta muy bueno, con esto ya nadie va a usar modulos especificos para wifi o bluetooth, y con el segundo procesador y mas GPIO me parece que el uso de arduino va a disminuir bastante, porque muchas veces se ponen arduinos solo para comunicar dos modulos entre si.
El sintetizador de voz esta escrito en asm, y todo el programa esta implementado en la interrupcion de PWM, que se ejecuta en el HR4 unas 8680 veces por segundo, el PIC envia la muestra actual de sonido a la salida PWM e inmediatamente despues dispara la interrupcion, ahi se ejecuta el codigo que genera la muestra siguiente y retorna de la interrupcion. Fuera de eso hay un bucle principal que no hace nada. Se puede portar a C, parte de eso lo hice, tengo hace unos años escrito el parser en C para Linux, falta la parte del sintetizador, que fue variando desde entonces y no termine de escribir.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #65 en: Noviembre 01, 2016, 14:32:52 »
Para que las rutinas de transmision y recepcion a 57600 bps en el C64 tuvieran mas utilidad, necesitaba poder recibir un byte por cada cuadro, perdiendo el menor tiempo posible. Esto me llevó a experimentar con las líneas RTS y CTS, de manera de poder avisar al PC, modem wifi o cualquier otro dispositivo, que el C64 está listo para recibir datos, pero tenia que encontrar una secuencia donde sólo pasara 1 byte.
También había otro problema, que no sabía cuando el PC (o el modem wifi) tenía datos para transmitir, lo cual requería implementar una temporización para cancelar la espera de un byte después de cierto tiempo, que podría ser la duración de medio byte (85 microsegundos).
Experimentando un poco pude agregar el temporizador usando uno de los dos que tiene la CIA2, y encontrar la secuencia adecuada para activar y desactivar la línea RTS.
La secuencia es más o menos así:
- Entramos a la interrupción.
- Programamos el timer para dispararse en 85 microsegundos (la duración de medio byte a 57600 bps).
- Activamos RTS para indicar que el C64 puede recibir datos.
- Habilitamos una interrupción que se dispara al llegar un bit de start.
- Esperamos a que el timer llegue a 0.
- Si el timer llegó a 0, se cancela la recepción, se desactiva RTS y la interrupción del bit de start.
- Si se disparó la interrupción por bit de start, comenzamos a recibir el byte, y en tiempos muertos dentro de la recepción se desactiva RTS y la interrupción, para asegurarse de que al terminar la recepción del byte no se envíe otro.

Aquí se puede ver un video probando la recepción y la transmisión, con el C64 conectado tanto a un PC por RS232 como al sintetizador de voz HD1. El video tiene anotaciones, que según leí en youtube no se ven desde un móvil.

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

Los datos que vienen desde el PC se leen a 57K de a 1 byte por cuadro (60 caracteres por segundo por ser NTSC), y lo que envía el C64 va hacia el sintetizador y hacia el PC.
En la primera prueba, el C64 recibe caracteres a 57K, los imprime en pantalla, y los envía de vuelta al PC, y al sintetizador de voz. El texto que enviemos desde la terminal va hacia el C64, aparece en pantalla, se reenvía al sintetizador de voz para ser hablado, y vuelve a la terminal.
En la segunda prueba, los caracteres recibidos por el C64 no se imprimen directamente, sino que se ingresan al buffer del teclado, como si acabaramos de tipearlos. Esta vez no se usa el sintetizador de voz, lo que hacemos es ingresar remotamente un pequeño programa BASIC, y algunos comandos en modo directo.
La última prueba es similar, pero haciendo además que el C64 envíe un texto al sintetizador de voz y al PC, que va a aparecer en la terminal.
En la terminal se puede ver abajo lo que se envió hacia el C64, y arriba lo que el C64 envía al PC y al sintetizador de voz.
Ahora queda probar si el módulo wifi se comporta de la misma manera que el PC, es decir si chequea RTS justo antes de enviar un byte al C64, si funciona igual, entonces ya tenemos las rutinas para recibir datos por wifi durante la ejecución de un juego, y quedaría hacer un parser para decodificar las respuestas del módulo.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #66 en: Noviembre 11, 2016, 04:35:00 »
Dejo el plano actualizado de la version 1.2 del sintetizador HR4.
Esta version tiene reservados los pines para la lectura de joystick analogico de PC, o paddles/potenciometros, pero es algo que no esta funcionando del todo. Los comandos estan funcionando, reportan correctamente el estado de los dos botones del joystick, pero siempre devuelve el msmo valor de los ejes, como si la palanca estuviera al centro.
El que quiera grabar o regrabar algun PIC que tenia otra version, me puede pedir el archivo y le paso el .hex para que lo grabe. Por ahora es una version alfa pero no creo que cambie mucho hasta la version final.



pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #67 en: Diciembre 03, 2016, 17:37:59 »
Por fin pude portar la aventura conversacional al C64, me volvi loco porque tuve que partir de la version para C128, y eso implico formatear todos los textos a 40 columnas uno por uno. El otro problema, que era lo que me frenaba para portar el programa, es que en MSX las lineas pueden tener creo que 255 caracteres, y en C128, 160 caracteres, mientras que en el C64 pueden tener 80 caracteres como maximo. Esto hace que tenga que agregar un monton de lineas adicionales para reemplazar una linea por 2 o 3, en particular si son IF que imprimen y hablan textos de acuerdo a ciertas condiciones.
Para esta version quise agregarle algunos detalles, queria que el texto se imprimiera como si se estuviera recibiendo por un modem, en un estilo Juegos de guerra, asi que hice unas rutinas que en cada cuadro de video imprimen un caracter desde un buffer, y envian un byte por RS232 al sintetizador de voz, a 57600 bps.
Desde el BASIC no es complicado de usar, hay que cargar el texto a imprimir en la variable ZP$, y el texto a hablar en la variable ZV$, llamando con SYS 49152 se carga ZV$ al buffer de RS232, y con SYS 49155 se carga ZP$ al buffer de impresion. La rutina de interrupcion chequea si hay elementos en los buffers y procesa un caracter cada vez.
En el borde inferior de la pantalla se puede ver una parte en verde que indica cuando se esta enviando un byte al sintetizador, y otra en rojo cuando se esta imprimiendo en pantalla.
Tambien hay rutinas para sincronizarse con la impresion y la voz, que esperan a que termine cualquiera de esas dos tareas.

https://www.youtube.com/watch?v=PZ-nRV99SIs

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Proyecto de sintetizador de voz por hard
« Respuesta #68 en: Diciembre 04, 2016, 17:08:34 »
Aunque no comente nada, te leo con mucho interés.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #69 en: Diciembre 04, 2016, 17:30:05 »
Ídem que Josepzin.
Se me escapa gran parte de lo que estás logrando.
Tremendo trabajo.
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 #70 en: Diciembre 04, 2016, 23:34:04 »
El "driver" que uso ahi le puede ser util a alguien para sus programas en BASIC, se carga en 49152 y ocupa alrededor de 1K, esto incluye dos buffers de 256 bytes cada uno. Hay que activarlo primero con SYS 49164, esto configura la rutina de interrupcion y chequea en cada cuadro los dos buffers, hay un contador de byte por cada uno, si cada contador es mayor que cero envia un byte del buffer correspondiente a la salida RS232 o a la pantalla, y decrementa el contador correspondiente. Los dos buffers son independientes, uno puede cargar texto a imprimir y no cargar nada para hablar (para RS232).
Desde el BASIC, si uno quisiera por ejemplo imitar la frase de juegos de guerra, tendria que hacer:

10 SYS 49164: REM Esto solo se hace una vez al principio del programa
20 ZP$="SALUDOS, PROFESOR FALKEN":REM Este es el texto a imprimir
30 ZV$="SALU+DOS,PROFESO+R FA+LKE-N.":REM Este es el texto a hablar
40 SYS 49152:REM Esto carga la variable ZV$ en el buffer de transmision
50 SYS 49155:REM Esto carga la variable ZP$ en el buffer de impresion
60 SYS 49161
70 GET A$:IF A$="" THEN 70

Como la rutina de interrupcion automaticamente comienza a imprimir/hablar apenas se ingresa el primer caracter, la rutina llamada con SYS 49161 espera hasta que no haya mas elementos en el buffer de impresion, de esta manera sincronizamos el programa con la impresion en pantalla. SYS 49158 hace lo mismo pero con el buffer de transmision, espera hasta que se haya enviado todo al sintetizador de voz.
No es necesario llamar a 49161, se puede cargar la variable con mas texto y llamar de nuevo a 49155 para agregarlo al buffer, si el contenido de ZP$ es mas grande que el espacio libre en el buffer de impresion, la rutina se quedara esperando hasta que haya lugar libre. Como la rutina de interrupcion sigue imprimiendo y vaciando ese buffer, todo ocurre en paralelo.
El envio por RS232 es siempre a 57600 bps, no tiene utilidad si no se armaron una placa del sintetizador de voz, aunque tambien con una interfaz RS232 conectada a un PC se podria ver en el PC el texto que envia el programa.
Adjunto la rutina por si alguien quiere probarla.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #71 en: Diciembre 05, 2016, 15:05:20 »
Me olvide de aclarar que la rutina tambien hace que el cursor este siempre visible, y lo fuerza a empezar invertido cada vez que se imprime un caracter, de esta manera al imprimir un texto se ve el bloque del cursor, y recien empieza a parpadear una vez que se termina de imprimir. El parpadeo es el estandar del sistema, pero modificado para actuar como me convenia para parecerse a una terminal. Tambien, como la orden INPUT imprime un signo ?, es necesario esperar a que se termine la impresion antes de ejecutar esa orden, antes de poner la rutina en 49161 para esperar el fin de la impresion, me pasaba que el INPUT imprimia el ? en medio de la impresion del texto anterior, porque lo ejecutaba antes de que se terminara de imprimir.
En esta foto se alcanza a ver el borde inferior de la pantalla cuando el programa esta imprimiendo y hablando, la franja verde es el tiempo usado para enviar un byte a 57600 bps (entre 3 y 4 lineas, incluyendo el manejo del buffer), y la franja roja es el tiempo usado para imprimir un caracter.



En el video cada tanto se puede ver un flash donde todo el borde se pone rojo, eso es efecto del scroll, que excede el tiempo disponible en el borde entre dos cuadros, causando que el borde entero quede rojo por lo que tarda en desplazar el contenido de la memoria de pantalla.
Aqui se ve el C64 corriendo el juego:



Por ultimo, esta foto salio oscura, pero cuando la vi me recordo un poco a la portada del juego Hacker II:


« última modificación: Diciembre 05, 2016, 15:07:26 por pastbytes »

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #72 en: Diciembre 09, 2016, 00:17:35 »
Despues de pelear bastante con el BASIC y el asm, tengo una version preliminar para probar, no requiere el sintetizador de voz, porque lo detecta al arrancar, lee el modelo y la version y los imprime en pantalla, si no se detecta sintetizador, avisa que se deshabilitan los mensajes de voz, y solo se tendra el efecto de impresion en pantalla. Si detecta al sintetizador, dara opcion de tener todos los mensajes de voz, de obviar algunos, o de no tener mensajes de voz.
Adjunto el d64 con esta version.
La pantalla de deteccion del sintetizador:



Corriendo la aventura:



Otra de la deteccion:


« última modificación: Diciembre 09, 2016, 00:20:00 por pastbytes »

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 #73 en: Diciembre 09, 2016, 03:29:07 »
flor de laburo! vi que tuviste que casi escribir el juego dos veces.
quedó muy bien (aunque lo probé sin el sintetizador).

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #74 en: Diciembre 09, 2016, 04:03:45 »
Ya subi un video de como corre con los dos sintetizadores, y sin voz.

https://www.youtube.com/watch?v=OLxStj-RTqk

Y adjunto el programa corregido, tenia un par de lineas que todavia esperaban la respuesta del sintetizador, aunque no se hubiera detectado.
Lo hice mas o menos completo para que sirva de ejemplo de como usar las rutinas, que aunque estan hechas en asm, el BASIC es el que controla todo.