Marsyas sería una gran opción para hacer esto, está diseñado para este tipo de tarea.
Para sintonizar un instrumento, lo que debe hacer es tener un algoritmo que calcule la frecuencia fundamental (F0) de un sonido. Hay una serie de algoritmos para hacer esto, uno de los más nuevos y mejores es el algoritmo YIN, que fue desarrollado por Alain de Cheveigne. Recientemente agregué el algoritmo YIN a Marsyas, y su uso es muy simple.
Aquí está el código básico que usaría en Marsias:
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 crea primero un objeto de la serie que vamos a añadir componentes a. En una serie, cada uno de los componentes recibe la salida del MarSystem anterior en serie. Luego agregamos un SoundFileSource, que puede alimentar en un archivo .wav o .mp3 en. A continuación, agregamos el objeto ShiftInput que produce superposición de fragmentos de audio, que se introducen en el objeto AubioYin, que estima la frecuencia fundamental de ese fragmento de audio.
Luego le decimos a SoundFileSource que queremos leer el archivo enAudioFileName.
La instrucción while luego se repite hasta que SoundFileSource se quede sin datos. Dentro del ciclo while , tomamos los datos que la red ha procesado y sacamos el elemento (0,0), que es la estimación de frecuencia fundamental .
Esto es incluso más fácil cuando utiliza los enlaces de Python para Marsyas.