2011-03-20 10 views
5

¿Hay alguna secuencia de comandos/software/algoritmo que permita convertir un archivo MIDI (o WAV) a una lista de <frequency, duration> para que podamos reproducir una "imagen" de este sonido archivo, por ejemplo, a través de la función System.Console.Beep(frequency, duration) en C#?Archivo MIDI o WAV a una matriz de frecuencias y duración

+2

Has hecho dos preguntas monstruosamente diferentes allí.MIDI y WAV son totalmente diferentes, no solo en el formato, sino también en todo el concepto de la forma en que almacenan el audio. MIDI almacena el audio como una serie de notas, y por lo tanto, es trivial extraer los pares de frecuencia y duración (no conozco ningún software específico para hacer esto, he escrito el mío para hacer eso de una manera muy hacky) . WAV es muestras digitales, por lo que necesitaría un software de análisis de frecuencia para sacar los datos de la nota. Eso es posible, pero no 100% exacto y una olla de pescado completamente diferente. Entonces, ¿qué quieres? – mgiuca

+0

Al menos, cómo hacer para el archivo MIDI (pero dígame también los principios para WAV, ya que tengo curiosidad, leí en alguna parte que FFT es insuficiente) – anonymous

+0

Es realmente una idea fascinante. Probablemente tome el archivo WAV, conviértalo al dominio de la frecuencia (por ejemplo, FFT) y luego aplique un modelo psicoacústico para elegir el "pitido" individual que un humano escucharía. Tipo del equivalente de audio de un filtro "impresionista" de Photoshop ... –

Respuesta

2

Necesita convertir el MIDI, WAV u otro archivo de sonido a muestras de audio en bruto. Luego, para bloques sucesivos de muestras (generalmente superponiendo cada bloque en un 50%), aplique una función de ventana (por ejemplo, Hanning), luego una FFT, luego tome la magnitud de los bucles de salida FFT, luego para el audio normalmente tomaría 20 * log10 de esta magnitud para obtener un valor de dB.

+1

+1, Esto está bien para WAV, pero no se moleste con este método para MIDI. Si tiene algo en MIDI, no lo sintetice y vuelva a leerlo. – Brad

+0

@Brad: depende de si solo quieres información de notas (que por supuesto puedes obtener directamente de los datos MIDI) o si quieres el espectro de audio completo: la pregunta del OP es bastante vaga sobre qué tipo de "imagen" quiere . –

+0

Tenga en cuenta que este método FFT dará las frecuencias espectrales aproximadas en el sonido, no la nota musical o las frecuencias de tono en la música. Las duraciones también se cuantificarán a los pasos de tiempo de las ventanas de FFT, que pueden o no ser una medida precisa de la duración de cualquier nota real o tono de ráfaga. – hotpaw2

1

La explicación de Paul R está bien para WAV.

Para MIDI, tendrá que elegir una pista y leer los datos MIDI. Cómo decide qué pista depende de usted, pero realmente solo puede elegir una, ya que solo obtiene una "nota" a la vez de la bocina de la PC, utilizando su método.

C# MIDI Tutorial: http://www.codeproject.com/KB/audio-video/MIDIToolkit.aspx

vez que haya leído sobre eso, usted debe saber cómo leer un archivo MIDI en A partir de ahí, se puede traducir a que las frecuencias y duraciones.. La duración depende del tempo y el número de tics que dura una nota, y el tono dependerá de un número de nota y su frecuencia correspondiente de acuerdo con equal temperament. (Si quieres volverte realmente loco, incluso podrías manejar afinaciones alternativas, pero no me preocuparía por el momento).

Además, creo que NAudio has some MIDI classes for reading files, pero es posible que no estén completos.

Mientras nos estamos volviendo locos ... si pudieras enhebrarlo de manera efectiva (esto sería casi imposible de imaginar, pero ...), para la reproducción de WAV, podrías usar PWM to drive the PC speaker and emulate PCM audio playback. Recuerdo algunos viejos DOS games from Necrobones solía hacer esto, y había un controlador para Windows 3.1 que funcionó muy bien en mi portátil de 33MHz para los clics y golpes habituales. Aunque este método de un marco administrado (o incluso dentro de Windows sin una prioridad en tiempo real) podría ser muy difícil.

2

Para MIDI, debe analizar el archivo usted mismo (lo que he hecho, y recomiendo las dos referencias siguientes: one y two), u obtener un conjunto de herramientas MIDI. No conozco ninguno para .NET pero here is a Google search.

Una vez que lo consigue, debería ser bastante fácil. Lea en el archivo MIDI utilizando el kit de herramientas, y esto le dará un conjunto de pistas. Cada pista contiene una secuencia de eventos, cada uno con una marca de tiempo relativa al evento anterior. Un evento puede ser "nota en", "nota desactivada" o uno de los cientos de otros eventos que probablemente no le interesen y puedan ignorar para este ejercicio. Solo busque los eventos "note on" y "note off". Por lo general, cada nota es una "nota activada" (con cierto tono y velocidad, que es volumen) seguida de una "nota desactivada" algún tiempo después (con el mismo tono y una velocidad de 0).

Así que armado con esta información, puede construir una tabla de notas con un cuádruple (hora de inicio, duración, altura, velocidad), donde la hora de inicio es la hora del evento "nota activada", la duración es la diferencia horaria entre "note on" y "note off", y pitch/velocity es el tono/velocidad de la "nota activada". Puede convertir el tono en frecuencia usando this formula.

En cuanto a WAV/MP3/AAC/OGG, todos tienen la misma técnica, que es lo que Paul sugiere en su respuesta.

Cuestiones relacionadas