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

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #45 en: Septiembre 16, 2016, 14:21:43 »
Hace tiempo que vengo planificando unas rutinas para controlar los sintetizadores de voz desde el C64 como tarea de fondo, implementando un buffer de envio y enviando en cada interrupcion (50 o 60 veces por segundo) un byte del buffer, pero a 57600 bps. Segun mis calculos 50 o 60 caracteres por segundo debian ser suficientes para que el programa pudiera hablar fluidamente, y a la vez el enviarlos a 57600 bps minimizaria el tiempo utilizado en la interrupcion.
Todo esto era teoria, y nunca implemente las rutinas porque habia que resolver la forma de uso desde el BASIC y asm de manera de que se pudiera llamar desde los dos sin tener que esperar a que se liberara el buffer. Es todo un problema de sincronizacion entre clientes para hacer mas practico el uso en juegos.
Sin embargo las rutinas para enviar y recibir a 57600 bps estaban hechas y probadas, asi que se me ocurrio hacer una rutina de interrupcion simple que no sirviera mas que para pruebas, y asi es que cargue un texto en el buffer que se va enviando de a 1 byte por interrupcion de video (60 bytes por segundo en mi caso, que tengo un C64 NTSC), y cuando termina vuelve a repetirse indefinidamente.
El resultado se puede ver en este video:

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

La rutina de interrupcion se ejecuta en la linea 251 del video, asegurandose de esa manera que no va a ser interrumpida por el video, ya que cae en el borde inferior, donde ya no se leen graficos desde la memoria. El envio de un byte tarda alrededor de 170 microsegundos, y la rutina cambia el color del borde a amarillo durante el envio, por lo que quedan en amarillo casi 3 lineas de video, durante el resto del borde inferior y luego el borde superior se puede agregar mas codigo para procesar un juego.
Como mi rutina solo roba menos de 200 microsegundos 60 veces por segundo, no se nota lentitud en el BASIC, y hasta se puede consultar el directorio de la SD2IEC y ejecutar programas.
Lo que tambien se puede apreciar es que el buffer del sintetizador esta siempre lleno (led azul encendido), por lo que 60 caracteres por segundo sobra para la voz, hay que ver si pasa lo mismo para enviar comandos musicales, que requieren una cantidad mayor de caracteres.
Pero al menos ya esta probado que tiene posibilidades para usarse en un juego en asm, ahora solo queda implementar el codigo para que sea facil de usar.

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 #46 en: Septiembre 16, 2016, 20:34:09 »
muy bueno

¿que tan dificil es agregar un extension al basic para que hable? (tipo las extensiones de SAM)
onda:

10 DECIR "HOLA MUNDO",0

el ",0" sería un flag para que lo que haga sincronico o asincronico.
No se si el protocolo que tenes te permite enviarle comandos el sintentizador o no, pero quedaría muy siimpático.

Me estoy imaginando hacer un proyecticto de home-automation con la c64 y, por ejemplo, cuando la puerta se abre le mando el comando a la c64 (ej: usando el unijoysticle), y la c64 lo recibe, y dice "intruso, intruso, introduzca contraseña" :)

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #47 en: Septiembre 16, 2016, 23:41:12 »
Desde el BASIC se puede usar desde hace años, solo tenes que abrir el puerto RS232 con OPEN 1,2,0,CHR$( 8 )+CHR$( 1 ) y despues por ejemplo PRINT#1,"SALUDOS.".
El problema con el BASIC es que soporta hasta 1200 bps nada mas, pero funciona tambien por interrupciones.
Al principio de este video podes ver como se usa en C64:

https://www.youtube.com/watch?v=EFo4w9jZu-Q

Hace tiempo the woz hizo una extension del BASIC con mi sintetizador TAV64, agregando el comando TAV al BASIC, pero te complica la vida porque hay que cargar la extension antes de cargar el programa.
« última modificación: Septiembre 16, 2016, 23:49:48 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 #48 en: Septiembre 17, 2016, 01:14:29 »
si, claro. tiene sentido que ya tengas hecho lo del BASIC, sino sería muy limitado su uso para la c64.
lo del open + print# va perfecto para la prueba que me gustaría hacer. gracias.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #49 en: Septiembre 17, 2016, 01:45:32 »
Lo que hice, despues de considerar otras formas de conexion, fue escribir rutinas propias pero conservando las mismas entradas y salidas compatibles con las rutinas RS232 de la ROM, de esta manera la placa es la misma y uno usa el BASIC a 1200 bps, o asm a 57600 bps. Cuando termine de completar las rutinas, tambien se va a poder enviar a 57600 bps desde el BASIC, al estilo del sintetizador TAV, cargando el texto que queres enviar en la variable Z$ y despues llamando a la rutina con SYS.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #50 en: Septiembre 21, 2016, 15:33:51 »
Tenemos puerto de joystick analogico de PC en el Commodore!
Para competir con el unijoysticle, uso RS232 en lugar de wifi, y joystick analogico en lugar de telefono movil, es lo que hay, compito con tecnologia prehistorica.   :D

Pude agregar una entrada para joystick analogico de PC al sintetizador HD1, algo que habia querido hacer con el HR4 pero no se pudo por falta de memoria de programa.
La parte tecnica es complicada pero se puede resumir asi:
- Para conectar un joystick analogico al sintetizador hay que agregar 2 resistencias de 100K (una por cada eje), y 2 resistencias de 10K (una por cada boton).
- Para leer el joystick desde el Commodore hay que enviar un byte pidiendo el estado de uno de los ejes del joystick, e inmediatamente recibir un byte que contiene 7 bits con el valor y 1 bit con el estado del boton.
- Se piden por separado los datos del eje X + estado del boton 1, y del eje Y + estado del boton 2.
- La comunicacion se hace a la velocidad que uno quiera de las 4 disponibles, en la prueba yo uso 57600 bps simplemente para minimizar el tiempo empleado.
- El sintetizador captura continuamente el estado del joystick, 60 veces por segundo, y uno puede consultar por comando el ultimo valor de captura.

Aqui se puede ver un video probando el joystick en un Commodore 64, durante la rutina de interrupcion se envia continuamente texto para hablar, y ademas se pide el estado del joystick, todo esto enviando y recibiendo a 57600 bps. En cada interrupcion (60 veces por segundo) se envia 1 byte, se recibe un byte, y si el buffer del sintetizador no esta lleno, se envia un byte para la voz.
Por supuesto que esta es una prueba extrema, dificilmente vamos a estar enviando texto para hablar continuamente, y tampoco es necesario leer el joystick 30 veces por segundo como estoy haciendo (en un cuadro leo el eje X y en el siguiente el eje Y).

https://www.youtube.com/watch?v=yCT-q-fPCw4

cubelindo

  • Commodore Overlord
  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 776
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #51 en: Septiembre 21, 2016, 17:00:35 »

Bueno, hay pocos programadores de C64, pero desarrolladores de hardware todavía menos

Mucho ánimo, se ve muy bien!!
All Your Base Society

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 #52 en: Septiembre 21, 2016, 18:49:41 »
Tenemos puerto de joystick analogico de PC en el Commodore!
Para competir con el unijoysticle, uso RS232 en lugar de wifi, y joystick analogico en lugar de telefono movil, es lo que hay, compito con tecnologia prehistorica.   :D

Excelente! Entonces, para poder competir,  me parece que le voy a tener que agregar un sintetizador al unijoysticle :)

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #53 en: Septiembre 21, 2016, 19:05:09 »
Lo de competir lo decia porque entra tambien en la categoria de "controlador raro e indirecto para Commodore".  :D
En realidad la lectura de joystick la hice porque queria ver que tal andaba nomas, la razon principal era poder leer dos potenciometros, para poder en el futuro hacer que afecten directamente parametros del sonido, tambien serviria para joystick, paddles, o potenciometros para que lea el usuario y use en sus aplicaciones, pero esto en otras plataformas que no sean la C64, que ya tiene ese tipo de entradas. Seria ideal para Plus/4, que no tiene entrada de paddles y encima tiene una UART para comunicarse a 19200 bps con asistencia de hard.

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 #54 en: Septiembre 21, 2016, 19:59:55 »
Lo de competir lo decia porque entra tambien en la categoria de "controlador raro e indirecto para Commodore".  :D

si si, no hace falta ni decirlo.

que bueno lo de los pots. ¿ya lo tenes resuelto? ¿te funciona bien? ¿que usaste?
Maniako me estuvo ayudando con eso un poco, pero finalmente no le agregué soporte para pots. Pero es algo quiero agregar en el futuro.

No se si ya viste este link donde explica como funciona el 1351:
http://svo.2.staticpublic.s3-website-us-east-1.amazonaws.com/[m]ouse/

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #55 en: Septiembre 21, 2016, 20:21:32 »
Bueno, aca no estoy usando nada de eso, entro con cada potenciometro derivado a masa con una resistencia de 100K (porque los potenciometros de estos joysticks tienen ese valor), y tomo el voltaje del medio, que lo mando directo al conversor A/D del PIC. El valor capturado queda en un registro interno del sintetizador hasta que lo pido desde la C64 enviando un byte de valor ASCII 9 (TAB), a lo que el PIC responde con un byte con el valor de POTX y el estado del boton 1, si desde la C64 envio un byte de valor ASCII 11 (VT, vertical tab), el PIC responde con  un byte con el valor de POTY y el estado del boton 2. Por eso lo de indirecto, estoy leyendo un joystick por RS232, cuando podria entrar por el puerto de joystick. Igual hay que aclarar que los joysticks de PC usan un valor distinto de potenciometro que los paddles de Commodore, asi que igual habria que adaptarlo.
En cuanto a la entrada de potenciometros de los puertos de joystick, a ver si me acuerdo mas o menos como funciona, como para que tengas una idea.
La captura la hace el SID, que primero tiene que seleccionar con unos 4066 (o 4016, no  me acuerdo) cual de las dos entradas leer (joy1 o 2), despues descarga el capacitor en la C64, me parece que todo el ciclo de captura dura 512 microsegundos y ocurre continuamente, no se puede detener. Si no recuerdo mal, pasa 256 us descargando el capacitor mandandole 0, y luego los otros 256 us se lo conecta al puerto de joystick y se va cargando a traves del potenciometro en el paddle, lo que mide el SID es el tiempo que tarda en cargarse, y ese tiempo le va a decir aproximadamente el valor del potenciometro.
El mouse 1351 reporta el movimiento simulando un potenciometro, en la realidad el 1351 deberia mover un potenciometro por el cual deberia pasar la corriente que viene desde los 5V de la C64, hacia la entrada POTX o POTY del SID en el puerto de joystick. De acuerdo al valor de resistencia, el capacitor va a llegar a la carga completa antes o despues.
Pero el 1351 lo hace de manera digital, engañando al SID, en lugar de variar una resistencia y con eso el tiempo de carga del capacitor, simplemente espera hasta el momento en que el capacitor deberia estar cargado, y manda un 1 a esa entrada, cargandolo al instante.
El detalle, es que el mouse detecta cuando empieza el ciclo de 512 us, sabe que hay 256 us donde el SID descarga al capacitor, y luego temporiza el momento justo de los otros 256 us para poner el 1 cuando corresponda. No me acuerdo ahora como se detectaba el inicio del ciclo, me parece que el mouse lee la propia entrada de POTX del puerto de joystick y si detecta un 0 es que el SID esta descargando el capacitor, y si esta en alta impedancia es que esta capturando. Lo digo medio de memoria porque no experimente con esto y hace un tiempo que lo lei, pero por ahi te da una idea de como funciona.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #56 en: Septiembre 21, 2016, 20:50:46 »
Todo es interesantísimo y el proyecto es genial, pero saber cómo lee realmente los potenciometros y saber que se puede detectar y usarlo para calcular el tiempo de espera para inyectarle 5v para simular un potenciometro es ideal.
No se me ocurrió eso ni de lejos. Eres un crack, en serio.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

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 #57 en: Septiembre 22, 2016, 02:05:51 »
Lo digo medio de memoria porque no experimente con esto y hace un tiempo que lo lei, pero por ahi te da una idea de como funciona.

gracias. y muy buena memoria. por lo que leí en ese artículo en envié, es así.

Agrego otro articulo más que habla de lo mismo: http://www.zimmers.net/anonftp/pub/cbm/documents/projects/interfaces/mouse/Mouse.html

saber cómo lee realmente los potenciometros y saber que se puede detectar y usarlo para calcular el tiempo de espera para inyectarle 5v para simular un potenciometro es ideal.

¿crees que se puede mejorar aún más el circuito que me enviaste usando esta técnica?

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Proyecto de sintetizador de voz por hard
« Respuesta #58 en: Septiembre 22, 2016, 06:25:15 »

¿crees que se puede mejorar aún más el circuito que me enviaste usando esta técnica?

Se puede probar a ver qué tal funciona.
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 #59 en: Octubre 17, 2016, 01:25:08 »
Ya que estaba haciendo pruebas tanto con el sintetizador de voz como con el modulo wifi, se me ocurrio que podia compartir el puerto con los dos. Para probar esto lo primero era armar una placa nueva, ya que la que estaba usando solo permitia conectar un modulo a la vez. Como todavia no tenia resuelto como conectar los dos en paralelo, la idea fue armar la placa de forma que en principio pudiera usar un solo modulo a la vez, dejando el otro sin conectar.
Aca hay una foto de cuando la empece a armar, viendo donde ubicar los componentes:



Probando como quedaria con los dos modulos conectados:





Asi quedo ya funcional:







Con los modulos conectados:





La idea basica es utilizar DTR para seleccionar un modulo o el otro, activando DTR (que viene activado por defecto y es lo normal en comunicaciones por modem) se habilita el modulo wifi, y desactivando DTR se podria hablar con el sintetizador de voz. Esto es algo que funciona bien, cuando DTR esta activado se envia una señal a una nueva entrada _CS que agregue al sintetizador, si esta linea esta en 0 el sintetizador ignora cualquier cosa que reciba, y no envia nada, ya que las lineas TX y RX estan casi en paralelo, porque llegan a ambos modulos desde el C64. Con las lineas RTS y CTS no hay problema porque el sintetizador solo utiliza CTS para avisarle al C64 que no puede recibir datos (porque el sintetizador tiene un buffer limitado), esta linea el modulo wifi no la necesita porque siempre tiene capacidad para recibir lo que envie el C64, por lo cual al activar el modulo wifi (activando DTR) la linea CTS que va al C64 se pone en 1 siempre mientras DTR este activada, de esta manera se le indica al C64 que puede enviar datos al modulo wifi en cualquier momento. La linea RTS en cambio sirve para que el C64 le indique a los modulos que no esta listo para recibir datos, esto no se usa en el sintetizador porque nunca envia datos que el C64 no pide, en otras palabras el C64 siempre sabe cuando el sintetizador va a enviar datos, asi que no necesita indicarle al sintetizador que no esta listo para recibir. Sin embargo, si es necesario indicarle al modulo wifi que el C64 no puede recibir datos, por lo cual RTS desde el C64 solo se conecta a ese modulo.
Un par de fotos de la version actual conectada al C64:




« última modificación: Octubre 17, 2016, 01:33:18 por pastbytes »