Утеплитель

  • Автор темы Автор темы belovw
  • Дата начала Дата начала

belovw

Well-Known Member
22 Апр 2009
9.609
8.781
113
50
RK Almaty
boosty.to
Пить уже было нечего, кушать тоже, спать не хотелось. Написал плагину формата JS для Рипера - утеплитель, основанный на апроксимации точек. В основе алгоритма использовал многочлен пятого порядка. Стандартные настройки по умолчанию. Добавляются третья и пятая гармоника. Третья добавляется в противофазе. Динамических воздействий на сигнал нет.

Слушайте, оценивайте. На лавры не претендую.

На графике передаточная характеристика при дефолтных настройках и увеличении выходной громкости на +4,44 дБ
на входе сигнал принудительно ограничивается
при X>1 X=1
при X<-1 X=-1

Различие между ламповым и полупроводниковым усилителем как раз и заключается в том, что радиолампа, искажая сигнал, добавляет в него четные гармоники, а транзистор – нечетные. Вот почему ламповый усилитель звучит более приятно на слух.

У меня получился чистой воды транзисторный "утеплитель". Если посмотреть исходник то будет видно что четные коэфиценты запланировны, но пока что находятся под коментом в нерабочем состоянии.
desc:Warmer

slider1:0<-100,100,0.01>amaunt
slider2:0<-100,100,0.01>1"
slider3:-6<-100,100,0.01>3"
slider4:-20<-100,100,0.01>5"
slider5:0.5<-100,20,0.01>Level

@init
bpos=0;

@slider
am=pow(10,slider1/20);
sl1=pow(10,slider2/20);
sl3=pow(10,slider3/20);
sl5=pow(10,slider4/20);
lv=pow(10,slider5/20);

@sample
spl0=spl0*am;
spl1=spl1*am;
x=max(min(spl0,1),-1);
y=max(min(spl1,1),-1);
//spl0=sl1*x+sl2*x*x-sl3*x*x*x+sl4*x*x*x*x+sl5*x*x*x*x*x;
//spl1=sl1*y+sl2*x*x-sl3*y*y*y+sl4*x*x*x*x+sl5*y*y*y*y*y;
spl0=((sl5*x*x-sl3)*x*x+sl1)*x;
spl1=((sl5*y*y-sl3)*y*y+sl1)*y;
spl0=spl0*lv/am;
spl1=spl1*lv/am;

Для того что бы использовать его в качестве VST плагины нужно с офсайта скачать Reaplugins. После установки добавить мою плагину в папку reaplugs/JS/Effects
после в хосте загрузить Reajs плагин и выбрать нужную из списка (т.е. мою) плагину.

ЗЫ: Похоже получился мягко подсерающий клипер. В любом случае жду рецензий.
 

Вложения

  • Warmer BW.zip
    Warmer BW.zip
    414 байт · Просмотры: 56
  • Test.jpg
    Test.jpg
    67,5 KB · Просмотры: 16
Последнее редактирование:
Прошел только день, на первый взгляд особой разницы от плагины не слышно. Субъективно звук становится как бы открытым и, прозрачнее что ли если конечно не доводить до явного перегруза.
Хочется услышать мнения других участников форума кто юзает рипер и тех кто использует reajs.dll
 
А можно ли его как-то скомпилировать в .dll чтоб можно было в других хостах (кубейс, сонар и т.д...) проверить работу этого плагина?
 
]Den[;1234700 написал(а):
А можно ли его как-то скомпилировать в .dll чтоб можно было в других хостах (кубейс, сонар и т.д...) проверить работу этого плагина?
Только для PC: Нужно с офсайта скачать Reaplugins. После установки добавить мою плагину в папку reaplugs/JS/Effects
после в хосте загрузить Reajs плугин и выбрать нужную из списка (т.е. мою) плугину.
 
Последнее редактирование:
belovw,
Дружище, не мог бы ты популярно объяснить, что делает каждая из регулировок?
Например,
1``
3``
5``
И какой смысл в их отрицательных значениях, кроме Level?
Для себя я пока выяснил, что искажения получаются разные, но в разряд "утеплителей" отнести их никак не могу.
Даже слегка в растерянности, где бы я смог эту обработку применить... :)
View hidden content is available for registered users!
 
Последнее редактирование:
что делает каждая из регулировок?
Это коэфиценты многочлена
y=a1*x1-a3*x^3+a5*x5.
По дефолту они дают форму кривой как на картинке. a1 трогать не нужно, это как бы dry. А вот 3" и 5" как оказалось добавляют гармоники третьего и пятого порядка.

Пропусти нормализованную под ноль фанеру через него и увидешь что пики упали до -4,44 дБ, а субъективная громкость не упала. Потом третья гармоника как говорят это от лампы.
Покрути плагину в дефолте настраивая только amount, прибавляй до перегруза, а потом мягко отпусти что бы он пропал. Включи байпас и сравни. Звучание особо не меняется, но мне это влияние нравится. Как буд-то после него звук раскрывается. Дальше видно будет.

По поводу дублирования тем: всё понимаю, но это вынужденое действие к привлечению аудитории, потом на дублировании я не попадался. Плагина написана для Рипера, поэтому и оформлена в теме Рипера, но также может использоваться как VST в других хостах под PC, поэтому там и дал линк на тему, а линк не есть повтор. В любом случае для людей стараюсь.
 
Последнее редактирование:
belovw,
Но я как раз и спрашиваю: какой смысл в минусовых значениях?
Те операции, что ты описывал, я как раз и производил с ним. Если не ошибаюсь, "теплые" гармоники как раз- четные. А тут прям такой ядреный транзистор получается...
Еще: очень грубо двигаются фейдеры, может, логарифмическую регулировку для них сделать?
А вот с этим: "коэфиценты многочлена", не издевайся, да? :)
 
  • Like
Реакции: belovw
очень грубо двигаются фейдеры, может, логарифмическую регулировку для них сделать?
Они и так к дБ привязаны для удобства. Для мягкости используй <Ctrl>.

какой смысл в минусовых значениях?
Минусовый значения в дБ не есть минусовый коэфицент. Например -6 дБ=0.5, а -20 дБ=0.1

Различие между ламповым и полупроводниковым усилителем как раз и заключается в том, что радиолампа, искажая сигнал, добавляет в него четные гармоники, а транзистор – нечетные. Вот почему ламповый усилитель звучит более приятно на слух.

Исходя из последних новостей поправлю топ.
 
parfumer, Спасибо за анализ. Спасибо за то что натолкнул меня на изучение принадлежности гармоник транзистору и лампе. Буду копать дальше. Вообще в коде изначально были прописаны чётные коэфиценты, но они ведут себя пока что не контролируемо и потому закоментированы, т.е. отключены. Буду копать дальше. А пока придумай другое название для этой плагины. Мне например нравится её сёр на нечетных гармониках - SSL-ем попахивает :prankster2:
И юзай-юзай её по дефолту (только amount крути). Может чего нового и услышишь. А там глядишь в тему старперы помладше подключатся-проще будет )))
 
Последнее редактирование:
Большое спасибо автору за наводку на ReaJS.
Это просто находка) Работать со звуковой волной на простейшем javascript, да еще и не заморачиваясь над всякими заголовками, определениями, структурой и пр. присущими кодингу, а сразу работать над алгоритмом - это просто потрясающе) Просидел всю ночь, настолько затянула эта игра с переменными, функциями и этими многочленами (к этому со школьных уроков алгебры отвращение, не переваривал ничего). Пришлось повозиться с википедией

Написал для себя пару простейших скриптов (но нужных и отсутствующих в наборе):
Инвертер волны (x=0-x);
Биткрашер (floor((x+(1/(bt*2)))*bt))/bt);
Синусный Утеплитель (x=sin(x)-x+sin(x));

По поводу работы автора сказать что-либо трудно... (мне мой синусный больше понравился :prankster2: )
Добавлю лишь, что ежели вы хотите эмуляцию лампы, Nick Crow (разработчик TubeDriver) рассказал бы много больше. Лампа, кстати, даже верхнюю и нижнюю полуволны "драйвит" по-разному
 
Спасибо ! Я пожалуй буду пользоваться.
я использовал Вармер на драм-лупе (состоящем в основном из разного рода бочек грузных и не очень) ДнБэшном... бочка приобрела подходящую для меня сатурацию, при дефолтных значениях... двигать что-либо в этом плагине надо очень аккуратно, после него я поставил лимитер. - все норм.

попробовал на гитаре - тоже можно иногда использовать, но...я наверное не буду, хотя...

Для написания электронщины - можно вешать на верхнее железо, в качестве вэйвшейпера... вполне читабельно выходит...

На мой взгляд, для пущего удобства тюнинга - хорошо б было значения передвигаемого ползунка уменьшить... то есть, что б изменения измерялись не в "еденицах", а в "ноль целых, икс десятых" - а то как рванешь вправо - как захрипит, и приходится очень медленно передвигать...
Понятно ли что я хотел сказать? =)

Спасибо, здОрово !
 
  • Like
Реакции: belovw
По поводу работы автора сказать что-либо трудно... (мне мой синусный больше понравился
Анализатор показал с Вашей формулой на синусе третью гармонику.

Почитал
Nick Crow (разработчик TubeDriver)
после этого все мои изыски - детский лепет на фоне 2012. Аж растроился. Одно умиляет - Москва не сразу строилась.



На мой взгляд, для пущего удобства тюнинга - хорошо б было значения передвигаемого ползунка уменьшить... то есть, что б изменения измерялись не в "еденицах", а в "ноль целых, икс десятых" - а то как рванешь вправо - как захрипит, и приходится очень медленно передвигать...
очень грубо двигаются фейдеры, может, логарифмическую регулировку для них сделать?
Они и так к дБ привязаны для удобства. Для мягкости используй <Ctrl>.
Шаг изначально выставлен на 0.01. Удерживай <Ctrl>
Диапазон регулировок поменяю исходя из запросов пользователей.

Спасибо за проявленное внимание.
 
Последнее редактирование:
попробуйте.
y=x-k3*x^3+k5*x^5

вместо k3 можно использовать А=0,5 по дефолту
вместо k5 - В=0.1
диапазон регулировок для А и В 0...1
 
Последнее редактирование:
А как делай сделать не разбирался?
А то мне дифференциатор и интегратор надо сделать, а как в память загонять предыдущий отсчет я не понял((
Читал исходники делея, но моему непронраммерскому мозгу это сложновато сходу осилить.
 
В @sample пишете в массив buff[0]=spl0 и buff[1]=spl1
В конце пишете buff+=2 и проверку на его заполненность buff>=buffsize ? buff=0;
Где buffsize размер массива (его отсчитывают относительно частоты дискретизации - srate)

Это все просто... Глядя на некоторые сложные алгоритмы, даже у тех же в комплекте, у меня дух захватывает...
 
Последнее редактирование:
  • Like
Реакции: timbo
А как делай сделать не разбирался?
Разбирался. В ORTF панере как раз на основе делея и создаётся задержка каналов. Кстати поюзайте. Итересно себя ведёт. На первый взгляд всё как обычно, но если рядом включить трек только с интенсивностым панарамированием то разница становится очевидной, а в чью пользу решать вам.
Vayson, расписал как сделать задержку !!!!

Пример дифференциатора

desc: Dif

@init
xl=0;
xr=0;

@sample
spl0=spl0-xl;
spl1=spl1-xr;
xl=spl0;
xr=spl1;
Надо ещё коэфицент самплрейт вставить, а для этого матчасть читать надо, чуть позже допилю. С интегратором посложнее будет, надо будет решить задачку защиты от переполнения. Подключайтесь ребята. Кружок начинающего программиста DSP начал своё функционирование. :girl_witch:
 
Последнее редактирование:
  • Like
Реакции: dizzy gillespie и timbo
Пример дифференциатора
Хех, я и не думал, что так просто))

С интегратором посложнее будет, надо будет решить задачку защиты от переполнения.
Там бы надо HPF вставить с очень низкой частотой среза, чтобы DC не было, это и будет защитой от переполнения. Правда такой фильтр не спасает от кратковременных забросов, так что разумно на выходе поставить клиппер.

Вообще, зачем я это все задумал — если внутрь цепи дифференциатор-интегратор поставить ограничение или вейвшейпер по типу того, что вы описали, то получается ограничение волны по производной, что смегчает транзиенты. Если злоупотреблять то получается очень характерный "глухой" дисторшен.
Сам по себе эффект может и не имеет большой ценности (хотя всегда хочется больше эффектов хороших и разных:biggrin:), но недавно я обнаружил очень толковое применение ему — прогнал через него сигнал для сайдчейна компрессора. ОЧЕНЬ понравилось, особенно на полном миксе! Звук стал менее нервным, стало возможно куда сильнее жать без ощущения расплющивания.
Сейчас для этого использую цепочку из пяти плагинов:fool: — дифференциатор, вейвшейпер, интегратор, HPF, клиппер, но хотелось бы все собрать под одной крышей и добавить настроек.
Буду копаться в JS.
Но может кто здесь реализует идею до конца?
 
В общем копался вечером. Задача оказалась гораздо труднее, чем я полагал.
Кстати, в SynthMaker'e год назад делал цепочку по отдельности, все работает. Только сильно не эффективно, видимо синтмейкер в каждую .длл'ку много чего ненужного тащит.
В процессе случайно сделал эквалайзер :rofl:
 
Vayson, расписал как сделать задержку !!!!

Я расписал всего лишь как заполнить буфер предыдущими отсчетами. А с ним уже можно делать все что душе угодно (предполагая, что автор разберется), включая и делей ( spl0=spl0+(buff[delay]*volume) )

Подключайтесь ребята. Кружок начинающего программиста DSP начал своё функционирование. :girl_witch:

Ура) Глядишь скоро на kvraudio русские засветятся

В процессе случайно сделал эквалайзер :rofl:

Бывает :sarcastic:

P.S. Распишите пожалуйста, что такое интегратор, простыми словами
Еще плоховато представляю себе, что происходит с сигналом, проходящим через дифференциатор...
 
Последнее редактирование:
Распишите пожалуйста, что такое интегратор, простыми словами
Еще плоховато представляю себе, что происходит с сигналом, проходящим через дифференциатор...
Ну тут несколько вольное обращение с терминами, но, насколько могу судить, распространенное.
В общем дифференциатор считает производную волны, интегратор -- интеграл. Т.к. волна у нас дискретная, то вместо производной -- конечная разность, а вместо интеграла -- сумма.
Т.е. дифференциатор считает для каждого отсчета -- out=input-input[i-1], интегратор out=input+input[i-1].
Соответственно, поставленные друг за другом, они должны взаимно компенсироваться, с точностью до DC.
Вот этого у меня и не получилось, причем даже тогда, когда я, чтобы не возиться с логикой, сделал отдельными плагинами дифференциатор и интегратор.
В Synthedit'е же получалось.
 
В общем дифференциатор считает производную волны, интегратор -- интеграл. Т.к. волна у нас дискретная, то вместо производной -- конечная разность, а вместо интеграла -- сумма.
Всё верно, но не хватает одного множителя.
Значит так, производная это изменение функци за бесконечно малый промежуток времени (вроде так)
X'=dX/dt=X1-X0/t1-t0
самый малый промежуток который мы можем использовать это растояние между двумя близжайшими семплами. В нашем случае:
dt=1/Fd, Fd-частота дискритизации, берётся из системной переменной srate поэтому dt=1/srate =>
desc: Dif

@init
xl=0;
xr=0;

@sample
spl0=(spl0-xl)srate;
spl1=(spl1-xr)srate;
xl=spl0;
xr=spl1;
 
Последнее редактирование:
самый малый промежуток который мы можем использовать это растояние между двумя близжайшими семплами.
Это верно. Правда, для практических целей это не так важно, т.к. в общем случае будет нормировочным множителем (т.е. если в дифференциаторе умножаем, то в интеграторе делим). Хотя, если задаться целью, чтобы плагин был независим от семплрейта, то покопаться в этом направлении, вероятно, стоит. Я же пока не преследовал этой цели.
Да, выводить на выход семпл, умноженный на 44100, как-то рискованно:wink:
 

Я гуглил в первую очередь. Хотел простыми словами
Что делает код мне тоже понятно. Непонятно - что происходит со звуковой волной при прохождении через дифференциатор (интегратор) на длительном промежутке времени, потому что каждый следующий цикл зависит от результата работы предыдущего...
И еще самое главное - зачем они нужны, и каковы цели его применения :to_pick_ones_nose:

Да, выводить на выход семпл, умноженный на 44100, как-то рискованно:wink:

Предположение - может не стоит его выводить? дифференциатор (с умножением на srate), внутренняя обработка, интегратор (с делением на srate)
 
Последнее редактирование:
Непонятно - что происходит со звуковой волной при прохождении через дифференциатор (интегратор) на длительном промежутке времени
Он как фильтр низких частот работает. Фактически, все, что ниже fs/2 пропорционально режется (с очень плавным наклоном).

потому что каждый следующий цикл зависит от результата работы предыдущего...
Ну тут-то как раз ничего необычного нет, все IIR фильтры так работают. Более того, они еще и с фидбеком, т.е. если в том коде выход зависит только от входа, то в рекурсивных фильтрах среди слагаемых еще и выход добавляется.


Предположение - может не стоит его выводить? дифференциатор (с умножением на srate), внутренняя обработка, интегратор (с делением на srate)
Ну в ём тадыть и смысла особого нет.
Этот коэффициент ничего с окраской звука в любом случае не сделает.
 
если задаться целью, чтобы плагин был независим от семплрейта, то покопаться в этом направлении, вероятно, стоит
Пока мы работаем с такой штукой как дельта те, то без срате ни как. Бояться нечего, при перегрузе рипер сам отключит выход. В любом случае дельта те нужна.
 
Пока мы работаем с такой штукой как дельта те, то без срате ни как.
Нас строго говоря никто не обязывает дельта т учитывать.

Бояться нечего, при перегрузе рипер сам отключит выход.
А он гарантированно отключит, если на 44100 умножать. Можно на srate/44100 умножать, допустим.

В любом случае дельта те нужна.
Часто обходятся и без нее. Она нужна только если требовать инвариантность от семплрейта.
Для отработки можно обойтись, да и для моих нужд лучше один раз нормировать вейвшейпер, чем два раза дифференциатор и интегратор.
 
Ну да, а ещё можно вышмат переписать на новый лад. ))))
А тут никакого вышмата, и нечего его упоминать всуе.
Есть, скажем, такая задача -- если семпл к семплу сигнал прыгает от -1 до 1, то это может быть нехорошо и надо ему помешать. Вот тут нам понадобится разность отсчетов. Если умножать на srate то получим 88200 -- т.е. на 50 дБ больше, чем 0dBFS. И зачем нам эту ерунду городить?

Кстати 44100/srate даст 1 (единицу)
Это если srate у нас 44100.
 

Сейчас просматривают