JS: Stereo Imager

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

belovw

Well-Known Member
22 Апр 2009
9.491
8.684
113
50
RK Almaty
boosty.to
Мне очень нравится плагин от Waves S1 Imager Stereo. После того как кончилась демо лицензия и не найдя альтернативу, я решил написать его самостоятельно в JS формате для Reaper. Через ReaJS его можно также использовать в Win DAW, поддерживающих VST.

Жду комментов и рецензий. Если понадобится - твикнем.

* Версия от 16.10.2012. 19.08.2013 внесён корректирующий коэффициент в режиме MS.

* Версия от 20.08.2013. Добавлена визуализация.
 
Последнее редактирование:
// (C) 2012, Vladimir V. Belov

// NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
// WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
// ANY DIRECT OR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
// OUT OF THE USE OR INABILITY TO USE THIS PLUG-IN, COMPUTER FAILTURE OF
// MALFUNCTION INCLUDED. THE USE OF THE SOURCE CODE, EITHER PARTIALLY OR IN
// TOTAL, IS ONLY GRANTED, IF USED IN THE SENSE OF THE AUTHOR'S INTENTION, AND
// USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A THIRD
// PARTY CONTRIBUTION, EVEN IF INCLUDED IN REAPER(TM), COCKOS INCORPORATED OR
// ITS AFFILIATES HAVE NOTHING TO DO WITH IT. LAST BUT NOT LEAST, BY USING THIS
// PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
// ENTRUST SOMEBODY ELSE WITH DOING SO.
//
// Released under GPL:
// <http://www.gnu.org/licenses/>.

desc:Stereo Imager

slider1:<0,1,1{LR,MS}>Mode
slider2:1<0,2,0.01>Width (%)
slider3:0<-45,45,1>Rotate (Deg)

@init
k=sqrt(2);

@slider
// 2xPi/360=0.017...
rot=slider3*0.017453292;
cs=cos(rot);
sn=sin(rot);
width = slider2;

@sample

//Mode
slider1==0 ? (
a=(spl0+spl1)/2;
b=(spl0-spl1)/2;
):(
a=spl0/k;
b=spl1/k;
);

//Width
spl0=a+b*width;
spl1=a-b*width;

//Rotate
L=spl0*cs-spl1*sn;
R=spl1*cs+spl0*sn;
spl0=L;
spl1=R;
 

Вложения

Данный плагин я написал значительно раньше чем ознакомился с ссылкой с которой поделился Вадим Володин http://www.musicdsp.org/archive.php?classid=4 (Вадим,огромное спасибо за ссылку)

Если посмотреть ссылки ниже
http://www.musicdsp.org/archive.php?classid=4#173
http://www.musicdsp.org/archive.php?classid=4#255
http://www.musicdsp.org/archive.php?classid=4#256
то можно увидеть насколько похожи алгоритмы.

Как появится свободное время, попробую попереводить с С на JS другие алгоритмы. А в этой ветке обсуждаем Stereo Imager.
 
  • Like
Реакции: Al Brazy и LexaLexin
belovw, по моему пока делать отдельную ветку, например плагины в JS формате, и постить туда все что с этим связанно... перенести в неё Ваши творения и других участников форума...
ещё такой вопрос, а через Reaplugins можно осуществить Vocal Riding, что для Рипера на бесплатном софте?
 
а через Reaplugins можно осуществить Vocal Riding, что для Рипера на бесплатном софте?
Нет. Модуляция любого из параметров плагина от входного сигнала возможна только в рипере.
 
Последнее редактирование:
  • Like
Реакции: LexaLexin
Нет. Модуляция любого из параметров плагина от входного сигнала возможна только в рипере.
[OFF]Володя, если ты про модуляцию пиковым уровнем сигнала, то во фрукте есть нативная приблуда для этого.
А ты где Си научился? [/OFF]
 
Предварительно раззиповал? Возможно путь не тот. Попробуй выполнить команду
Show REAPER resource path in explore
появится папка, в ней есть подпапка Effects, в неё и положи раззипованную плагину.

А ты где Си научился?
В музыкальной школе ))).
Знаю Бейсик, микроассемблер, Фортран и Паскаль когда изучал в политехе. Си на самом деле не знаю.
 
  • Like
Реакции: MJSound
Завёл в каталоге js эффектов папочку "belovw" ))

Digilay давно уже в каждом проекте, за s1 - imager, полагаю, также не застоится)
 
  • Like
Реакции: belovw
belovw, у нас есть тут люди на форуме, которые не плохо умеют рисовать всякого рода скины и мордочки.. может их подключить и вам останется всё это дело "прописать" и вуаля, плаг с "лицом"...
 
останется всё это дело "прописать" и вуаля, плаг с "лицом"...
Разбираться с этим надо. Время нужно. Я пока только в математике продвинулся. И то проблемы есть. Нужно разбираться с кросфэдингом. Если прописать огибающую, то на синусе слышны потрескивания. Если есть кто может подсказку дать, буду признателен.
 
  • Like
Реакции: LexaLexin
а огибающая какого параметра? возможно интерполяция (качество/метод выбери сам) поможет
 
а я тоже не в теме, хз как там рипер снимает параметры, мож он неаккуратно работает.
 
Я что-то пропустил
[OFF]Поскольку ЧСВ распирает, скажу, что этот плагин (Digilay) Володя посвятил мне :-) :scaut: Правда, Володя?
В названии всё зафиксировано, если шо... :-)
[/OFF]
 
  • Like
Реакции: LexaLexin
belovw, я так понял, с дилеем работа закончилось?
По Stereo Imager - если бы ему нарисовать визуализацию как у "папы" - было бы отлично.
 
Версия от 20.08.2013 добавлена визуализация.

Посмотреть вложение 71410
// (C) 2012, Vladimir V. Belov
// (C) 2007, Michael Gruhn.

// NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
// WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
// ANY DIRECT OR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
// OUT OF THE USE OR INABILITY TO USE THIS PLUG-IN, COMPUTER FAILTURE OF
// MALFUNCTION INCLUDED. THE USE OF THE SOURCE CODE, EITHER PARTIALLY OR IN
// TOTAL, IS ONLY GRANTED, IF USED IN THE SENSE OF THE AUTHOR'S INTENTION, AND
// USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A THIRD
// PARTY CONTRIBUTION, EVEN IF INCLUDED IN REAPER(TM), COCKOS INCORPORATED OR
// ITS AFFILIATES HAVE NOTHING TO DO WITH IT. LAST BUT NOT LEAST, BY USING THIS
// PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
// ENTRUST SOMEBODY ELSE WITH DOING SO.
//
// Released under GPL:
// <http://www.gnu.org/licenses/>.

desc:Stereo Imager

slider1:<0,1,1{LR,MS}>Mode
slider2:1<0,2,0.01>Width (%)
slider3:0<-45,45,1>Rotate (Deg)
slider5:0<0,2,1{Dots,Lines,Rays}>Display

@init
k=sqrt(2);
p=$pi/180;

gfx_clear=-1;
off = 500000;
rot=-45*0.017453292;
DOTS = 0;
LINES = 1;
RAYS = 2;
MAXDRAWSPLS = 10000;
PHASEUPDATERATE = srate/8;
n = 0;
phC = 0;
ph = 0;

@slider
width=slider2;

kr=p*slider3;
kw=atan(slider2);

kcs=cos(kr);
ksn=sin(kr);

k1=sin(kr-kw);
k2=cos(kr-kw);
k3=sin(kr+kw);
k4=cos(kr+kw);

@block

@sample

//Mode
slider1==0 ? (
a0=(spl0+spl1)/2;
a1=(spl0-spl1)/2;
):(
a0=spl0/k;
a1=spl1/k;
);

//Width
spl0=a0+a1*width;
spl1=a0-a1*width;

//Rotate
L=spl0*kcs-spl1*ksn;
R=spl1*kcs+spl0*ksn;
spl0=L;
spl1=R;

//Goniometer
s0 = sign(spl0);
s1 = sign(spl1);
angle = atan( spl0 / spl1 );
(s0 == 1 && s1 == -1) || (s0 == -1 && s1 == -1) ? angle += 3.141592654;
s0 == -1 && s1 == 1 ? angle += 6.283185307;
spl1 == 0 ? spl0 > 0 ? angle = 1.570796327 : angle = 4.71238898;
spl0 == 0 ? spl1 > 0 ? angle = 0 : angle = 3.141592654;
radius = sqrt( sqr(spl0)+sqr(spl1) ) ;
angle -= rot;
vert = 0 = cos(angle)*radius;
horiz = off = sin(angle)*radius;
b<MAXDRAWSPLS ? b += 1;


s0 != s1 ? phC-=1:phC+=1;
(n+=1) > PHASEUPDATERATE ? (
ph = (1-(phC/n))/2;
phC = n = 0;
);

@gfx 500 500

size = min(gfx_w,gfx_h-20);
sizeH = size/2;
sizeDSqr05 = sizeH * 0.70710681;
sizeQ = sizeH/2;
size2Q = 2*sizeQ;
size3Q = 3*sizeQ;

(mouse_cap) ? (
gfx_r=gfx_g=gfx_b=0; gfx_a=1;
gfx_x=gfx_y=0;
gfx_rectto(gfx_w,gfx_h);
);

gfx_r=gfx_g=gfx_b=0; gfx_a=0.066;
gfx_x=gfx_y=0;
gfx_rectto(gfx_w,gfx_h);

x = y = sizeH;

i = min(b,MAXDRAWSPLS);
while (
slider5 == DOTS ? (
gfx_a=0.33;
gfx_x=sizeH+0*sizeDSqr05;
gfx_y=sizeH-off*sizeDSqr05;
gfx_setpixel(0.5,1,0);
):(
slider5 == LINES ? (
gfx_x=x; gfx_y=y;
x=sizeH+0*sizeDSqr05;
y=sizeH-off*sizeDSqr05;
):(
gfx_x=sizeH+0*sizeDSqr05;
gfx_y=sizeH-off*sizeDSqr05;
);
gfx_r=0.5; gfx_g=1; gfx_b=0; gfx_a=0.25;
gfx_lineto(x,y,0);
);
(i-=1)>0;
);
b=0;

gfx_r=gfx_g=gfx_b=0.8; gfx_a=0.03;

gfx_x=sizeQ; gfx_y=sizeQ;
gfx_lineto(size3Q,size3Q,0);

gfx_x=sizeQ; gfx_y=size3Q;
gfx_lineto(size3Q,sizeQ,0);

gfx_a=0.03;
gfx_x=size2Q; gfx_y=size2Q-sizeQ*k;
gfx_lineto(size2Q,size2Q+sizeQ*k,1);

gfx_x=size2Q-sizeQ*k; gfx_y=size2Q;
gfx_lineto(size2Q+sizeQ*k,size2Q,1);

gfx_x = gfx_y = sizeQ;
gfx_drawchar($'L');
gfx_x = size3Q; gfx_y = sizeQ;
gfx_drawchar($'R');
gfx_x = sizeH; gfx_y = 5;
gfx_drawchar($'M');
gfx_x = 0; gfx_y = sizeH;
gfx_drawchar($'+');
gfx_drawchar($'S');
gfx_x = size-20; gfx_y = sizeH;
gfx_drawchar($'-');
gfx_drawchar($'S');

gfx_r=1; gfx_g=gfx_b=0; gfx_a=1;

gfx_x=gfx_y=size2Q;
gfx_lineto (sizeQ*(2+k1),sizeQ*(2-k2),1);
gfx_lineto (sizeQ*(2+k3),sizeQ*(2-k4),1);
gfx_lineto (size2Q,size2Q,1);
gfx_lineto (sizeQ*(2+ksn*1.05),sizeQ*(2-kcs*1.05),1);

gfx_r=gfx_g=gfx_b=0; gfx_a=1;
gfx_x=0; gfx_y=size;
gfx_rectto(size+1,size+20);
gfx_r=1; gfx_g=0; gfx_b=0; gfx_a=1;
gfx_x=1+ph*(size-1); gfx_y=size+1;
gfx_lineto(gfx_x,size+19,0);

gfx_r=gfx_g=gfx_b=0.8; gfx_a=1;
gfx_x = 0; gfx_y = size+10;
gfx_drawnumber(0,0);
gfx_x = sizeH-8; gfx_y = size+10;
gfx_drawnumber(90,0);
gfx_x = size-25; gfx_y = size+10;
gfx_drawnumber(180,0);

gfx_r=0.5; gfx_g=1; gfx_b=0; gfx_a=1;
gfx_x = 0; gfx_y = size;
gfx_drawnumber(ph*180,0);
 

Вложения

belovw, отлично. Возможно, стоит чуть уменьшить "дисплей", и, если возможно, сделать чтобы при кручении ручек, за красным треугольником не оставались столь явные "копии" (эхо).
 
Мужики. Есть маленькая проблема. При изменении угла наклона, появляются потрескивания очень хорошо заметные на чистом синусе. В принципе в статике не страшно, а вот если применять автоматизацию, то становятся заметными.
В принципе догадываюсь что нужно сделать что бы убрать это. При резком изменении угла происходит резкое изменение амплитуды на суммирующей матрице. Такие изменения проявляются в виде половинчатых джитеров (если конечно так можно выразиться) со своим полным спектром. Как вариант решения проблемы ввести плавное изменение коэффициентов. Как это реализовать пока не знаю. Попробовал ввести линейную апроксимацию, но и её нужно пилить и пилить. Так что други зазывайте в тему знакомых програмеров DSP. Буду допиливать алгоритм. Буду признателен.
 
Последнее редактирование:
Я и не качал ещё... Не могу время найти для вдумчивого прослушивания пока... Думаю у многих так.
 

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