Pregunta

Estoy desarrollando un sistema como una ayuda a los músicos de la realización de la transcripción.El objetivo es realizar automático de música de la transcripción (no tiene que ser perfecto, ya que el usuario corregir fallos / errores más adelante) en un solo instrumento monofónico de grabación.¿Alguien aquí tiene experiencia en automático de música de la transcripción?O procesamiento de señal digital en general?Ayuda de alguien que es muy apreciado no importa cuál sea su formación.

Hasta ahora no se ha investigado el uso de la transformada Rápida de Fourier para la detección del tono, y una serie de pruebas, tanto en MATLAB y mi propio Java programas de prueba que han demostrado ser rápido y preciso suficiente para mis necesidades.Otro elemento de la tarea que tendrá que ser abordado es el de la pantalla de la producción de datos MIDI en la hoja forma de la música, pero esto es algo que no me preocupa ahora.

En breve, lo que estoy buscando es un buen método para la nota de la aparición de detección, es decir,la posición en la señal donde una nueva nota comienza.Como el lento comienzo puede ser muy difícil de detectar correctamente, yo en un principio será utilizar el sistema con piano grabaciones.Esto también es parcialmente debido al hecho yo toco el piano y debe estar en una mejor posición para obtener un adecuado grabaciones para la prueba.Como se indicó anteriormente, las primeras versiones de este sistema será utilizado por simple monofónico grabaciones, posiblemente progresando más tarde a los más complejos de entrada en función de los progresos realizados en las próximas semanas.

¿Fue útil?

Solución

Aquí está un gráfico que ilustra el umbral de acercamiento a la nota de la aparición de detección:

alt text

Esta imagen muestra un típico archivo WAV con tres discretas notas tocadas en la sucesión.La línea roja representa un elegido de la señal de umbral, y las líneas azules representan nota posiciones de inicio devuelto por un algoritmo simple que marca un inicio cuando el nivel de la señal cruza el umbral.

Como muestra la imagen, la selección de un adecuado umbral absoluto es difícil.En este caso, la primera nota es recogido bien, la segunda nota se perdió completamente, y la tercera nota (apenas) se inicia muy tarde.En general, un bajo umbral de causas a recoger fantasma de las notas, mientras que la recaudación le hace falta a las notas.Una solución a este problema es el uso de un umbral relativo que desencadena un inicio si la señal se incrementa en un porcentaje determinado durante un cierto tiempo, pero este tiene sus propios problemas.

La solución más sencilla es utilizar el algo contradictorio nombre de compresión (no compresión MP3 - eso es algo completamente distinto) en el archivo de onda en primer lugar.Compresión esencialmente aplana los picos en los datos de audio y, a continuación, amplifica todo lo que el audio está cerca de los valores máximos.El efecto en el ejemplo anterior quedaría así (que muestra por qué el nombre de "compresión" parece no tener sentido - en el equipo de audio es generalmente etiquetados "loudness"):

alt text

Después de la compresión, el umbral absoluto enfoque va a funcionar mucho mejor (aunque es fácil de sobre-comprimir y empezar a recoger ficción nota se inicia, el mismo efecto que la reducción del umbral).Hay un montón de onda de los editores, hay que hacer un buen trabajo de compresión, y es mejor dejar que ellos manejan esta tarea, usted probablemente tendrá que hacer una buena cantidad de trabajo de "limpieza" de sus archivos de forma de onda antes de la detección de notas en ellos de todos modos.

En la codificación de los términos, un archivo WAV se cargan en la memoria es esencialmente una matriz de dos bytes enteros, donde 0 representa la ausencia de señal y 32.767 y -32,768 representan los picos.En su forma más simple, un umbral de detección del algoritmo acaba de empezar en la primera muestra y leer a través de la matriz hasta que se encuentre un valor mayor que el umbral.

short threshold = 10000;
for (int i = 0; i < samples.Length; i++)
{
    if ((short)Math.Abs(samples[i]) > threshold) 
    {
        // here is one note onset point
    }
}

En la práctica esto funciona horriblemente, ya audio normal tiene todo tipo de transitorios picos por encima de un umbral determinado.Una solución es utilizar un promedio de intensidad de la señal (es decir,no marca un inicio hasta la media de los últimos n muestras está por encima del umbral).

short threshold = 10000;
int window_length = 100;
int running_total = 0;
// tally up the first window_length samples
for (int i = 0; i < window_length; i++)
{
    running_total += samples[i];
}
// calculate moving average
for (int i = window_length; i < samples.Length; i++)
{
    // remove oldest sample and add current
    running_total -= samples[i - window_length];
    running_total += samples[i];
    short moving_average = running_total / window_length;
    if (moving_average > threshold)
    {
        // here is one note onset point 
        int onset_point = i - (window_length / 2);
    }
}

Todo esto requiere de muchos ajustes y jugando con las configuraciones para llegar a encontrar las posiciones de inicio de un archivo WAV con precisión, y por lo general lo que funciona para un archivo no funcionan muy bien en otro.Este es un muy difícil y no-perfectamente-problema resuelto dominio que has elegido, pero creo que es genial que estás resolviendo.

Actualización:este gráfico muestra el detalle de la nota de detección de la I a la izquierda, a saber detectar cuando el fin de la nota:

alt text

La línea amarilla representa el umbral.Una vez que el algoritmo ha detectado una nota de inicio, se supone que la nota continúa hasta que el promedio de la intensidad de la señal cae por debajo de este valor (representado aquí por las líneas de color púrpura).Este es, por supuesto, otra fuente de dificultades, como es el caso de que dos o más notas que se superponen (polifonía).

Una vez que se han detectado los puntos de inicio y finalización de cada nota, usted puede ahora analizar cada rebanada de WAV archivo de datos para determinar las alturas.

Actualización 2:Acabo de leer tu actualizada pregunta.Cancha de detección a través de auto-correlación es mucho más fácil de implementar que el FFT si usted está escribiendo su propia desde cero, pero si usted ya ha comprobado y utilizado un pre-construidos de la FFT de la biblioteca, es mejor que use seguro.Una vez que haya identificado el inicio y parada de la posición de cada nota (y se incluyeron algunos relleno al principio y al final de la pasada de ataque y liberación de partes), ahora se puede sacar cada rebanada de datos de audio y pasarlo a una función FFT para determinar la cancha.

Un punto importante aquí es no utilizar una parte de los datos de audio comprimidos, pero en lugar de usar un trozo de la original, sin modificar los datos.El proceso de compresión distorsiona el audio y se puede producir un error en una cancha de la lectura.

Un último punto sobre la nota de los tiempos de ataque, es que puede ser un problema menor de lo que usted piensa.A menudo en la música un instrumento con un ataque lento (como un sintetizador) comenzará una nota antes de un ataque afilado instrumento (como un piano) y las dos notas se sonido como si estuvieran empezando al mismo tiempo.Si estás jugando instrumentos de esta manera, el algoritmo con recoger a la misma hora de inicio para ambos tipos de instrumentos, lo cual es bueno desde un WAV a MIDI perspectiva.

Última actualización (espero):Olvida lo que he dicho acerca de la inclusión de algunos de los rellenos de las muestras de los principios de ataque de parte de cada nota se me olvidaba esta es realmente una mala idea para la detección del tono.El ataque porciones de muchos instrumentos (especialmente el piano y otros de percusión-tipo de instrumentos) contienen transitorios que no son múltiplos de la frecuencia fundamental, y se tiende a meter la pata de detección de tono.Usted realmente desea iniciar cada rebanada un poco después del ataque por esta razón.

Ah, y el tipo de importante: el término "compresión" aquí no se refiere a MP3 compresión de estilo.

Actualización de nuevo:aquí es una simple función que no compresión dinámica:

public void StaticCompress(short[] samples, float param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        int sign = (samples[i] < 0) ? -1 : 1;
        float norm = ABS(samples[i] / 32768); // NOT short.MaxValue
        norm = 1.0 - POW(1.0 - norm, param);
        samples[i] = 32768 * norm * sign;
    }
}

Cuando param = 1.0, esta función no tendrá ningún efecto sobre el audio.Mayor param valores (2.0 es buena, que va a la plaza de la diferencia normalizada entre cada muestra y el máximo valor de pico) se producen más de compresión y una más fuerte en general (que mierda) de sonido.Los valores por debajo de 1.0, se producirá un efecto de ampliación.

Uno de los otros, probablemente, punto obvio:usted debe grabar la música en un pequeño, no ecoica habitación desde hace eco a menudo son recogidos por este algoritmo como el fantasma de notas.

Actualización:aquí hay una versión de StaticCompress que va a compilar en C# y explícitamente al que arroja todo.Esto devuelve el resultado esperado:

public void StaticCompress(short[] samples, double param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        Compress(ref samples[i], param);
    }
}

public void Compress(ref short orig, double param)
{
    double sign = 1;
    if (orig < 0)
    {
        sign = -1;
    }
    // 32768 is max abs value of a short. best practice is to pre-
    // normalize data or use peak value in place of 32768
    double norm = Math.Abs((double)orig / 32768.0);
    norm = 1.0 - Math.Pow(1.0 - norm, param);
    orig = (short)(32768.0 * norm * sign); // should round before cast,
        // but won't affect note onset detection
}

Lo siento, mi conocimiento de puntuación en Matlab es 0.Si usted publicado otra pregunta sobre el por qué de su función de Matlab no funciona como se esperaba obtener respuesta (no sólo por mí).

Otros consejos

Lo que quieres hacer a menudo se llama WAV-to-MIDI (google " wav-to-midi "). Ha habido muchos intentos en este proceso, con resultados variables (el inicio de la nota es una de las dificultades; la polifonía es mucho más difícil de tratar). Recomiendo comenzar con una búsqueda exhaustiva de las soluciones estándar, y solo comenzar a trabajar por su cuenta si no hay nada aceptable por ahí.

La otra parte del proceso que necesitaría es algo para representar la salida MIDI como una partitura musical tradicional, pero hay miles de millones de productos que lo hacen.

Otra respuesta es: sí, he procesado mucho la señal digital (vea el software en mi sitio web; es un sintetizador de software de voz infinita escrito en VB y C), y estoy interesado en ayudarlo con este problema. La parte WAV a MIDI no es realmente tan difícil conceptualmente, solo hace que funcione de manera confiable en la práctica que es difícil. El inicio de la nota solo establece un umbral: los errores se pueden ajustar fácilmente hacia adelante o hacia atrás a tiempo para compensar las diferencias de ataque de la nota. La detección de tono es mucho más fácil de hacer en una grabación que en tiempo real, e implica simplemente implementar una rutina de autocorrelación.

Debería mirar MIRToolbox Está escrito para Matlab y tiene un detector de inicio incorporado. Funciona bastante bien. El código fuente es GPL, por lo que puede implementar el algoritmo en cualquier idioma que funcione para usted. ¿Qué idioma usará su código de producción?

esta biblioteca se centra en el etiquetado de audio:

aubio

  

aubio es una biblioteca para etiquetado de audio. Sus características incluyen segmentar un archivo de sonido antes de cada uno de sus ataques, realizar la detección de tono, tocar el ritmo y producir transmisiones midi a partir de audio en vivo. El nombre aubio proviene de 'audio' con un error tipográfico: es probable que también se encuentren varios errores de transcripción en los resultados.

y he tenido buena suerte con él para la detección de inicio y la detección de tono. Está en c, pero hay envoltorios swig / python.

también, el autor de la biblioteca tiene un pdf de su tesis en la página, que tiene gran información y antecedentes sobre el etiquetado.

Los comienzos duros se detectan fácilmente en el dominio del tiempo mediante el uso de una medición de energía promedio.

SUMA de 0 a N (X ^ 2)

Haga esto con fragmentos de toda la señal. Debería ver picos cuando se produzca la aparición (el tamaño de la ventana depende de usted, mi sugerencia es de 50 ms o más).

Documentos extensos sobre detección de inicio:

Para ingenieros hardcore:

http://www.nyu.edu/classes/bello/MIR_files /2005_BelloEtAl_IEEE_TSALP.pdf

Más fácil de entender para la persona promedio:

http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

Podría intentar transformar la señal wav en un gráfico de amplitud frente al tiempo. Entonces, una forma de determinar un inicio consistente es calcular la intersección de una tangente en el punto de inflexión del flanco ascendente de una señal con el eje x.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top