Sintetizador de voz y generador de sonido

Proyectos de hardware con sus esquemáticos y si llevan software en fuente

Moderadores: cacharreo, Fundadores

Reglas del Foro
Aquí solo tienen cabida proyectos de hardware que incluyan siempre al menos sus esquemáticos para poder reproducirlos si llevan componentes electrónicos, y si es posible los ficheros del programa en que se hacen, los diseños de las placas, los gerber, etc. Si llevan algún tipo de software asociado debe estar diponible el código fuente

Para los que no cumplen estas condiciones se debe postear en el foro de proyectos generales.
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

Kyp escribió:
pastbytes escribió:Lamentablemente no, ese micro tiene la mitad de la memoria, el 648A es identico pero con 4K en lugar de los 2K del 628A.
El programa usa toda la memoria, no queda nada libre.
A que ordenador lo quieres conectar?
Me lo estaba imaginando. ¿Y un 873 que tengo por aquí? Tampoco tengo un cristal de 20 MHz. Supongo que habrá un montón de cosas sincronizadas con temporizadores y si pongo otro valor no funcionará, ¿no?

Sería para un Spectrum.
El 873 podria servir por las capacidades que tiene, pero el programa no esta hecho para ese, habria que adaptarlo. Los 20MHz no son necesarios, pero con 4MHz no va a andar, no se como sera actualmente pero la ultima prueba que hice requeria 8 o 10MHz de minimo. De todas maneras el programa esta hecho para 20MHz y cambiar el cristal requiere modificarlo.
Avatar de Usuario
Kyp !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3398
Registrado: 30 Sep 2013, 14:54
Ubicación: Madrid
Has thanked: 29 times
Been thanked: 157 times

Re: Sintetizador de voz y generador de sonido

Mensaje por Kyp »

Bueno, no importa, compraré un PIC y un cristal y ya veré si necesito algo más. Te aviso cuando lo tenga pero ten en cuenta que no tengo mucho tiempo y voy lento :|
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

Kyp escribió:Bueno, no importa, compraré un PIC y un cristal y ya veré si necesito algo más. Te aviso cuando lo tenga pero ten en cuenta que no tengo mucho tiempo y voy lento :|
No hay problema, yo tambien avanzo cuando puedo. Me avisas y te envio el .hex de la version que tenga en ese momento.
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

Con respecto al soporte de soft, detallo por plataforma como se controla.

Commodore:
Los Commodore tienen un puerto del usuario que difiere en los distintos modelos pero conserva compatibilidad para las señales cuando se usa en modo RS232. Esto posibilita que se use la misma placa en los C64/128, C16, Plus/4, y posiblemente VIC20 (nunca use uno pero creo que es compatible tambien).
Los programas de demostracion que hice/adapte usan el soporte en ROM del RS232, por lo que todo se hace con OPEN y luego PRINT#, con ligeras diferencias en los parametros del OPEN entre modelos. En el C64 la velocidad maxima que se puede usar de forma segura como tarea de fondo es de 1200 bps, que es la que usa por ejemplo la aventura conversacional en el Commodore 128. La serie del Plus/4 dispone de una UART para el RS232, lo que le da un maximo de 19200 bps, que es lo que se usa en el juego "guerra galactica" que pruebo en uno de mis videos.
Dado que el Plus/4 puede manejar el RS232 por hard, no hay mucha necesidad de escribir un driver para mejorar la velocidad. En el C64 sin embargo, 1200 bps solo es adecuado para programas muy simples hechos en BASIC.
Mi intencion es implementar rutinas que se puedan llamar tanto desde BASIC como desde asm, estas rutinas proporcionarian una cadena de texto con la secuencia a enviar al sintetizador, desde el BASIC habria que cargar ese texto en una variable especifica, desde asm habria que cargarlo en un buffer y pasar el puntero. Estas rutinas ingresarian este texto a un buffer de envio, y el codigo que estaria implementado en la rutina de interrupcion de teclado (que se llama 50 o 60 veces por segundo) iria enviando en serie un caracter por interrupcion, a 57600 bps, durante el borde inferior de la pantalla. De esta manera el envio se haria como tarea de fondo, y se perderian 170 microsegundos por interrupcion, mas la gestion del buffer. El envio de 50 o 60 caracteres por segundo deberia ser suficiente para la mayoria de los usos.

MSX:
En los MSX el sintetizador se conecta a un puerto de joystick, se requiere la carga de un driver que actualmente se usa desde el BASIC, y recibe como parametro un texto a enviar. La rutina actual funciona enviando a 19200 bps, hay dos versiones, una que envia hasta detectar que el sintetizador no puede recibir mas datos (linea CTS en 1), y retorna al BASIC la cantidad de caracteres enviados, para que el programa pueda reintentar el envio del resto. Ya que esto no es muy practico por la lentitud del BASIC, hice otra rutina que no retorna el control hasta haber enviado el texto completo, esperando a que el sintetizador se libere si tiene el buffer de recepcion lleno. Esta rutina es la que se usa en la aventura conversacional, y no es problema que se quede esperando al sintetizador, porque este tiene un buffer lo suficientemente grande como para devolver el control antes de que se termine de reproducir lo recibido.
Si se quiere usar en un juego en asm, habria que implementar algo como lo que comentaba para Commodore, una rutina en la interrupcion de video que gestione un buffer de envio y envie 1 caracter por interrupcion, tambien a 57600 bps, ya que a 19200 bps cada envio de caracter toma casi 521 microsegundos, contra 170 us a 57600 bps.
El sintetizador tiene un comando de reporte de version, esto se puede usar en el programa para detectar que sintetizador esta conectado y que version de firmware tiene, tambien si no se recibe respuesta, sirve para detectar que no hay sintetizador conectado, y adicionalmente, para detectar en que puerto de joystick hay uno si lo hay.
Tal como el caso del Spectrum, se podria conectar el sintetizador a la salida de grabacion en cinta, o a cualquier otro puerto (el paralelo por ejemplo), siempre que se tenga una salida para enviar los datos al PIC, y opcionalmente 2 entradas para detectar el estado del sintetizador, y 1 mas si se quiere detectar que el sintetizador esta conectado. Se podria tener un driver universal que siempre se llame de la misma manera y que detecte donde esta conectado el sintetizador (cassette, joy1, joy2, cartucho, etc.) para adaptarse a cada caso.
Otra cosa interesante seria adaptar el driver para que funcione desde MSX-DOS, de forma similar al comando ECHO pero enviando el texto al sintetizador.

Spectrum:
En Spectrum se utiliza una version del driver para MSX, pero controlando la salida MIC para enviar datos a 19200 bps. La placa requiere un amplificador que adapta la señal MIC a niveles TTL para que las reciba el sintetizador. Aqui no disponemos de entradas para ver el estado del sintetizador, por lo que hay que tener cuidado de enviar secuencias cortas para dar tiempo al sintetizador de procesarlas antes de hacer otro envio. Esta limitacion solo existe en el 48K, que no tiene mas entradas (salvo EAR, que tengo que ver si puedo aprovechar), pero en Spectrums con puertos de joystick o RS232 se puede tener la funcionalidad completa, habria que adaptar el driver para esos puertos.
El driver actual funciona desde el BASIC, y requiere cargar la secuencia en la variable Z$, antes de llamar a la rutina que se encarga del envio.

Amstrad CPC:
No conozco mucho de este ordenador ya que jamas vi uno en mi vida, por aqui eran casi inexistentes. Deberia poder conectarse de varias maneras, y se podria adaptar el codigo para MSX o Spectrum, tambien se podria usar el recurso de cargar el texto en una variable BASIC especifica.

Timex Sinclair 2068:
Probe el driver para Spectrum y funciona la primera vez pero despues ya no responde, tengo que encontrar tiempo para chequear si hay alguna incompatibilidad con ese codigo, probablemente haya alguna diferencia de velocidad.

ZX81:
Si bien deberia funcionar el driver para Spectrum adaptandolo, no se si tendria sentido, ya que el manejo de la salida de cinta altera la generacion de la imagen, pero tendria que investigar si se puede enviar un byte por interrupcion a 57600 bps sin alterar la imagen (no tengo tanto conocimiento para saber ahora si es posible).

Atari:
En los 8 bits se que se puede reprogramar los puertos de joystick como salida, por lo que se podria adaptar el codigo para Commodore, ajustandolo a la distinta velocidad del procesador. En los ST debe haber varias maneras de conectarlo, pero es un ordenador que tampoco vi nunca en persona.
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

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:



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.
En un MSX se requeriria reescribir el driver para enviar a 57600 bps, e implementar tambien una rutina de interrupcion para enviar un byte por interrupcion de video.
En el video se usa el sintetizador HD1 porque los altavoces me quedaban lejos y ese tiene una mejor calidad de voz para compensar la distancia, pero todo esto tambien es aplicable al HR4.
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

Una prueba mas, ahora le agregue una entrada de joystick analogico de PC al sintetizador HD1, esta era una funcion que quise agregar al HR4 pero quedo afuera por falta de memoria de programa.
Para poder conectar el joystick solo hizo falta 2 resistencias de 100K (una por eje) y 2 resistencias de 10K (una por cada boton), en el PIC se usa el conversor A/D y se captura el estado del joystick 60 veces por segundo. Desde el ordenador se puede pedir la ultima lectura en cualquier momento, esto requiere dos peticiones, y cada una consta de 1 byte de comando enviado hacia el sintetizador, y 1 byte recibido conteniendo 7 bits con el valor del eje y 1 bit con el del boton. Haciendo las dos peticiones de estado se tienen los dos ejes y los dos botones.
En este video se puede ver a un Commodore 64 comunicandose con el sintetizador a 57600 bps, enviando 1 byte y recibiendo otro para consultar el estado del joystick, esto se realiza de manera intercalada y durante la interrupcion de video, en un cuadro se pide la coordenada X + boton 1 y en el otro la coordenada Y + boton 2, de esta manera se lee el joystick de manera completa 30 veces por segundo. Ademas de esto, luego en la interrupcion se envia un byte desde un buffer en RAM que contiene el texto que se va hablando continuamente, esta es una prueba extrema porque dificilmente haya que enviar texto para hablar todo el tiempo, y tambien puede ocurrir que no necesitemos leer el joystick o podamos hacerlo no tan frecuentemente. Pero aun asi se sigue pudiendo usar el BASIC y leer el disco.

Avatar de Usuario
Kyp !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3398
Registrado: 30 Sep 2013, 14:54
Ubicación: Madrid
Has thanked: 29 times
Been thanked: 157 times

Re: Sintetizador de voz y generador de sonido

Mensaje por Kyp »

Ya tengo los componentes, te he enviado un MP.
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

No habia visto los mensajes, llevo unos dias con muy poco tiempo ultimamente, pero intentare publicar el .hex y el nuevo plano a mas tardar el fin de semana.
Espero que no hayas montado nada, porque hubo algunos cambios desde la ultima vez que publique, no en la parte del firmware sino cambios en la asignacion de pines del PIC.
Ya detallare mejor en que estuve trabajando, pero unos dias despues de la ultima prueba donde agrego una entrada de joystick al sintetizador HD1, comence a experimentar con un modulo wifi ESP-12E, basado en el ESP8266. Tenia una version 1.1 del sintetizador HR4 que todavia no tenia entrada de joystick, y decidi que tal vez seria mejor asignar las entradas para que en el futuro si lograba optimizar el codigo pudiera hacer una actualizacion de firmware sin tener que hacer cambios a los pines. Entonces decidi probar si podia leer un joystick analogico en el HR4, y aunque no quedo funcional, parece que se va a poder hacer, por lo cual decidi, ya que habia publicado el plano de la v1.1 e iba a ser confuso volver a cambiar los pines para soportar joystick en el futuro, cancelar esa version y hacer una v1.2 con nuevo plano.
En el medio de eso estuve experimentando con wifi, y se me ocurrio que podria compartir el puerto serie entre el sintetizador de voz y el modulo wifi, esto actualmente esta funcionando en un Commodore 64, y como consecuencia de estas pruebas tuve que hacer mas cambios a la asignacion de pines del sintetizador de voz.
La idea es que el mismo codigo en el PIC del sintetizador de voz sirva para armarse una placa de sintetizador o una placa de sintetizador + wifi, y esto ya esta hecho pero en el sintetizador HD1, solo tengo que dedicarme uno o dos dias a actualizar el firmware del HR4 y modificar la placa que tengo para asegurarme de que todo funciona bien. Si va bien, publico tambien el nuevo plano.
Ya que vas a conectar el sintetizador de voz a un Spectrum, los cambios no se notaran demasiado porque solo puedes usar la salida MIC para enviar datos al PIC, pero cambian de pines los leds y los jumpers de configuracion.
pastbytes
Le gustan las llamas
Le gustan las llamas
Mensajes: 95
Registrado: 14 May 2016, 09:12
Ubicación: Patagonia Argentina
Been thanked: 48 times
Contactar:

Re: Sintetizador de voz y generador de sonido

Mensaje por pastbytes »

Como dije antes, ya detallare mejor estos proyectos, pero por ahora dejare un par de videos de lo que estuve probando.
Para probar el modulo wifi y los sintetizadores de voz simultaneamente, tuve que armar una nueva placa donde pudiera conectar dos modulos, uno seria el de wifi, y el otro podria ser un sintetizador de voz (HD1 o HR4).
En este video se ven funcionando los dos, con un programa en BASIC envio datos a cualquiera de los modulos, que se seleccionan activando o desactivando la linea DTR, y luego accedo a un ftp desde una terminal, donde llego a listar el directorio (hay muy poca diferencia entre esto y descargar un archivo).



En este otro video lo que hago es probar la recepcion de datos a 57600 bps desde el PC, usando RTS para dejar pasar solo un byte por cuadro de pantalla, de esta manera podria recibir datos desde el modulo wifi sin tener que estar todo el tiempo pendiente a la recepcion. La prueba la hice con un PC, en una terminal que envia a 57K una linea de texto entera, pero que llega a un ritmo de 60 caracteres por segundo al C64, activando y desactivando la señal RTS en los momentos justos.
Ademas de recibir datos desde el PC e imprimirlos, o cargarlos en el buffer del teclado (lo que equivale a tipear directamente en el C64), se prueba tambien el envio de caracteres al sintetizador de voz y al PC, todo esto ejecutado en la rutina de interrupcion que es llamada 60 veces por segundo (por ser NTSC este Commodore) durante el borde inferior de la pantalla.



Los videos tienen anotaciones con un detalle de lo que se va haciendo, es recomendable verlos en un PC.
Avatar de Usuario
Kyp !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3398
Registrado: 30 Sep 2013, 14:54
Ubicación: Madrid
Has thanked: 29 times
Been thanked: 157 times

Re: Sintetizador de voz y generador de sonido

Mensaje por Kyp »

Aun no he tenido tiempo de montar nada. De todas formas empezaré montándolo todo en una placa de pruebas así que con tener claro el esquema y como grabar el PIC tengo suficiente.
Responder

Volver a “Proyectos de hardware abiertos”