.

El mes pasado me topé con “Beat Detection Algorithms”, un texto en dos partes (1 y 2) sobre la implementación en Scala de un par de algoritmos sencillos con el objetivo titular. Aparte de la explicación de la teoría tras estas implementaciones se puede encontrar el resultado integrado en el código fuente de un proyecto del autor.

Recuerdo haber echado un ojo a este tipo de análisis matemático (aunque sin llegar a aplicarlo) a finales de la década de los 90, en la estela de la demoscene y con el ascenso de WinAmp y sus complementos de visualización. Remontándome sólo al año pasado, tenía apuntado un artículo sobre detección de pulsaciones usando Web Audio, encontrado a través de EchoJS, nuevamente sin llevarlo a la práctica por mi parte.

Grimes – Go: Peaks with a lowpass, highpass, and bandpass filter, respectively.

Este último enlace lo tenía apuntado junto con otra reseña en EchoJS de un proyecto denominado WaveGL, cuyo objetivo era «generar audio en la GPU y transmitirlo a la tarjeta de audio» y del que señalaban uno de varios ejemplos. Con tantos proyectos de programación que he visto recientemente no estaría mal sacar un poco de tiempo para programar por gusto en lugar de por compromiso.

.

No recuerdo dónde oí por primera vez «una idea es una responsabilidad» pero me resulta admirable la gente que es capaz de ponerla en práctica. Una de estas personas es Paul Lewis, trabajador de Google, que se planteaba los siguiente:

Given we have the Web Audio API and getUserMedia, I wondered if I could make a passable guitar tuner. Looks like I can, and in the process I learned way more stuff about audio than I care to mention. Cool stuff, though! I thought I’d do a breakdown of what went into building it.

No contento con desarrollar su idea en su página explica algunos detalles de todo este proyecto personal. Una lectura muy interesante y muy recomendable.

.

Una red neuronal recurrente, o RNN (Recurrent Neural Network) es una clase de red de neuronas artificial en las que las conexiones entre unidades forman un ciclo dirigido. Si no lo he entendido mal, esto quiere decir que la secuencia cíclica de vértices (o nodos) y aristas en un camino es determinada completamente por el conjunto de aristas que usa: sólo se puede recorrer en una dirección. Esto crea un estado interno de la red que le permite exhibir un comportamiento temporal dinámico y procesar secuencias arbitrarias de entradas. También se puede entender como una red neuronal recursiva, igualmente abreviada como RNN, con una estructura en cadena.

Todo esto viene a colación una serie de relativamente breves pero interesantísimos textos de Bob L. Sturm titulados “Deep learning for assisting the process of music composition”, partes 1, 2, 3 y 4. En ellos deja constancia de algunas reflexiones sobre un proyecto veraniego realizado en colaboración con João Felipe Santos denominado The Infinite Irish Trad Session:

So João grabbed all the tunes he could from The Session, I parsed and editted the text file to produce a 13 MB file of 23,962 tunes, and João set to using it to train an RNN with 3 hidden layers having 512 units each. Once finished, João had the system generate a 21 MB text file of new ABC tunes, which I am parsing into its 72,000+ tunes. I convert each ABC tune to MIDI, process it in python (with python-midi) to give a more human-like performance (including some musicians who lack good timing, and a sometimes over-active bodhran player who loves to have the last notes :), and then synthesize the parts with timidity, and finally mix it all together and add effects with sox. Each successful synthesis is then served to my home directory, and a cronjob generates a new playlist every five minutes from the 22000+ tunes already synthesized (that is 18,964,140 kilobytes, which at 128 kbps is a 41 hour trad session!).

Hope you have some craic!

El resultado son composiciones como esta:

Parte del trabajo se apoya en el trabajo de Andrej Karpathy sobre redes LSTM, cuyo artículo “The Unreasonable Effectiveness of Recurrent Neural Networks” explica con algo más de detalle qué son las RNN y sus virtudes.

Todo esto me llegó vía Hacker News, igual que el artículo sobre composición algorítmica de hace unos meses.

.

Hay un gran artículo de Batuhan Bozkurt de mediados de 2009 que describe tanto el origen como el proceso de recreación de Deep Note utilizando SuperCollider. Años después veo este post de Stuart Memo (que de hecho cita al primero) donde explica su experimento intentando aproximar el sonido usando JavaScript:

El sonido [se genera] básicamente [con] 30 osciladores de onda cuadrada emitiendo aleatoriamente en frencuencias entre 200Hz y 400Hz. [El resultado] es filtrado para producir el efecto de barrido que se oye.

El resultado se puede oír en CodePen y tiene una semblanza con la composición del Dr. James A. Moorer.

.

A la imagen anterior llegué pasando por un artículo de Wired de Natah Hurst acerca de otro proyecto de Amanda Ghassaei, siendo la misma persona que hizo los discos usando impresión en 3D. En esta ocasión utiliza un láser para grabar sobre distintas superficies, incluyendo madera, y en los enlaces anteriores se pueden ver y oír vídeos con los resultados. Con todo, yo me quedo con el aspecto de estos grabados:

La autora de estos experimentos habla de intentar grabar canciones en secciones transversales de un árbol, sobre los anillos, lo que me recordó a otro artefacto que «reproduce» precisamente esos anillos.