Признание тональности звука

У меня есть гитара, и мне нужен мой компьютер, чтобы узнать, какую ноту играет, узнавая тон. Можно ли это сделать в python, также возможно с pygame? Быть способным сделать это в pygame было бы очень полезно.

Чтобы распознать частоту звукового сигнала, вы должны использовать алгоритм FFT ( быстрое преобразование Фурье ). Насколько я могу судить, PyGame не имеет возможности записывать аудио и не поддерживает преобразование FFT.

Во-первых, вам нужно захватить необработанные данные с помощью звуковой карты; этот вид данных называется PCM (импульсно-кодовая модуляция). Самый простой способ захвата аудио в Python – использование библиотеки PyAudio (привязки Python к PortAudio). GStreamer также может это сделать, это, вероятно, слишком много для ваших целей. Захват 16-разрядных образцов со скоростью 48000 Гц довольно типичный и, вероятно, лучшая нормальная звуковая карта даст вам.

После того, как у вас есть исходные аудио данные PCM, вы можете использовать модуль fftpack из библиотеки scipy для запуска образцов с помощью преобразования FFT. Это даст вам частотное распределение анализируемого аудиосигнала, т. Е. Насколько сильным является сигнал в определенных полосах частот. Затем, это вопрос нахождения частоты, которая имеет самый сильный сигнал.

Возможно, вам понадобится дополнительная фильтрация, чтобы избежать гармонических частот, которые я не уверен.

Однажды я написал утилиту, которая делает именно это – она ​​анализирует, какие звуки воспроизводятся.

Вы можете посмотреть здесь код (или вы можете скачать весь проект, интегрированный с Frets On Fire, героем с открытым исходным кодом героя, чтобы создать настоящего героя гитары). Он был испытан с использованием гитары, гармоники и свистов 🙂 Код уродливый, но он работает 🙂

Я использовал pymedia для записи и scipy для FFT.

За исключением основополагающих, которые другие уже отмечали, я могу дать вам несколько советов:

  1. Если вы записываете с микрофона, есть много шума. Вам нужно будет использовать множество пробных ошибок, чтобы установить пороговые значения и методы очистки звука, чтобы заставить его работать. Одно из возможных решений – использовать электрогитару и подключить ее выход к аудиовходу. Это работало лучше для меня.
  2. В частности, существует много шума около 50 Гц. Это не так плохо, но его обертоны (см. Ниже) находятся на частоте 100 Гц и 150 Гц, и это близко к гитаре G2 и D3 …. Как я уже сказал, мое решение состояло в том, чтобы переключиться на электрогитару.
  3. Существует компромисс между скоростью обнаружения и точностью. Чем больше образцов вы выберете, тем дольше вам понадобится обнаружить звуки, но вы будете более точно определять точный шаг. Если вы действительно хотите сделать проект из этого, вам, вероятно, придется использовать несколько временных масштабов.
  4. Когда воспроизводится тоны, он имеет обертоны . Иногда, через несколько секунд, обертоны могут быть даже более мощными, чем базовый тон. Если вы не справитесь с этим, ваша программа подумает, что он услышал E2 в течение нескольких секунд, а затем E3. Чтобы преодолеть это, я использовал список звуков, воспроизводимых в настоящее время, и тогда, пока эта заметка или один из ее обертонов имели в ней энергию, я предположил, что она играет ту же самую ноту.
  5. Особенно сложно определить, когда кто-то играет одну и ту же ноту 2 (или более) раз подряд, потому что трудно различить это и случайные колебания уровня звука. Вы увидите в моем коде, что мне пришлось использовать константу, которую нужно было настроить в соответствии с используемой гитарой (по-видимому, каждая гитара имеет свой собственный характер колебаний мощности).

Вам нужно будет использовать аудио-библиотеку, такую ​​как встроенный аудиопроигрыватель .

Анализ конкретной ноты, которую играет, не является тривиальным, но может быть сделано с использованием этих API.

Также может быть полезно: http://wiki.python.org/moin/PythonInMusic

Очень похожие вопросы:

  • Обработка звука – распознавание тона
  • Обнаружение шага в реальном времени
  • Обнаружение тангажа в реальном времени с использованием FFT

Обращение звука в последовательность заметок нелегко, особенно с несколькими нотами сразу. Прочтите результаты Google для «оценки частоты» и «распознавания примечаний».

У меня есть некоторые примеры оценки частоты Python , но это лишь часть того, что вам нужно решить, чтобы получать записи с гитарных записей.

Эта ссылка показывает, что кто-то делает это в VB.NET, но основы того, что нужно сделать для достижения вашей цели, зафиксированы в этих ссылках ниже.

  • STFT
  • Колли Тьюки
  • FFT