Marsyas byłby świetnym wyborem do zrobienia tego, jest zbudowany specjalnie do tego rodzaju zadań.
Do dostrajania instrumentu należy użyć algorytmu, który szacuje podstawową częstotliwość dźwięku (F0) . Istnieje wiele algorytmów, aby to zrobić, jednym z najnowszych i najlepszych jest algorytm YIN, który został opracowany przez Alaina de Cheveigne. Niedawno dodałem algorytm YIN do Marsyas, a użycie go jest proste.
Oto podstawowy kod, który trzeba zastosować w Marsjaszem:
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;
}
Ten kod najpierw tworzy szereg obiektów, które dodamy do komponentów. W serii każdy ze składników odbiera dane wyjściowe poprzedniego systemu MarSystem w postaci szeregowej. Następnie dodajemy SoundFileSource, który można nakarmić w pliku .wav lub .mp3 w. Następnie dodajemy obiekt ShiftInput, który wyprowadza zachodzące na siebie fragmenty audio, które następnie są przesyłane do obiektu AubioYin, który szacuje podstawową częstotliwość tego fragmentu audio.
Następnie przekazujemy SoundFileSource, że chcemy odczytać plik wAudioFileName.
Instrukcja while zapisuje się w pętli, aż do wyczerpania danych SoundFileSource. Wewnątrz pętli pobieramy dane przetwarzane przez sieć i wyprowadzamy element (0,0), który jest podstawową estymatą częstotliwości .
Jest to jeszcze łatwiejsze, gdy używasz powiązań Python dla Marsyas.