*** Nueva version 4 del sintetizador *** Ultimamente no tuve mucho tiempo para dedicarle a este proyecto, por un lado por falta de tiempo y por otro por problemas tecnicos que tenia que solucionar. El problema mas importante que tenia era que ya no habia memoria en el PIC de 4K para seguir agregando cosas, y como hay una gran cantidad de tablas de saltos en el programa, que requieren ser ubicadas en paginas de 256 palabras (no son bytes porque la memoria de programa del PIC tiene un ancho de 14 bits), el problema no era solo de falta de memoria sino que ademas la memoria libre tenia que ser contigua. Las tablas de saltos no pueden quedar entre dos paginas, por lo que liberar un poco de memoria requiere ir acomodando rutinas y tablas por toda la memoria para rellenar lo mejor posible cada pagina y dejar la mayor cantidad de espacio libre contiguo. Para complicar las cosas, si muevo algo de lugar y no cabe, el programa no compila y no puedo ver donde cae cada rutina en memoria, por lo que todo el reacomodamiento tiene que hacerse anotando cuanto ocupa cada rutina y planificando de antemano antes de modificar el programa. Ese es el precio a pagar por insistir en usar un PIC16 en lugar de un PIC18 para esta aplicacion, pero creo que valio la pena.
En enero empece a planificar el nuevo algoritmo de escalado de voz, pero por el problema de la falta de memoria y porque todavia no se me ocurria como implementar las modificaciones en el programa existente, las cosas fueron avanzando muy lentamente, hasta la semana pasada. Despues de unos dias de trabajo pude terminar la parte principal del nuevo algoritmo, que en principio funcionaba peor que el anterior hasta que corregi algunos errores y termino andando mejor de lo esperado.
Esta nueva version seguramente va a ser la mas avanzada en PIC16, probablemente haya versiones para otros PIC de esa familia pero las diferencias van a ser en calidad de sonido (menor o igual) y tipo de conexion (por RS232, directo a un Z80 o 6502, etc.). Tuve que desistir de incorporarle funciones de sintetizador musical por falta de espacio, eso quedara para versiones reducidas y para el proximo proyecto de sintetizador de voz y musica en PIC18.
Todavia falta corregir y agregar algunas pocas cosas, pero basicamente las caracteristicas de esta version son:
- Programa diseñado para correr en un PIC16F648A a 20MHz, con 4K de memoria.
- Conexion por RS232 a 1200bps, usando RX, TX y CTS.
- Se puede cambiar la velocidad y el tono de la voz.
- El tono se puede cambiar tanto para las formantes como para la envolvente.
- El tono de voz puede variar en un rango de 3 octavas y un semitono, de C1 a C4.
- El programa esta pensado para recepcion continua de datos, habla apenas recibe.
- Se implementan dos comandos de acentuacion y 3 de sonidos extra.
- La calidad del sonido es de 8 bits a 8680 Hz de muestreo.
- Permite el uso directamente desde un programa emulador de terminal.
- Toda la comunicacion se hace en ASCII con caracteres imprimibles.
Las versiones anteriores almacenaban las vocales en su forma final, la version 2 agregaba silencio a cada ciclo de las ondas para lograr emitir una nota mas baja sin alterar el tono base de la voz, es decir las frecuencias formantes. Esto tenia el problema de que al bajar una octava, la mitad del ciclo fuera silencio, lo que reducia mucho la utilidad y lo limitaba a una octava mas o menos usable. La version 3 tambien almacenaba las ondas pero hacia un escalado de frecuencia, lo cual lograba siempre buen volumen y notas correctas, pero alteraba las formantes, dando la sensacion de que al avanzar mas de una octava estuviera hablando una voz diferente.
Mientras la version 2 alteraba la nota conservando la voz base, y la version 3 alteraba ambas cosas simultaneamente, la version 4 logra los resultados de la version 2, con la calidad de la version 3. Para lograr esto, se tuvo que reconstruir las ondas eliminando la nota musical que las afecta, para que pudieran emitirse a un volumen constante y fueran independientes. Estas ondas base son las que definen el tono de la voz, y pueden escalarse en frecuencia en un rango de 3 octavas. A su vez cada una de esas 37 voces posibles pueden ajustarse para emitir otras 3 octavas (37 semitonos), modulando las ondas base con una onda envolvente predefinida escalable en frecuencia. Con esto se puede cantar en 3 octavas conservando la misma voz, y se puede disponer de 37 voces diferentes, seria posible por ejemplo tener varios chips con voces distintas cantando exactamente las mismas notas. Pero aparte del tema musical, una gran ventaja de estos parametros es que permiten darle mas expresion a la voz, aunque no se pretenda hacer cantar al chip.
El escalado de las ondas base esta implementado, pero no asi el comando en el parser, por lo cual por el momento solo se puede cambiar por programa, estando por defecto en la nota C3. La nota en cambio si tiene el comando implementado, y es lo que se utiliza en la siguiente demostracion. Tengo que hacer un video donde se pueda ver mejor la prueba, pero por ahora va un mp3 con un texto de prueba.
El texto de prueba es:
"Saludos, comunidad de retrocomputacion. Estan escuchando la version 4 del sintetizador de voz con PIC16.
Esta version implementa un nuevo algoritmo, que genera la voz emitiendo una onda base, la cual es modulada en amplitud por una onda envolvente de frecuencia escalable.
La frecuencia de la envolvente puede ajustarse para corresponder a cualquier semitono entre la nota do de la octava 1, hasta la nota do de la octava 4.
Podemos probar con las notas musicales?
do re mi fa sol la si [octava 1]
do re mi fa sol la si [octava 2]
do re mi fa sol la si [octava 3]
do [octava 4]
Este programa esta implementado usando un PIC16F648A, y recibe los comandos a 1200 bits por segundo, por medio de una conexion serie.
El sonido emitido es digital, con una calidad de 8 bits de resolucion, a una frecuencia de muestreo de 8,6 KHz.
A continuacion, este sintetizador entonara las estrofas del himno nacional argentino:
Oid mortales, el grito sagrado: ¡Libertad! ¡Libertad! ¡Libertad!
¡Oid el ruido de rotas cadenas: ved en trono a la noble Igualdad!
Ya su trono dignísimo abrieron las Provincias Unidas del Sud,
Y los libres del mundo responden ¡Al gran Pueblo Argentino salud!
¡Al gran Pueblo Argentino salud!
Y los libres del mundo responden ¡Al gran Pueblo Argentino salud!
Y los libres del mundo responden ¡Al gran Pueblo Argentino salud!
Sean eternos los laureles que supimos conseguir:
que supimos conseguir:
coronados de gloria vivamos o juremos con gloria morir.
o juremos con gloria morir.
o juremos con gloria morir.
Para mas informacion, ingresen al sitio del proyecto, en www . pastbytes . com
o al foro de proyectos en retrocomputacion.com [beep]"
El mp3 va a ser temporal hasta que haga un video, por ahora se puede descargar de
LINK