Marsyas будет отличным выбором для этого, он построен именно для такого рода задач.
Для настройки прибора вам необходимо иметь алгоритм, который оценивает базовую частоту (F0) звука. Для этого существует ряд алгоритмов, один из новейших и лучших - это алгоритм YIN, разработанный Ален де Чевинем. Недавно я добавил алгоритм YIN к 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;
}
Этот код сначала создает объект Series, который мы будем добавлять компоненты. В серии, каждый из компонентов принимает выходные данные предыдущей MarSystem в последовательном порядке. Затем мы добавляем SoundFileSource, который вы можете подать в файле .wav или .mp3. Затем мы добавляем объект ShiftInput, который выводит перекрывающиеся фрагменты звука, которые затем подаются в объект AubioYin, который оценивает основную частоту этого фрагмента звука.
Затем мы сообщим SoundFileSource, что мы хотим прочитать файл inAudioFileName.
Оператор while затем останавливается до тех пор, пока в SoundFileSource не закончится данные. Внутри цикла мы берем данные, которые сеть обработала и выдает элемент (0,0), который является базовой оценкой частоты .
Это еще проще, если вы используете привязки Python для Marsyas.