AIMP Forum

AIMP for Windows => Плеер / Player => Предложения / Suggestions => Звуковой движок / Sound Engine => Topic started by: techtuner on October 21, 2011, 17:16:30

Title: Сведение треков (Harmonic Mixing)
Post by: techtuner on October 21, 2011, 17:16:30
В AIMP определённо стоит реализовать сведение треков по bpm с использованием "beatmix X" с использованием Keycodes (http://en.wikipedia.org/wiki/Harmonic_mixing (http://en.wikipedia.org/wiki/Harmonic_mixing)) - это сведение по битам аудио трека (в ритм), где X - произвольно выбираемое значение битов для сведения. Эта технология широко используется в программах для DJ (например MixMeister Fusion), но ни в одном плеере подобной штуки ещё не встречал. Степень удобства и комфорта прослушивания с этой технологией увеличивается в разы.
А в аудио библиотеке стоит реализовать сканирование музыки с целью определения Keycodes (характеризует тон песни) для более точного сведения треков, да и для более удобного прослушивания.
В MixMeister сведение на автомате реализовано на 5, просто закидываешь песни с близкими bpm, keykode's и получаешь в результате MEGAMIX в прямом смысле слова! Ошибок сведения практически нету, а качество на высоте! Важно отметить, что на всю настройку сведения треков тратится совсем не много времени.
Если данные функции реализовать, то уверен, что у AIMP конкурентов не останется.
Title: Re: Сведение треков
Post by: Soolo on October 21, 2011, 17:31:14
нашёл похожую тему https://www.aimp.ru/forum/index.php?topic=29483.0 Вы такое предлагаете?
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on October 21, 2011, 17:38:37
ага, искал такую тему - не нашел, но я здесь добавил Keycodes - это, пожалуй, основное в сведении, т.е. если просто тональность треков совпадает, то даже в режиме crossfade треки неплохо сводятся, хотя для полного счастья нужно добавить сведение по bpm и сделать beatmix 8 или beatmix PingPong. А здесь написано подробнее: http://www.dj.ru/forum/index.php?showtopic=26563 (http://www.dj.ru/forum/index.php?showtopic=26563), в том числе и точность определения keycode современными программами.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Фагот on October 22, 2011, 10:26:55
Это может быть использовано, когда вы поригрываете один жанр композиций, а когда у вас коллекция на 200гиг различной музыки это теряет смысл. Не вижу особой нужды в такой фишке.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on October 23, 2011, 13:58:32
Ради эксперимента специально в плейлист MixMeister добавил  музыку следующих жанров: Dance, Club, Hip-Hop, Lounge, Pop; упорядочил все песни по KeyCode, перенес музыку с KeyCode соответствующим G-ноте в основной плейлист, а далее упорядочил получившееся по bmp. В результате песни фактически разделились по жанру, т.е. lounge оказались в области с низким bpm (это естественно), hip-hop - чуть выше, dance, club - с bpm порядка 120-130 (pop оказались в области жанра с KeyCode соответсвующем A-ноте). Разумеется не обошлось и без ошибок определения KeyCode + bmp (для lounge bpm оказался порядка 140-160 - из-за гармоник пианино, содержащихся в песнях, спорный релаксационный эффект от песни с таким "второстепенным" bpm, не так ли? Основной явно не превышал 90-100).
Ещё пытались микшироваться hip-hop и lounge, т.к. у них bpm и keycode совпадали. Не знаю насколько это верно, всё же жанры несколько отличны и keycode как бы должен отличаться (MixMeister почему-то не определяет мажорные композиции, может быть поэтому?).

Итого достоинства следующие:
1. Keycode + bpm во многом определяют жанр музыки;
2. Возможность выбрать музыку "по настроению", как в технологии "Sense Me" в Sony WALKMAN;
3. Если мы вычислим bpm, то, потенциально мы сможем сводить треки в ритм! - это, пожалуй, основное (но хорошо сводятся, правда, только песни с одинаковыми или близкими значениями KeyCode);

To Fagot: а вы 200 ГБ музыки в одном плейлисте держите? У меня лично всё в той или иной мере рассортировано по жанрам и можно смело добавить в плейлист какую-нибудь папку с большим количеством песен одного жанра, рассортировать их все по keycode+bpm и наслаждаться воспроизведением прекрасно сведённых композиций.

А теперь касательно практической составляющей. За два дня сделал программу в LabVIEW, которая позволяет считывать сигнал с микрофона, сразу же выводить звук на динамики, строить осциллограмму и спектр сигнала - всё делается в RealTime (собственно ничего особо ресурсоёмкого тут нет). Потом решил определить BPM того сигнала, который записывается: сначала пробовал использовать bandpass фильтр (в области 1-3 Гц), потом определять пики - безрезультатно, BPM определялся близко, но погрешность была большой, варьировал пределы и метод фильтрации и т.п. - никакого полезного эффекта это не принесло.
Затем попробовал использовать автокорреляционную функцию (АКФ) (по сути тот же спектр, но с хорошей детализацией НЧ диапазона) - на осциллограмме появился всплеск, соответствующий частоте BPM (и точность была хорошей), но только для ритмичной музыки, типа туц-туц. Для музыки с электрогитарой был прям провал - на АКФ полностью отсутствовал пик, характерный для BPM.
Пришел к выводу, что надо использовать кросс-корреляционную функцию. Впринципи она позволяет определить не только BPM, но и задержку между двумя сигналами (как в DJ аппаратуре).
Если будут предложения касательно наиболее оптимального алгоритма определения BPM (в том числе с определением диапазона тактов музыки), с удовольствием прочту.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Фагот on October 23, 2011, 18:09:36
Да, я чаще слушаю общий плейлист, нежели разбитый по жанрам.
Если вы напишете плагин, то тем самым бесспорно нам поможете. Иметь такой плагин было бы хорошо.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on October 23, 2011, 22:13:36
Вроде сделал программку в LabVIEW, работает, но как-то не очень стабильно, bpm определяется в 70% случаев верно, погрешность -  десятые доли процента, если решение не расходится. Но в моем алгоритме слишком сильная обратная связь, поэтому он расходится, надо это будет исправить. Потенциально, в используемом мной методе определения BPM можно также расставить границы семплов для дальнейшего сведения в ритм двух песен, было бы класно.
Насчёт плагина - не уверен.  Если можно было бы LabVIEW проект сконвертировать хотя бы в С, возможно это и можно, но я в этом ещё не разбирался. Тогда бы и алгоритм ресемплера оттуда взять можно было (он там стандартный, качественный и работает отлично и быстро). Delfi - не знаю, учить не буду.
В LabView используются стандартные функции, которые порой очень сложно реализовать на языке программирования самому, но в моём алгоритме специфической функцией является только функция кросс-корреляции, работающая через FFT.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on October 27, 2011, 00:08:25
Нашел новую информацию касательно оптимального алгоритма поиска BPM: http://werner.yellowcouch.org/Papers/bpm04/ (http://werner.yellowcouch.org/Papers/bpm04/) - это одна из первых статей Werner Van Belle касательно определения BPM, датированная 2000 годом. В статье предлагается технология определения BPM с погрешностью <0.01%, но у данного алгоритма недостаточный процент правильного определения, часто находится BPM кратный основному (1.5, 2 и т.п.).
Это было в 2000 году, на данный момент, используя тот же принцип, но с существенными модификациями: можно определить BPM с той же точностью, с гораздо более высокой скоростью, но процент попадания на правильный tempo выше ~95%.
Данный алгоритм был включен в программу BpmDj http://bpmdj.yellowcouch.org/aftersplash.html (http://bpmdj.yellowcouch.org/aftersplash.html) (для ОС Linux). Программа распространяется по GNU лицензии с открытым исходным кодом, так что подпрограммы определения BPM (а заодно и "цвета" музыки, ритма и композиции) можно оттуда взять. Код написан на С++.
Я применил первую версию алгоритма для своей программы на LabVIEW - точность действительно превосходная, но не всегда определяются правильные пики на BPM-графике, и ещё следует переработать алгоритм поиска BPM, т.к. пока что расчёт ведется очень долго (Werner Van Belle написал статью касательно ускорения расчёта в 6000 раз, так что оптимизация последует).
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on November 05, 2011, 21:47:43
На LabVIEW я всё же "победил" алгоритм поиска BPM, о котором рассказывал раньше. Расчёт BPM занимает достаточно длительное время - 5-30% от исходного времени песни (для одного ЦП 3.0 ГГц). Такой большой разброс связан с индивидуальными особянностями аудиотреков, в среднем получается порядка 7-8% от времени песни. Точность ~0.01%.
Есть ещё один алгоритм (я бы назвал его одним из наиболее распростаненных) - метод с использованием FFT для огибающей кривой. Он позволяет очень быстро (в 4-10 раз быстрее) определить BPM с приемлемой (но недостаточной) точностью.
Как один из вариантов - сначала использовать FFT алгоритм, а потом применить метод трассировки, чтобы увеличить точность (и уменьшить количество промахов на соседние tempo).
Так что разработка идёт, надо теперь разбираться с FFT...
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on November 23, 2011, 23:00:04
Новая информация:
1. Оптимизировал алгоритм расчёта BPM, теперь непосредственно расчёт BPM занимает совсем незначительное время ~0.75-0.9% от времени песни, но, правда, если учитывать скорость считывания WAV файла (MP3 пока не пытался считывать), то скорость расчёт падает до ~2% от времени песни;
2. Используется "гибридный" алгоритм расчёта - сначала FFT envelope, потом алгоритм трассировки - для уточнения; в итоге получил точность расчёта 0.005%. Раньше BPM рассчитывался с точностью 0.001%, но она достижима только с использованием типа данных DOUBLE, а это СУЩЕСТВЕННО увеличивает объём занимаемой оперативной памяти (вдвое :-) ) + уменьшается скорость расчёта ~ на 20-30%. Но, я считаю, что 0.005% - это очень хорошая точность. Использование "гибридного" способа расчёта BPM позволило почти полностью избавиться от промахов в расчёте tempo;
3. Узнал об одной очень интересной функции LabVIEW - а именно о ток как создавать !!! dll !!! из готовых проектов! Т.е. потенциально мой код можно будет подключить к AIMP! По крайней мере теоретически никаких проблем в совместимости возникнуть не должно, сам LabVIEW сам написан помоему на С++ (или на С);
4. Тут же сразу возникает вопрос: как реализована потоковая обработка аудио в AIMP? Используются маленькие массивы данных типа SINGLE (32bit)? Или загружается аудио файл целиком, потом обрабатывается (слишком это маловероятно)? Где подробнее можно узнать?
Дело в том, что мой алгоритм, пока что, используется весь аудио файл целиком. Я понимаю, что это далеко не самый оптимальный способ расчёта BPM, как относительно скорости вычисления, так и относительно объёма занимаемой оперативной памяти (в первых версиях кода использовалось ~1-2 Гб оперативной памяти, сейчас ~ 150 Мб на песню длиной 5 мин). Основная проблема заключается в том, что сам алгоритм основан на том, что время аудио-семпла должно быть велико. В данный момент приходится использовать стандартный ресемплер LabVIEW (который, кстати, не вносит погрешностей в сигнал, в отличие от AIMP'овского и он тоже есть в виде DLL) для уменьшения размера массива. Но, видимо, придется сделать последовательное считывание и обработку семплов из файла, надеюсь, что это реально сделать. Учитывая то, каких результатов удалось добиться в MixMeister - это реально!
Вобщем что хотел рассказать-уже рассказал. Разработка продолжится как появится свободное время.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Heaven`s A Lie on November 23, 2011, 23:45:30
Да, я чаще слушаю общий плейлист, нежели разбитый по жанрам.
Если вы напишете плагин, то тем самым бесспорно нам поможете. Иметь такой плагин было бы хорошо.
Да, такие штуки надо делать плагиниально - внесение в сам плеер будет его перегружать.
Я за плагин, хоть мне он и не нужен, я люблю метал, которых не располагает к сведению.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: techtuner on February 03, 2012, 11:58:17
Вчера чисто случайно нашел новую программу PIONEER MIXTRAX. Её функциональность на 100% повторяет те требования, которые выдвигались к Harmonic Mixing в AIMP, и даже немного больше!

Программа, разработанная PIONEER, изначально предназначалась для создания плейлистов для устройств, поддерживающих новую технологию MIXTRAX (она даже в портативных плеерах реализована!), но кто нам мешает просто её скачать http://mixtraxnet.com/support/download/index_ru.html (http://mixtraxnet.com/support/download/index_ru.html) и наслаждаться результатами её работы!

В ней реализовано:
1. Библиотека мультимедиа с возможностью выставить "тип" песни (Pop, Hip-Hop, Dance, Chill...) как в атоматическом режиме в процессе сканирования, так и в ручном.
2. Сканирование песен и расчёт BPM и оптимальных Keycode (напрямую Keycode не выводятся, но они вычисляются 100%, иначе свести треки правильно вряд ли получится).
3. Возможность выбора длины трека при автоматическом воспроизведении (Короткий-_-_-Длинный).
4. Используются разные типы сведения аудио (Fade, Flanger, High-Pass Filter, Low-Pass Filter, Echo, Noise, Crush). Большинство из них очень качественно сводят треки...
5. Smart Shuffle - автоматическое перепостроение плейлиста для правильного сведения треков!
6. Приятный дизайн программы.
7. Шильдик Pioneer  :)

Субъективно, ПО разработано действительно качественно. Всё работает именно так, как надо. Получается свести даже Pop-Dance жанр музыки, и два вокалиста друг-другу "не мешают"... это достигается за счёт использования разных эффектов миксинга.

BPM определяется быстро и верно. Скорость работы, кстати, была бы такая же, как и в моей программе, написанной в LabVIEW  8) +-25%, если бы Pioneer использовал все ресурсы ЦП, а т.к. он использует только 50% (и это правильно!), сканирует он раза в два дольше моего ПО, и абсолютное время сканирования составляет 4-5% от длины трека.
Из всех просканированных мной треков BPM не определился только у двух "песен" - длиной 6 и 10 секунд. Правда там и ритма никакого не было - только голос.

Smart Shuffle, по утверждению Pioneer, расставляет треки с учетом BPM и тональности песен. Треки действительно грамотно расставляются, с учетом тональности трека, но не исключена возможность сведения треков одинаковой тональности, но разных жанров. Если использовать "папку" одного жанра, то всё ОК.

Программа пока что относительно новая и ещё будет развиваться (пока что версия 1.1.0). Например, ещё не реализованы некоторые методы сведения, которые уже реализованы !в магнитоле! Pioneer DEH-6400SD.
Стоит сказать СПАСИБО инженерам Pioneer за столь качественный продукт.

Что касается разработки плагина для AIMP... ПО на LabVIEW уже есть, но его надо портировать в С++, делать свою собственную медиа библиотеку, т.к. напрямую к AIMP подключить не получится... Вобщем дел вагон, а вот целесообразности разработки подобного плагина я не вижу - только один человек поинтересовался по поводу разработки данного ПО, а остальным, видимо, это не нужно.

Так что кому действительно нужна такая функциональность от плеера - рекомендую перейти на MIXTRAX.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: oleg.vygovskijj on February 29, 2012, 15:47:34
Я работаю звукооператором в Дк -использую АИМП на мероприятиях и хотелось бы чтобы звук на конце уходил до--5000 msec!!!!!!
Title: Re: Сведение треков (Harmonic Mixing)
Post by: ramx on April 30, 2012, 07:18:36

Что касается разработки плагина для AIMP... ПО на LabVIEW уже есть, но его надо портировать в С++, делать свою собственную медиа библиотеку, т.к. напрямую к AIMP подключить не получится... Вобщем дел вагон, а вот целесообразности разработки подобного плагина я не вижу - только один человек поинтересовался по поводу разработки данного ПО, а остальным, видимо, это не нужно.
Согласен с Фагот, такой плагин имеет право на жизнь!
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Я Гриша! on April 22, 2013, 17:59:17
Добавьте пожалуйста голосование! По теме За
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Zero on April 22, 2013, 18:32:58
Добавьте голосование, проголосую за.
З.Ы. Не стоит ожидать реализации данной идеи..., хотя...
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Я Гриша! on April 22, 2013, 19:30:54
Ну почему... BPM же появился! может со временем как логическое продолжение будет и такой функционал
Title: Re: Сведение треков (Harmonic Mixing)
Post by: Zero on April 22, 2013, 20:28:08
Ну почему... BPM же появился! может со временем как логическое продолжение будет и такой функционал
Троеточие после слова "хотя" символизирует мои ожидания и надежды по сабжу.
Title: Re: Сведение треков (Harmonic Mixing)
Post by: BratishkA on May 08, 2013, 18:06:42
А мне идея очень понравилась, я бы хотел такой плагин,
Title: Re: Сведение треков (Harmonic Mixing)
Post by: kuzduk on December 30, 2015, 18:36:47
Скажите. Плагин сей существует? Может есть другой плагин для ритмичного сведения?