*** Sintetizador HR4 V1.0 ***Varias novedades, resumiendolo para el que no quiera leer todo, hice las primeras modificaciones desde junio al sintetizador HR4, y ahora esta en la version 1.0, lo que cambio es que se corrigieron unos errores en el calculo de la frecuencia de las notas, se mejoro el sonido de los fonemas D y T, y se agrego un nuevo comando X a esa version, todo esto originado en mejoras que se hicieron al sintetizador HR5.
La historia completa es un poco mas complicada, todo parte de un error en las envolventes de los instrumentos en el sintetizador HR5, que todavia no pude encontrar, pero esto me llevo a revisar exhaustivamente todo el manejo de frecuencias, los instrumentos y las envolventes. Revise las diferencias entre varias versiones que fui dejando en el camino, y encontre que el error se introdujo al pasar de sonidos de 8,6KHz a sonidos de 15,6KHz, lo cual no me dice mucho porque es un cambio drastico en el programa, y no hay manera de probar una version intermedia. Pero lo interesante fue que descubri varios errores que estaban desde hacia mucho tiempo, seguramente al menos desde las primeras versiones de la HR3, pero al ser tan sutiles pasaron desapercibidos.
El primer error estaba en el escalado de ondas, tanto en la voz como en los instrumentos, para adaptar una onda a distintas frecuencias lo que se usa es un acumulador de fase, que es un registro, variable o como se lo quiera ver, donde uno va sumando un determinado valor en cada muestra emitida, cuando el acumulador se llena, se avanza una muestra, De esta manera lo que se logra es reproducir una onda mas lento de lo que deberia salir, si el valor que se suma al acumulador no hace que se rebalse, no se avanza una muestra de la onda, y por lo tanto se repite la misma muestra que la ultima vez. Se podria ver esto como si fuera un contador de fracciones de muestra, si uno quiere reproducir la onda a la mitad de frecuencia, habria que emitir cada muestra de la onda 2 veces, para esto sumariamos al acumulador la mitad del valor posible, como para que por cada 2 muestras se avance 1. Pero esto solo sirve para hacer mas lenta una onda, si se quiere elevar la frecuencia, lo que hay que hacer es saltearse muestras, para esto el acumulador debe tener dos partes, una para fracciones de muestra y otra para muestras enteras. En la practica es un mismo acumulador, pero cierta parte se considera como muestras enteras que es lo que se suma al indice que indica en que muestra estamos.
El tema da para hablar bastante, pero con eso se tiene una idea de como funciona, el SID por ejemplo utiliza ese metodo. El sintetizador HR4 usaba 16 bits para determinar la frecuencia de las ondas, con esto se podia alcanzar todo el rango de las octavas que se usan musicalmente, y con una precision de frecuencia bastante buena. El sintetizador HR5 utilizaba tambien 16 bits, pero al emitir el sonido a una frecuencia mas alta, esos 16 bits reducian el rango de frecuencias posibles, cuando intente agregar una octava extra, justo la ultima nota excedio el rango, y entonces expandi el acumulador a 20 bits.
En cada muestra emitida, cuando se suma el valor al acumulador, puede ser que haya que avanzar una cantidad de muestras en la onda (en HR5 se usan ondas de 119 muestras) que excedan el final de la onda, por ejemplo si estamos en la muestra 117 (la ultima es la 118) y en lugar de avanzar 1 muestra tenemos que avanzar 2, deberiamos terminar en la muestra 119, que no existe por ir de 0 a 118. por lo que pasariamos a la muestra 0. La rutina que hacia este calculo del excedente tenia un error que hacia que pasara a la muestra 1 como minimo, por lo que en la practica todos los sonidos se emitian con la primera muestra solo en el primer ciclo, despues siempre se evitaba, lo que hacia que sonaran con una frecuencia mas alta, aunque no era un error perceptible.
El segundo error tenia que ver con los fonemas, hay fonemas a los que se le puede configurar la nota, como las vocales, o el caso de los instrumentos, esos no eran problema en el nuevo programa, porque aunque se emitiera sonido a 15KHz, aun se podian usar las viejas ondas a 8,6KHz, que de hecho es lo que empece haciendo, ya que bastaba con recalcular los valores para cargar en el acumulador en cada nota, para ondas de 66 muestras (8,6KHz) y sonido de 15KHz. Pero habia fonemas que no eran repetitivos, y al pasar a 15KHz se reproducian casi al doble de velocidad, estos requerian volver a renderizarse para 15KHz, y en algunos casos adaptar los algoritmos que los generan. Este era el caso de los fonemas R y T, que estaban generados combinando partes de ondas existentes para ahorrar memoria, y al tener que emitir ahora mas muestras que antes, requeria cambiar ademas de las ondas, los numeros de muestras en las rutinas. El asunto es que rehaciendo esos dos fonemas me encuentro con que la T funcionaba mal, despues de un largo algoritmo usado para combinar 4 ondas con ruido para imitar una T, resulta que la mezcla se hacia mal, y como consecuencia de eso lo unico que salia era el sonido del fonema S, que era el "ruido" usado en la mezcla. Ya que igual sonaba como T, se podria haber eliminado todo el algoritmo y ahorrar memoria, pero decidi arreglarlo. Asi es que busque en el archivo de ondas la T original, es decir el fonema T digitalizado que uso como referencia para sintetizarlo, renderice la onda a 15KHz para resintetizarla modificando el algoritmo, y me encontre con que la onda no era tan grande como para almacenarla entera en el programa, y que de hecho ocupaba mas o menos lo mismo que la rutina para sintetizarla, mas una onda especial que usa ese algoritmo. En resumen, era un algoritmo tan antiguo que de tantas modificaciones ya no servia, porque arreglado y todo era un mal sustituto para la onda original, y ocupaba demasiado, por lo que opte por eliminarlo completamente y almacenar la onda completa, lo que ademas de ahorrar memoria, ahorra proceso y aumenta la calidad del sonido.
En cuanto al sintetizador HR4, viendo que la onda T ocupaba menos que su algoritmo, decidi probar las modificaciones tambien ahi, y resulto que mejoro en igual forma, ahorrando proceso y memoria. Tambien corregi los errores de calculo de frecuencia, que con todo lo complejo que suenan, se reducia a eliminar 2 instrucciones, es decir que ademas ahorran memoria. Con estas correcciones el HR4 quedo con memoria libre para 32 instrucciones.
Ayer se me ocurrio probar si podia incluir el nuevo comando X para configurar la expresividad de la voz, es decir que tan acentuados son los acentos, dudaba de si eso podria entrar, porque gran parte del codigo se lo lleva agregar el comando al parser. El programa ya venia preparado para esa funcion, pero justamente no habia memoria en su momento para agregar el comando para darle un valor. Lo que hice fue hacer una copia del programa, que ya era beta 14 por las correcciones de frecuencia y sonidos D y T, abri el programa de la HR5 para saber los cambios exactos que tenia que hacer, y a medida que agregaba cosas llevaba una cuenta de instrucciones extra, para saber si llegaba a las 32 libres que tenia.
Resulto que entre las lineas para definir las propiedades del fonema (porque para el programa todo son fonemas), los agregados al parser para aceptar los comandos X y x, el chequeo y conversion del parametro, y la implementacion, que no es mas que copiar el parametro a un registro, se necesitaban 42 instrucciones, 10 menos de las disponibles.
Entonces recorde que el mensaje de arranque por RS232 envia un texto que en la version declara VERSION 1.0 BETA 14, y que si avanzo a la version 1.0 final podria ahorrar 8 instrucciones (" BETA 14"), lo que volvia posible llegar a ahorrar lo necesario. Despues de reacomodar algunas rutinas en distintas paginas, y de usar 2 instrucciones libres entre las posiciones 0x000 y 0x004, donde la 0x000 solo estaba ocupada por un goto start, y en 0x004 estaba la rutina de interrupcion, pude llegar a ahorrar lo suficiente para que las modificaciones entraran. Y no solo entraron, sino que quedo lugar para 2 instrucciones, una en 7FE y otra en 003, aunque dudo que eso se pueda aprovechar para algo.
Incluso me pude dar el lujo de reservar con un NOP una instruccion para un digito extra en caso de que en el futuro necesite pasar de la version 1.9.
En definitiva, el sintetizador HR4 tiene ahora las mismas capacidades que el HR5, solo se diferencian en la calidad de sonido.
Y volviendo al HR5, logre sintetizar un elemento de bateria, usando ondas existentes, por lo que se podria implementar perfectamente en el HR4, pero obviamente no va a ser posible agregar el comando para ejecutar el instrumento, al menos por ahora. En el HR5 lo voy a agregar cuando termine de darle forma, mi idea es tener dos elementos basicos de bateria, el primero es incluso ajustable a una nota. El segundo va a requerir mas trabajo, cuando salga ese voy a agregar los dos.