• Este parece un proyecto fractal, cuanto mas lo miro mas detalles le encuentro. biglaugh.png
    Corregi las cosas que me faltaban, que no eran errores sino ajustar los comandos permitidos por el parser a los sonidos agregados, ya que el parser aun tenia una definicion bastante antigua y habia un par de comandos que faltaba agregar, es largo de explicar y no vale la pena, no era algo que afectara al funcionamiento.
    Queda un solo cambio para hacer de los planeados, que tampoco afecta, es un cambio minimo para que al ejecutar el comando para detener inmediatamente un sonido, no lo haga al instante sino que espere a terminar el ciclo de onda actual, lo cual lo retrasa unas pocas muestras pero el sonido termina suavemente y no salen clicks. Esto es usado normalmente cuando se controla el PIC en tiempo real, como en el caso del programa con el piano, que cada vez que se pulsa una tecla detiene el sonido actual y emite el nuevo.
    Lo gracioso de todo esto, es que corregi varias cosas y en lugar de perder espacio logre espacio como para 80 instrucciones mas, ahora caben 165 contiguas, y 7 mas que no se pueden usar.
    Esto hace que si bien con el ultimo arreglo quede finalizado, tenga la tentacion de agregar un segundo canal de sonido, no puede ser nada complejo desde el punto de vista del codigo, tiene que aprovechar las rutinas existentes del sintetizador de voz y el motor de sonido, asi que puede tener restricciones, pero la idea es que tome menos de una semana hacerlo, seguramente va a tomar mas tiempo planearlo que hacerlo.
    La forma mas simple seria dejar el sintetizador monofonico y simplemente agregar dos instrumentos que funcionarian como fonemas pero emitiendo por ejemplo sonido de organo y bajo. Si todo se complica probablemente haga eso, pero tal vez lo mejor seria agregar un sintetizador de sonido independiente que genere ondas simples como triangular y/o diente de sierra, y funcione a la vez con el sintetizador de voz. Habria un comando para activar o desactivar el segundo canal, aunque el PIC lo procesaria siempre, solo que sonaria o no. Si se habilita ese canal, el audio pasaria a tener 7 bits por canal y por lo tanto la mitad de volumen, pero se podria cantar con acompañamiento.
    Si ocurre algun milagro, por ahi se pueda tener la segunda opcion pero con la posibilidad de usar tambien una onda digitalizada (cada onda ocupa 66 posiciones de memoria), o implementar alguna forma basica de volumen o ADSR.

    pastbytes
    cuanto mas lo miras, mas posibilidades de encontrar como optimizar el codigo tenes, ponete una meta y deja lo otro para la V2 wink.png
    a mi me pasa lo mismo, siempre le puedo mejorar cosas a los programas y el tiempo de puesta en prod se estira
    Por otro lado, excelentes avances.
     

  • Lo que pasa en este caso, es que la meta era que tuviera un solo canal pero pudiera hacer voz, musica y efectos, como explosiones, disparos, etc., y en algun momento tuve que resignar la parte de musica y ruido porque no quedaba memoria, ahora de pronto quedo memoria como para implementarlo y ahi esta el problema, que ahora se puede pero hay que hacer lo que entre. Lo de la musica y efectos no va a ser nada del otro mundo, es decir no competiria con el SID o el AY, eso lo pense mas por el lado de agregarle el PIC a una maquina sin sonido como las Sinclair o alguna con sonido muy basico como las Apple II.
    Pero creo que ya tengo una idea de como hacerlo, para el fin de semana creo que ya esta resuelto. wink.png
     

  • *** Version final del sintetizador HR4 ***

    Bueno, estuve dedicado con todo estos ultimos dias a terminar el sintetizador, y creo que oficialmente ya quedo una version final, aunque la deje como beta 4, por si se reporta algun error y hay que corregir algo.
    Se me ocurrieron una gran cantidad de cosas para agregarle, pero con la poca memoria que habia tuve que ir descartandolas, asi que quedaran para una version en un PIC mas potente, o al menos con mas memoria.
    Quise hacer la modificacion para que al ordenarle al chip detener el sonido inmediatamente, lo haga al terminar el ciclo actual de la onda, pero el criterio para elegir donde terminar dependia de cada sonido, lo cual iba a incrementar el codigo, por lo cual lo deje como esta.
    Tambien desisti de agregar un segundo canal exclusivo para musica, porque requeria definir un monton de cosas para el futuro, ya que intento que los comandos sean compatibles con las versiones que sigan, y eso hace que tenga que definir los comandos para chips que todavia no existen, y de ahi sacar un subconjunto de comandos para este proyecto mas modesto. Gracias a haberme puesto a analizar esto surgieron ideas interesantes para futuras versiones, pero tambien hice un cambio drastico en este programa cambiando los nombres de los comandos para que se ajusten al futuro del proyecto.
    Los cambios que hice fueron:

    - Renombre el comando Von (Ajusta tono de Voz Base, octava, nota) como Bon.
    - Renombre el comando Rxx (Ajusta duracion de un sonido en cantidad de Repeticiones/Ciclos) como Cxx.
    - Amplie el rango de notas una octava hacia abajo (octava 0) y otra hacia arriba (octava 4), quedando ahora desde C0 hasta C5. Esto no tiene mucha utilidad para la voz ya que entre C1 y C4 se entiende bien, despues ya no tanto, pero sirve para musica.
    - Agregue un nuevo comando Vx, que ajusta el volumen del sonido en un nivel de 0 a 15. Esto tambien es util para mejorar la naturalidad de la voz regulando el volumen en algunas silabas, y por supuesto tambien es util para hacer musica.
    - Agregue un instrumento musical para generar musica, activado con el comando /3, que genera una onda triangular que crece rapidamente y decrece lento. No habia lugar para cargar ninguna tabla de ondas, por lo que tuve que reutilizar esa que ya estaba. Esta onda es afectada por los 3 parametros de configuracion existentes para la voz: Cxx define la cantidad de ciclos de duracion, Non define la octava y nota del sonido, y Bon define la octava y nota para la envolvente triangular que la afecta. Esto requiere experimentacion, pero se puede dejar el tono base fijo (con Bon) y solo alterar nota (con Non), duracion (con Cxx) y volumen (con Vdead. El tono base en la practica lo que hace es cambiar el timbre del sonido, es decir afecta en como suena, como si fuera un instrumento distinto.
    - Cambie el algoritmo de escalado de frecuencias, porque tenia un rango para frecuencias 16 veces mas altas de la maxima razonable, que es de 4 muestras por ciclo, por lo que recalcule las tablas de conversion de notas a frecuencias y ahora las notas tienen 16 veces mas precision, ademas de que en el futuro ya se puedan generar envolventes de hasta 7 segundos por ciclo. Para que se entienda un poco mejor, antes la precision era de 1/256 de muestra, y ahora es de 1/4096 de muestra, si mal no recuerdo ahora el maximo error de frecuencia en una nota es de 0,08%, pero en la mayoria es muchisimo menos.

    Lamentablemente quedaron unas cuantas cosas afuera, pero ya hay una buena base para pasar a un PIC16F876A, donde la intencion es tener 2 canales de sonido y duplicar la calidad de las ondas para mejorar en particular la voz, ademas de aumentar ligeramente la frecuencia de muestreo de salida.
    Ya me consegui unos sobres para enviar los chips, pero en este momento solo tengo 5 PICs, me tienen que llegar algunos mas asi hago todos los envios juntos.
     

  • Tambien actualice el programa controlador para que soporte las nuevas opciones.


    1377141035 75 FT59536 Picsynthctrl3
     

  • Tambien actualice el programa controlador para que soporte las nuevas opciones.


    1377141035 75 FT59536 Picsynthctrl3

    pastbytes

    Felicitaciones es un logro importante para vos y para el foro !!! Shapo !!!cheesey.png
     

  • Mientras esperaba que me llegaran los PICs y conectores DB9 para placa, encontre una manera drastica de ahorrar cerca de 70 posiciones de memoria cortando una onda a la mitad y generando la segunda mitad a partir de la primera, se perdio algo de detalle pero como es usado solo en un sonido y resulta ser un sonido de alarma, no es una perdida importante. Otra vez di vuelta medio programa para acomodar las tablas de ondas y rutinas de la forma mas conveniente posible. Esto me permitio agregar una nueva tabla de ondas para un instrumento, que despues de pensarlo un poco decidi que debia ser un bajo. Hice varios intentos para implementarlo ahorrando codigo pero no hubo manera, tenia una distorsion y se controlaba la nota de una forma diferente a los otros sonidos, es decir era un parche y ademas confuso de usar. Al final termine optimizando un poco mas el codigo, rehaciendo rutinas antiguas eliminando codigo redundante (algo que no me gusta mucho porque dejaron de ser rutinas reutilizables en otros proyectos), y gracias a esto pude implementar una rutina de escalado de frecuencia exclusiva para un segundo instrumento. Los dos instrumentos usan la misma onda base del bajo, pero el que se activa con el comando /3 modula la onda con una envolvente de nota configurable, tal como pasa con la voz, y el que se activa con /4 no usa modulacion, sale tal cual esta almacenado. De esta manera se puede optar por tener el bajo normal o con efecto de volumen, que modifica un poco la forma de onda segun la nota que se configure a la envolvente.
    De paso encontre algunos errores en el calculo de frecuencias, que estaban desde el inicio y no habria encontrado si no fuera porque agregue ese segundo instrumento sin modulacion, ya que emitia un click en la primera muestra del sonido y esto pasaba desapercibido antes porque la modulacion de la envolvente reducia al minimo el volumen justo ahi.
    Los cambios internos fueron bastantes, pero lo que se ve de afuera es poco, en resumen:

    - Se elimino la onda triangular y se la reemplazo por un bajo en tabla de ondas, que permite configurar tanto la nota de la onda base como de la envolvente triangular que lo afecta.
    - Se agrego otro instrumento que usa la misma onda de bajo pero no es afectado por la envolvente.
    - Se corrigieron errores en el calculo de las frecuencias de las notas, que a su vez provocaban una pequeña distorsion al comenzar un sonido.
    - Se corrigio el calculo automatico de ciclos del fonema L, usando otro algoritmo mas exacto.

    Ahora pasa a ser 1.0 beta 5, aunque diria que es definitivamente una version final, ya que ahora si estoy conforme con las funciones agregadas, me quedo afuera que pudiera generar ruido como para hacer una bateria, pero si fue tanto lio agregar una onda, agregar varios algoritmos de generacion de ruido con seguridad va a ser imposible con solo 11 posiciones libres.
    Estuve experimentando variando nota y envolvente, y vi que se pueden hacer efectos interesantes. Tambien hice un ADSR "casero" enviando una secuencia del mismo instrumento pero con diferentes niveles de volumen, y sale perfecto, nada de distorsion ni lentitud de respuesta, se escucha el sonido continuado y subiendo/bajando de volumen suavemente, a pesar de que la resolucion del volumen es de solo 4 bits. La verdad que tiene muchas posibilidades para juegos, aunque tampoco hay que pedirle milagros.
     
  •  

  • Francamente, estoy impresionado.
     
  •  

  • Ahora llega el momento de empezar a probar en distintas maquinas, por eso envio varios chips a ver si de a poco sale andando en Spectrum y MSX, en C64 es casi directo y hay varias maneras posibles de conexion, ahi el problema pasa mas por el hecho de que no se consiguen o son caros los conectores para el puerto del usuario, por eso tal vez sea mejor usar un puerto de joystick. Tambien me interesa que se pruebe la parte de voz para ver que se puede mejorar, y que tan complicado resulta el lenguaje usado por el programa para interpretar los comandos.
    Tengo el manual a medio terminar, me falta explicar un poco de los ultimos agregados para hacer musica, y la parte de conexion.
    En algun momento voy a tener que hacer o adaptar algunos programas o juegos en BASIC para probar el chip en varias maquinas, pero va a tomar tiempo porque ahora tengo que ponerme al dia con cosas que tengo atrasadas.
     

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