Documentación:
1. Descripción
2. Análisis del problema
Para lograr la funcionalidad del sistema se tuvo que estudiar el manejo del sonido en Java. En un principio la idea fue hacer el desarrollo en bajo nivel programando los osciladores punto a punto, leyendo la informacion byte a byte. Esto fue un problema porque el manejo de audio en Java es complejo y más complejo todavía si se quiere hacer procesamiento de señales como modulación de amplitud o filtraje de bandas de frecuencia, por ejemplo. Investigando se descubrió una biblioteca de códigos llamado JSyn, que tiene clases desarrolladas especialmente para creación de módulos como osciladores, filtros, sumadores y multiplicadores de señales, etc. Para ver una introducción a la biblioteca JSyn presione aquí y para más información visite la pagina principal de Jsyn.
Dado que los controladores principales son teclado y mouse, nuestro proyecto se hace accesible a cualquier persona que tenga un PC con tarjeta de sonido, acceso a aplicaciones Java y que en su sistema pueda ser instalado el paquete de JSyn. (Su instalación se puede hacer desde aquí).
En la siguiente página se puede ver un par de ejemplo de casos de uso para el sistema. Casos de Uso.
3. Arquitectura de la solución
La solución consta de las siguientes clases:
·Sintetizador: Es la clase principal. Esta clase crea una instancia de un frame en el cual irá la interfaz gráfica del sistema.
·SinteFrame: Es la clase generadora del frame. Esta crea una instancia de un panel en el cual van los objetos de la interfaz gráfica. Esta clase tiene 2 clases internas anónimas, una para cada action listener de los botones del menú del frame. Un botón es para salir de la aplicación y el otro muestra información sobre los autores de la aplicación.
·SintePanel: Es la clase generadora del panel principal. En este panel van todos los títulos, paneles y objetos gráficos para la GUI. Esta clase tiene 4 clases internas: PanelSlider se utliza para la creación de un panel con un slider y su nombre. Se utiliza para todos los sliders de la GUI. Las otras tres clases,
BotonHandler, KeyHandler y SliderHandler son para el manejo de interrupciones cuando se presiona un botón, se presiona una tecla del teclado del PC o se mueve un slider, respectivamente. BotonHandler implementa la interfaz ActionListener, KeyHandler implementa a KeyListener y SliderHandler a ChangeListener.
·Keyboard: Clase generadora de un panel en el cual se muestra el dibujo del teclado del sintetizador. En cada tecla tiene dibujado también una letra para mostrar al usuario, que tecla del teclado del PC debe presionar para generar una determinada nota en el sintetizador. Mediante una variable de control se puede seleccionar si se dibuja un punto sobre una de las teclas.
·Notas: Clase que genera una base de datos con las frecuencias de todas las notas musicales dentro de un rango de octavas.
·SignalManager: Clase que crea dispositivos de audio tales como osciladores y filtros. Estos dispositivos son importados de la biblioteca Jsyn.
·aboutWindow: Clase generadora de un frame para una ventana secundaria. Este frame se encarga de mostrar información sobre los autores del programa.
·abwCont: Clase generadora de un panel para la ventana secundaria. En este panel se insertan etiquetas de texto con la información que se despliega en la ventana secundaria.
En el siguiente link se muestra una imagen con el diagrama de clases: Ver aqui. El diagrama fue hecho mediante el IDE Netbeans, el cual permite mostrar en el diagrama de clases los atributos y métodos de cada clase. Para no sobrecargar la imagen, en el diagrama se muestran solamente los métodos. Cabe destacar que la clase SignalManager utiliza las clases de la biblioteca JSyn, pero como son muchas, se han omitido en el diagrama.
4. Documentación del código de fuente
5. Pruebas
6. Conclusiones, Problemas y Proyecciones
Un aspecto negativo importante es la latencia que hay desde que el usuario presiona la tecla hasta que el sonido es generado. Esta problemática es muy importante ya que el sistema no responde bien ante cambios de notas relativamente rápidos. Esto debe estudiarse para tratar de mejorar el funcionamiento del sistema.
Dado que el proyecto presenta una arquitectura modular, es fácil la adición de nuevos módulos. Podrían agregarse otros osciladores que modulen la frecuencia del oscilador principal, se pueden agregar módulos de efectos de audio como chorus, delay, reverberación, etc. Otra proyección que se puede hacer es la modificación de la interfaz gráfica haciendo sliders más pequeños y asi reduicir el tamaño total de la ventana, quizás cambiarlos por controles giratorios tipo potenciómetros. También puede estudiarse la posibilidad de hacer el control mediante un ente externo como un controlador MIDI/USB. (Ejemplo de un controlador MIDI/USB). Una proyección interesante es la de añadir polifonía. Tal como está ahora el sistema se puede generar una nota a la vez, sin embargo puede modificarse para la generación de múltiples notas en un mismo instante. En fin, las posibilidades de expansión son muchas, lo cual le da al proyecto una gran potencialidad.