• Estuve un par de dias peleando contra el SID, y medio que terminamos empatados, pude lograr algunos fonemas del sintetizador de voz con PIC en el SID, aunque no sin antes encontrarme con un monton de inconvenientes. El tema del ADSR es lo que mas me complico la vida, porque los sonidos estan ajustados a un ciclo de aproximadamente 9 milisegundos, lo cual para el ADSR del SID es un tiempo muy justo. El tiempo minimo de ataque son 2 ms, luego sigue el decaimiento que tiene minimo 6 ms, esos tiempos no los podemos achicar, lo intente, pero al disparar el ciclo de relajacion antes de esos 8ms minimos, el resultado es impredecible. A veces funciona, y otras se anula el ADSR por un tiempo y afecta a los sonidos posteriores, que se reproducen a bajo volumen o con volumen fijo.
    En resumen, hay que usar el ADSR como viene, sin demasiadas vueltas, por lo general use 2ms de ataque, 6ms de decaimiento, con sostenimiento 0, es decir que queda anulado practicamente y el decaimiento cae directamente a 0, siendo el disparo del ciclo de relajacion un tramite para quedar preparado para el proximo sonido. Esta limitacion me obligo a prescindir del ADSR para crear ondas complejas, o de regular el volumen del canal sin tocar el volumen general interrumpiendo los ciclos antes. Solo en el caso de sonidos largos como la S o la K se pudo hacer uso del ADSR para modelar las ondas.
    Otro tema importante es que entendi la diferencia entre el 6581 y el 8580, ya que la tuve que sufrir, el 6581 tiene un problema con las componentes de continua de las ondas, que afecta en particular cuando se cambia de volumen. Ya que tenia sonidos que estaban compuestos de diferentes ondas en secuencia a distinto volumen, el 6581 hacia un click entre cada parte, cada vez que se ajustaba el volumen, mientras que el 8580 no lo hacia. Mirando bien las ondas me di cuenta que el error es igual al que tuve en mi primer sintetizador con PIC, que al reducir el volumen no compensaba el offset y por lo tanto las ondas quedaban mas cercanas a 0, es decir no quedaban centradas a mitad de tension. Esto hacia que al bajar de volumen se generara un flanco descendente abrupto que era audible, y lo mismo pasaba cuando se subia el volumen, pero con un flanco ascendente. En el 8580 las ondas aparecen perfectamente centradas a media tension. La solucion fue aplicar un filtro pasa altos en el SID a todos los canales, de forma que deje pasar todo por encima de 100Hz, con lo cual el sonido del 6581 quedo casi identico al del 8580, pero igualmente el 8580 tiene el sonido mas limpio.
    No hice todos los sonidos porque solo queria hacer una frase de prueba, mas adelante por ahi termine los que faltan, pero ya bastante peleado fue lograr este resultado. Queria hacer el codigo simple, facil de modificar y sin muchos requerimientos de proceso, de forma que el SID haga la mayoria del trabajo, tengo una rutina que temporiza unidades de 500us, aunque en la practica nunca uso menos de 1ms, y no deberia ser complicado adaptar las rutinas a un programa con interrupciones.
    Creo que se podria lograr un mejor sonido, pero es una base desde donde partir, esta hecho pensando en utilizar la menor cantidad de recursos, las ondas son muy cercanas a las del sintetizador con PIC, pero les falta detalle y por lo tanto no son tan entendibles.
    Dejo el .prg para que lo prueben, si lo cargan en un emulador pueden escuchar la diferencia entre el 6581 y el 8580, que gracias al filtro es muy poca pero existe.
    Tal como sugiere el nombre del archivo, hay que cargarlo con ,8,1 y ejecutarlo con SYS 49152.
    ]synth64_49152.prg[/file]
     

  • Va la captura del sonido desde el WinVICE 2.3, en 6581 y en 8580, para el que no quiere o no puede probarlo en un emulador o maquina real.
    Lo que dice es "SALUDOS, COMUNIDAD DE RETROCOMPUTACION"
    El .prg lo va a escribiendo en pantalla a medida que lo dice.
    ]synth64mp3.zip[/file]
     

  • Va una version mejorada, esta vez se usa el bit TEST del SID en las dos voces utilizadas, para el que no sepa de que se trata, este bit se utiliza para resetear la onda de cada canal, de forma que comience cuando se coloca el bit a 0. Cuando defini algunos sonidos lo hice asumiendo que las ondas empezaban a correr cuando disparaba el sonido, sabiendo que esto no era asi, ya que los osciladores corren continuamente, pero ese hecho le agregaba un poco de azar al sonido. Sin embargo, tambien eso podia provocar que las ondas de los dos canales se anularan entre si, por lo cual decidi sincronizarlos para tener una onda mas predecible, y mejoro notablemente aunque el sonido perdio un poco de fuerza, es decir, suena demasiado limpio, mas sintetico.
    Para compensar esto, se me ocurrio activar la resonancia del filtro pasa altos, que habia puesto en nivel 0, poniendola ahora al maximo (15), y el sonido recupero fuerza, tiene mas volumen y mas agudos, ya que la resonancia aumenta el poder del filtro por decirlo de un modo simple. El resultado en las ondas es que se recuperan un poco las triangulares, que salian un poco suavizadas antes, si tuviera un monton de canales de sonido este efecto no seria deseable, pero ya que solo trabajo con dos canales, lo abrupto de las ondas me sirve para que cada canal se note mas.
    Adjunto un zip con dos .prg, son el mismo programa pero la version "low" tiene un tono de voz mas bajo, tambien habla mas lento pero eso se puede ajustar despues para que conserve el tono bajo pero hable a la misma velocidad que la version normal. En el zip tambien estan incluidas las capturas en mp3 de las dos versiones.
    Despues voy a tener que decidir si queda el tono normal o lo hago mas bajo, no se que voz sera mejor.
    Recuerden que hay que cargarlo con ,8,1 y ejecutarlo con SYS 49152, en esta version el mismo programa borra la pantalla y deja escrito ese comando para volver ejecutarlo con solo presionar RETURN.

    ]synth64a.zip[/file]
     

  • Es increible lo que haces Jorge... solo me limito a leer con la mandibula golpeando el teclado. suprised.png
     

  • Yo lo que me golpee contra el teclado fue la cabeza cuando el SID hacia lo que queria. biglaugh.png
    Me sorprende que haya salido tan cercano al original con todas las limitaciones que tengo para generar sonido en la C64, claro que si hiciera un programa que desactivara la pantalla y usara todos los trucos disponibles podria incluso emitir el sonido digitalizado, pero esa no es la idea, sino hacer algo liviano y adaptable.
    Me faltan unos pocos sonidos, ya casi tengo la G y J, quedaria hacer la F que no deberia ser tan complicada, la B que es mas complicada, y las CH y SH que no me salen muy bien porque todavia no las termino de entender del todo.
    Encima si supiera algo de musica podria hasta tocar una melodia de fondo porque me sobra un canal. shades.pngbiglaugh.png
    Todo esto me llevo poco tiempo pero porque tengo de donde partir, con un sintetizador ya hecho y los sonidos independientes ya aislados, asi que me limite a imitar esos sonidos con ondas triangulares y ruido, cosa que tampoco es muy facil pero seria peor si tuviera que empezar de cero. Tambien y a pesar de que tuve que leer y probar bastantes cosas, no hubiera salido tan rapido sin la ayuda de the_woz que me despejo algunas dudas acerca del SID y me permitio concentrarme mas en el programa que en leer manuales.
    Mas adelante tendria que releer un poco la documentacion de MSX, en particular los rangos de frecuencia de los osciladores y generadores de envolvente, para saber si es posible obtener el mismo resultado que con el SID. Todo depende de las envolventes, no se si estan en el rango que necesito, si es asi se puede inventar ondas triangulares (el chip solo tiene cuadradas) y lograr algo parecido. Pero tener que programar en Z80 no me atrae demasiado (por ahora).
    Y a todo esto, pudiste probar alguno de los .prg? Tenes C64?
     

  • Bueno, aca van un par de pruebas mas, es la conclusion de algo que habia probado sin exito hace meses cuando intente el sintetizador en BASIC y assembler, pero que no resulto como esperaba. Sin embargo, esa vez descubri cual fue el error, asi que ahora lo aplique a este programa. La prueba se trataba de hacer cantar al sintetizador, y esta vez lo pude hacer exitosamente, aunque fue otro trabajo demencial ya que de musica se poco y nada.
    Antes de hacer semejante trabajo tenia que decidir que cantar, y dado que no queria tener problemas con derechos de autor y tenia que ser algun tema en castellano, me decidi por el himno nacional, que con seguridad (creo) es de dominio publico. biglaugh.pngbiglaugh.png
    No pretendia hacer un tema entero, asi que solo use las dos primeras lineas de la letra, y ya que me sobraba un canal de sonido quise probar de poner la melodia de fondo como acompañamiento. Sin embargo, como el programa emite algunos sonidos a distinto volumen, la musica de fondo suena muy rara, por lo que opte por hacer dos versiones. La primera version utiliza el volumen como corresponde solo para el sintetizador de voz, sin musica de fondo, y la segunda toca la musica en el canal 3, pero reproduciendo todos los sonidos del sintetizador a maximo volumen, lo cual genera algun problema con la sintesis, en particular con la S que se nota demasiado. Es el precio a pagar para tener musica en el otro canal.
    Para hacer esto tuve que buscar la partitura oficial del himno, aprender a leer las notas, buscar las frecuencias, traducir eso a intervalos de 500 microsegundos para usar la rutina de temporizacion existente, y modificar los sonidos para que acepten un rango de tonos mas amplio (solo aceptaban 3 tonos, normal, acento y fin de oracion).
    Como ya era demasiado sacar las notas, desisti de aprender tiempos musicales y busque ringtones monofonicos, los cuales pase a wav para medir la duracion de las notas, luego compare con los tiempos del sintetizador en velocidad normal y agregue repeticiones a los sonidos para ampliar la duracion de acuerdo a cada nota. Tuve que bajar una octava a lo que estaba en la partitura, ya que el ADSR del SID no me permite pasar de la octava 2 y la parte de canto del himno esta para la octava 3. El acompañamiento lo hice con las mismas notas pero en la octava 3 original.
    Otra cosa que tiene esta version del programa son los sonidos B, CH (no usado en este caso) y G (como en Gato o Guitarra), quedarian pendientes la F, J y SH.

    ]synth64musical.zip[/file]
     

  • Muy bueno !!! Se escucha mucho mejor que el demo anterior, igual el efecto "WOPR" (que el texto aparezca mientras habla) ayuda tambien a que "se escuche" mejor. Para cuando el verdadero SAYIT en castellano jajaja ???
     

  • Si, es cierto, lo de ver el texto ayuda un monton, si se escucha el sonido solo no se entiende del todo bien, pero la idea es que sea liviano y se pueda usar en programas BASIC, por eso el requerimiento de que sea simple y mantenga la pantalla activada. Seria como un extra para los programas lo de la voz, como para complementar lo que se ve en pantalla. Por ahora esta dentro de los 4K el programa, y ando viendo como hacer la interfaz para que se pueda usar desde un programa, parece haber consenso en que una orden SAY seria mejor, pero hay que ver que tan complicado es hacer eso. Ahora me falta muy poco para terminar y despues tengo que hacerle una optimizacion para reducir el tamaño del programa todo lo que pueda, asi queda espacio para rutinas que transformen de ASCII a los sonidos correspondientes.
    Un programa propietario para que uno ingrese texto y se hable no deberia costar mucho, es solo traducir ASCII a la rutina correspondiente y chequear que el texto sea valido, pero es mejor si se puede utilizar desde BASIC.
     

  • Breve actualizacion, el sintetizador esta terminado, el fonema F salio facil como era de esperar, el fonema J no funciono de la forma en que estaba hecho en el PIC, aunque en ese programa no estaba bien logrado. Tuve que recurrir al sonido original grabado del microfono, analizarlo y sintetizarlo con el SID, y sorprendentemente quedo perfecto, asi que eso tendra que ser actualizado tambien en el PIC. El fonema SH, que era el ultimo que quedaba y que era el que no estaba resuelto en el PIC, tambien quedo terminado pero despues de pelear bastante con las limitaciones del SID. Resulta que analizando el sonido vi que no era tan complicado pero requeria modulacion en amplitud, pude simular correctamente el sonido usando una onda triangular modulada en amplitud por ruido, pero eso no se puede hacer en el SID. Si bien tiene modulacion en amplitud (ring modulation), solo lo permite entre una onda triangular del canal 1 y una onda cuadrada del canal 3, esto eliminaba al ruido de la ecuacion y me obligo a improvisar otra manera. Lo que hice fue modular las dos ondas de frecuencia fija para tener una onda modulada en amplitud por la otra, pero tuve que usar un tercer canal para agregarle ruido encima, el resultado es aceptable pero no ideal. La solucion mas exacta en el SID seria disparar la onda triangular y modificar el volumen con el tiempo, pero esto eliminaria la ventaja del programa de no ser dependiente del proceso, perderia la posibilidad de adaptarse a una interrupcion de forma simple. Lo malo de la solucion que quedo, es que ahora se usan los 3 canales en ese sonido y ya no habria posibilidad de tener un canal libre para otros usos.
    Ahora sigue ir armando una especie de lista de reproduccion para pasarle una secuencia de fonemas al programa, y optimizarlo para reducir el tamaño.
     

  • Probe el ultimo y el del himno quedo perfecto , pero ahora que se usan los tres canales me imagino que no se le va a poder poner musica , a la espera de la ultima revision para probar la H y J a ver que tal quedo ...
     

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