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

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

★★

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

В музыке НИКОГДА не используются секунды.

В определенной серьезной классической музыке 20 века и позднее вполне используются. Но вряд ли кто-то будет твоей программой такое распознавать.

Поэтому идея с секундами отличная, просто и эффективно.

James_Holden ★★★★
()

Хоть музыкой не увлекаюсь, но респект за такой труд! Уверен многим пригодится

Sunderland93 ★★★★★
()

А задержка не слишком большая?

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

Я думаю, что автор очень большой молодец и что написал программу и что сделал видеопрезентацию, а не просто три строчки текстового описания. Кому-то такая вещь, очень возможно, даже пригодится. Мне нет, просто потому, что у меня есть миди-клавиатура и я на ней что-то несложное вполне способен наиграть руками, а тут, как я понял, всё-таки лаг. Но я вполне могу себе придумать применение этой программы в реальном живом выступлении (когда звук бедный, а на основе того что играет гитарист можно генерировать всякие «пады»)

Ещё я кое-что думаю про форму головы грифа, но это оффтоп.

ist76 ★★★★★
()

Сделано круто, настоящий любительский проект.

Интересно, а что за usb карта используется в демонстрации?

AVL2 ★★★★★
()

За peervideo зачёт. Да и за всё остальное тоже. Молодец.

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

Я слышал, что к ним драйвера есть, но блин цена, но все равно интересно, они реально без проблем работают в линуксе?

Вот прям как обычные аудиокарточки usb, воткнул и готово? Или там миллиард тонкостей с дистрибутивом, ядром и т.д.?

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

Тупо подрубаещь и работает. Даже firmware не нужен. Работает на любых дистрах, даже на одобренных ФСПО

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

Цена у них (для аудиоинтерфейсов) - считай, что даром. Не RME, чай.
Имей ввиду, у Скарлетов уже три ревизии вышло. С третьей были небольшие сложности, тут на форуме один из участников допиливал и, кажется, допилил.

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

Ясно, спасибо за предупреждение, на авито как раз много 2гн, а новые все 3 поколения.

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

Я, на. :) Первый абзац как-то проглядел. Спасибо, поправил.

hobbit ★★★★★
()

В музыке НИКОГДА не используются секунды

Имеется в виду малая секунда? Редко, но используется, у Sepultura, помнится :)

ЗЫ. какОфония

kott ★★★★★
()

весьма интересно, буду пробовать.

piyavking ★★★★★
()

или я не понял твою мысль

kott ★★★★★
()

В музыке ничего не понимаю, но простые и эффективные алгоритмы это круто.

kirill_rrr ★★★★★
()

Молодец. Я хотел такую программу писать для ZX-Spectrum в 1991 году. Но учитель в музыкалке сказал, что ему такую программу не надо.

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

А на каком языке?

Обычно писал в машинных кодах. Но сейчас понимаю, что вряд ли смог написать такое школьником, не зная разложения в ряды. Просто на уровне идеи было. Учитель по баяну подбирал музыку на слух, а я - нет, не слышал.

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

А я сейчас тоже школьник, 8 класс. Только я не осилил быстрое преобразование Фурье, только дискретное, поэтому взял готовое - FFTW3

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

как это не заменит? я втупил, когда подумал, что интервал в малую секунду вообще не используется

kott ★★★★★
()

Попробовал с гитарой.

Сразу напоролся на «какофонию», причина которой оказалась проста - была выставлена маленькая задержка у pipewire и мощности компа не хватало. Решилось увеличением задержки.

При работе программы, конечно, не получается магически превратить обычную гитару в гитарный синтезатор, не зря же у него с каждой струны отдельный канал сделан )))

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

Как это воспринимается на слух - зависит от MIDI инструмента. Когда я выбрал фортепиано, у меня извлечение одной ноты на гитаре приводит к исполнению целого пассажа ))) Вот дергаю ноту, и обертоны то цепляются то нет по мере изменения их громкости.

Если выбрать какой-то плавный PAD, то как раз получается неплохо, все ноты плавно накладываются и создается фон из взятого на гитаре аккорда.

Более неприятное явление - из-за особенностей гитары, взятая нота плавает, высота сразу четко не устанавливается. И звучит гамма из двух-трех нот подряд первую секунду. Серьезным образом эту проблему можно было бы решить, если использовать событие Pitch Bend.

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

Понял, я просто взял компромисс простота-качество

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

Интересно :) но мой алгоритм работает более менее

realbarmaley ★★
() автор топика

В музыке НИКОГДА не используются секунды.

Чтоа? Куча джазовых аккордов имеют секунду. Причем не на нотах разных октав, а на ближних нотах.

И прикинь, в гамме ДО-мажор есть аж две секунды. Вот это ничеси!

Но за программу однозначно зачет.

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

Речь об аккордах же, не о гамме. А так то в диатонической гамме 7 секунд, если от тоники до тоники считать. Секунда бывает большая и малая, если что.

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

в гамме ДО-мажор есть аж две секунды

Редко ми и фа, си и до играю вместе, но исключения, как вы сказали, джазовые аккорды

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

Речь об аккордах же, не о гамме. А так то в диатонической гамме 7 секунд, если от тоники до тоники считать. Секунда бывает большая и малая, если что.

Правильно, я про малую и написал.

Наложение последовательных нот друг на друга - это обычное дело, то есть даже аккорды не нужны чтобы алгоритм попал в такую ситуацию.

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

я думаю, имелось в виду малая секунда от тоники в аккордах

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