Marsyas был бы отличным выбором для этого, он создан именно для такого рода задач.
Для настройки инструмента вам нужно иметь алгоритм, который оценивает фундаментальные
частота (F0) звука. Для этого существует ряд алгоритмов, один из самых новых и лучших
это алгоритм 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, что хотим прочитать файл в AudioFileName.
Оператор while затем циклически повторяется до тех пор, пока в SoundFileSource не закончатся данные. В то время как
Цикл, мы берем данные, которые сеть обработала, и выводим элемент (0,0), который является
оценка основной частоты.
Это даже проще, когда вы используете привязки Python для Marsyas.