Как стать автором
Обновить

Комментарии 42

Я думаю, в части, касающейся получения хромограмм примерно так же. Оценка близости к «эталону» при помощи наивного Байеса и максимизации скалярного произведения на маску, вполне возможно, там тоже используется. А вот что касается применения «музыкальных познаний» — тут можно придумать много разных подходов. Думаю, что авторы Capo все же имеют куда больше опыта в автоматизированном анализе музыкальных записей, чем я, и используют более продвинутые подходы
*Мечтательно*
Вот бы первую часть, но чуть подробнее и обширнее...
Вы имеете в виду, поподробнее про «устройство» музыки?
Да, про это. Всегда хотелось разобраться, а вы так емко пишете, что хочется почитать еще )
Да оно вроде как не совсем по хабровской тематике получится — ни к программированию, ни к IT в целом музыка ведь прямого отношения не имеет :)
Почему же? Музыка — вполне себе абстрактный математический язык. Там есть всякие алгоритмы, последовательности и закономерности. Об этом как раз можно написать.
Посмотрите книжку Г.Е. Шилова «Простая гамма Устройство музыкальной шкалы.». Там это все очень подробно описано на школьном уровне.
Спасибо!
Что-нибудь такое?
7not.ru/theory/ — разве плохое начало? Оглавление курса там слева, не очень заметно.
Писал я диссер на эту тему (но не написал), распознавал звучащие ноты при помощи генетики. Основная проблема здесь — это исключить обертоны, которые могут маскировать тон (f0) другой ноты. Если обертоны исключены, то выделить f0 уже не составляет труда.
Для равномерно-темперированного строя можно попробовать точнее измерять частоты.
Октавные обертоны это не устранит, а вот иные — может! Обертоновая квинта будет звучать на несколько центов иначе, чем темперированная. И если при преобразовании Фурье эту разницу сохранить — то её можно использовать для устранения обертонов.
Аккорды обычно не подбирают к академической классической музыке… А насчёт рока и бардов всяких — я не очень уверен, что там при настройке инструментов разница в несколько центов… Ну Вы меня поняли :)
Очень сложно, хотя и интересно. СМО, Матанализ, Музыка, еще и Статдинамику приплели (буквально на днях была лекция про спектральный анализ с использованием оконной функции, без которой половину бы не понял). Не знаю, можно ли написать проще, но проделана очень большая работа. Спасибо за статью.
Спасибо за замечательную статью! Мои внутренние музыкант, программист и математик выражают восхищение! =)

Хотя я, честно сказать, люблю подбирать вручную, а теорию музыки предпочитаю индийскую. Но это так, к слову.
Статья отличная (7 лет «музыкалки» за пол-страницы — это нечто), но после фразы «умножаем эту маску скалярно на хромограмму, как будто это 12-мерные вектора» решил что пора закончить рабочий день.

ps: а что-нибудь из раннего Prodigy распознает? ;)
Когда то была идея таким же образом распознавать все «нотные частоты» и давить в ноль все что к ним не относится. Получалась такая себе «бюджетная минусовка». А если при этом разбивать на диапазоны — можна было бы получить «партии» разных инструментов (бас, гитара, крипка, пианино) и раскидать по каналам… но до реализации так и не дошел — не хватает заний по фурье (((
мне казалось, что именно так минусовки и делаются, нет?
Качественные минусовки можно сделать только подбором (если не рассматривать вариант каким-то образом заиметь оринигал). В некоторых простейших случаях может помочь метод вычитания каналов, основывающийся на том, что в стереозаписи голос часто пишется в моно, соответственно голосовая компонента строго синфазна, а музыкальные партии размазаны по стереопанораме. Если в такой записи вычесть один канал из другого, то останется один канал, но только с музыкой. На практике все не так радужно, но некий эффект дает. Возможно что сейчас есть и более продвинутые методы.
Да, пробовал такой способ, но не всегда голос «моно и строго по цетру», еще бывает ревер на одном из каналов, и тогда выходит… «плюсовка» с голосом как на вокзале (большом пустом зале издалека). А музыка потом звучит мякго говоря как из унитаза (((
Лучше не фурье, а вэйвлеты тогда уж.
Например, вот такие вэйвлеты.
Я думал насчет вейвлетов, когда только приступал к этой штуке. Но, почитав статьи в Википедии, понял, что ничего не понимаю :) И отказался от них в пользу знакомого со студенческих времен Фурье. Сейчас вот вернулся, перечитал — вроде стало понятно в общих чертах. Полезно было все-таки сначала самому покопаться руками в предмете изучения. Так что, возможно, вернусь к этой теме. Спасибо!
На том уровне, на котором это тут нужно, вейвлеты — это просто оконное преобразование Фурье с окном специфического вида. Т.е. это я гооврю про вейвлету Морле, поскольку все остальные изыски тут либо не будут работать, либо будут работать хуже. Ну а утилизировать основное преимущество ортогональных вейвлет (полнота при изменении масштаба вдвое) тут не удастся (да и в большинстве приложений на самом деле не удается), поскольку изменение частоты вдвое — это слишком грубая шкала.
О, как резко поднялось качество НЛО в части приглашений!
Добро пожаловать! Нам такие люди здесь нужны.
Спасибо за качественный (и грамотный во всех смыслах) материал.
Введение в теорию музыки на основе векторов и масок — это отлично.
Как не учившийся в музыкалке, никогда до конца не понимал эти аккорды и лады, а тут по одной странице понял.
Я ничего не понял, но
f2 / f1 = 21/12

похоже на артефакт копипаста, где съелась степень 2^(1/12).

Я видел пост не золотым.
> похоже на артефакт копипаста
Да, так и есть, спасибо! Верхние/нижние индексы «съелись» при копировании из Ворда, а я не заметил.
Насчет «незолотистости» — ну, я, когда это публиковал, думал, что меня матерые DSP-шники сразу тухлыми яйцами закидают. Я до этого эксперимента с подбором аккордов никогда ничем подобным не занимался, и наверняка значительная, если не бОльшая, часть того, что я тут написал, с профессиональной точки зрения полная ересь.
Еще посмею заметить один момент относительно студийных записей. Проблемы с распознаванием тона и несоответствие «Ля» 440 Гц связаны с мастерингом. На этом этапе композиция уже сведена, фонограмму максимизируют (поднимают RMS и прогоняют через жесткий компрессор — максимайзер), и часто продюссера результат «не кумарит»))) Поэтому принимается решение композицию ускорить/замедлить, соответственно, сдвигается основной тон. Да, существуют алгоритмы сжатия-растяжения по времени без изменения тона, но они негативно влияют на качество фонограммы, поэтому в этом случае не используются.
Труд проделан колоссальный! Когда-то давно задумывал что-то подобное, но прикинув объёмы и предстоящие трудности — не решился. Проблем на самом деле больше, чем вы пишите. Сигнал инструментов никогда не бывает строго синусным, так чтобы на спектрограмме строго стояла одна частота и больше ничего. Всегда будут обертоны и паразитные частоты. звучание струны во времени даст колебания уровней паразитов, тонов и обертонов. Т.е. если в динамике наблюдать за спектрограммой перемещающегося окна для преобразования Фурье — увидим плавающие по частоте пульсирующие максимумы. Точность работы БПФ зависит и от ширины выбранного окна. чем точнее она совпадает с периодом изучаемого сигнала, тем лучше результат. Домножение на весовое окно сильно улучшает ситуацию, но не до конца. Анализировать электрогитары — это еще сложнее. Перед выводом звук обрабатывается методами, искажающими статические АЧХ и ФЧХ сигнала и плюс добавляются эффекты, в которых используется преобразование задержанного выходного сигнала
На самом деле, подобный софт существовал ещё лет 15 назад, я тогда экспериментировал с ним. Он умел из WAV файла создавать MID. В реальности, конечно, на полноценной фонограмме он работать нормально не мог (хотя песню узнать можно было), а вот если один рояль звучит или одна гитара — очень даже неплохо получалось. Название, конечно, не вспомню, но работало это дело из командной строки DOS. ))

Гораздо более интересным с практической т. зрения, конечно, представляется алгоритм удаления голоса из плюсовки. Но пока иного софта кроме софта под названием «человек-аранжировщик» не придумали. ))
Был очень успешный проект — WIDI. Российская разработка. Название происходит от сокращения «wav2midi».

Я тоже этой темой занимался, писал курсовую. Остановился на том, что спектральный анализ посредством Фурье здесь не подходит, так как для достаточного разрешения по частоте нужно брать большой блок по времени, но не все звуки в музыке звучат достаточно долго для того, чтобы их хватило на блок достаточной длины. Если ставить цель распознавать ноты, звучащие до 20мс (50 изменений в секунду) — то преобразование Фурье с окнами плохо подходит.

Поэтому я в свое время занялся более прогрессивными методами спектрального анализа. Могу рекомендовать вейвлеты Морлета, непрерывное вейвлет-преобразование. Из публикаций: Kronland-Martinet R., Morlet J., Grossmann A. «Analysis of sound patterns through wavelet transforms» и другие статьи тех же авторов.

Также в последнее время развиваются методы время-частотного анализа на основе использования не только амплитудной, но и фазовой информации. Например, вот свежая статья: Timothy J. Gardner and Marcelo O. Magnasco «Sparse time-frequency representations». Этот метод — вообще бомба. Он как бы преодолевает принцип неопределенности Гейзенберга в определенных ситуациях, типичных для музыки. В статье метод не описан полностью, я пытался реализовывать его на основе того, что понял из статьи. Результаты получились интересные, хотя до практического применения дело не дошло.
А есть еще AKoff Music Composer
image
Можно выбирать способ отфильтровывания частот. Результат весьма интересный.
Спасибо! Надо будет почитать на досуге про sparse time-frequency representations. Пока нашел в интернете, посмотрел по диагонали — ничего не понял :) Надеюсь, при более подробном изучении удастся разобраться
> Если ставить цель распознавать ноты, звучащие до 20мс (50 изменений в секунду) — то преобразование Фурье с окнами плохо подходит.
К счастью, с такой скоростью даже Ингви Мальмстин не играет
Чтобы было легче разобраться — рекомендую сначала реализовать Morlet's wavelets. Когда наступит понимание этого метода — тогда можно ударяться и в sparse time-frequency, тем более что вейвлеты неявно используются в последнем методе в качестве исходного этапа обработки. Просто вейвлеты дают амплитудную и фазовую информацию, но обычно используется только амплитудная, т.к. фазу непонятно как интерпретировать. Но в методе sparse time-frequency предложен способ по фазовой информации уточнять амплитудную, что сужает линии на спектрограмме и позволяет точнее определять по ней ноты.

Насчет скорости 50изм/с — это не такое уж нереалистичное требование. Во-первых, в синтезаторной музыке, особенно всяких восьмибитных мелодиях, часто используются трели — быстрый перебор по нотам. Во-вторых, если играет одновременно несколько инструментов — то нота, взятая на любом из них, приводит к появлению нестационарности в сигнале, так что куски сигнала до взятия ноты и после ее взятия уже нельзя безнаказанно объединять в один блок для целей спектрального анализа.
Да уж, довольно быстро — 1/64 пои темпе 187,5. У Игоря Фёдоровича такого не было.)
Я как-то пытался по спектрограмме в плеере ноты разгадать, лол.
НЛО прилетело и опубликовало эту надпись здесь
из одной и той же струны, зажатой на одном и том же ладу, можно извлечь кучу разных звуков: все зависит от того как зажать и как дернуть — в это и состоит исполнительское мастерство. :) пост-обработка со звуками вообще творит чудеса.
для реальных записей разложение на 12 нот дает весьма грубую абстракцию. если бы все было бы так просто, это была бы не гитара, а какое-нибудь фортпепиано. :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации