domingo, 7 de enero de 2018

Procesado de secuencias MIDI con R (I). Decodificación

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.

En la universidad construí un interface MIDI para conectar un teclado mudo de 49 teclas a una tarjeta de sonido Gravis Ultrasound instalada en el PC.



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 la segunda entrega de este artículo usaremos estas frecuencias para sintetizar desde R sonidos con los que reproducir la melodía decodificada.

Finalmente dibujamos en función del tiempo las notas de la melodía principal. Puede verse con mejor detalle aquí.



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.



En el fichero mididecode.R puede encontrarse el código con el que se han obtenido todas las gráficas, y mazinger09.mid es el archivo MIDI usado en el ejercicio.

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.