Referencias: Wikipedia
MIDI (Musical Instrument Digital Interface) es un protocolo estándar, una interfaz digital y conectores que permiten que varios instrumentos musicales electrónicos, ordenadores y otros dispositivos relacionados se conecten y comuniquen entre sí.
De un archivo MIDI se puede usar las instrucciones para una solo intrumento, por ejemplo el que ejecuta la melodía, y revisar los delta tiempos entre cada nota para encontrar su pmf o cdf.
Archivo ejemplo: el_aguacate.mid
Formato de MIDI
Las intrucciones midi se puden leer usando la librería mido de python.
Para instalar la librería puede usar pip install mido en la uso de una ventana“símbolo de sistema”. Revisar instrucciones en el enlace pip install.
Para abrir el archivo y crear un documento de texto que se pueda interpretar, se dispone del siguiente script de python:
import mido as md # INGRESO archivomid = 'el_aguacate.mid' archivotxt = 'el_aguacatemidi.txt' # PROCEDIMIENTO partitura = md.MidiFile(archivomid) # SALIDA pistas = partitura.tracks n = len(pistas) for i in range(0,n,1): print(i, pistas[i]) # ARCHIVO DE TEXTO archivo = open(archivotxt,'w') for dato in partitura: archivo.write(str(dato) + '\n') archivo.close()
que muestra el número de pistas/instrumentos en el archivo.mid y crea un archivo de texto.
0 <midi track 'untitled' 47 messages> 1 <midi track 'BAJO' 1041 messages> 2 <midi track 'PIANO' 3079 messages> 3 <midi track 'GUITARRAS' 943 messages> 4 <midi track 'JAZZ GTR' 383 messages> 5 <midi track 'PLATILLO' 1002 messages> 6 <midi track 'TAMBOR' 470 messages>
También se puede procesar los datos, para un instrumento, y utilizar las medidas de tiempo como parámetro para tabular el comportamiento y obtener la pmf y cdf.
import numpy as np import matplotlib.pyplot as plt import mido as md # INGRESO archivomid = 'el_aguacate.mid' # instrumento canal = 'channel=3' # para pmf tramos = 20 # PROCEDIMIENTO # Abre archivo midi partitura = md.MidiFile(archivomid) # un instrumento, tabla de notas accion = 'note_on' tabla = [] for dato in partitura: linea = str(dato) parte = linea.split(' ') if (parte[0]==accion and parte[1]==canal): valor = parte[2].split('=') nota = int(valor[1]) valor = parte[3].split('=') velocidad = int(valor[1]) valor = parte[4].split('=') tiempo = float(valor[1]) tabla.append([nota, velocidad, tiempo]) tabla = np.array(tabla) m = len(tabla) # Cuenta de tiempos xmin = 0 xmax = np.round((np.max(tabla[:,2])*1.1),2) muestreo = tramos +1 x = np.linspace(xmin,xmax,muestreo) deltax = x[1]-x[0] cuenta = np.zeros(muestreo,dtype=int) for f in range(0,m,1): valor = tabla[f,2] encuentra = 0 j=0 while not(j>=muestreo or encuentra==1): if x[j]>valor: cuenta[j-1] = cuenta[j-1]+1 encuentra=1 j=j+1 frelativa = cuenta/np.sum(cuenta) acumulada = np.cumsum(frelativa) # SALIDA # Presenta pistas pistas = partitura.tracks n = len(pistas) print('pistas/instrumentos: ') for i in range(0,n,1): print(i, pistas[i]) # Tabulados print('Tabulados: ') print(' x: ',x) print('cuenta: ', cuenta) # GRAFICAS plt.subplot(211) plt.bar(x,frelativa, width=deltax*0.8, align='edge') plt.title(archivomid + ' , ' + canal) plt.ylabel('pmf') plt.subplot(212) plt.plot(x,acumulada,'m') plt.ylabel('cdf') plt.show()
Tarea:
a) Descargar el archivo.mid de la canción de su preferencia, seleccionar una pista y procesar las funciones de probabilidad de masas y acumulada.
b) para las notas del instrumento, mostrar tambien la pmf, cdf
Ejemplo de instrucciones midi generadas en el archivo
control_change channel=9 control=7 value=120 time=0 note_on channel=2 note=62 velocity=64 time=1.5 note_on channel=2 note=58 velocity=64 time=0 note_on channel=2 note=58 velocity=0 time=0.155 note_on channel=2 note=62 velocity=0 time=0.08 note_on channel=0 note=43 velocity=64 time=0.065 note_on channel=1 note=74 velocity=64 time=0 note_on channel=1 note=70 velocity=64 time=0 note_on channel=1 note=62 velocity=64 time=0 note_on channel=2 note=70 velocity=64 time=0 note_on channel=2 note=67 velocity=64 time=0 note_on channel=9 note=46 velocity=64 time=0 note_on channel=9 note=46 velocity=0 time=0.07