Marsyas sería una excelente opción para hacer esto, está diseñado exactamente para este tipo de tarea.
Para afinar un instrumento, lo que necesitas hacer es tener un algoritmo que estime la frecuencia fundamental (F0) de un sonido. Hay una serie de algoritmos para hacer esto, uno de los mejores y más nuevos es el algoritmo YIN, que fue desarrollado por Alain de Cheveigne. Recientemente agregué el algoritmo YIN a Marsyas, y usarlo es muy simple.
Este es el código básico que usaría en Marsyas:
MarSystemManager mng; // A series to contain everything MarSystem* net = mng.create("Series", "series"); // Process the data from the SoundFileSource with AubioYin net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("ShiftInput", "si")); net->addMarSystem(mng.create("AubioYin", "yin")); net->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName); while (net->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->to<mrs_bool>()) { net->tick(); realvec r = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); cout << r(0,0) << endl; }
Este código primero crea un objeto Serie al que le agregaremos componentes. En Serie, cada uno de los componentes recibe en serie la salida del MarSystem anterior. Luego agregamos un SoundFileSource, al que puede ingresar un archivo .wav o .mp3. Luego agregamos el objeto ShiftInput que genera fragmentos de audio superpuestos, que luego se alimentan al objeto AubioYin, que estima la frecuencia fundamental de ese fragmento de audio.
Luego le decimos a SoundFileSource que queremos leer el archivo en AudioFileName.
La declaración while luego se repite hasta que SoundFileSource se queda sin datos. Dentro del bucle while, tomamos los datos que la red ha procesado y generamos el elemento (0,0), que es la estimación de frecuencia fundamental.
Esto es aún más fácil cuando usa los enlaces de Python para Marsyas.
http://clam-project.org/CLAM es un marco de software completo para la investigación y el desarrollo de aplicaciones en el dominio del audio y la música. Ofrece un modelo conceptual así como herramientas para el análisis, síntesis y procesamiento de señales de audio.
Tienen una excelente API, una buena GUI y algunas aplicaciones terminadas donde puedes ver todo.
Esta guía debería ayudar. No utilice ALSA para su aplicación. Utilice una API de nivel superior. Si decide que le gustaría usar JACK, http://jackaudio.org/applications tiene tres afinadores de instrumentos que puede usar como código de ejemplo.
ALSA es una especie de estándar predeterminado para Linux ahora en virtud de que los controladores del kernel se incluyen en el kernel y el OSS se deprecia. Sin embargo, existen alternativas al espacio de usuario de ALSA, como jack, que parece estar dirigido a aplicaciones de tipo profesional de baja latencia. Su API parece tener una API mejor, aunque no la he usado, mi breve exposición a la API de ALSA me haría pensar que casi cualquier cosa sería mejor.