miércoles, 20 de enero de 2010

Detector de melodía

Detector de melodía
Carlos Jesús Ruiz Fernández



Resumen- Implementación de un detector de melodía mediante el estudio de las características de un archivo de audio con codificación PCM, entre ellas características frecuenciales. Reconstrucción posterior de dicha melodía en un archivo midi.

Términos de indexado- detector de melodía, análisis frecuencial, wav, midi, método de suavizado.

I-Introducción

Un detector de melodía, es un programa que permite reconocer las notas melódicas de un archivo de audio, separándolas de las no melódicas.

La melodía es una sucesión temporal de notas de diferente altura, típicamente más altas que el acompañamiento, que destaca en una pieza o fragmento.

Actualmente la detección de la melodía de un documento de audio es una tarea compleja para la cual todavía no se ha encontrado un algoritmo óptimo aunque sí algunas aproximaciones bastante buenas.

El algoritmo implementado pretende hallar la melodía de un archivo de audio polifónico. La melodía hallada será monofónica, es decir contendrá una o ninguna nota en cada instante de tiempo, pero nunca más de una.
El algoritmo se basa en los siguientes principios[1]:
  1. “salience principle”: se asume que las notas melódicas sobresalen sobre las demás en términos de intensidad.
  2. “melodic smoothness principle”: se asume que los intervalos entre las frecuencias de las notas a lo largo del tiempo suelen ser pequeños.
II-Formato del programa
y de los datos de entrada y de salida

El programa realizado se ha implementado en Matlab. Se ha elegido este lenguaje de programación por su facilidad y eficiencia a la hora de trabajar con matrices. La señal de la voz es una matriz por ello Matlab reduce el código y aumenta la agilidad de ejecución.

El formato final del programa es una función

function []=MelodyRetrieval(fich_wav, fich_midi)

donde
  • fich_wav: es el fichero de audio con la señal en formato WAV. Está codificado mediante PCM.
  • fich_midi: es el fichero de salida en formato MIDI. El fichero está basado en la especificación "MIDI 1.0 Spec", en la sección III se detalla la estructura del archivo.


III-Consideraciones e
implementaciones previas
Notas:

Como el formato de salida va a ser un midi, reducimos el número de notas posibles a las notas que puede reproducir un midi, en su especificación "MIDI 1.0 Spec", estas son desde la nota C en la octava -1 que corresponde a la nota 0 MIDI hasta la nota G en la octava 9 que corresponde a la nota 127.

Además se considera que ciertas notas aparecen en la melodía de forma muy poco frecuente y en algunos casos pueden confundirse con bajos, por lo tanto se han utilizado notas por encima o igual a la D3, es decir de la nota 50 MIDI.

Nota MIDI Nota Octava Frecuencia Número de nota (1-12)
50 D 3 146,83 3
51 Dis/Des 3 155,56 4
52 E 3 164,81 5
53 F 3 174,61 6
54 Fis/Ges 3 185 7
55 G 3 196 8
56 Gis/As 3 207,65 9
57 A 3 220 10
58 Ais/B 3 233,08 11
59 H 3 246,94 12
60 C 4 261,63 1
61 Cis/Des 4 277,18 2
62 D 4 293,66 3
63 Dis/Des 4 311,13 4
64 E 4 329,63 5
65 F 4 349,23 6
66 Fis/Ges 4 369,99 7
67 G 4 392 8
68 Gis/As 4 415,3 9
69 A 4 440 10
70 Ais/B 4 466,16 11
71 H 4 493,88 12
72 C 5 523,25 1
73 Cis/Des 5 554,37 2
74 D 5 587,33 3
75 Dis/Des 5 622,25 4
76 E 5 659,26 5
77 F 5 698,46 6
78 Fis/Ges 5 739,99 7
79 G 5 783,99 8
80 Gis/As 5 830,61 9
81 A 5 880 10
82 Ais/B 5 932,33 11
83 H 5 987,77 12
84 C 6 1046,5 1
85 Cis/Des 6 1108,73 2
86 D 6 1174,66 3
87 Dis/Des 6 1244,51 4
88 E 6 1318,51 5
89 F 6 1396,91 6
90 Fis/Ges 6 1479,98 7
91 G 6 1567,98 8
92 Gis/As 6 1661,22 9
93 A 6 1760 10
94 Ais/B 6 1864,66 11
95 H 6 1975,53 12
96 C 7 2093 1
97 Cis/Des 7 2217,46 2
98 D 7 2349,32 3
99 Dis/Des 7 2489,02 4
100 E 7 2637,02 5
101 F 7 2793,83 6
102 Fis/Ges 7 2959,96 7
103 G 7 3135,96 8
104 Gis/As 7 3322,44 9
105 A 7 3520 10
106 Ais/B 7 3729,31 11
107 H 7 3951,07 12
108 C 8 4186,01 1
109 Cis/Des 8 4434,92 2
110 D 8 4698,64 3
111 Dis/Des 8 4978,03 4
112 E 8 5274,04 5
113 F 8 5587,65 6
114 Fis/Ges 8 5919,91 7
115 G 8 6271,93 8
116 Gis/As 8 6644,88 9
117 A 8 7040 10
118 Ais/B 8 7458,62 11
119 H 8 7902,13 12
120 C 9 8372,02 1
121 Cis/Des 9 8869,84 2
122 D 9 9397,27 3
123 Dis/Des 9 9956,06 4
124 E 9 10548,08 5
125 F 9 11175,3 6
126 Fis/Ges 9 11839,82 7
127 G 9 12543,85 8


Estructura del archivo MIDI:

Para la realización del archivo MIDI ha sido necesario un estudio de las especificaciones de dicho formato.
El archivo MIDI comienza con una cabecera en la que se indican los aspectos generales del archivo MIDI, entre ellos
  • Ticks por negra: lo normal son 240 ticks.
  • Formato de archivo: una o dos pistas, síncronas o asíncronas.
  • Número de pistas: en nuestro caso serán dos, una para metadatos y otra para datos.
Después vienen las dos pistas. En la primera, como se ha dicho previamente, estarán los metadatos, entre ellos título, comentario, compás, clave y tempo.

IV-Estructura del detector
de melodía

El detector de melodía sigue una implementación estructurada organizada en una serie de módulos:

1. Filtrado de la señal

El filtrado de la señal se realiza mediante la Transformada Rápida de Fourier. Se utiliza un filtro paso-banda. Se pretende tener una señal dentro de los límites de las notas que se impusieron al principio, es decir, entre la nota 50 y la nota 127 MIDI. Esto es, entre los 146Hz y los 12544Hz.

Fig.1 Señal antes y después de ser filtrada
(Presión en función del tiempo)

2. Ventanado

A la hora de trabajar con los datos es necesario crear ventanas para el tratamiento después de las mismas. Se h utilizado la ventana óptima recomendada en [1]. Esto es una ventana de 46.44ms.

Además se ha seleccionado el espacio entre muestras, es decir, el número de segundos que habrá entre el dato calculado de una muestra y la siguiente. En [1] se ha realizado un estudio del mejor parámetro que se puede utilizar, obteniendo como resultado 5.8ms.

3. Cálculo espectral de cada ventana

Se realiza un análisis espectral por cada ventana de la señal. El análisis espectral se realiza mediante la Transformáda Rápida de Fourier.

Una vez obtenido el cálculo se almacena para cada una de las muestras para ser utilizado más adelante. En la figura 2 se observa el cálculo espectral de la señal. Cada color en cada muestra corresponde a una nota MIDI entre las notas posibles.

Fig.2 Cálculo espectral de la señal en ventanas
(Intensidad de cada nota para cada muestra)

4. Cálculo espectral centrado en notas

En este caso se va a calcular la frecuencia fundamental para cada muestra de audio con la ventana ya seleccionada anteriormente.

Para ello se utilizan los valores espectrales calculados anteriormente y se realiza un promedio para cada una de las frecuencias que representan cada nota.

De este modo se obtiene un cálculo espectral para cada una de las notas, independientemente de la octava.

5. Unión de los dos cálculos espectrales

Una vez obtenidos los valores de los dos apartados anteriores se mezclan utilizando una técnica de comprobación.

Para cada una de las muestras para las que se ha calculado su espectro y para cada uno de los dos análisis espectrales realizados, se obtiene el valor máximo y la nota a la que corresponde ese valor.
Se considera que una nota es por ejemplo C8 y una nota genérica es C. Si la nota predominante corresponde con la nota predominante genérica, entonces se selecciona directamente esa nota para continuar con el proceso de detección de la melodía.

Si la nota predominante no corresponde con la nota genérica predominante, entonces se busca la nota genérica en las proximidades de la nota, la nota más cercana que coincida con la nota genérica será la elegida.

Fig.3 Esquema de la unión de análisis frecuenciales

En la siguiente figura se observan los dos cálculos espectrales realizados anteriormente pero en este caso se muestra como salida las notas predominantes.

Fig.4 Notas MIDI resultantes de los dos análisis espectrales

A partir de estos dos datos, se obtiene el resultado de la unión ya explicado anteriormente:

Fig.5 Resultado de la unión de los dos análisis espectrales en forma de nota MIDI

De todas formas el proceso suele coincidir en un nivel bastante alto. En el siguiente gráfico se observa el nivel de coincidencia que se produce entre los dos análisis espectrales y corresponde exactamente con un 85,13%.

Fig. 6 Gráfica de barras representando el nivel de coincidencia entre los dos análisis espectrales

6. Selección de silencios

Para la selección de los silencios se ha elegido un umbral acorde con los silencios del documento. El umbral elegido es de 10-8.

Fig.7 Notas MIDI después de la selección de silencios

7. Fase de smoothness o suavizado

La fase de smoothness o suavizado consiste en la aplicación del principio de "melodic smoothness principle" explicado anteriormente por el cual se asume que la diferencia frecuencial entre dos notas nunca es muy grande.

Para conseguir cumplir este principio se comienza seleccionando regiones de un tamaño determinado. En el caso de este algoritmo se han seleccionado regiones que no se separan más de 7 notas de diferencia.

Fig. 8 Selección de regiones de smoothness

Una vez obtenidas las regiones se selecciona la región mayor, es decir, la región que contiene más número de muestras.

A partir de esta región se asigna el centro de las regiones anteriores que será el primero de la región seleccionada y de las posteriores que será el último.

Si alguna de las notas está más de 7 notas separada de su centro correspondiente, se busca su misma nota pero en la octava más próxima al centro. Si, en cambio, está dentro de la diferencia de 7 notas frente al centro, se deja como está.

En la siguiente figura se puede observar la aplicación del algoritmo directamente sobre una señal de audio.

Fig.9 Aplicación de la fase de smoothness
antes y después

Esta fase se realiza una vez para cada ventana.

8. Fase de modelado para el midi

El archivo midi generado debe reproducir notas y no muestras. Cada nota debe tener una duración y es necesario tener una duración de nota mínima.

Se ha considerado que 1/8 s es una buena elección, ya que las melodías no son notas excesivamente cortas y 8 notas por segundo parece bastante razonable.

Para conseguir esto se utilizan ventanas de la duración seleccionada y se halla la moda de cada ventana.

9. Creación del fichero MIDI

Para la creación del fichero MIDI ahora tenemos muestras de 1/8 s y debemos escribirlas en un fichero midi y detectar la longitud de cada nota.

En la especificación MIDI una nota lleva los siguientes parámetros:
  • Nº ticks
  • Activación / desactivación de la nota.
  • Canal
  • Nota MIDI
  • Velocidad
Se revisan todas las muestras y si una nota se repite al escribir la nota en el MIDI se aumenta el número de ticks por dos y así sucesivamente.


V-Conclusiones

Después de realizar el algoritmo se han extraído las siguientes conclusiones:
  1. Las notas mejor reconocidas son las que tienen frecuencias más altas.
  2. El sistema cambia varía mucho su funcionamiento dependiendo del instrumento o instrumentos utilizados.
  3. El análisis espectral funciona bastante bien independientemente.
  4. La fase de smoothness mejora considerablemente la salida haciéndola más agradable.

VI-Referencias

[1] R.P. Paiva, T. Mendes, and A. Cardoso. On the detection of melody notes in polyphonic audio. In ISMIR, 2005.

[2] DeLiang Wang, Guy J. Brown. Computational Auditory Scene Analysis, 2006.

[3] Graham E. Poliner, Daniel P. W. Ellis, Andreas F. Ehmann, Emilia Gómez, Sebastian Streich, Beesuan Ong. Melody Transcription From Music Audio: Approaches and Evaluation

[4] Lixin Shi, Junxing Zhang, Min Li. Note Recognition Of Poliphonic Music Based On Timbre Model, 2009.