Proyecto Sintetizador Documentación Versión 1.0 - Miércoles 01 Julio 2009
Proyecto en versión Applet.
Descargar presentación Powerpoint.

Documentación:

1. Descripción
En la actualidad existe una variedad importante de instrumentos musicales. En la amplia gama existen unos instrumentos llamados sintetizadores anágolos. Estos dispositivos fueron diseñados en base a circuitos analógicos que mediantes módulos como LFO, VCO y VCF podían lograr una amplia gama de sonidos. El objetivo de nuestro proyecto y quizás el desafío que nos impusimos fue implementar uno de estos instrumentos mediante software, aprovechando los conocimientos adquiridos durante el ramo. Para ver una breve introducción a sintetizadores visite la siguiente página: Introducción a Sintetizadores.

2. Análisis del problema
Para abordar la problemática, se definió implementar una interfaz gráfica con controles deslizables o sliders y botones. La idea general es que el usuario mediante el teclado y el mouse disponibles en su PC pueda generar sonidos. Se eligió generar sonidos con el teclado y que a la vez se puedan mover controles en la interfaz grafica con el mouse. Además se optó por definir una arquitectura del sistema. Por supuesto se fueron haciendo algunos ajustes en el proceso de diseño, pero en definitiva, para esta version 1.0 se definió la siguiente arquitectura de diseño:

Diagrama de Bloques

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
Ya se comentó la arquitectura general del sintetizador, lo que involucra como se conectarán los módulos JSyn, pero en este punto se comentará sobre la arquitectura de la solución orientada a la programación 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
El código de fuente documentado se encuentra disponible en el siguiente link: Documentacion Sintetizador.Además adjuntamos los códigos a continuación:
Sintetizador.java
SinteFrame.java
SintePanel.java
Keyboard.java
Notas.java
SignalManager.java

5. Pruebas
Para verificar la calidad y la confiabilidad de nuestro software se realizaron diversas pruebas durante y después de su desarrollo. Dichas pruebas fueron de caracter unitario, otras fueron funcionales y otras de integración. El detalle de cada una es analizado en el siguiente link: Test de Pruebas

6. Conclusiones, Problemas y Proyecciones
Luego de implementar todo el sistema podemos afirmar que cumplimos los objetivos propuestos. Se implementó un sistema que genera sonidos mediante el teclado del PC. Además mediante el mouse se puede modificar una serie de parámetros asociados a controles en una interfaz gráfica. Estos controles a su vez pueden modificar en tiempo real el sonido que se genera.

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.


fbp2009