Marsyas serait un excellent choix pour ce faire, il est construit exactement pour ce genre de tâche.
Pour régler un instrument, vous devez avoir un algorithme qui estime la fréquence fondamentale (F0) d'un son. Il existe un certain nombre d'algorithmes pour cela, l'un des plus récents et meilleurs est l'algorithme YIN, qui a été développé par Alain de Cheveigne. J'ai récemment ajouté l'algorithme YIN à Marsyas, et l'utiliser est mort simple.
Voici le code de base que vous utiliseriez dans 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;
}
Ce code crée d'abord un objet de la série que nous allons ajouter des composants à. Dans une série, chacun des composants reçoit la sortie du système MarSystem précédent en série. Nous ajoutons ensuite un SoundFileSource, que vous pouvez charger dans un fichier .wav ou .mp3 dans. Nous ajoutons ensuite l'objet ShiftInput qui génère des morceaux d'audio qui se chevauchent, qui sont ensuite introduits dans l'objet AubioYin, qui estime la fréquence fondamentale de ce morceau d'audio.
Nous indiquons ensuite à SoundFileSource que nous voulons lire le fichier dans NomFichierAudio.
L'instruction while effectue ensuite une boucle jusqu'à ce que SoundFileSource ne dispose plus de données. A l'intérieur de la boucle , nous prenons les données que le réseau a traitées et sortons l'élément (0,0), qui est l'estimation de fréquence fondamentale .
Ceci est encore plus facile lorsque vous utilisez les liaisons Python pour Marsyas.