30 de agosto de 2014
Music score creator
Desde la última entrada, allá a principios de 2013, han pasado bastantes cosas. La universidad va encaminada, he aceptado unos proyectos con la banda y en la universidad con los que aprenderé mucho y me quitarán bastante tiempo. Entre todo ello al fin he creado mi primera aplicación y hoy os voy a hablar de ella. Se trata de Music score creator.

Aspecto de la aplicación en el estado actual de desarrollo
La idea la tenía desde hace un par de años: Generar la partitura a partir del sonido de una melodía que tocaras. De esa manera, ahorrarías trabajo de escribirlo todo o, si no tienes los suficientes conocimientos para poder escribirla, poder tener un primer borrador de la partitura.
En principio había pensado en utilizar la idea como proyecto de fin de carrera, pero teniendo ya claro cuál va a ser más o menos su enfoque, quedó en el aire. Y ahí estaba hasta que hace unas semanas, cuando dos amigos competían en una Jam de videojuegos (#gbjam) me entró ganas de hacer algo de provecho este verano. Un videojuego no me apetecía y ahí resurgió la idea. Me animé y empecé a buscar información sobre cómo grabar y obtener información de un audio.
Empecé buscando información para hacerlo en C++, pero después de unos días sin encontrar nada que no fuera muy engorroso de usar, pensé en cambiar de lenguaje. Y ahí vino Python; un lenguaje que siempre me gustó pero que por a o por b no había usado nunca en un proyecto. Busqué información y en poco tiempo tenía lo suficiente para poder empezar.
Interfaz Gráfica
Lo primero que me hacía falta era encontrar una librería para poder hacer la parte gráfica, me acordé de una que usé hace un año y medio o así, wxWidgets. Era una librería para C++ multiplataforma que me resultó fácil de utilizar y por curiosidad busqué encontrando, con alivio, que tenían una versión para Python llamada wxPython. Así que raudo y veloz me puse a instalarla y buscar cómo funcionaba todo. Pero claro, al principio el camino fue lento y poco a poco iba añadiendo elementos a la interfaz que poca funcionalidad tenía por entones.

Primeros pasos
Una vez que conseguí la interfaz superior, empecé a añadir las funcionalidades que aparecían. Abrir, guardar y grabar audio. Después encontré cómo insertar texto, botones, cajones y demás y me pude centrar en la funcionalidad.
Desarrollo de la Aplicación
Al poder grabar, abrir y guardar audio, ya pude centrarme en cómo encontrar información del mismo. El objetivo principal era poder dividir el audio en trozos variables -para poder determinar la duración de las notas- y de ellos obtener la frecuencia principal, la que más peso tiene. De esa manera, ya tendría qué nota es y cuánto dura. Para poder obtener las frecuencias tenía que utilizar la Transformada de Fourier, pudiendo pasar de una función del dominio del tiempo a una en el dominio de la frecuencia.
Con esto, que me llevó unos cuantos días, pude tener el algoritmo listo. Obtenías un audio, y te devolvía las frecuencias. Al principio el número de segmentos por segundo era fijo, pero cambiando un valor podía modificarlo. No me llevó mucho hacer una función que, en base del tempo de la melodía, te diera el número de trozos -notas, en mi caso, semicorcheas- correspondiente por segundo. Con esto ya tenía lo principal hecho.
Otra cosa importante que tenía que hacer era una tabla con un rango de frecuencias para cada nota. Una búsqueda rápida te lo da y solo tuve que determinar los intervalos para cada una de ellas. Después añadí un poco de preprocesado, quitando silencios del comienzo para que la partitura no quedara desplazada. Con ello, solo quedaba determinar qué notas había. Para ello había una condición, el compás (measure) con el que estábamos trabajando ya que dicha característica determinaba cuantas notas había por compás. Por ejemplo, si el compás es 4/4, tendríamos una redonda por compás, dos blancas por compás, cuatro negras por compás, etc. Así que en función de dicho valor cogía más o menos segmentos de audio ya procesado, y contaba cuántas veces una misma nota se mantenía. Seguidamente determinaba que, según dicho número, se correspondía con una nota. Por poner un ejemplo, si una nota se mantenía en tres segmentos, se correspondería a una corchea con puntillo, ya que un segmento es una semicorchea. Así con todos hasta el máximo que podía haber, que es 16 en un compás de 4/4.
Ya tenía todo listo, con saber qué nota es y cuánto dura ya podía escribir la partitura. Tengo que decir ahora que, sin el proyecto LilyPond todo este proyecto no hubiera sido posible. LilyPond es, como bien ellos dicen:
LilyPond es un programa de grabado musical (tipografía musical o edición de partituras), consagrado a la producción de partituras de la calidad más alta posible. Lleva la estética de la música tipografiada de la forma tradicional a las partituras impresas mediante ordenador. LilyPond es software libre y forma parte del Proyecto GNU.
Una auténtica gozada capaz de crear partituras muy bellas y con un formato claro y sencillo que es una delicia trabajar con él. Ejemplos hay muchos y son de una calidad enorme. De nuevo agradecerles el trabajo realizado.

Partitura generada mientras hacía pruebas con la aplicación
Bueno, pues solo quedaba escribirlo en dicho formato y generar el pdf con Lilypond.
Mejoras añadidas
Unas pequeñas mejoras que añadí fueron la de poder generar el archivo midi de la partitura para poder comparar el resultado con el origen, poder cambiar la afinación de las notas y poder transportar la partitura a algunos instrumentos. Dado que si, por ejemplo, tocara algo con mi clarinete, no aparecerían mis notas, sino las correspondientes si se tocara con un piano o instrumento en la misma tonalidad. Lo dicho, mejoras que no eran necesarias pero que ayudan y son de agradecer que estén.
Apuntes finales
Ya para finalizar, comentar que el proyecto está bajo licencia GPLv3, en mi cuenta de GitHub podéis ver el código y que en Python Package Index lo tenéis disponible para vuestra descarga e instalación en sistemas Linux. De lo que hay que hacer para subirlo allí da para otra entrada, porque son muchas cosas las que hay que configurar. Y termino con un pequeño vídeo que muestra su funcionamiento cuando estaba en la versión beta 0.8:
Espero que os haya gustado el proyecto.