AIMP Forum

AIMP для Windows => Skin Editor / Skin Engine => Вопросы => Topic started by: Aleksandr009 on September 27, 2016, 16:20:43

Title: Вариации Эквалайзера.
Post by: Aleksandr009 on September 27, 2016, 16:20:43
Сделал 3-хполосный темброблок (эквалайзер). Кривая - синусоида.
Title: Re: 3-хполосный темброблок
Post by: Black_AVP on September 27, 2016, 17:41:14
За энтузиазм уже +1 поставил.
Title: Re: 3-хполосный темброблок
Post by: Aleksandr009 on September 27, 2016, 17:58:38
За энтузиазм уже +1 поставил.
Кривая, конечно, далека от нужной. Таких изломов не должно быть. У ВЧ-фильтра она вообще получилась зеркальной.
АЧХ каждого фильтра имеет форму, близкую к параболе, симметричную относительно центральной частоты.
Чтоб было понятнее, набросал несколько вариантов сочетаний разных положений регуляторов.
Спасибо. Но это было пока так для примера. Про форму и сам догадался. Также думаю, что при симметрии это не парабола, а скорее синусоида.
Теперь надо подумать как-бы это рассчитать.
Title: Re: 3-хполосный темброблок
Post by: Aleksandr009 on September 28, 2016, 15:40:53
О да! Я это смог сделать!  ;D
Идеальная кривая - синусоида. Для расчёта коэффициентов использовал 2 синусоиды - 0.5+0.5sin(pi*x/9-pi/2) и 0.5+0.5sin(pi*x/8-pi/2).

Обновил файл в первом посте!
Title: Re: 3-хполосный темброблок
Post by: Aleksandr009 on September 28, 2016, 16:29:35
Ещё немного обновил!
       
Не сразу мысль пришла что формулу синусоиды можно прямо в скрипт запихнуть. Теперь расчёт будет поточнее. 
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 28, 2016, 17:03:18
Молодец, Александр! Жаль, плюсик пока не поставить - сутки не прошли. В твоём возрасте мне тоже казалось, что ничего невозможного на свете нет.
Скрипт можно ещё немного оптимизировать, если вспомнить про циклы, писанины будет меньше.
Для ВЧ-фильтра вместо 8-ми строчек это будет выглядеть так:

for N:= 1 to 8 do
  EQ.Set('BandValue' + IntToStr(N + 10), (((State - 1499)/200 * (1 + sin(pi * N / 8 - pi/2))) + ((M - 1499)/200 * (1 + sin(pi * (8 - N) / 8 - pi/2)))));

Но, остаётся одна маленькая неприятность: пользователь может из диалога DSP изменить твою АЧХ любым движком, в своём 2-полосном я это дело заблокировал.
Жаль, что в наших скинах аппаратуры это не применить - трёхполосные регуляторы тембра, практически, не встречаются.
Как вариант, можно было пойти несколько по другому пути: регуляторы подключить не к скрипту, а к нужным полосам эквалайзера 31, 1к, 16к, а в скрипте считывать эти значения, тогда скрипт окажется независимым от State (возможно, даже, будет один на всё) и блокировать регуляторы будет проще.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 28, 2016, 18:03:11
Молодец, Александр! Жаль, плюсик пока не поставить - сутки не прошли. В твоём возрасте мне тоже казалось, что ничего невозможного на свете нет.
Скрипт можно ещё немного оптимизировать, если вспомнить про циклы, писанины будет меньше.
Для ВЧ-фильтра вместо 8-ми строчек это будет выглядеть так:

for N:= 1 to 8 do
  EQ.Set('BandValue' + IntToStr(N + 10), (((State - 1499)/200 * (1 + sin(pi * N / 8 - pi/2))) + ((M - 1499)/200 * (1 + sin(pi * (8 - N) / 8 - pi/2)))));

Но, остаётся одна маленькая неприятность: пользователь может из диалога DSP изменить твою АЧХ любым движком, в своём 2-полосном я это дело заблокировал.
Жаль, что в наших скинах аппаратуры это не применить - трёхполосные регуляторы тембра, практически, не встречаются.
Как вариант, можно было пойти несколько по другому пути: регуляторы подключить не к скрипту, а к нужным полосам эквалайзера 31, 1к, 16к, а в скрипте считывать эти значения, тогда скрипт окажется независимым от State (возможно, даже, будет один на всё) и блокировать регуляторы будет проще.

Спасибо!  Оптимизацией может позже займусь.

И хотел узнать как вы у себя заблокировали в 2-полосном?


Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 28, 2016, 18:16:04
Да, ещё, если вспомнить формулы приведения из школьной тригонометрии, вычисления ещё можно несколько упростить:
sin(a - pi/2) = - cos(a).

И хотел узнать как вы у себя заблокировали в 2-полосном?
Вот тут, как раз коммутаторы и понадобятся. Надо собрать значения всех бендов эквалайзера, просуммировать их, а результат подать на скриптовый счётчик. Получится, что он будет срабатывать при любом изменении любой полосы. В этом месте я как раз на грабли попервости и наступил - ошибся с модулем счётчика.  Хотя на самом деле всё просто: биндинг возвращает значения в диапазоне -1500..0..1500, умножить на 18, получим 27000, и столько же прибавить (в общем коммутаторе), чтобы результат не был отрицательным - для счётчика это недопустимо. Получается, что модуль должен быть не менее 54000.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 28, 2016, 18:55:41
Кстати, подобным образом, наверное, можно построить и 5- и 7-полосный эквалайзер - вот это уже будет более актуально и востребовано.
А если получится, можно пойти и дальше - сделать эквалайзер с изменяемым числом полос по желанию поьзователя.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 28, 2016, 19:36:38
Кстати, подобным образом, наверное, можно построить и 5- и 7-полосный эквалайзер - вот это уже будет более актуально и востребовано.
А если получится, можно пойти и дальше - сделать эквалайзер с изменяемым числом полос по желанию поьзователя.
Да, построить и 5- и 7-полосный (ну и другое число) эквалайзер будет легко- надо лишь изменить дробь под число полос.
А вот второе будет очень сложно.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 29, 2016, 14:18:47
Добавил версию с оптимизированными скриптами!
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 15:52:31
Добавил версию с оптимизированными скриптами!
Так, конечно, лаконичнее смотрится. Осталось ещё лишние скобки покуцать.
Но, что интересно, я вчера ещё попробовал оптимизировать твой скрипт, правда, дальше ВЧ-фильтра не ушёл, вышло так:
  for N:= 1 to 8 do
    EQ.Set('BandValue' + IntToStr(N + 10), ((State - 1499) * (1 - cos(pi * N /8)) +
      (M - 1499) * (1 - cos(pi * (8 - N) /8))) / 200);

Старался, всё-таки, следовать законам тригонометрии, что sin(a - pi/2) = - cos(a), а в твоём примере, вижу, что остался "+". У меня с плюсом не работает, а утебя с минусом. В чём загадка?
И ещё, почему в некоторых местах вычитается константа 1499, а вдругих - 1500. Правда эта единичка на результате, практически, не скажется.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 29, 2016, 16:12:30
Так, конечно, лаконичнее смотрится. Осталось ещё лишние скобки покуцать.
Но, что интересно, я вчера ещё попробовал оптимизировать твой скрипт, правда, дальше ВЧ-фильтра не ушёл, вышло так:
  for N:= 1 to 8 do
    EQ.Set('BandValue' + IntToStr(N + 10), ((State - 1499) * (1 - cos(pi * N /8)) +
      (M - 1499) * (1 - cos(pi * (8 - N) /8))) / 200);

Старался, всё-таки, следовать законам тригонометрии, что sin(a - pi/2) = - cos(a), а в твоём примере, вижу, что остался "+". У меня с плюсом не работает, а утебя с минусом. В чём загадка?
И ещё, почему в некоторых местах вычитается константа 1499, а вдругих - 1500. Правда эта единичка на результате, практически, не скажется.
Подправил всё.
Загадок нет! А из тригонометрии почти ничего не помню так как про неё не вспоминал давно. Просто я коэффициенты N поменял местами в сумме.
1499 пропустил не исправил везде должно быть 1500, так как при 1499 минимальное значение регуляторов -14.99dB.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 16:30:46
Вся наша оптимизация в скриптах сводится, в основном, к сокращению писанины, а скрипт-движок её всё одно сожрёт - ни быстрее, ни медленнее работать в скине не будет, так что, особо с этим заморачиваться не стОит.
+1 тебе ещё за труды.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 29, 2016, 16:35:16
Вся наша оптимизация в скриптах сводится, в основном, к сокращению писанины, а скрипт-движок её всё одно сожрёт - ни быстрее, ни медленнее работать в скине не будет, так что, особо с этим заморачиваться не стОит.
+1 тебе ещё за труды.
Сейчас вроде-бы уже некуда оптимизировать.
Спасибо и вам за советы!
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 16:46:18
Заметил одну неприятность: если движок 31Гц находился до запуска плеера не в 0, или его принудительно сдвинуть, то при изменении СЧ или ВЧ-регуляторов получается такая "бяка". Надо, видимо, и его в рассчёты включить.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=54358.0;attach=48051)
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 29, 2016, 17:05:09
Заметил одну неприятность: если движок 31Гц находился до запуска плеера не в 0, или его принудительно сдвинуть, то при изменении СЧ или ВЧ-регуляторов получается такая "бяка". Надо, видимо, и его в рассчёты включить.
Так и с другими. Они вообще не были изначально включены в расчёт. И в ВЧ случайно попал из вашего примера.
Но теперь я везде добавил их.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 17:21:40
Так и с другими. Они вообще не были изначально включены в расчёт. И в ВЧ случайно попал из вашего примера.
Но теперь я везде добавил их.
Этот фильтр (31 Гц), вообще, особняком стоит в эквалайзере. Если заметил, то все остальные идут через полоктавы, а этот - через октаву, относительно 63 Гц, получается, как бы пропущена полоса 43 Гц. А для полноты не хватает ещё и 20 кГц.
Во всех эквалайзерах 1 кГц - это центральная частота, у нас же слева от неё 9 полос, а справа - 8 - несимметрия.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 29, 2016, 17:25:33
Этот фильтр (31 Гц), вообще, особняком стоит в эквалайзере. Если заметил, то все остальные идут через полоктавы, а этот - через октаву, относительно 63 Гц, получается, как бы пропущена полоса 43 Гц. А для полноты не хватает ещё и 20 кГц.
Во всех эквалайзерах 1 кГц - это центральная частота, у нас же слева от неё 9 полос, а справа - 8 - несимметрия.
Поэтому и пришлось использовать 2 синусоиды.
А если добавить ещё 2 слева, то ещё более несимметрично будет при центре 1 кГц.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 17:39:54
Поэтому и пришлось использовать 2 синусоиды.
А если добавить ещё 2 слева, то ещё более несимметрично будет при центре 1 кГц.
Имелось в виду эквалайзеры с нечётным числом полос, как и в этом случае - 3. Но в любом случае частоты идут с равным шагом. В реальной аппаратуре часто встречаются эквалайзеры с 20 и 10 полосами - там уже не имеет значения, которая частота будет центральной.
Здесь, наверное, можно пойти было на некоторое упрощение: устанавливать движок 31 Гц в то же состояние, что и 63 Гц, т.е. АЧХ на этом участке будет просто прямой, тогда и сохранится симметрия относительно 1 кГц.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 29, 2016, 17:42:26
Имелось в виду эквалайзеры с нечётным числом полос, как и в этом случае - 3. Но в любом случае частоты идут с равным шагом. В реальной аппаратуре часто встречаются эквалайзеры с 20 и 10 полосами - там уже не имеет значения, которая частота будет центральной.
Здесь, наверное, можно пойти было на некоторое упрощение: устанавливать движок 31 Гц в то же состояние, что и 63 Гц, т.е. АЧХ на этом участке будет просто прямой, тогда и сохранится симметрия относительно 1 кГц.
А сделать центральными 2 - 700 Гц и 1 кГц?
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 17:49:46
А сделать центральными 2 - 700 Гц и 1 кГц?
Можно, конечно, но что тогда писать на этом регуляторе? Во всех 3-полосных темброблоках, что я встречал, даже в нашей аппаратуре, регулятор СЧ - это 1 кГц. Крайние регуляторы могут иметь и другие частоты, но в реалии их характеристики далеки от совершенства и АЧХ может иметь приличную неравномерность. Здесь же мы можем получить почти идеальную кривую.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 29, 2016, 20:05:31
Решил таки добить свою идею с коммутаторами:
... Надо собрать значения всех бендов эквалайзера, просуммировать их, а результат подать на скриптовый счётчик. Получится, что он будет срабатывать при любом изменении любой полосы.
Получился один скрипт, причём средние частоты, оказывается, и рассчитывать не нужно.
Регулировать можно как отдельными тремя слайдерами, так и в самом эквалайзере слайдерами 31 Гц, 1 кГц и 16 кГц, остальные блокированы.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Starkad on September 30, 2016, 07:49:13
Отличная работа - по +1. Я сперва реализовал трехполосный темброблок без использования тригонометрических формул, поэтому изменения получились линейными. Пока собирался обдумывать нелинейное изменение, ВЫ уже все сделали красиво. Для многих это будет очень удобно. Спасибо.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 30, 2016, 09:15:48
Решил таки добить свою идею с коммутаторами:Получился один скрипт, причём средние частоты, оказывается, и рассчитывать не нужно.
Регулировать можно как отдельными тремя слайдерами, так и в самом эквалайзере слайдерами 31 Гц, 1 кГц и 16 кГц, остальные блокированы.
У меня тормознуто работают регуляторы особенно средний. Наверное из-за большого количества значений.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 30, 2016, 09:32:11
У меня тормознуто работают регуляторы особенно средний. Наверное из-за большого количества значений.
У себя я разницы не наблюдаю, единственное, что заметно - примагничивание в зоне 0 дБ, потому как используются "родные" слайдеры экывалайзера.
Нагрузка на проц возрастает при быстром дёргании, особенно, регулятора СЧ, у меня до 8..10%, но в обоих вариантах одинаково. Это объяснимо - идёт постоянное обращение к скрипту. Если же крутить колёсиком (что чаще всего пользователи и делают), то нагрузка на проц не превышает 1%.
По-другому "ненужные" сладеры заблокировать не получится.

Кстати, в 2-полосном варианте можно обойтись и без тригонометрии - просто умножать на коэффициенты, заранее вычисленные для каждой полосы, нагрузка, полагаю, ещё уменьшится.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 30, 2016, 16:18:22

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

Сделал 2-полосный плавный или такой неправильный, надо чтобы центр на месте был как в 3-полосном.


Кстати возникла идея привязать предусиление, тогда уровень громкости при регулировке будет всегда оставаться одинаковым.

Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 30, 2016, 16:48:35
Я не думаю, что тригонометрические вычисления сильно грузят, скорее это количество вычислений.
Со скрипт-движком, скорее всего, разницы не заметить, но реально подпрограмма вычисления синуса намного объёмнее, чем простое умножение даже вещественных чисел, насколько помню, там используется разложение в ряд.

Сделал 2-полосный плавный или такой неправильный, надо чтобы центр на месте был как в 3-полосном.
Не... так, конечно не должно быть, в 2-полосном можно вообще частоты от 500 Гц до 2 кГц не трогать, всегда выставлять на 0.
В этом 3-полосном варианте, если СЧ-движок выставить на 0 дБ, он вполне сойдёт за 2-полосный.

Кстати возникла идея привязать предусиление, тогда уровень громкости при регулировке будет всегда оставаться одинаковым.
Не стоит этого делать. На графике это, может быть, и интересно смотрится, но на слух это будет неприемлимо, да и в реальной аппаратуре так никогда не делается, скорее всего пользователь в этом случае потянется к регулятору громкости. Если, к примеру, мы начнём добавлять верхи или низы, или всё вместе, средние частоты начнут проваливаться и на слух будет казаться, что громкость уменьшилась. Ухо у нас не одинаково воспринимает равную громкость на разных частотах, вспомни кривые равной громкости (это про тонкомпенсацию).
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on September 30, 2016, 17:46:49
А вот над такой задачей для 2-полосного, мне кажется, стоит подумать. Имитировать изменение добротности фильтров, т. е. крутизну синусоид, оставляя АЧХ на средних частотах плоской. Ес-но, раздельно для НЧ и ВЧ. Это уже будет некая заявка на параметрический эквалайзер.

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=54358.0;attach=48058)
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 30, 2016, 17:58:47
А вот над такой задачей для 2-полосного, мне кажется, стоит подумать. Имитировать изменение добротности фильтров, т. е. крутизну синусоид, оставляя АЧХ на средних частотах плоской. Ес-но, раздельно для НЧ и ВЧ. Это уже будет некая заявка на параметрический эквалайзер.

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=54358.0;attach=48058)
Думаю это решаемо надо ввести ещё одну переменную в формулу и управлять значением через скрипт.
Вот тут только надо подумать хорошенько!
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on September 30, 2016, 20:01:34
А вот над такой задачей для 2-полосного, мне кажется, стоит подумать. Имитировать изменение добротности фильтров, т. е. крутизну синусоид, оставляя АЧХ на средних частотах плоской. Ес-но, раздельно для НЧ и ВЧ. Это уже будет некая заявка на параметрический эквалайзер.

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=54358.0;attach=48058)

Я смог и такое сделать!


Надо бы подумать над переименованием темы, а то она начиналась с 3-полосного эквалайзера, а теперь разрослась в сторону различных видов.
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Black_AVP on October 01, 2016, 10:11:04
Я смог и такое сделать!
Молодец, +1. Хоть и несколько грубовато получилось, но логически всё правильно.
Единственное, в регуляторах ширины пропускания фильтров два последних значения явно лишние: и на слух это неестественно звучит, и на графике некрасиво смотрится.

Надо бы подумать над переименованием темы, а то она начиналась с 3-полосного эквалайзера, а теперь разрослась в сторону различных видов.
Ну, переименуй первый пост, назови "Вариации на тему EQ". :)
Title: Re: 3-хполосный темброблок (эквалайзер)
Post by: Aleksandr009 on October 01, 2016, 10:19:38
Молодец, +1. Хоть и несколько грубовато получилось, но логически всё правильно.
Единственное, в регуляторах ширины пропускания фильтров два последних значения явно лишние: и на слух это неестественно звучит, и на графике некрасиво смотрится.
Так это решается легко надо лишь уменьшить количество значений в счётчиках.
Title: Re: Вариации Эквалайзера.
Post by: samix on April 07, 2017, 14:30:32
Браво!+
Раз вы это опубликовали,значит я могу внедрить такой темброблок в свои поделки?
Title: Re: Вариации Эквалайзера.
Post by: Aleksandr009 on April 07, 2017, 20:43:31
Раз вы это опубликовали,значит я могу внедрить такой темброблок в свои поделки?
Для этого и опубликовано ;)
Title: Re: Вариации Эквалайзера.
Post by: koelo on July 23, 2017, 21:34:50
What is the difference between: темброблок.zip & темброблок_2.3.zip ?
Title: Re: Вариации Эквалайзера.
Post by: Aleksandr009 on July 24, 2017, 12:42:46
What is the difference between: темброблок.zip & темброблок_2.3.zip ?
The differences are in the provider's scripts.
In 2.3 it is simplified
Title: Re: Вариации Эквалайзера.
Post by: koelo on July 24, 2017, 14:19:57
The differences are in the provider's scripts.
In 2.3 it is simplified

I want to make 3 knobs to control the 18 band EQ, which one do you suggest I should use?
Title: Re: Вариации Эквалайзера.
Post by: Aleksandr009 on July 24, 2017, 14:53:22
I want to make 3 knobs to control the 18 band EQ, which one do you suggest I should use?

You can use any.

Also note the EQ_3_Band.zip
Title: Re: Вариации Эквалайзера.
Post by: koelo on July 24, 2017, 15:22:27
You can use any.

Also note the EQ_3_Band.zip

Thanks for the help, much appreciated :)