Ответ 1
Marsyas был бы отличным выбором для этого, он был построен именно для такого рода задач.
Для настройки инструмента вам нужно иметь алгоритм, который оценивает фундаментальные частота (F0) звука. Для этого существует ряд алгоритмов, один из самых новых и лучших является алгоритмом YIN, который был разработан Ален де Чевином. Недавно я добавил алгоритм YIN к Марьясу, и использование его мертво просто.
Вот базовый код, который вы бы использовали в Марсии:
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.