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.

miércoles, 23 de diciembre de 2009

Zurribalba Subachoqueña

Estoy haciendo un trabajo para una asignatura. El trabajo consiste en crear dos páginas web y conseguir que aparezcan las primeras al realizar una búsqueda en google. Por ahora he conseguido que una de las páginas aparezca la primera pero la otra todavía no aparece.

Voy a introducir en esta página los links a esas páginas para que de ese modo puedan adquirir el Pagerank de esta página que es más altos que el de las otras, o por lo menos eso creo. Si alguien quiere colaborar con la causa y poner un link en su página se lo agradecería.

Las páginas son las siguientes:

http://zurribalba.blogspot.com/
http://subachoquena.blogspot.com/

Lo que si que veo más difícil conseguir es que aparezcan mis páginas al realizar búsquedas con los dos términos, pero voy a intentar hacerlo por otros medios.

viernes, 16 de octubre de 2009

Postgrado en Ingeniería Informática y de Telecomunicación

Al final he decidido hacer un Posgrado Oficial de la Universidad Autónoma de Madrid. Esta decisión la he tomado porque tengo mucho interés en especializarme en temas de video y por ahora esta era la mejor opción tanto si luego me dirijo hacia la investigación como si me oriento al mundo laboral.

Mi idea a largo plazo es realizar las dos cosas. Conozco varios casos de personas que trabajan y están haciendo un posgrado o un doctorado a la vez. De este modo podría ir asumiendo responsabilidades en una empresa y a la vez seguir especializándome.

Particularmente me ha costado mucho realizar este paso, ya que no quería dejar de especializarme en algunas cosas... Pero lo que tenía claro es que me gusta más la parte de video y prefiero hacer cosas relacionadas con software que con harware.

Por ahora voy a colaborar con un grupo de investigación de la Universidad Autónoma de Madrid llamado VPU (Video Proccessing and Understanding Lab). He tenido la suerte de encontrar un hueco en el grupo de investigación que más interés tenía.

Por ahora iré colgando aquí cosas relacionadas con los temas de investigación que estoy realizando.

lunes, 7 de septiembre de 2009

Ingeniero Informático

Pues ayer fui a recoger el resguardo del título de Ingeniero Informático. La verdad es que esperaba que para lo que me ha costado por lo menos fuera en papel no reciclado, pero estoy de acuerdo con el hecho de preservar la naturaleza.

Me han asegurado que me llamarían para que recogiera el título en aproximadamente cinco meses. El título sale a unos 140 euros y el suplemento europeo al título unos 70 euros. El suplemento europeo al título contiene información relevante de las asignaturas y materias que la carrera ha cubierto para poder utilizarlo en la Unión Europea como referencia laboral o escolar.

Ahora he decidido hacer un Máster, pero todavía no tengo claro muy bien cómo voy a hacerlo y en qué condiciones así que cuando tenga más información la detallaré aquí.

jueves, 4 de junio de 2009

Virus

Hace unos días entró un virus en mi ordenador. Pensé que teniendo el Antivirus funcionando no tendría ningún problema pero poco a poco me fui dando cuenta de que el antivirus solo funcionaba para impedir la ejecución constante de varios ficheros. Pasé el antivirus completo pero no detectó ningún problema después de 1 Terabyte revisado.

Así que decidí eliminar el virus. Lo primero que hice fue buscar en el administrador de tareas los procesos activos, ya que si un programa se ejecutaba de repente debía ser por culpa de alguno de los programas activos en la memoria. Eliminé algunos que podrían ser sospechosos, pero seguían saliendo los mensajes del antivirus diciendo que había impedido la ejecición del programa. Como veía que siguiendo esa línea no conseguía nada miré los programas que se cargan automáticamente en el arranque. Ahí sí pude ver algo. Había dos o tres líneas que hacían referencia a dll's que al parecer se cargaban mediante rundll32.exe que estaba en la carpeta system32 de Windows.

Mi primer impulso fue eliminarlo, pero me di cuenta de que rundll32 carga cualquier dll del sistema. Así que la única manera que tenía de recuperar ese archivo era con el archivo original de Windows. Intenté con el cd de instalación que se sobreescribieran todos los archivos de sistema, pero no pude, así que al final terminé instalando otro sistema operativo. Una vez instalado copié el archivo del sistema operativo nuevo al antiguo y no dio resultado.

En principio parecía que el virus no daría demasiada lata, pero me di cuenta de que, curiosamente, no podía acceder a facebook o tuenti, en cambio sí podía entrar en gmail por ejemplo. Cosa rara. Pensé que el error podía estar en el explorer.exe así que lo paré y mediante el símbolo de sistema de windows copié también el explorer.exe nuevo al antiguo sistema operativo. La cosa seguía igual.

Decidí volver a la línea en la que dejé investigando los ficheros que se cargaban en el arranque. El nombre de los ficheros parecían nombres aleatorios. Si borraba estos archivos del arranque, volvían a aparecer simultáneamente. Intenté acceder a los ficheros en system32 y borrarlos pero no me dejó. Los puse en cuarentena, con el antivirus, pero no sirvió de nada. En cambio lo que sí que sirvió fue moverlos desde la carpeta system32 al escritorio. Para que surgiera todo efecto, reinicié el sistema. Al iniciar dio un error de que no encontraba el fichero, pero después todo siguió bien. Ahora ya podía borrar el archivo del arranque de Windows.

Así lo hice con los demás, pero me aparecían nuevos ficheros en el arranque. Me di cuenta de que todos estos ficheros estaban en system32 y tenían un patrón común. Todos tenían nombres aleatorios, todos eran dll's y todos estaban ocultos. Me recorrí toda la carpeta system32 borrando uno a uno y comprobando que el nombre no me sonara a ningún archivo importante del ordenador. Al final los borré todos. Cuando reinicié, me dieron error unos cuantos de esos ficheros, como la primera vez que no los encontraba y no volvió a salir ningún mensaje.

Después de mucha investigación y mucho tiempo conseguí deshacerme de un virus que me temo que entró por medio de un pendrive prestado.

sábado, 16 de mayo de 2009

Maquetación con smarty

Estos últimos días he estado realizando un proyecto en el que he estado maquetando una página web previamente codificada en php con smarty. Debíamos actualizar la página del año pasado a la de este año y cambiar alguna de las funcionalidades de la misma. Yo había utilizado php muchas veces pero smarty lo había utilizado simplemente una vez y al final decidimos evitarlo ya que era más costoso maquetar el proyecto en smarty que hacerlo en php. Además en aquella ocasión no pensábamos reutilizarlo después.

Este proyecto está pensado para poder ser utilizado más adelante, por lo que el uso de smarty sí está justificado. Smarty, para el que no lo conozca es un motor de plantillas para php. De este modo se separa la parte funcional de nuestro sistema web de la parte de presentación. Eso fue un factor a favor para mí, ya que solo tenía que modificar las plantillas. Las plantillas de smarty suelen tener la extensión .tpl.

Cuando recibí la página web me encontré con una estructura bastante común. En el directorio raíz un main.php, config.php y un index.php. El index llamaba al main y el config era un fichero para configurar el servidor, la contraseña de acceso a la base de datos y alguna que otra cosa más. También me encontré con varias carpetas images, install, lib, modules, themes y upgrade. Más tarde comprobaría que solo utilizaría modules y themes, además de images, donde cambié alguna de las imágenes.

En la carpeta themes tenemos distintas plantillas para mostrar la página global. Estas plantillas controlan el aspecto de las pantallas típicas de nuestro sistema. Dentro me pude encontrar themes como ajaxian, carbon, classic, floatrix, etc. En nuestro caso descubrí que se usaba la plantilla matrix.

En la carpeta modules, tenemos los distintos módulos de cada una de esas páginas. También son presentación, pero a nivel mucho más bajo.

En realidad los cambios que tenía que hacer en la página eran cambios concretos, pero tenía que encontrar dónde estaba el código que tenía que tocar, y lo hallé a la vieja usanza, es decir, realizando una búsqueda de ciertos comentarios que aparecían en el código. Con la búsqueda de Windows se pueden realizar búsquedas de palabras, pero para frases es más complicado, por lo que me decidí a usar directamente el notepad++ para encontrarlo. Una vez encontrado el código es muy sencillo. Tenemos {foreach}{/foreach}, {if}{else}{/if}. Una vez encontrado el código donde tenía que tocar simplemente reutilicé otras funciones y trozos de código de otros sitios para completar la maquetación.

Comprobé que en la carpeta modules, tenía muchos apartados referentes a funcionalidades del código. Dentro de cada apartado tenía otros apartados y el que me interesaba era templates. Dentro de este último si quería modificar algo, debía crear una carpeta local, y en ella hacer una copia de la plantilla. El código automáticamente utiliza la plantilla que hay en local en vez de en el directorio superior. De este modo siempre se tiene una copia de la plantilla inicial.

Una vez finalizada la maquetación he comprobado que utilizar smarty sí es eficaz, ya que sin tocar el código funcional que alguien había creado, he modificado toda la parte de presentación en poco tiempo. Hay que tener cuidado de no utilizarlo en proyectos que no vayan a ser reutilizables porque sería una pérdida de tiempo, pero en proyectos como el que me he refierido en este artículo, es un ahorro de tiempo considerable.

domingo, 21 de septiembre de 2008

Vuelta al trabajo

Pues sí, empieza un nuevo curso en el que intentaré abriros las puertas a la informática. Explicaros lo que es hoy la informática, y lo que queremos que sea. Hacia dónde vamos y con qué obstáculos nos encontramos.

He empezado a trabajar en el IIC (Instituto de Ingeniería del Conocimiento) de la Universidad Autónoma de Madrid, así que intentaré ir transmitiéndo lo que vaya aprendiendo para que así todos podamos ir aprendiendo también.

Agradezco colaboraciones y participación y me encanta que me propongais temas o que me corrijais las cosas que creais que están mal.