03.02.2023

Преобразование звука в MIDI в реальном времени

Спустя 2,5 месяца работы я готов вам представить свою программу wave2midi. Она анализирует спектр нот в звуковом сигнале в реальном времени и на выдает на выходе MIDI события, которые можно записывать в таких программах, как MuseScore, или проигрывать в синтезаторе Yoshimi. Моя программа может воспринимать даже аккорды!

Программа работает в среде UNIX подобных систем с звуковой системой JACK Audio Connection Kit.

К ней можно подключать любые программы, поддерживающие JACK.

Я использую w2midi для того, чтобы получать звук синтезатора, играя на электрогитаре и для того, чтобы получать звук синтезатора своим голосом в микрофон! Вы можете придумать свой способ её использовать. Можно, например, для более точного распознавания пропускать входящий сигнал через компрессор, а выходящие ноты транспонировать (я думаю есть такие утилиты, если нет, то напишу).

>>> Видео демонстрация

Программа состоит из интерфейса командной строки (w2midi) и графического интерфейса (w2midi_qt). CLI часть написана на C99, а графическая — на C++ с использованием фреймворка Qt5.

w2midi распространяется под лицензией Apache 2.0, w2midi_qt под GPL-3.0-only.

Хочу обратить внимание на настройку:

  • Чем выше буфер, тем выше задержка и точность
  • Если программа улавливает лишние звуки, измените порог срабатывания в Дб

Программа распознает частоты с помощью преобразования Фурье, а конкретно, с помощью библиотеки FFTW3. Частоты преобразуются в ноты по простой формуле: 12 * \log_2 \frac{f}{d}, где f — полученная частота, d — опорная. Гармонический ряд — относителен, я считаю его относительно частоты 440 герц (нота ля первой октавы).

Отдельно хочу обратить внимание на обертоны. Если просто анализировать ноты по такому алгоритму, то получается настоящая какафония… Это из за того, что музыкальные инструменты издают не чистую синусоиду, а еще и дополнительные гармоники, называемые обертонами, придающие тембр. Но они нам не нужны во время записи нот. Чтобы их побороть я придумал очень простой алгоритм: из полутонов, стоящий в интервале (расстояние между нотами) секунда (1-2 полутона) выбирается самый громкий. Да, все так просто… В музыке НИКОГДА не используются секунды. Самое интересное, что об этом нигде не написано, просто заметил эмпирическим путём такое интересное свойство.

Вот такая история. Инструкции по сборке из исходных кодов находятся в README.

>>> Видео демонстрация

>>> Репозиторий w2midi

>>> Репозиторий w2midi_qt

>>> Просмотр (1920×1080, 1088 Kb)

Источник.