0 Пользователей и 1 Гость просматривают эту тему.
За энтузиазм уже +1 поставил.Кривая, конечно, далека от нужной. Таких изломов не должно быть. У ВЧ-фильтра она вообще получилась зеркальной.АЧХ каждого фильтра имеет форму, близкую к параболе, симметричную относительно центральной частоты.Чтоб было понятнее, набросал несколько вариантов сочетаний разных положений регуляторов.
Подробнее...Молодец, Александр! Жаль, плюсик пока не поставить - сутки не прошли. В твоём возрасте мне тоже казалось, что ничего невозможного на свете нет.Скрипт можно ещё немного оптимизировать, если вспомнить про циклы, писанины будет меньше. Для ВЧ-фильтра вместо 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-полосном?
Кстати, подобным образом, наверное, можно построить и 5- и 7-полосный эквалайзер - вот это уже будет более актуально и востребовано.А если получится, можно пойти и дальше - сделать эквалайзер с изменяемым числом полос по желанию поьзователя.
Добавил версию с оптимизированными скриптами!
Так, конечно, лаконичнее смотрится. Осталось ещё лишние скобки покуцать.Но, что интересно, я вчера ещё попробовал оптимизировать твой скрипт, правда, дальше ВЧ-фильтра не ушёл, вышло так: 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. Правда эта единичка на результате, практически, не скажется.
Вся наша оптимизация в скриптах сводится, в основном, к сокращению писанины, а скрипт-движок её всё одно сожрёт - ни быстрее, ни медленнее работать в скине не будет, так что, особо с этим заморачиваться не стОит.+1 тебе ещё за труды.