Base de datos y caja de ritmos

September 22, 2014

Como amante de la música y guitarrista aficionado, hubo un día hace algunos meses en que deseé que existiera en Internet una base de datos de ritmos con la que poder buscar y reproducir ritmos que me acompañaran mientras yo tocaba y cantaba. Mi sorpresa fue que no existía algo así en Internet, así que creé el proyecto RitmoDB.

Mi idea era crear la infraestructura para que los usuarios –percusionistas, bateristas, y otros músicos profesionales y aficionados– pudieran contribuir con su conocimiento, es decir, debía tratarse de una base de datos colaborativa con la que crear, reproducir y compartir ritmos. El canal idóneo sería la web, dando acceso a usuarios de PCs, tabletas, smartphones, etc.

Entonces, de entrada, el problema se dividía para:

  • permitir la creación, modificación y reproducción de ritmos con una caja de ritmos virtual. La caja de ritmos consta de dos componentes:
    • la interfaz visual y
    • el motor de procesamiento de sonido,
  • poder almacenar los ritmos, estableciendo formatos de datos para definir pistas, sonidos, compases, acentos, etc.

Caja de ritmos virtual

La interfaz visual es genérica, pero dada la diversidad de navegadores y dispositivos existentes, se hace imposible una implementación única para el motor de sonido. Arbitrariamente, fijé Internet Explorer 8 y las versiones coetáneas de los demás navegadores como mis objetivos.

En un principio me planteé escribir la interfaz usando SVG (Scalable Vector Graphics), pero el soporte de este lenguaje no era satisfecho por los navegadores objetivo, así que terminé usando HTML y CSS.

Una pseudo-clase de JavaScript, RitmoDBMachine, implementa la interfaz visual de la caja de ritmos. Me ayudé de jQuery para abstraerme de las particularidades del navegador al gestionar el comportamiento dinámico de la caja de ritmos, p.ej. al añadir/eliminar pistas, responder a los clicks del usuario, etc., y de mustache.js para modelar las plantillas de elementos autocontenidos y reutilizables, como pistas, steppers, módulos de control, etc.

Caja de ritmos virtual de RitmoDB.
Caja de ritmos virtual de RitmoDB.

Motor de sonido

Aquí si era difícil realizar una implementación única, p.ej. la API de Web Audio para HTML5 era soportada solo por algo más de la mitad de la última versión de los navegadores de entonces y, por las pruebas que hice, incluso en los que clamaban soporte, el comportamiento de algunos métodos era inesperado; Flash no está soportado por los dispositivos de Apple; etc.

Por tanto, no me quedó más remedio que hacer múltiples implementaciones (HTML5 Web Audio, HTML5 Audio element, Flash) y testear el soporte en tiempo de ejecución, desde la implementación más eficiente hasta la menos, para usar la mejor de las disponibles.

Almacenamiento de ritmos

Cada ritmo se almacena usando varias tablas:

  • la tabla ritmo guarda los datos generales: id, género, nombre, tempo, n_tiempos, dur_tiempo (n_tiempos y dur_tiempo definen el compás), n_subdivs (subdivisiones por compás);
  • la tabla pista guarda los datos de una pista: id, sonido (referencia a la tabla sonido), volumen, partitura (array en formato JSON), tripletes (indicador, 0 o 1, de si esta pista define tripletes o no), ritmo (referencia a la tabla ritmo);
  • la tabla sonido: id, nombre, familia (de instrumentos);
  • la tabla fuente_sonido: id, fichero (ruta en el disco), formato, sonido (referencia a un sonido). El mismo sonido puede tener varias fuentes, p.ej. una para formato .mp3 y otra para .ogg.

Los acentos están implícitos en la partitura, p.ej. el compás 4/4 de negras [1, 0, 1, 0] define dos acentos: silencio e intensidad máxima; sin embargo [2, 0, 1, 0] define tres acentos: silencio, intensidad máxima e intensidad intermedia.

Esta es la estructura básica de la base de datos, pero existen algunas tablas más que no se han mencionado por facilitar la explicación, p.ej. datos adicionales permiten distinguir ritmos verificados, acreditan los ritmos a sus creadores, etc.

Gracias a Freesound pude reunir un conjunto inicial de muestras de sonido con las que empezar a alimentar la base de datos. Yo mismo creé los primeros 50 ritmos, como este estándar de funky, para dar un empuje inicial al proyecto. Espero que poco a poco crezca y se convierta en una referencia de ritmos en Internet.

Archivos