• Hace unos años se me ocurrio hacer un sintetizador de voz en un PIC, empece generando tonos telefonicos (DTMF) en un PIC16F628 con oscilador de 4MHz, porque queria que el programa usara pocos recursos, tanto de memoria como de proceso, y lo logre, emitia tonos mejor que los telefonos. Luego me dedique a capturar y analizar la voz para reducirla a lo minimo, y termine logrando casi todos los sonidos, reproduciendo algunos digitalizados y generando en tiempo real otros, ya sea combinando varios sonidos digitalizados (como mezcla o sucesion), combinando digitalizados con ruido generado por programa, o haciendolos completamente por programa.
    Despues de algunos años de experiencia en esos experimentos (con algunas pausas en el medio) y cuando iba a rehacer el motor de sintesis para una version 2 en los PIC16 y una version completamente nueva para PIC18, se me ocurrio que seria interesante saber si esa experiencia se podia aplicar a una maquina de 8 bits. Despues de 3 o 4 dias en los que tuve que aprender de nuevo a programar en 6502 y a manejar el SID, termine de hacer una pequeña demostracion de que se puede lograr resultados interesantes. El SID hace gran parte del trabajo con el ADSR, aunque tambien me limita un poco la modulacion, ya que esta justo en los tiempos minimos que necesito, y por otro lado tengo que usar onda triangular que es lo mas parecido a la senoidal. Tuve que hacer simulaciones usando mi programa de audio favorito (GoldWave) y vi que era factible hacer algo con el SID, por lo que procedi a hacer pruebas de sonido en BASIC para de paso ponerme al tanto de las posibilidades del SID. La idea original no era hacer algo en BASIC, sino probar parametros para luego implementarlo en ensamblador, pero los resultados me sorprendieron y decidi ver hasta donde el BASIC era capaz de hacer el trabajo, asi que termine en este programa que adjunto. No tiene la gran calidad ni un amplio vocabulario biglaugh.png pero sirve como demostracion de que algo se puede hacer con BASIC puro.
    Tambien hice una version en codigo maquina que suena mejor, aunque basada en las simplificaciones que hice para la version BASIC, solo que a los tiempos correctos (el BASIC se tarda un poco mas del doble de lo necesario en reaccionar), asi que no es lo mejor que se puede hacer en CM, queda espacio para mejoras.

    ]basic_synth.prg[/file]
     

  • Pensaba abandonar las pruebas en BASIC de C64 para pasar directamente al codigo maquina, pero resulto que pude agregar fonemas basados en ruido, como la S y la T, todo esto a pesar de las limitaciones en cuanto a modulacion. En los sonidos con ruido la modulacion de amplitud es fundamental, algo que casi no puedo hacer desde BASIC, y sin embargo la calidad de esos sonidos salio muy buena. Tambien agregue el sonido de la N y un pobre intento de D, asi que en algun momento hago alguna actualizacion. No creo que llegue a terminar todos los sonidos ya que implica un trabajo enorme y demasiada imaginacion para reemplazar ondas con otras que a simple vista no se parecen en nada, pero si se completara, hasta se puede usar como subrutinas y armar las frases que uno quiera. Voy a ver si armo otra version un poco mas completa y creo que lo voy a dejar ahi, al menos en la version BASIC, despues cuando tenga tiempo optimizare la version en ensamblador, y me voy a sacar la duda de si el PSG de las MSX esta a la altura del desafio.
    Por si alguno no se dio cuenta en el mensaje anterior, el archivo adjunto es un programa BASIC de C64, para probarlo basta con descargarlo y arrastrarlo a la ventana del emulador WinVICE, o abrirlo con algun otro.
     

  • Hola Jorge!
    Monumental trabajo. Realmente un laburo enorme, que no muchos se han animado a encarar.
    Felicitaciones!
     

  • Pudiste probarlo? Esa version es muy simple porque solo tenia las vocales y la L, como que no me daba mucho margen para decir algo. biglaugh.png
    Lo que me esta volviendo loco es pensar de antemano las modificaciones que voy a hacer porque no tengo renumerador de lineas y estoy escribiendo el programa como si estuviera en la C64. No puedo copiar y pegar, tengo que andar viendo cuantas lineas voy a usar en cada sonido, renumerar a mano linea por linea y "copiar" codigo poniendole numeros de linea nuevos a codigo existente (como para tener un clon con otra numeracion) para despues modificarlo. Tambien perdi una variable que es la modulacion cambiando el volumen, porque por la poca velocidad del BASIC me veo obligado a saltar varios niveles de golpe y eso genera un ruido bastante molesto, por lo que tuve que optar por usar siempre el volumen maximo. Tengo que eliminar instrucciones innecesarias y REMs porque todo suma milisegundos que modifican el sonido, aunque asi como esta suena bien.
     

  • No, no tengo con que...Está todo embalado mad
     

  • Con un emulador de C64. wink.png
    Adjunto una captura del audio generada desde el WinVICE para que tengas una idea de como sale, si cargas el sonido en un editor vas a ver los espacios en el medio de cada sonido, eso es el retraso de 2 o 3 lineas BASIC entre que detiene un sonido y dispara el nuevo.
    Como sugiere el nombre del archivo, lo que dice el programa es "SILENCIO", era una prueba para combinar la S al principio y en el medio de una palabra.
    Asi sin ver el programa corriendo pierde la gracia, porque no se ve el "truco Jedi" que hace parecer al sintetizador mejor de lo que es, y que consiste en ir viendo escribirse el texto a medida que se habla. Es una ventaja que otros sintetizadores no tienen porque desactivan la pantalla, pero hay que valerse de todo lo que se pueda en condiciones tan desiguales. biglaugh.png

    ]synth64_ntsc_silencio.zip[/file]
     

  • Buenisimo!!!!!!
    Hay un grupo de yohoo de aficionados a la robótica que si llegan a oir eso, te secuestra!!! ja ja ja!

    ¿Lo que hiciste con PIC se oye asi de bien?
     

  • El PIC usa una mezcla de PCM, sonidos hechos por programa (como el ruido), mezcla de ambos (un mixer por soft), y secuenciacion de varios sonidos para no llenar la memoria de tablas de ondas. En el BASIC C64 tuve que programar el ADSR con un valor fijo y generar los sonidos con dos tonos en dos canales, en uno creo que use 3, en otros solo 1. A veces hay que tocar lo mismo en dos canales para lograr el doble de volumen de forma rudimentaria, tambien hay un sonido que mezcla ruido con onda triangular, pero basicamente casi todo es onda triangular. Asi que el metodo difiere radicalmente con respecto al PIC, hay muchas cosas que el SID no puede hacer, pero tiene la ventaja de que los osciladores funcionan solos mientras que en el PIC hasta una onda simple requiere proceso. Despues busco algun mp3 para que lo escuches. Pero la calidad es muy superior, lo malo es que a veces eso jode, porque hay que entender muy bien la naturaleza de cada sonido, la mayoria los entiendo por eso pude generarlos en un sistema tan distinto imitando los wavs que tengo de referencia, pero de otros todavia me falta aprender mucho, y si entendes mal como se genera un sonido, la mayor calidad te juega en contra. Es como ser de madera para dibujar y ponerte a hacer algo en el Paint a 5000x5000 pixels, se va a notar mas que no servis que si lo hicieras en 100x100 pixels. biglaugh.png
     

  • Bueno, aca esta la version MSX-BASIC, no tenia ganas de agregar muchos sonidos porque la verdad si bien hay algunas ventajas con ese chip de sonido, el que genere ondas cuadradas de base arruina todo el efecto, se escucha como distorsionado. Es una lastima porque con las envolventes y una temporizacion mas precisa se podria haber hecho bastante, si tan solo tuviera onda senoidal o al menos triangular. Esto no deja mas remedio que programar en codigo maquina y hacer los sonidos llevando el chip al limite para hacer algo decente, cosa que no voy a hacer. Hubiera sido interesante portarlo a una Spectrum, pero deberia sonar igual.
    Adjunto el DSK con el programa SYNTHMSX.BAS, copie una imagen booteable que tenia por ahi y le borre todo lo que no servia, porque no tengo ninguna imagen del MSX-DOS para trabajar con el BlueMSX. Y por cierto, que emulador pesado, los experimentos los hice parcialmente en mi vieja notebook Pentium 2 de 266MHz con 128MB de RAM y un XP optimizado, ahi el WinVICE emula perfectamente la C64 con disketera. Mientras hago eso puedo escuchar mp3s con el Winamp 2.91 en modo clasico, programa liviano si los hay (para que quiero lucecitas de colores si solo quiero escuchar musica), y mientras que el WinVICE va perfecto, al BlueMSX lo tuve que configurar para saltearse 5 cuadros y tuve que apagar la diminuta visualizacion del Winamp donde muestra el espectro de frecuencias, porque sino se trababa la musica.
    Si alguien lo prueba en una maquina real que avise, yo tengo una DPC-200 a mano pero no asi la disketera, que esta archivada bajo otras cajas por falta de espacio para armarla. En el emulador no suena muy bien, y tampoco suena igual siempre. Si quieren armar otras palabras tienen que copiar los sonidos que ocupan 3 o 4 lineas de programa cada uno, aunque hay pocos sonidos hechos, que vendrian a ser: AEIOULNST, el listado no esta muy ordenado porque las primeras partes las tuve que tipear tres veces. La segunda por perder todo no me acuerdo por que razon, y la tercera por presionar F12 pensando que podia ser STOP. biglaugh.png
    Menos mal que solo tuve que rehacer unos pocos calculos, que no habia anotado (a diferencia de la version C64) porque ya estaba cansado de tanto orden.

    ]synthmsx.zip[/file]
     

  • Desembala esa 64 de una vez, se te va a terminar la garantia antes de que la pruebes... amazed.png

    No, no tengo con que...Está todo embalado mad

    Ariel Palazzesi
     

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