Вопрос

Мне интересно, какую аудиотеку рекомендуется использовать?

Я пытаюсь создать небольшую программу, которая поможет в настройке инструментов.(Фортепиано, гитара и т.д.).Я читал об аудиотеках ALSA и Marsyas.

Я думаю, идея состоит в том, чтобы брать данные с микрофона, проводить анализ фрагментами по 5-10 мс (из того, что я прочитал).Затем выполните БПФ, чтобы определить, какая частота содержит наибольший пик.

Это было полезно?

Решение

Marsyas был бы отличным выбором для этого, он создан именно для такого рода задач.

Для настройки инструмента, что вам нужно сделать, это иметь алгоритм, который оценивает основную частоту (F0) звука.Для этого существует ряд алгоритмов, один из новейших и лучших алгоритм YIN, который был разработан Аленом де Шевеньем.Недавно я добавил алгоритм ИНЬ в Marsyas, и использовать его предельно просто.

Вот базовый код, который вы бы использовали в 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.Затем мы добавляем источник звукового файла, который вы можете использовать в формате .wav или .mp3.Затем мы добавляем объект ShiftInput, который выводит перекрывающиеся фрагменты звука, которые затем передаются в объект AubioYin, который оценивает основную частоту этого фрагмента звука.

Затем мы сообщаем источнику звукового файла, что хотим прочитать файл inAudioFileName.

Затем оператор while выполняет цикл до тех пор, пока в источнике звукового файла не закончатся данные.Внутри цикла while мы берем данные, которые обработала сеть, и выводим элемент (0,0), который является основной оценкой частоты.

Это еще проще, когда вы используете привязки Python для Marsyas.

Другие советы

Это руководство должно помочь.Не используйте ALSA для своего приложения.Используйте API более высокого уровня.Если вы решите, что хотели бы использовать JACK, http://jackaudio.org/applications имеет три настройки инструментов, которые вы можете использовать в качестве примера кода.

http://clam-project.org/ CLAM - это полноценная программная платформа для исследований и разработки приложений в области аудио и музыки.Он предлагает концептуальную модель, а также инструменты для анализа, синтеза и обработки аудиосигналов.

У них отличный API, приятный графический интерфейс и несколько готовых приложений, где вы можете увидеть все.

ALSA сейчас является своего рода стандартом по умолчанию для Linux, поскольку драйверы ядра включены в ядро, а операционные системы обесценились.Однако существуют альтернативы пользовательскому пространству ALSA, такие джек, который, по-видимому, нацелен на приложения профессионального типа с низкой задержкой.Похоже, у этого API более приятный API, хотя я им не пользовался, мое краткое знакомство с ALSA API заставило бы меня подумать, что почти все было бы лучше.

Дерзость включает функцию построения частотного графика и имеет встроенные фильтры БПФ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top