LINUX.ORG.RU

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

 , , , ,


6

4

Спустя 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

★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от realbarmaley

Я писал это другому комментатору, у которого в гамме почему-то 2 секунды всего )))

James_Holden ★★★★
()

Вот это я понимаю, царский пост - зайти в галерею со своим проектом. Да еще и по музыке.

Респект.

P.S. Дальше в каментах прочел возраст автора. Дважды респект. Я бы в школе подобное не осилил.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

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

это абсолютная неправда, но в остальном очень одобряю

когда-нибудь когда у меня снова будет компьютер и время, обязательно протестирую (например, как оно будет настоящее пианино в midi-клавиатуру превращать)

в общем, как здесь раньше говорили джва года (а на самом-то деле гораздо дольше) мы ждали эту фичу

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

наверняка комментаторы выше уже поинтересовались, но от чего такая комбинация? особенно обидно за -only, конечно

ps: отдельный респект за notabug и peertube

caryoscelus
()
Ответ на: комментарий от caryoscelus

наверняка комментаторы выше уже поинтересовались, но от чего такая комбинация?

Если честно, получилась случайно.

only из за того, что я не очень люблю подписывать неизвестную лицензию.

realbarmaley ★★
() автор топика
Ответ на: комментарий от samy_volosaty

Если сильно хочется подтяжки я могу написать, там несложно, строк 20 кода в w2midi выйдет и один флажок в w2midi_qt

realbarmaley ★★
() автор топика
Последнее исправление: realbarmaley (всего исправлений: 1)

Как непрофессиональный музыкант, играл в духовом оркестре любительском на всех не тростниковых духовых инструментах, закончил на басу Б-2 в басовом ключе, а так же игравшем дома на баяне, я хочу выразить автору - огромную признательность за его труд!

Так держать! Была бы система лайков, я бы поставил максимально возможный!

Спасибо, за Ваш труд. Очень интересная тема. Не теряйтесь, её надо развивать! Я так думаю.

Mamluk
()
Ответ на: комментарий от realbarmaley

only из за того, что я не очень люблю подписывать неизвестную лицензию.

понимаю. проблема-то остро проявляется в тот момент, когда уже есть много сторонних коммитов, а потом надо по каким-то причинам (например, совместимость с другой библиотекой) обновиться и сделать это очень сложно. как вариант, можно попробовать написать, что автору передаётся право перелицензировать проект (включая все сторонние коммиты) под новую версию gpl

caryoscelus
()
Ответ на: комментарий от realbarmaley

Если сильно хочется подтяжки я могу написать, там несложно, строк 20 кода в w2midi выйдет и один флажок в w2midi_qt

ну пока не знаю.

заманчиво попробовать приспособить для съёма чего-нибудь...

samy_volosaty ★★★★★
()
Ответ на: комментарий от realbarmaley

кстати....

process->start("w2midi"

тут бы путь указать.... может опционально... если не хочется PATH менять

samy_volosaty ★★★★★
()
Последнее исправление: samy_volosaty (всего исправлений: 1)
Ответ на: комментарий от kott

+, моя программа хорошо работает с другими через jack. Можно то есть выход через транспозер пропустить

realbarmaley ★★
() автор топика
Ответ на: комментарий от James_Holden

Я сделал питч распознввание потяжек, только получилось не очень… Не хватает разрешения по частоте. То есть подтяжки гуляют на +- 500 центов (половина полутона)…

Короче читаю методы распознавания частоты кроме FFT, перепишу все. Вместо CLI будет SO+CLI и SO+GUI. Thread safety, Ну и много других переработок.

realbarmaley ★★
() автор топика
Ответ на: комментарий от James_Holden

Я собрал пакет для debian, можно скачать и установить

realbarmaley ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.