• Abro este tema para pasar en limpio la informacion del proyecto, ya que habia empezado con un tema de pruebas de soft y ya no es adecuado por ser mas bien un proyecto de hardware.
    Ya habia publicado el circuito para conectar el chip a una C64, que vendria a ser una version simplificada de la version RS232 generica, ya que la C64 incorpora un puerto RS232 pero maneja voltajes TTL y por lo tanto se conecta de forma directa al chip.
    En las ultimas pruebas decidi elevar la velocidad de comunicacion del chip de 300 a 1200 bps, ya que las computadoras de 8 bits que tengo con puerto RS232 manejan perfectamente esa velocidad desde el BASIC.
    Las pruebas hasta el momento se hicieron en C64 desde BASIC y desde un programa terminal, en Epson HX-20 desde BASIC, en Sinclair Spectrum 48K con Interface 1 desde BASIC, y desde una PC actual usando un programa terminal.
    La comunicacion usa entonces 1200 bps, 8 bits de datos, sin paridad y con 1 bit de stop, las lineas utilizadas con TX, RX, CTS y por supuesto GND. El chip desactiva la linea CTS cuando se llena el buffer, por lo cual puede actuar de forma impredecible (perdiendo datos basicamente) si se ignora esa indicacion y se continua enviando datos. Sin embargo si se van a enviar frases cortas y espaciadas se puede utilizar solamente las lineas RX y GND para una comunicacion minima.

    El circuito para la version RS232 es el siguiente:


    1310924626 75 FT0 Picsynth232


    Puede verse que hay pines del chip sin utilizar, estos estan reservados para el modo CPU que aun no esta desarrollado, y que consiste en conectar el chip a un bus de datos y direcciones (o puertos de E/S) de una computadora de 8 bits. En este caso el sintetizador recibiria los datos en paralelo en una direccion de memoria en los procesadores de E/S mapeada en memoria (por ejemplo el 6502) o en un puerto de E/S en los procesadores que lo permitan (por ejemplo el Z80), y devolveria señales de control en otra direccion o puerto. Si bien aun no estan implementadas estas funciones, los pines permanecen reservados para una version futura.
     

  • Esto es parte del manual del sintetizador:

    Introducción

    Este sintetizador de voz está basado en un conjunto reducido de fonemas del castellano, diseñado en principio para su uso en Argentina, por lo que faltan algunos sonidos usados en otros países. Se eliminaron letras redundantes como la Q, que debe ser reemplazada por K, la C, reemplazada por K o S según el caso, la V, reemplazada por B, la W, reemplazada por U, la X por KS, la Y por I, y la Z por S. Se conservaron letras como C y H solamente para formar los fonemas CH y SH. También se distinguen los dos sonidos de la R, fuerte y suave, y la G representa solamente su sonido característico, reemplazando el otro por J.
    En total se dispone de 21 fonemas, más 2 modos de acentuación para las vocales, y pausas de varias duraciones. El sintetizador recibe la información del usuario en ASCII, usando una codificación que puede variar entre 1 y 3 caracteres por sonido. El programa está diseñado para facilitar su uso desde un programa terminal, emitiendo sonido apenas recibe un comando válido, esto es, una secuencia de caracteres válida que represente un sonido. No se hace distinción de mayúsculas y minúsculas ya que se convierte internamente a mayúsculas, sin embargo el programa devuelve el carácter exacto que recibe, siempre que sea válido. Los caracteres válidos son: A E I O U B C D F G H J K L M N P R S T 0 1 2 + - _ , ; . También es válido el carácter espacio (ASCII 32 decimal, 20 hexadecimal). Los caracteres de retorno de carro y avance de línea se consideran válidos y se retornan sin cambios aunque no tienen ningún efecto en el sintetizador. Cualquier otro carácter distinto recibido se considera inválido y se devuelve como *.
    Nota: El programa devuelve cada caracter apenas recibido, sin importar su validez o si aún se está procesando caracteres anteriores, por lo cual el equipo controlador puede verificar rapidamente si hay problemas en la comunicación.

    Comandos permitidos

    Como dijimos, se considera un comando a una secuencia de caracteres ASCII que representa a un sonido, no necesariamente un fonema. Algunos fonemas agregan una pausa inicial para separarlos del sonido que los precede, si se está usando estos fonemas en el inicio de una palabra, donde probablemente ya tengamos una pausa previa entre palabras, se puede usar las versiones terminadas en 1, que eliminan esta pausa. Los caracteres + y – se utilizan para dar entonación a las sílabas por medio de las vocales, si se agrega un + luego de una vocal se obtiene un tono mayor como el que da un acento, mientras que agregando un – a continuación de la vocal se logra un tono menor como al finalizar una oración. Esto también puede utilizarse como efecto para lograr algunas tonadas regionales. A continuación sigue una tabla con los comandos disponibles.

    COMANDO FONEMA

    DESCRIPCION

    A A
    E E
    I I
    O O
    U U
    A+ Á vocal acentuada
    E+ É vocal acentuada
    I+ Í vocal acentuada
    O+ Ó vocal acentuada
    U+ Ú vocal acentuada
    A- a. ultima silaba de la frase
    E- e. ultima silaba de la frase
    I- i. ultima silaba de la frase
    O- o. ultima silaba de la frase
    U- u. ultima silaba de la frase
    B B
    CH CH
    CH1 CH inicio de palabra
    D D
    F F
    G G/GU lueGo/aGUila/Gato/GUitarra
    J J Juego/Gente
    K K
    K1 K inicio de palabra
    L L
    M M
    N N
    P P
    P1 P inicio de palabra
    R RR alaRRma/peRRo/RRoca/RRaiz
    R2 R caRa/aRena
    S S
    T T
    T1 T inicio de palabra
    SH SH LLamada/faLLa/aYer
    (Espacio) Pausa 50 mseg. (espacio normal entre palabras)
    _ Pausa 32 mseg. (pausa auxiliar entre fonemas)
    , Pausa 256 mseg.
    ; Pausa 400 mseg.
    . Pausa 1000 mseg.

    Ejemplo:

    Texto original: “Sintetizador de voz."
    Texto a enviar: “SINTETISADO+R DE BO-S “

    En este caso se reemplazan las Z por S, la V por B, se agrega el acento en la O de SINTETIZADOR, y se pronuncia la última sílaba de la frase con un tono menor. También se agrega un espacio al final para que suene la S, ya que el sintetizador queda a la espera del próximo caracter para saber si debe pronunciar S o se trata de los sonidos SH o SH1. Al enviar otro caracter válido, en este caso el espacio, automáticamente asume el sonido como S.
     

  • Actualizo el estado del proyecto, hace un par de semanas me llegaron los PIC16F648A, los que usaba en el desarrollo eran de una tanda de hace como 5 años y con esos funcionaba todo perfectamente. Ahora con estos micros nuevos me encuentro con que se resetean arbitrariamente, parecen funcionar bien si se les envia datos por RS232 cada tanto, pero cuando quedan en espera al rato se resetean, a veces deja de andar el sonido y emiten el eco de los caracteres por el puerto, otras directamente se cuelgan y no responden mas.
    En el programa habia dejado asignados unos pines como entrada para enviarle datos en paralelo desde un microprocesador, y si bien no se deberia dejar pines como entrada sin un valor definido, eso no daba problemas de ruido, sin embargo en esta nueva partida de micros parece que es un problema. Probe de colocar esos pines como salida en el programa y se redujeron bastante las fallas, pero aun siguen ocurriendo, aunque no ocurre en la placa que va conectada a la C64, lo que me hace suponer que los ruidos provienen de la conversion de voltajes que hace el MAX232, asi que me queda probar de colocar algun capacitor electrolitico grande en paralelo con los 5V, y capacitores a masa donde haga falta filtrar ruidos. Me extraña mucho que haya tanta diferencia electrica entre micros del mismo modelo.
    En cuanto al progreso del proyecto, estuve investigando la factibilidad de agregar la funcionalidad de chip de sonido, aunque sea monofonico, y el resultado fue que es posible emitir tonos con frecuencia programable desde 16Hz hasta 2000Hz, lo cual cubre las octavas 0 a 6, dejando la octava 7 afuera que es la maxima que puede emitir el SID6581.
    La frecuencia se enviaria al PIC como un numero de 16 bits, aunque los valores usados son solamente 18237, y la resolucion es de alrededor de 0.1Hz si no hice mal los calculos.
    Se utiliza una onda base y un algoritmo de escalado que ya desarrolle, al menos teoricamente, falta escribir el codigo, y adaptarlo a lo existente que es un poco mas complicado. Esta onda se almacena en el programa y contiene 255 muestras de 8 bits, por lo que podria ser cualquier forma basica (senoidal, triangular, diente de sierra, cuadrada) o algun instrumento digitalizado. Por la distorsion que puede haber en las frecuencias mas altas, ya que a 2000Hz la onda tendria 3.55 muestras por ciclo, es mejor aproximarse lo mas posible a una onda cuadrada, o alguna otra que mantenga su forma con semejante reduccion, pero lo mas probable es que sea una mezcla entre diente de sierra y triangular, con 3/4 de onda ascendente y 1/4 descendente.
    Lo que queda por resolver es algun hack para que se pueda integrar de manera transparente el sintetizador musical con el motor de sonido que esta orientado a secuenciar sonidos de una cantidad de repeticiones definida. Si se adaptara el sonido al motor, las frecuencias emitidas tendrian que tener una duracion fija, lo cual complicaria las cosas si se quiere emitir continuamente un sonido ya que habria un flujo de datos constante hacia el chip, y tambien complicaria hacer efectos variando la frecuencia ya que se tendria una duracion minima para cada frecuencia. Por esto lo adecuado es que el programa tenga sostenimiento automatico, es decir que el chip emitiria la frecuencia enviada hasta que se le ordene emitir otra o detener el sonido. Para hacer esto el programa deberia funcionar en tiempo real y no con el buffer que usa actualmente, ya que encontraria una frecuencia en el buffer y se quedaria emitiendola continuamente sin pasar al siguiente elemento de la lista. Por esto es que debe hacerse un hack para compatibilizar esos dos modos de funcionamiento de alguna manera y que siga sirviendo como sintetizador de voz o sonido.
    De todas maneras, una vez resuelto el tema del ruido voy a enviar los chips prometidos, y la parte de la emision de tonos quedara para la version alfa 3.
     

  • Bueno, parece que esta solucionado el problema de los ruidos, la placa tiene conectado un electrolitico de 220uF a la salida del 7805 asi que no le vi sentido agregarle otro en la alimentacion del PIC, pero si le agregue uno de 100nF entre los dos pines de alimentacion del micro, y se dejo de resetear erraticamente. Sin este capacitor hace cualquier cosa, algunos clicks cada tanto en la salida de audio, o se queda prendido algun led, o se resetea y envia el mensaje de inicio por el puerto serie, o se pierde el sonido al rato, o directamente no responde mas. Es la primera vez que tuve que poner un filtro asi en la alimentacion, nunca antes en 18 años tuve problemas de este tipo con un PIC, pero al menos ya se que no es un problema de soft, que me hubiera complicado bastante las cosas.
     

  • *** Prueba de sintetizador con PIC, mp3 adjunto ***

    Retomando este tema, capture la salida del PIC reproduciendo un texto que habia empezado a escribir en diciembre para armar un video de demostracion, como seguramente va a pasar un tiempo antes que lo complete, hice un mp3 de eso.
    Para refrescar como funciona esto, el PIC recibe texto por RS232 a 1200bps, y lo habla en tiempo real ni bien llegan comandos validos, lo cual no es muy apto para tipear en vivo pero si es interesante cuando se le envia un texto armado desde alguna computadora o microcontrolador. En este caso le envie el texto desde una notebook usando un programa terminal y envio de archivo ASCII, pero lo mismo podia funcionar si pegaba en el programa un texto cortado de otro lado.
    Adjunto el mp3 resultante, en una calidad horrible porque el audio dura 1 minuto 44 segundos y tenia que hacerlo caber en los 512K que se permite para los archivos adjuntos. El mp3 esta en 32KHz, 40Kbps, asi que el original suena mejor y sin ese eco que aparece, aunque la inteligibilidad es la misma, no se entiende mas uno que otro. El texto enviado esta un poco arreglado para que suene mas natural, agregando o quitando espacios segun como sonaba, esto es, que algunas palabras van pegadas a otras, y otras palabras van divididas en partes agregando pausas intermedias. La forma en que hablamos difiere bastante de como escribimos, la mayoria del tiempo no usamos espacios entre palabras, asi que para obtener resultados mas naturales hay que ir probando.
    Lo unico que no esta terminado del sintetizador es el sonido de la J, que no suena muy bien aunque se parece a como deberia sonar.
    El texto procesado es exactamente este:

    el proshe+kto te+kstoabo+s,seinisio+ ko+mou+na konber_sio+n delprogra+ma piksi+nt,desarosha+do pa+raun mikrokontrolado+r pik diesise+ise+fe se+isku-a-r2enta-i-ocho- a-.
    labo+s ke+esta+n eskucha+ndo,sejene+r2a konun pik,elkualresi+be elte+ksto en se+r2ie amildos_sie+ntos bits por se-gundo-.
    la prime+r2a konber_sio+n pa+r2akomputado+r2as deo+chobits,sei+so pa+r2a ko+modor sese+ntaikua+tro,emitie+ndo soni+do dijita+l dekua+trobits,asietemi+lochosie+ntos je+rts demu-e-streo-.
    ma+sta+rde sekonbirtio+ elprogra+ma a ko+digo dese+ta oche+nta,i serealisa+r2on ber_sio+nes par2a sinkle+ir s_pe+ktrum, ta+nto pa+r2a losmode+los dekuar2entaio+choka+,emitie+ndo soni+do por el parla+nte inte_gra+do;ko+mo pa+r2a losmode+los de sie+ntobeintio+choka+,emitie+ndo sonido atrabe+s del_chi+p,a  i grie+ga  tre+s,oche+ntainue+be-dose-.
    tambie+n seisie+r2on konber_sio+nes pa+r2a se+ta e+kis oche+ntaiu+no;ta+imeks sinkle+ir dosmi+lsese+ntaio+cho;ikomputado+r2as e+me_e+se_e+kis.
    enlasber_sio+nes pa+r2a se+ta e+kis oche+ntaiu+no,i s_pe+ktrum kuar2entaio+choka+;se simu+lael soni+dodekua+trobits,atrabe+sdeun algor2i+tmo demodula_sio+n dea+nchode- pul_so-.
    en e+stas ber_sio+nes pa+r2a komputado+r2as kon se+ta oche+nta,la frekue+n_sia de muestre+o es de nuebemi+lkinie+ntos jerts.

    Y en castellano seria:

    El proyecto Texto A Voz se inicio como una conversion del programa PICSynth, desarrollado para un microcontrolador PIC16F648A. La voz que estan escuchando se genera con un PIC, el cual recibe el texto en serie a 1200 bits por segundo.
    La primera conversion para computadoras de 8 bits se hizo para Commodore 64, emitiendo sonido digital de 4 bits, a 7800 Hz de muestreo.
    Mas tarde se convirtio el programa a codigo de Z80, y se realizaron versiones para Sinclair Spectrum, tanto para los modelos de 48K, emitiendo sonido por el parlante integrado, como para los modelos de 128K, emitiendo sonido a traves del chip AY-3-8912.
    Tambien se hicieron conversiones para ZX81, Timex Sinclair 2068, y computadoras MSX.
    En las versiones para ZX81 y Spectrum 48K, se simula el sonido de 4 bits a traves de un algoritmo de modulacion de ancho de pulso.
    En estas versiones para computadoras con Z80, la frecuencia de muestreo es de 9500 Hz.

    
    ]picsynth2012.zip[/file]
     

  • *** Prueba de canto en el PIC - mp3 adjunto ***

    Esto es solo una divagacion porque todavia faltan resolver muchas cosas antes de que una version cantante pueda salir, pero tenia curiosidad de saber como sonaria el algoritmo que usa la demo cantante del TAV64, aplicado al sintetizador con PIC.
    Para variar, use el himno otra vez como prueba. biglaugh.png
    Cabe aclarar que no esta para nada afinado, ya que use los mismos calculos de tono y duracion que los de la demo de C64, y ambos programas tienen tonos base totalmente distintos, ademas de distintas frecuencias de muestreo para la reproduccion de sonidos. Pero para saber como sonaria esta bien.
    Va adjunto un mp3 con la prueba.
    ]oidmortales1.zip[/file]
     

  • esta bueno para "Luc, yo soy tu padre"
    Muy bueno!
     

  • Excelente laburo el que estas haciendo Jorge.
    Felicitaciones.

    saludos
     

  • jaja no se me habia ocurrido lo de Darth Vader, lo voy a tener que probar.
    Estaba pensando que puedo probarlo en la DPC-200 usando el puerto de joystick como salida, ya que el chip es RS232 y no muchas MSX tienen ese puerto.
     

  • Bueno, retome el programa para darle forma mas definitiva, termine de arreglar el fonema J que habia intentado hacer en enero y no salio del todo bien, tenia un error que ya esta corregido, de paso tambien arregle el fonema SH que tenia el mismo error.
    Modifique el comando _ (espacio auxiliar dentro de una palabra) para que use apostrofe en su lugar, asi quedan los comandos unificados con las versiones de TAV. Actualice el numero de version a 1.0 alfa 3, y creo que asi va a salir por ahora.
    Pensaba agregar el codigo para que el chip pueda cantar, pero aunque no es complicado, como vengo ultimamente con los tiempos va a pasar un mes mas hasta que lo haga, asi que por ahora sale como esta para no retrasarlo mas. En la version cantante, se agregarian un par de comandos que deben ir entre parentesis, y que especificarian la nota musical a la que saldria la voz, y la duracion de los sonidos, o velocidad del habla si se quiere ver asi.
    Seria algo como (N12R0A), el comando N tiene dos digitos como parametros, el primero es el numero de octava, que puede ser 1, 2 o 3, aunque la 3 solo tiene una nota, el segundo parametro es el numero de semitono en hexadecimal, desde 0 hasta B, en este caso es 2, que corresponde a RE. La nota seria entonces D1 en el sistema norteamericano. El comando R indica la cantidad de repeticiones o ciclos de los sonidos, tambien en hexa, y normalmente es el valor 10 (0A), variando esto se cambia la velocidad a la que se habla. Esos comandos se van a poder poner en cualquier parte del texto, y afectan a todo lo que sigue, si se ajustan correctamente se puede hacer cantar al chip, pero tambien se pueden usar para cambiar el tono y velocidad de la voz, o aplicarlo en distintas partes del texto para lograr expresiones como exclamacion o interrogacion. Pero todo esto va a quedar para la proxima version, y tambien va a salir incluido en las diferentes versiones de TAV, o al menos en TAV64.
    Voy a ver si puedo hacerme tiempo para hacer algunas pruebas, para asegurarme que no dejo de andar nada con las modificaciones, y despues ya quedan listos los chips para enviar.
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal