• ¡Muy bueno! Le voy a dar una mirada y cuando tengas necesidad de un "beta tester" teneme en cuenta.....que lo incluyo en algún aparatejo para jugar un rato!

    Y es asi...a veces esos "detalles" -sobre todo los relacionados con la interfaz- llevan más tiempo que la aplicación en si misma. mad
     

  • Si, es frustrante querer terminar algo y no tener la interfaz para manejarlo, al motor de sintesis le falta casi nada para que este listo, pero como me canse de grabar chips para probar combinaciones de sonidos decidi encarar la interfaz, pensando que salia rapido. Pero como no quiero atrasar aun mas las pruebas una vez que tenga la interfaz serie, los distribuyo como alfa, y cuando termine el par de sonidos que falta sera la beta. Desde ya que estas en la lista para alfa y beta, o en terminologia Microsoft, version final y service pack 1 respectivamente. biglaugh.pngbiglaugh.png
     

  • Ok!

    (Me voy preparando para los pantallazos azules! smile )
     

  • Bueno, la primera simulacion de sonido del motor digital fue frustrante, intente con RETRO y los sonidos que en el sintetizador actual suenan claros, como la R y la T, como sonido almacenado suenan debiles e incluso irreconocibles, pero por otro lado las vocales mejoraron drasticamente y le dan un sonido mas natural.
    En resumen, el asunto requiere su trabajo, ya sabia de entrada que obligar al sonido capturado a ajustarse a parametros arbitrarios iba a ser complicado, pero a pesar de todo se ve prometedor para el futuro. Sin embargo, dado que mas o menos el 90% del trabajo esta en captura y edicion de audio, es un proyecto que dificilmente pase de un prototipo interno, ya que siendo que el audio entraria en menos de 16Kbytes, seria relativamente facil capturarlo e implementar un sintetizador con cualquier memoria barata y un PIC cualquiera. Con el proyecto actual se podria intentar lo mismo, pero dificilmente con los pocos recursos que usa este programa, o sin una memoria externa.
     

  • Rebobinando un poco hacia las pruebas que hice de sintesis de voz en BASIC en la C64, encontre unos graficos de como empece generando los sonidos, por si alguno quiere experimentar, aunque les advierto que se necesita cierto grado de demencia para intentarlo. biglaugh.png
    No hice los graficos de todos los sonidos pero empece con la letra A, y sirve bien de ejemplo para tener una idea de la sintesis aditiva, esto es generar una onda compleja sumando ondas simples.
    Lo primero que hice fue tomar el sonido minimo de la A, que se ve en este grafico, esto se repite entre 20 y 30 veces y suena como A.


    1307428737 75 FT55224 A2

    En el grafico se ve la onda original en verde, y unos puntos y lineas que dibuje a mano encima de la imagen. Mi idea era aproximar esa onda compleja utilizando dos canales de la C64 como norma, si se necesitaba un sonido mas elaborado iba a recurrir a un tercer canal para agregar mas detalle.
    Tenia entonces que determinar cuales eran las frecuencias a colocar en cada canal del SID para que mezclando las ondas se pareciera a lo que pretendia. Para encontrar las frecuencias use la medicion de tiempo del GoldWave, algo no demasiado preciso porque mide en milisegundos, pero aceptable para esto que era un simple experimento.
    Sabia el tiempo exacto del sonido de la imagen, asi que si lograba aproximar a ojo dos ondas repetitivas, multiplicando esas repeticiones por la frecuencia del sonido podria obtener las frecuencias a colocar en los canales del SID.
    Como se puede ver en la imagen, la frecuencia esta expresada indirectamente por el nombre, A#2, esto es que el sonido esta calibrado para la frecuencia de la nota A# (LA sostenido) de la segunda octava, que segun la tabla son 116.54 Hz. Si no se tiene un sonido fuente como ese, hay que medir la duracion de la captura y segun eso calcular la frecuencia.
    A esta onda le vi similitud con algunos tonos telefonicos, por lo cual parecia factible que con 2 tonos pudiera aproximarla. Cuando se mezclan dos ondas simples, una va a tener una frecuencia mayor que la otra (salvo que sean de la misma frecuencia, logicamente). La onda de frecuencia mayor es la que se ve mas facilmente, ya que serian las subidas y bajadas visibles a simple vista, aunque hay que estar acostumbrado a verlas. En este caso son 11 ciclos, asi que la frecuencia alta que iria a un canal del SID tiene una frecuencia aproximada de 116.54 Hz x 11 = 1281.94 Hz
    La frecuencia mas baja es un poco mas dificil de ver, pero se manifiesta en la onda como una especie de olas donde va montada la onda de alta frecuencia. Para aproximar a ojo la frecuencia de esa onda, y sabiendo en este caso que la de alta frecuencia se repite 11 veces, procedemos a seguir estos 11 ciclos marcando mas o menos donde iria el medio de los flancos de subida y bajada. Es algo asi como dibujar un horizonte que esta modificado por una ondulacion que queremos determinar. Cuando tenemos los medios marcados, los unimos y obtenemos una onda que antes era invisible, que seria la onda restante para el otro canal del SID. Para obtener la frecuencia hay que usar un poco de imaginacion, ya que es una aproximacion, pero hay que tener en cuenta que los ciclos tienen que ser de la misma duracion. Mirando la onda se puede apreciar que hay picos cada 2.5 cuadriculas, cada 2, cada 3, asi que siguiendo este patron se ven 6 picos, pero la distancia entre el ultimo y el primero (dando la vuelta, recordar que el sonido se repite) parece ser de alrededor de 5 cuadriculas, por lo que podemos asumir que hay un pico mas que no se nota porque justo se aplanan las ondas. Como es una aproximacion, tomar 7 repeticiones sirve, y entonces la frecuencia de esta segunda onda de baja frecuencia seria de 116.54 Hz x 7 = 815.78 Hz
     

  • Ahora ya tenemos que la onda se puede aproximar mezclando una onda senoidal de 1281.94 Hz con otra onda senoidal de 815.78 Hz, y si bien con esto logramos una aproximacion en frecuencia, aun falta refinar un poco la forma.
    Si miramos la onda de la imagen anterior, se nota que empieza con muy bajo volumen, casi cero, y termina igual, pero va como subiendo de volumen hasta alrededor de 1/3 del sonido, y luego baja continuamente en los otros 2/3.
    Esta modulacion en volumen se hace en el SID a traves del control de ADSR, por lo cual tuve que mirar las hojas de datos y simular en GoldWave unos parametros de ADSR que sean validos para lo que el SID permite y se aproximen a la forma de volumen que veo en la onda, nuevamente "a ojo".
    La modulacion quedo mas o menos asi:



    Esta envolvente lo que hace es aumentar el volumen (attack) de las dos ondas ya calculadas hasta llegar al tope, luego bajaria ligeramente (decay) hasta nivelarse como al 80% de volumen (sustain), se mantendria ahi brevemente y luego comenzaria a caer hasta cero (release).
    Con esos parametros de envolvente, mas las dos frecuencias de las ondas calculadas, ya se puede generar un sonido completamente sintetico que se aproxime al original. Pero dado que el SID no dispone de onda senoidal, tenemos que usar la mas aproximada que es la triangular.
    No tengo capturas de los pasos intermedios, pero simulando eso en GoldWave quedaria algo asi, usando las dos ondas triangulares mezcladas y luego aplicando la envolvente:

    1307431873 75 FT55224 A2 Triangle

    En esta captura puede verse abajo la onda original, y arriba la onda simulada tal como la generaria el SID con los calculos aproximados que vimos, se puede notar que es una buena aproximacion a la forma y volumen.
    Eso si revisan el programa BASIC de principios de este tema, es lo que basicamente hace el codigo, pokear los dos canales con las frecuencias y usar un bucle que dispara y desactiva el ADSR para generar la envolvente.
    Aunque el BASIC no logra llegar a tiempo para tener los 116.54 Hz de la onda compuesta, se aproxima lo suficiente para que se distinga el fonema A. Lo que cambia en este caso es que el tono ya no esta en esa nota sino un poco desafinado hacia los graves.
     

  • Para terminar, aca van los wavs de lo que deberia generar el SID, y que de hecho genera en la version assembler (A#2_1281.94_815.78_Triangle_ADSR_x20.wav), y lo que genera la version BASIC (FonemaA_BASICPAL_SID4.wav), donde la lentitud juega en contra ya que hay que completar el ciclo en 8.6 milisegundos (1/116.54 Hz) pero el BASIC lo completa en 25, un poquito desafinado biglaugh.png
    En este sentido la MSX tiene ventaja con respecto a la envolvente, ya que aunque es menos flexible en terminos de forma, se puede repetir de forma automatica, cosa que el SID no puede hacer ya que requiere disparar el ciclo ADS de forma manual y luego el R tambien de forma manual. La desventaja de la MSX, sin embargo, es que solo emite ondas cuadradas, lo que reduce notablemente la calidad del sonido, para este tipo de experimento, claro esta.

    ]a2_1281.94_815.78_triangle_adsr_x20.zip[/file]
    ]fonemaa_basicpal_sid4.zip[/file]
     

  • Breve actualizacion del proyecto con PIC16F648A, despues de pelear durante varios dias con la comunicacion RS232 descubri algunos errores que afectaban a la recepcion que fueron corregidos, pero despues por alguna razon no recibia a la velocidad suficiente, se tardaba algo de medio segundo en recibir un caracter, durante el cual no recibia otros, por lo que perdia datos y no se podia tipear a una velocidad normal en la terminal. Resulto que por la similitud de nombres de variables (registros) le erre en 2 caracteres y hacia cualquier cosa. La comunicacion serie esta integrada en la misma interrupcion del sonido asi que todo funciona "simultaneamente", recepcion, transmision y reproduccion del sonido, ademas del codigo que se haya puesto en el programa principal.
    La rutina de transmision tiene un buffer de 3 caracteres que no deberia ser necesario y probablemente se elimine, ya que decidi hacer eco instantaneo de lo recibido y por lo tanto solo habria a lo sumo un caracter en el buffer. Puede tener utilidad futura si agrego comandos donde el chip responda con mas caracteres de los que recibe, por ejemplo si pusiera un comando /V donde el chip responda "VERSION 0.1".
    El problema ahora es que por alguna otra extraña razon es posible exceder el buffer, perdiendo caracteres, esto es imposible de hacer tipeando, ya lo probe, tocando teclas lo mas rapido posible nunca pasa de 1 o 2 caracteres, y llegar a 2 es realmente dificil. Esto lo monitoreo desde la interrupcion con 3 leds conectados que muestran estilo vumetro digital la cantidad de caracteres en el buffer de transmision.
    La conclusion es que la rutina de transmision esta perdiendo tiempo entre caracteres, ya que todo lo que se envia llega sin errores a la terminal, lo que descarta un problema de temporizacion excesiva en algun bit de datos o el bit de start. Lo mas seguro es que el problema este emitiendo el bit de stop, o algun otro error que se me paso. De todas maneras todavia no me puse a revisarlo, recien pude hacer que la recepcion funcione correctamente. En cuanto funcione como corresponde tal vez haga un video aunque sea para que se vea como recibe, transmite y reproduce voz simultaneamente.
    Aun queda implementar la rutina de validacion de caracteres, que hace eco de los validos y envia asterisco por cada uno no valido, luego agregar una tabla de conversion ASCII a numero interno de fonema, y por ultimo enlazar eso con la lista de reproduccion del sintetizador.
     

  • Ultimo momento! (aca iria una placa roja con letras blancas biglaugh.png )
    Efectivamente habia un error en el bit de stop, me olvide de inicializar el contador de interrupciones a 23, asi que ya que cuento decrementando ese registro, estaba esperando 256 ciclos, un bit de stop un poco largo.
    Ya probe enviandole directamente un archivo ASCII desde el programa terminal, algo pesado para que tenga, un acuerdo de licencia de Microsoft, y "se hizo eco del mismo" sin un solo error.
    Me habia olvidado de lo lento que es 300 bps, el programa terminal decia que estaba enviando 27 caracteres por segundo, asi que el PIC no pudo terminar de leer el acuerdo de licencia (ya actua igual que los usuarios).
    Ahora puedo proceder a las etapas mas interesantes del proyecto. shades.png
     

  • Increiblemente, parece que tengo lista la siguiente generacion del sintetizador antes de terminar la actual, ya tengo la totalidad de los sonidos del sintetizador con voz digitalizada, en 44KHz y 16 bits, asi que se puede portar a cualquier calidad.
    Al principio costo un poco encontrarle la vuelta a la edicion, pero despues fueron saliendo mucho mas facil los siguientes fonemas, me base en el sintetizador actual, capture los fonemas completos, algo que antes no utilizaba porque necesitaba las minimas partes que se pudieran repetir. Es bastante complicado tener un fonema separado del resto de la palabra, y necesariamente debe estar en una palabra para sonar natural, asi que ante la complejidad del tema, me limite a imitar lo que genera el sintetizador actual, cortando y pegando partes de voz natural, ajustandola a los parametros del sonido sintetizado. El resultado es voz natural con volumen maximizado, con el tono y la duracion corregidos, pero conservando las pequeñas variaciones entre ciclos que es lo que hace al sonido natural.
    En resumen, hice un vocoder manual, o para el que no conozca el termino, le aplique un proceso como el que hace el soft que "afina" la voz de los cantantes, solo que a ojo. biglaugh.png
    Las pruebas las hice para 7KHz, la frecuencia de muestreo del sintetizador actual, pero resulto que sonaba con un tono demasiado grave, algo que en el otro sintetizador se compensa por las armonicas generadas por el sonido mas robotico. Ahora al tener buen sonido se nota demasiado bajo, por lo que me puse a probar distintos tonos y frecuencias de muestreo, y me termine convenciendo de que tengo que optar por algo cercano a 8KHz o algo cercano a 16KHz. Tambien me di cuenta que se puede mejorar bastante el sintetizador actual pasando al doble de frecuencia de muestreo y aumentando las repeticiones de los sonidos, pasa a ser una voz mas robotica pero muy entendible.
    En el camino tambien pude descubrir como generar bien algunos sonidos del sintetizador actual que no estaban del todo bien, asi que hubo bastante ganancia con esta rama de la investigacion.
    Para la nueva generacion de sintetizador digitalizado, el resultado es que el conjunto completo de sonidos ocupa 1,338 segundos de audio, para una calidad cercana a 16KHz en 8 bits de resolucion se necesitan 18874 bytes, esto es el 57,6% de la memoria de un PIC18F2520 (que tiene 32K bytes, 16K words), y aun sobraria un 84,8% de la memoria de un PIC16F877A (de 8K en palabras de 14 bits).
    Quedaria hacer un rejunte de codigo ya hecho, y un nuevo codigo para lectura de tablas de valores desde la memoria de programa, y saldria andando un prototipo. No termine todavia la conversion de ASCII a fonemas, asi que se tendria que usar por RS232 en modo binario, esto es por ejemplo enviar un 0 para una A, un 1 para una B, etc., en vez de enviar simplemente el texto en ASCII.
     

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