У меня есть гитара, и мне нужен мой компьютер, чтобы узнать, какую ноту играет, узнавая тон. Можно ли это сделать в python, также возможно с pygame? Быть способным сделать это в pygame было бы очень полезно.
Признание тональности звука
Ответ 1
Чтобы распознать частоту звукового сигнала, вы должны использовать алгоритм FFT (быстрое преобразование Фурье). Насколько я могу судить, PyGame не имеет возможности записывать аудио и не поддерживает преобразование FFT.
Во-первых, вам нужно захватить необработанные дискретизированные данные со звуковой карты; этот вид данных называется PCM (импульсно-кодовая модуляция). Самый простой способ захвата аудио в Python - это библиотека PyAudio (привязки Python к PortAudio). GStreamer также может это сделать, это, вероятно, излишний для ваших целей. Захват 16-разрядных выборок со скоростью 48000 Гц довольно типичный и, вероятно, лучшая нормальная звуковая карта даст вам.
После того, как у вас есть исходные аудио данные PCM, вы можете использовать модуль fftpack
из scipy library для запуска образцов с помощью преобразования FFT, Это даст вам частотное распределение анализируемого аудиосигнала, то есть насколько сильный сигнал в определенных полосах частот. Затем, это вопрос поиска частоты, которая имеет самый сильный сигнал.
Вам может потребоваться дополнительная фильтрация, чтобы избежать гармонических частот Я не уверен.
Ответ 2
Однажды я написал утилиту, которая делает именно это - она анализирует, какие звуки воспроизводятся.
Вы можете посмотреть код здесь (или вы можете скачать весь проект, интегрированный с Frets On Fire, героем гитары, открытым source clone, чтобы создать настоящего героя гитары). Он был протестирован с использованием гитары, гармоники и свистов:) Код уродливый, но он работает:)
Я использовал pymedia для записи и scipy для FFT.
За исключением основ, которые уже отмечались другими, я могу дать вам несколько советов:
- Если вы записываете с микрофона, есть много шума. Вам нужно будет использовать множество пробных ошибок, чтобы установить пороговые значения и методы очистки звука, чтобы заставить его работать. Одно из возможных решений - использовать электрогитару и подключить ее выход к аудиовходу. Это работало лучше для меня.
- В частности, существует много шума около 50 Гц. Это не так уж плохо, но его обертоны (см. Ниже) находятся на частоте 100 Гц и 150 Гц, и это близко к гитаре G2 и D3.... Как я уже сказал, мое решение состояло в том, чтобы переключиться на электрогитару.
- Существует компромисс между скоростью обнаружения и точностью. Чем больше образцов вы выберете, тем дольше вам понадобится обнаружить звуки, но вы будете более точно определять точный шаг. Если вы действительно хотите сделать проект из этого, вам, вероятно, придется использовать несколько временных масштабов.
- Когда воспроизводятся тоны, он имеет обертоны. Иногда, через несколько секунд, обертоны могут быть даже более мощными, чем базовый тон. Если вы не справитесь с этим, ваша программа подумает, что он услышал E2 в течение нескольких секунд, а затем E3. Чтобы преодолеть это, я использовал список звуков, воспроизводимых в данный момент, а затем, пока эта заметка или один из ее обертонов имели в ней энергию, я принял на себя ту же самую ноту, которую играли....
- Особо трудно обнаружить, когда кто-то играет одну и ту же ноту 2 (или более) раз подряд, потому что трудно различать это и случайные колебания уровня звука. Вы увидите в моем коде, что мне пришлось использовать константу, которую нужно было настроить в соответствии с используемой гитарой (по-видимому, каждая гитара имеет свой собственный характер колебаний мощности).
Ответ 3
Вам нужно будет использовать аудио-библиотеку, такую как встроенный audioop.
Анализ конкретной ноты, которую играет, не является тривиальным, но может быть сделано с использованием этих API.
Также может быть полезно: http://wiki.python.org/moin/PythonInMusic
Ответ 4
Очень похожие вопросы:
- Обработка аудио - распознавание тональности
- Обнаружение тангажа в реальном времени
- Обнаружение тангажа в реальном времени с использованием FFT
Включение звука в последовательность заметок нелегко, особенно с несколькими нотами одновременно. Прочтите результаты Google для "оценки частоты" и "распознавания примечаний".
У меня есть некоторые примеры оценки частоты Python, но это лишь часть того, что вам нужно решить, чтобы получать записи с гитарных записей.