2010-01-24 26 views
8

Soy nuevo en este campo, pero necesito realizar una conversión de WAV a MIDI en java. ¿Hay alguna manera de saber cuáles son exactamente los pasos involucrados en la conversión de WAV a MIDI? Tengo una idea muy aproximada de lo que necesita; muestree el archivo wav, filtéelo, use FFT para análisis espectral, extracción de características y luego escriba las características extraídas en MIDI. ¿Pero no puedo encontrar fuentes sólidas o documentos sobre cómo hacer todo eso? ¿Puede alguien darme pistas sobre cómo y por dónde empezar? ¿Hay alguna API de código abierto disponible para este proceso de conversión de WAV a MIDI?conversión wav-a-midi

Gracias anticipadas

+0

Marque esta posible duplicado, así http://stackoverflow.com/questions/1628071/programmatically-listening-to-sound-signal-processing/1628241#1628241 –

+0

de [wav a la conversión de midi] (http://stackoverflow.com/questions/1897023/wav-to-midi-conversion) – finnw

Respuesta

26

Es un proceso más complicado de lo que pueda imaginar.

Este problema de investigación a menudo se conoce como transcripción de música: el acto de convertir una representación de bajo nivel de música (por ejemplo, forma de onda) en una representación de alto nivel como MIDI o incluso partituras.

La sofisticación de su solución dependerá de la complejidad de sus datos de entrada. Toneladas de trabajos de investigación abordan la transcripción de música solo en piano monofónico o batería ... porque son fáciles de transcribir. (Relativamente). El violín es más difícil. La voz es aún más difícil. Violín más voz más piano es mucho más difícil. Una sinfonía es casi imposible. Te dan la imagen.

Los elementos básicos de la transcripción de música implican cualquiera de las siguientes áreas superpuestas:

  1. (múltiples) de paso de estimación
  2. reconocimiento de instrumentos, modelado timbre
  3. detección de ritmo
  4. nota inicio/detección de desplazamiento
  5. modelado de estructura/estructura

Busque documentos sobre "transcripción de música" en Google Scholar o en los procedimientos de ISMIR: http://www.ismir.net. Si estás más interesado en uno de los subtemas anteriores, puedo señalarte más. Buena suerte.

EDITAR: Dicho esto, existen soluciones existentes que todos podemos encontrar en la web. Siéntase libre de probarlos. Pero a medida que lo haga, evalúelos con ojo crítico y oído. ¿Qué tipos de señales de audio causarían la falla de la transcripción?

EDIT 2: Ah, usted solo está haciendo esto para piano. De acuerdo, esto es factible. La transcripción musical ha avanzado hasta el punto en que puede transcribir el piano monofónico bastante bien. Un concierto de Rachmaninov todavía planteará problemas.

Nuestras recomendaciones dependen de su objetivo final. Usted declara "necesita para realizar ... en Java." Entonces, parece que lo único que quieres es que algo funcione, independientemente de cómo te lleve allí. En ese caso, estoy de acuerdo al 100% con los demás: use algo que exista.

Esa es en realidad una pregunta interesante; todas las bibliotecas MIR que conozco son típicamente C/C++/Python/Matlab. Pero no Java. El EchoNest tiene una API de Java, pero no creo que tenga una transcripción a nivel de notas. http://developer.echonest.com. (Editar: Es hace transcripción a nivel de nota. Los datos devueltos incluyen tono, timbre, ritmo, tatum y más.Pero creo que la polifonía sigue siendo un problema.)

Oh, Marsyas está basado en Java. Guay. Pensé que era solo C++. http://marsyas.info/ Lo recomiendo. Fue desarrollado por George Tzanetakis, un profesor en MIR. Hace análisis de nivel de señal y debería ser una buena opción.

Ahora, si esto es para una experiencia de aprendizaje divertida, creo que puede utilizar las utilidades de manipulación de sonido en Java para experimentar con la señal WAV y ver qué sale.

EDIT: Esta página describe el software MIR mejor que puedo: The Tools We Use

para MATLAB, usted puede estar interesado en el MIR Toolbox

Aquí es una buena página de conjuntos de datos comunes: MIR Datasets

+0

Gracias por los consejos Steve. Estoy pensando en wav-midi solo para la interpretación de piano.Pensé que la transcripción de música solo está generando una partitura de música digital, gracias por corregirme. Necesito grabar un piano tocando una pieza de música y generar un archivo midi (archivo midi iewrite de archivo wav), capturando la mayoría de las características musicales de tono, dinámica, tiempo, ritmo, frases, tonos, articulación, etc. para ser utilizado para el procesamiento. Es posible capturarlos directamente desde midi, pero a partir de wav, no puedo pensar por dónde empezar. Tendré que investigar en las áreas que dijiste primero. Gracias Steve – Dolphin

+0

¿Tengo que usar Matlab para este proceso e integrarme con Java? Gracias anticipadamente Steve. Realmente pintó la imagen más grande. – Dolphin

+1

De nada. Ver mi respuesta a los comentarios en la publicación original. –

4

Este es una empresa muy grande para ser nuevo en el campo, a menos que quiera decir que está familiarizado con el análisis de señales y la detección de características en general y desea ver más específicamente la transcripción automática.

No hay API para la conversión de WAV a MIDI. Vamp es un marco para los complementos de extracción de características, pero para realizar la transcripción automática necesitaría usar toda la funcionalidad de los complementos existentes, además de implementar la funcionalidad que aún no existe en ninguno de ellos.

Examine las descripciones de los complementos en the vamp download page, las descripciones que no comprende son temas que debe comenzar investigando si desea hacerlo.

+0

Gracias por las sugerencias Smith. Al menos ahora sé que no tiene sentido buscar API que lo haga. ¿Puedes usar complementos con decir java code? Extracción de características: ¿tengo que usar algoritmos? Solo porque sé un algoritmo, ¿cómo puedo ponerlo en el código? ¿Tendré que usar Matlab e integrarme con un lenguaje (digamos Java)? ¿Puedes darme una foto? Gracias de nuevo Smith – Dolphin

+1

Vamp usa C, C++. ¿No hay complementos de Java y esos recursos? Eso sería más útil. ¿Cómo puedes usar complementos en código java? Gracias anticipadas – Dolphin

+1

Java no se ve tan a menudo en el procesamiento/análisis de señales porque es relativamente intensivo en la CPU, y hasta hace poco el hardware no era lo suficientemente rápido para hacer este tipo de cosas en Java a velocidades aceptables. Parece que Steve encontró una buena ventaja sin embargo. Para un enfoque de nivel superior, también existe la posibilidad de utilizar un entorno como csound http://csounds.com/, que proporciona una gran cantidad de herramientas para sintetizar y analizar el sonido con menos preocupaciones sobre la asignación y liberación explícita de memoria de lo que obtendría con C. –

3

Si no necesita automatizar esta tarea (es decir, para un sitio web donde la gente puede cargar archivos MP3 y recuperar archivos MIDI), debería considerar usar una herramienta como Melodyne que ya es bastante buena. Como señaló Steve, esta es una tarea muy difícil de lograr, e incluso los mejores algoritmos y soluciones presentes en este momento no son 100% confiables.

Así que si solo está haciendo un trabajo de estudio y necesita hacer algunas conversiones, probablemente le ahorrará un poco de tiempo (y muchos dolores de cabeza) utilizar una herramienta ya diseñada para esta tarea.

1

Dolphin, disculpe por ser brusco, pero ha subestimado por completo el problema. Lo que desea lograr, una transcripción de sonido de piano completa que incluya todos los parámetros que se utilizaron durante la reproducción, necesitaría una enorme cantidad de investigación con personas que han trabajado en el campo durante muchos años. Incluso un grupo de doctores en procesamiento de señales tendría que invertir mucho trabajo para acercarse incluso a lo que usted quiere decir. La transcripción de música ha necesitado décadas de trabajo para incluso funcionar a mitad de camino. Te sugiero que elijas un problema diferente que puedes manejar mejor que esto.

1

Este es un campo que todavía está muy en desarrollo, sin embargo, hay algunos algoritmos (experimentales) disponibles.

Puede instalar el anotador sónico y usar algunos plugins de vamp.

Por ejemplo:

./sonic-annotator file.wav -d vamp:qm-vamp-plugins:qm-transcription:transcription -w midi 

./sonic-annotator file.wav -d vamp:silvet:silvet:notes -w midi 

./sonic-annotator file.wav -d vamp:ua-vamp-plugins:mf0ua:mf0ua -w midi