domingo, 7 de enero de 2018

Decodificación de secuencias MIDI con R

En este artículo vamos a practicar con las funciones del paquete tuneR para leer archivos MIDI e interpretar su contenido. MIDI es un estándar de la industria musical que define los protocolos, mensajes de eventos e interfaces físicos bajo los que se comunican ordenadores y toda clase de instrumentos musicales digitales.

Aún conservo este interface MIDI que construí cuando estaba en la universidad, para conectar un teclado mudo de 49 teclas a una tarjeta de sonido Gravis Ultrasound instalada en el PC. El circuito es muy estándar y no puede ser más simple: un optoacoplador para aislar eléctricamente la entrada, inversores para regenerar un par de señales y resistencias para terminar las conexiones:



Podía disparar los samples cargados en la tarjeta tocando en el teclado, y usaba Cakewalk como secuenciador para reproducir y guardar composiciones en formato MIDI.

~~~

Empezamos por leer con readMidi() un fichero que contiene el tema de inicio de Mazinger Z. Para aquellos cuya edad empiece por un cuatro y amantes del anime en general, este 19 de enero se estrena en España la película 'Mazinger Z infinity'. En el siguiente vídeo puede verse el tráiler con la melodía que vamos a procesar.



A continuación nos quedamos con los eventos puramente melódicos mediante la función getMidiNotes(), que devuelve un dataframe con siete campos que definen cada nota musical:
  • time: instante de inicio de la nota.
  • length: duración de la nota (mismas unidades que time).
  • track: pista donde se reproducirá la nota.
  • channel: canal MIDI asignado a dicha pista (1-16).
  • note: nota MIDI (69 corresponde al la 440).
  • notename: nombre de la nota.
  • velocity: volumen individual de la nota.

Inspeccionamos una de las pistas para hacernos idea del tipo de datos codificados:



De manera simplificada puede decirse que cada pista se corresponde con un instrumento, y ha de asignarse a uno de los 16 canales disponibles en el estándar MIDI. Resulta fácil representar la correspondencia entre pistas y canales.



Varias pistas pueden confluir en un mismo canal; por ejemplo dos pistas de teclado para la mano izquierda y derecha respectivamente pueden agruparse en un único canal 'piano'. El canal 10 por convenio suele agrupar las pistas de percusión; en este caso fue así y vemos que se usaron para la percusión las pistas 2 y 3.

En notename tenemos el nombre de cada nota siguiendo la notación germana de Helmholtz (el autor de tuneR es alemán), pero nos resulta más cómodo leer directamente las notas MIDI en formato numérico desde el campo note. Los valores pueden asociarse a su frecuencia armónica fundamental con la expresión:


En la siguiente tabla se hace el cálculo para la escala cromática de la octava número 4 en el índice acústico científico. Esta octava contiene el do central del piano y el la 440 de referencia para afinación. Se añaden las correspondencias con las notaciones anglosajona y latina.



En este enlace puede encontrarse un archivo Excel con la formulación de frecuencias y las distintas notaciones vistas para un teclado de piano completo.

Dibujamos ahora las notas de la melodía principal en función del tiempo. Puede verse con mejor detalle haciendo clic en la imagen.



Para tener una visualización vistosa de la melodía, he representado el tiempo en formato angular, las notas como un radio o distancia al origen de coordenadas, y la duración de cada nota como un arco.

Añadiendo algo de solape y procesando el color con curvas en Photoshop, se tiene una imagen de la melodía abstracta y futurista.


~~~

Repositorio con el código R y archivos auxiliares: GitHub.

No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.