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:
- (múltiples) de paso de estimación
- reconocimiento de instrumentos, modelado timbre
- detección de ritmo
- nota inicio/detección de desplazamiento
- 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
Marque esta posible duplicado, así http://stackoverflow.com/questions/1628071/programmatically-listening-to-sound-signal-processing/1628241#1628241 –
de [wav a la conversión de midi] (http://stackoverflow.com/questions/1897023/wav-to-midi-conversion) – finnw