Обсуждение и выкладывание скриптов WSH, работающих с VU Meter
Отредактировано San_dr (2012-06-04 22:23:55)
foobar2000 |
![]() |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » foobar2000 » Частные конфигурации » VU Meter skins (WSH)
Обсуждение и выкладывание скриптов WSH, работающих с VU Meter
Отредактировано San_dr (2012-06-04 22:23:55)
Обсуждение и выкладывание скриптов WSH, работающих с VU Meter.
Вопросы и ответы, адресованные DRON-у, лучше размещать в основной теме компонента.
----------------------------------------------------------------------------------------------------------------------------------
Ок, и зонировать, нарезая диапазоны по ToDB(LM) ?
Дальше я уперся. Если делать универсально, т.е. под любую бэкграунд-шкалу, с заранее неизвестным количеством светодиодов и их расположением на шкале, надо в WSH делать кусок, эквивалентный Вашему VUEditorGUI с расстановкой точек. Только здесь нужно вводить диапазоны по уровню и соответствующие каждому диапазону X(i)min и X(i)max - левые и правые границы светодиодных сегментов в процентах к ww (ну или к wh, в зависимости от ориентации шкалы). При фиксированном и известном количестве светодиодов можно было бы организовать диалог с юзером через окно Properties с 4-мя переменными на каждый уровень. А вот как организовать диалог для заполнения массива переменной длины, не соображу. В бесконечном цикле поднимать popup-окно с 4-мя полями для заполнения и кнопкой "конец диалога" для прерывания процесса ? Как вообще организуются диалоги в WSH, я что-то не припомню ни одного ? Или не морочиться, создать массив 30х4, окнище Properties с 30-ю строчками, забить изначально массив нулями и пусть юзер сколько заполнит - столько и будет ? Т.е. например, заполнит строчку "LED №2 " -25, -20, 14.2, 13.8 (при ToDB(LM) в диапазоне от -25 до -20 зажигать сегмент от ww/14.2 до ww/13.8)
Отредактировано onv (2012-06-06 10:38:27)
San_dr
Индикатор баланса (звуковой сцены, как угодно) не могу придумать, как органично вписать в LED-шкалу. Горизонтально, вроде, правильно, но на этой шкале - как здрасьте (см. видео). Пробовал вертикальное перемещение (размещал между +2 и +4дБ - тоже не ахти. Придумай что-нибудь 
Если есть время и желание покрутить это вживую, в мой предыдущий скрипт добавь
var LR = 0;
function ToLine(Level){return Level;}
и в on_paint(gr)
LR = ToLine(L) - ToLine(R);
gr.FillSolidRect(ww/2 + ww*LR, wh/2-10, 5, 20, RGBA(255,255,55,100));
Отредактировано onv (2012-06-08 02:08:00)
Типа 
Немного расширил. Градиентная полупрозрачная заливка, левая и правая границы фиксированы. Центральная граница обеих полублоков - двигается, поверх прикрыта более яркой "полоской" для четкости визуализации. Может стоит увеличить (компенсировать) яркость оцифровки шкалы, попадающей в "зону затопления"
В синем варианте светодиодов - баланс зеленый
Неплохой вариант, наверное, имеет право на жизнь в горизонтальном исполнении на вертикальном индикаторе. А с горизонтальным, похоже, ничто несовместимо. В общем случае, эта зона (твоя синяя) должна быть на всю ширину. А это будет жуть. Так что, как ни не хотелось заводить отдельное окно для такой мелочи, а, похоже, таки придется. Разве что туда же и индикатор пересадить 
Отредактировано onv (2012-06-08 02:07:04)
onv, возможно твои проблемы дискретизации шкалы поможет решить такой пример, (создай горизонтальную панель WSH)
var ww = 0, wh = 0, j=6;
var g_syscolor = 0;
var COLOR_BTNFACE = 15;
function get_colors() {
g_syscolor = utils.GetSysColor(COLOR_BTNFACE);
}
get_colors();
function on_size() {
ww = window.Width;
wh = window.Height;
}
function RGB(r, g, b) {return (0xff000000 | (r << 16) | (g << 8) | (b));}
function on_paint( gr ) {
gr.FillSolidRect(0, 0, ww, wh,g_syscolor);
var i = 0;
while (i < ww+1) {
gr.FillSolidRect(i,0,j,wh, RGB(55,55,55));
i = i +11;
}
}
function on_colors_changed() {
get_colors();
window.Repaint();
}
ты должен привязаться к j - ширина светодиода, i - шаг
Отредактировано San_dr (2012-06-07 22:20:36)
А чем поможет этот матрац с шагом 11 ?
Нет, никакой сетчатой графической маской это не решить. Как бы ты ни дробил шкалу, каждый из сегментов останется частично засвечиваемым до тех пор, пока ты линейную пилу на входе не превратишь в ступеньки по числу светодиодов. Т.е., нужно разбить весь диапазон по уровню на зоны по количеству светодиодов и при любом уровне внутри конкретной зоны полностью зажигать соответствующий светодиод. Я это уже решил. Может быть, корявенько с точки зрения красоты кода, но зато настраивать шкалу по уровням элементарно.
В твоем примере ты прав в том, что в 99% случаев ширины светолиодов и межцентровки одинаковы и можно смело пользоваться просто счетчиком номера светодиода, давая одну неизменную поправку на неиспользуемые края окна.
Для этого достаточно :
добавить такие строчкиvar ledlm = 0, ledrm = 0;
switch(true) {
case ToDB(LM) < -25: ledlm = 0; break;
case ToDB(LM) >= -25 && ToDB(LM) < - 20: ledlm = 1; break;
case ToDB(LM) >= -20 && ToDB(LM) < - 17: ledlm = 2; break;
case ToDB(LM) >= -17 && ToDB(LM) < - 15: ledlm = 3; break;
case ToDB(LM) >= -15 && ToDB(LM) < - 12: ledlm = 4; break;
case ToDB(LM) >= -12 && ToDB(LM) < - 10: ledlm = 5; break;
case ToDB(LM) >= -10 && ToDB(LM) < - 8: ledlm = 6; break;
case ToDB(LM) >= - 8 && ToDB(LM) < - 5: ledlm = 7; break;
case ToDB(LM) >= - 5 && ToDB(LM) < - 3: ledlm = 8; break;
case ToDB(LM) >= - 3 && ToDB(LM) < 0: ledlm = 9; break;
case ToDB(LM) >= 0 && ToDB(LM) < 1: ledlm = 10; break;
case ToDB(LM) >= 1 && ToDB(LM) < 2: ledlm = 11; break;
case ToDB(LM) >= 2 && ToDB(LM) < 3: ledlm = 12; break;
case ToDB(LM) >= 3: ledlm = 13; break;
}
switch(true) {
case ToDB(RM) < -25: ledrm = 0; break;
case ToDB(RM) >= -25 && ToDB(RM) < - 20: ledrm = 1; break;
case ToDB(RM) >= -20 && ToDB(RM) < - 17: ledrm = 2; break;
case ToDB(RM) >= -17 && ToDB(RM) < - 15: ledrm = 3; break;
case ToDB(RM) >= -15 && ToDB(RM) < - 12: ledrm = 4; break;
case ToDB(RM) >= -12 && ToDB(RM) < - 10: ledrm = 5; break;
case ToDB(RM) >= -10 && ToDB(RM) < - 8: ledrm = 6; break;
case ToDB(RM) >= - 8 && ToDB(RM) < - 5: ledrm = 7; break;
case ToDB(RM) >= - 5 && ToDB(RM) < - 3: ledrm = 8; break;
case ToDB(RM) >= - 3 && ToDB(RM) < 0: ledrm = 9; break;
case ToDB(RM) >= 0 && ToDB(RM) < 1: ledrm = 10; break;
case ToDB(RM) >= 1 && ToDB(RM) < 2: ledrm = 11; break;
case ToDB(RM) >= 2 && ToDB(RM) < 3: ledrm = 12; break;
case ToDB(RM) >= 3: ledrm = 13; break;
}и заменить прорисовку на :
gr.FillSolidRect(25+(ww-35)*ledlm/13, wh/5, ww-(ww-35)*ledlm/13, wh/5, RGBA(0,0,0,255));
gr.FillSolidRect(25+(ww-35)*ledrm/13, wh/1.65, ww-(ww-35)*ledrm/13, wh/5, RGBA(0,0,0,255));
Отредактировано onv (2012-06-08 14:28:21)
San_dr
Хочешь игрушку прикольную (реалтайм АРУ, Replaygain на лету) ? 
Добавляешь такое:
var LRmax=-25;
в on_paint(gr) :
if(ToDB(LM) > LRmax) {LRmax=ToDB(LM)};
if(ToDB(RM) > LRmax) {LRmax=ToDB(RM)};
if(LRmax > 0) {fb.RunMainMenuCommand("Playback/Volume/Down"); LRmax = -25};
Перестараешься с оффсетом - улетишь в -100дБ 
но зато настраивать шкалу по уровням элементарно
ага, очень элементарно)
var ToLed = function(MValue)
{
var Values = [-25, -20, -17, -15, -12, -10, -8, -5, -3, 0, 1, 2, 3];
var DBValue = ToDB(MValue);
for (var i = 0; i < Values.length; i++)
{
if (DBValue < Values[i]) return i;
}
return Values.length;
}
gr.FillSolidRect(25+(ww-35)*ToLed(LM)/13, wh/5, ww-(ww-35)*ledlm/13, wh/5, RGBA(0,0,0,255));
gr.FillSolidRect(25+(ww-35)*ToLed(RM)/13, wh/1.65, ww-(ww-35)*ledrm/13, wh/5, RGBA(0,0,0,255));
а вот за switch(true) вам отдельное спасибо, он меня сильно порадовал (в хорошем смысле)
чисто скриптовый VU, без картинки 
Скрипт:
// @author "VU Meter component/object by DRON, jscript by Br3tt aka Falstaff >> http://br3tt.deviantart.com"
// @adapted - San_dr
ColorTypeDUI = {
background: 1,
textcolor: 0
};
function RGB(r, g, b) { return (0xff000000 | (r << 16) | (g << 8) | (b));
};
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b));
};
// VUMeter Object
VUMeter = new ActiveXObject("VUMeter");
VUMeter.RegisterWindow(window.ID);
// Globals
var ww = 0, wh = 0;
var g_backcolor = 0;
var g_textcolor = 0;
var g_syscolor = 0;
var COLOR_BTNFACE = 15;
var tooltip_timer = false;
function get_colors() {
g_backcolor = window.GetColorDUI(ColorTypeDUI.background);
g_syscolor = utils.GetSysColor(COLOR_BTNFACE);
g_textcolor = window.GetColorDUI(ColorTypeDUI.textcolor);
}
get_colors();
function on_size() {
ww = window.Width;
wh = window.Height;
};
function on_paint(gr) {
N=wh/12;
L=VUMeter.LeftLevel;
R=VUMeter.RightLevel;
LM = VUMeter.LeftPeak;
RM = VUMeter.RightPeak;
// create draw area
// fill bgcolor
gr.FillSolidRect(0, 0, ww, wh, g_syscolor);
gr.FillSolidRect(0, 2*N, ww, wh-4*N, g_backcolor);
// Draw Peak
// left peak
var i = 0;
while (i < ww*LM+1) {
var g_leftcolor = ( i>ww*5/7 ) ? RGB(255,140,0) : RGB(70,100,140);
gr.FillSolidRect(i-4, 2*N, 9, 3*N, g_leftcolor);
i = i +11;
}
// right peak
var k = 0;
while (k < ww*RM+1) {
var g_rightcolor = ( k>ww*5/7 ) ? RGB(255,140,0) : RGB(70,100,140);
gr.FillSolidRect(k-4, 7*N, 9, 3*N, g_rightcolor);
k = k +11;
}
// left level
var g_leftcolorL = ( ww*L>ww*5/7 ) ? RGBA(255,90,0,220) : RGBA(40,255,0,190);
gr.FillGradRect(0, N, ww*L, 4*N, 0, RGBA(150,155,0,200), g_leftcolorL, 1);
gr.FillSolidRect(ww*L-3, N, 4, 4*N, RGB(255,255,245));
// right level
var g_rightcolorR = ( ww*R>ww*5/7 ) ? RGBA(255,90,0,220) : RGBA(40,255,0,190);
gr.FillGradRect(0, 7*N, ww*R, 4*N, 0, RGBA(150,155,0,200),g_rightcolorR, 1);
gr.FillSolidRect(ww*R-3, 7*N, 4, 4*N, RGB(255,255,245));
// background
gr.DrawRect(2, N+3, ww-4, wh-2*N-6,6, g_backcolor);
}
function on_colors_changed() {
get_colors();
window.Repaint();
}
пиковые - из наборных светодиодов 2-х цветов, среднеквадратичные - градиентная сплошная поверх (цвет не только градиентный, немного прозрачный, но и зависит от уровня)
щас АРУ попробую 
Отредактировано San_dr (2012-06-09 13:48:35)
k6
Да, так намного красивее и оптимальнее, спасибо. Я ж сразу предупреждал, что корявенько, топорно, но наглядно
Только одна маленькая личная просьба - проверять вживую код перед публикацией. Я, даже не пробуя, вижу нестыковки, так у людей работать не будет. Для наброска для примера это абс. нормально, будь он в ЛС, а на форуме лучше проверять во избежание лишних вопросов потом. Теперь так же красиво надо сделать смену на лету бэкграундов по кругу из набора по левому даблклику, чтобы не перебивать DRON-овский перебор по левому синглу 
San_dr
Если делаешь градиентную, добавь поканальный вертикальный (90) градиент в обе стороны от центра полосы каждого канала (добавь выпуклости полосам). У меня так в сборках регулятор уровня рисуется, смотрится изрядно веселее плоского.
Отредактировано onv (2012-06-09 12:33:08)
смотрится изрядно веселее плоского
есть такое мнение, что это определяется общим стилем оформления
есть такое мнение, что это определяется общим стилем оформления
Ну, да, никто и не спорит, плоский вариант уже есть, готов, почему бы выпуклый не попробовать ?
Тем более, что вертикальный градиент можно ведь делать не просто линейной растяжкой двух зеркальных в обе стороны, а разбить на немножко зон ( сымитировать выпуклость или вогнутость, трапецеидальность или эффект чеканки, как вариант), сделать понизу полосы красивую тень, например. Сам светящийся прямоугольник светодиода можно набирать решеткой из тонких световых полосок, сеткой из светящихся точек малого диаметра... Были бы варианты, из чего подбирать лучший под конкретный стиль оформления. У San_dr с фантазией все в порядке, он разберется 
Отредактировано onv (2012-06-09 16:09:56)
onv
подскажи, плз чем ты "движущиеся картинки"
вместо скриншотов снимаешь ? Вот понадобилась.
Camtasia Studio 7.1
так это usb vebcamera нужна? а то у меня на ноуте встроенная, смотрит в одну сторону с монитором, зеркало нужно 
San_dr
Нет, вебка не нужна. Камтазия (и подобные) снимают видео с экрана, включая Ваш курсор (зависит от настроек).
установил, отснял, но видно нужны еще плагины для того, чтоб сконвертить в понятный проигрывателям стандарт. В общем, кому интересно - испытайте и посмотрите этот чисто скриптовый VU meter
// @author "VU Meter component/object by DRON, jscript by Br3tt aka Falstaff >> http://br3tt.deviantart.com"
// @adapted - San_dr
window.MaxHeight=36;
ColorTypeDUI = {
background: 1,
selcolor: 3,
};
function RGB(r, g, b) { return (0xff000000 | (r << 16) | (g << 8) | (b));
};
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b));
};
// VUMeter Object
VUMeter = new ActiveXObject("VUMeter");
VUMeter.RegisterWindow(window.ID);
// Globals
var ww = 0, wh = 0;
var g_backcolor = 0;
var g_selcolor = 0;
var g_syscolor = 0;
var COLOR_BTNFACE = 15;
var tooltip_timer = false;
function get_colors() {
g_backcolor = window.GetColorDUI(ColorTypeDUI.background);
g_syscolor = utils.GetSysColor(COLOR_BTNFACE);
g_selcolor = window.GetColorDUI(ColorTypeDUI.selcolor);
g_textcolor_hl = window.GetColorDUI(2);
}
get_colors();
function on_size() {
ww = window.Width;
wh = window.Height;
};
function on_paint(gr) {
D=(ww-43)/21
N=wh/12;
L=VUMeter.LeftLevel;
R=VUMeter.RightLevel;
LM = VUMeter.LeftPeak;
RM = VUMeter.RightPeak;
var LR = 0;
function ToLine(Level){return Level;}
LR = ToLine(R) - ToLine(L);
// create draw area
// fill bgcolor
gr.FillSolidRect(0, 0, ww, wh, g_backcolor);
// Draw Peak
// left peak
var i = -D;
while (i < ww*LM+1) {
var g_leftcolor = ( i>14*D+28 && i < 16*D+32) ? RGBA(230,255,0,200) : (i > 16*D+32 && i <18*D +32 ) ? RGB(250,220,0) : (i > 18*D +32) ? RGB(255,55,0) : RGB(10,105,250,100) ;
gr.FillSolidRect(i, 0, D, 5*N+1, g_leftcolor);
i = i +D+2;
}
// right peak
var k = -D;
while (k < ww*RM+1) {
var g_rightcolor = ( k>14*D+28 && k < 16*D+32) ? RGBA(230,255,0,200) : (k > 16*D+32 && k <18*D +32 ) ? RGB(250,220,0) : (k > 18*D +32) ? RGB(255,55,0) : RGB(10,105,250,100) ;
gr.FillSolidRect(k, 7*N-1, D, 5*N+1, g_rightcolor);
k = k +D+2;
}
// left level
gr.FillGradRect(0, 0, ww*L, 5*N+1, 0, RGBA(150,155,60,177), RGBA(220,250,177,227), 1);
gr.FillSolidRect(ww*L-3, 0, 4, 5*N+1, RGB(185,85,185));
// right level
gr.FillGradRect(0, 7*N-1, ww*R, 5*N+1, 0, RGBA(150,155,60,177),RGBA(220,250,177,227), 1);
gr.FillSolidRect(ww*R-3, 7*N-1, 4, 5*N+1, RGB(185,85,185));
// background
gr.FillGradRect(0, 5*N, ww/2+ ww*LR, 2*N+2,0, g_backcolor, g_selcolor);
gr.FillGradRect(ww/2+ ww*LR, 5*N, ww/2- ww*LR, 2*N+2,0,g_selcolor,g_backcolor);
gr.FillSolidRect(ww/2 + ww*LR-2, 5*N, 5, 2*N+2, g_textcolor_hl);
gr.GdiDrawText("R",gdi.Font("Tahoma", 3*N,1),g_syscolor, -4, 5*N-1, 2*D, 3*N,0x00000001);
gr.GdiDrawText("L",gdi.Font("Tahoma", 3*N,1),g_syscolor, 20*D+36, 5*N-1, 2*D, 3*N,0x00000001);
gr.GdiDrawText("S T E R E O P A N O R A M E R",gdi.Font("Tahoma", 3*N,1),g_syscolor&0x11aaaaaa, 3*D+6, 5*N-1, 20*D, 3*N,0x00000001);
gr.DrawRect(0, 0, ww, wh,4, g_backcolor);
}
function on_colors_changed() {
get_colors();
window.Repaint();
}
Отредактировано San_dr (2012-06-12 22:15:06)

а это мелкий вариант, без панорамометра
// @author "VU Meter component/object by DRON, jscript by Br3tt aka Falstaff >> http://br3tt.deviantart.com"
// @adapted - San_dr
window.MaxHeight=window.MinHeight=25;
ColorTypeDUI = {
background: 1,
textcolor: 0
};
function RGB(r, g, b) { return (0xff000000 | (r << 16) | (g << 8) | (b));
};
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b));
};
// VUMeter Object
VUMeter = new ActiveXObject("VUMeter");
VUMeter.RegisterWindow(window.ID);
// Globals
var ww = 0, wh = 0;
var g_backcolor = 0;
var g_textcolor = 0;
var g_syscolor = 0;
var COLOR_BTNFACE = 15;
var tooltip_timer = false;
function get_colors() {
g_backcolor = window.GetColorDUI(ColorTypeDUI.background);
g_syscolor = utils.GetSysColor(COLOR_BTNFACE);
g_textcolor = window.GetColorDUI(ColorTypeDUI.textcolor);
}
get_colors();
function on_size() {
ww = window.Width;
wh = window.Height;
};
function on_paint(gr) {
D=(ww-43)/21
N=wh/12;
L=VUMeter.LeftLevel;
R=VUMeter.RightLevel;
LM = VUMeter.LeftPeak;
RM = VUMeter.RightPeak;
// create draw area
// fill bgcolor
gr.FillSolidRect(0, 0, ww, wh, g_backcolor);
// Draw Peak
// left peak
var i = -D;
while (i < ww*LM+1) {
var g_leftcolor = ( i>14*D+28 && i < 16*D+32) ? RGBA(230,255,0,200) : (i > 16*D+32 && i <18*D +32 ) ? RGB(250,220,0) : (i > 18*D +32) ? RGB(255,55,0) : RGB(10,105,250,100) ;
gr.FillSolidRect(i, 0, D, 5*N+1, g_leftcolor);
i = i +D+2;
}
// right peak
var k = -D;
while (k < ww*RM+1) {
var g_rightcolor = ( k>14*D+28 && k < 16*D+32) ? RGBA(230,255,0,200) : (k > 16*D+32 && k <18*D +32 ) ? RGB(250,220,0) : (k > 18*D +32) ? RGB(255,55,0) : RGB(10,105,250,100) ;
gr.FillSolidRect(k, 7*N-1, D, 5*N+1, g_rightcolor);
k = k +D+2;
}
// left level
gr.FillGradRect(0, 0, ww*L, 5*N+1, 0, RGBA(150,155,60,177), RGBA(220,250,177,227), 1);
gr.FillSolidRect(ww*L-3, 0, 4, 5*N+1, RGB(185,85,185));
// right level
gr.FillGradRect(0, 7*N-1, ww*R, 5*N+1, 0, RGBA(150,155,60,177),RGBA(220,250,177,227), 1);
gr.FillSolidRect(ww*R-3, 7*N-1, 4, 5*N+1, RGB(185,85,185));
// background
gr.DrawRect(0, 0, ww, wh,4, g_backcolor);
}
function on_colors_changed() {
get_colors();
window.Repaint();
}
Не подскажете, как просимулировать флуоресцентный индикатор? Примерно, такой.
Если что, в штатно работающем индикаторе элементы включаются сразу и полностью.
На WSH можно сделать такое с помощью картинок? Прозрачные PNG (для накала и стекла) поддерживаются?
Прозрачные PNG (для накала и стекла) поддерживаются?
да, нужна хорошая фотка без перспективных искажений незажженного индикатора (т.е. снимок д.б. выполнен не короткофокусной "мыльницей". Остальное делатся в графическом редакторе полупрозрачным размытием. Сама нить - как желто-красная линия, можно постоянно горящая, можно выключать на стопе и паузе - установить порог этого "светодиода" в - 60дб.
Отредактировано San_dr (2012-06-13 07:00:13)
да, нужна хорошая фотка
Скорее всего, буду рисовать руками, возможно, что по чертежу из паспорта индикатора.
Единственное, не идеально понимаю английский язык, а на Гидрогене 70 страниц. Может кто в сам движок носом тыкнуть?
Движок https://sites.google.com/site/foobar200 … me/vumeter
редактор с описанием https://sites.google.com/site/foobar200 … Editor.zip
еще описание VU Meter# (пост 110)
Отредактировано San_dr (2012-06-13 10:26:40)
Движок https://sites.google.com/site/foobar200 … me/vumeter
редактор с описанием https://sites.google.com/site/foobar200 … Editor.zip
еще описание VU Meter# (пост 110)
Сие понятно, только вот на VFD элементы не могут светиться с разной яркостью. Сегмент либо включен, либо выключен. Затем и задал вопрос в теме именно по скриптовому движку.
VFD элементы не могут светиться с разной яркостью. Сегмент либо включен, либо выключен
на деле даже у VFD элементов не идеальная переключательная характеристика - на микроуровне порог размыт. редактор (опция add custom...) позволяет вводить необходимую для полной реальности остроту зажигания сегмента
WSH PeakMeter - очень "лёгкий" скрипт на 60 строк
http://rghost.ru/download/38475421/fd6b … es-Peak.7z
(Скрипт в архиве)
картинку vu_bg.png расположить по адресу: foobar2000\themes\fooRazor\images-PeakОтредактировано San_dr (2012-06-04 22:23:55)
WSH, горизонтальный, VU-meter, пикметр, многоцветный, шкала после минус 1 дБ, DUI, использует шрифт "EuropeExt" - в гугле поиск "EuropeExt шрифт скачать"
// @author "VU Meter component/object by DRON, jscript by Br3tt aka Falstaff >> http://br3tt.deviantart.com"
// @adapted - San_dr
window.MaxHeight=window.MinHeight=36;
window.MinWidth=124;
function RGB(r, g, b) { return (0xff000000 | (r << 16) | (g << 8) | (b));
};
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b));
};
// VUMeter Object
VUMeter = new ActiveXObject("VUMeter");
VUMeter.RegisterWindow(window.ID);
// Globals
var ww = 123, wh = 0;
var g_backcolor =RGB(30,40,40);
var tooltip_timer = false;
function on_size() {
ww = window.Width;
wh = window.Height;
};
function on_paint(gr) {
D=(ww-43)/21
N=wh/12;
L=VUMeter.LeftLevel;
R=VUMeter.RightLevel;
LM = VUMeter.LeftPeak;
RM = VUMeter.RightPeak;
// create draw area
// fill bgcolor
gr.FillGradRect(0, 0, ww/2, wh,0,g_backcolor, RGB(80,110,110));
gr.FillGradRect(ww/2, 0, ww/2, wh,0,RGB(80,110,110), g_backcolor);
gr.FillSolidRect(ww/2, 0, 1, wh,RGB(80,110,110));
// шкала
var S = -1;
while (S < ww+1) {
gr.FillSolidRect(S,3,1,30,RGB(100,130,130));
S = S+D+2;
}
gr.FillSolidRect(3,12, ww-6,13,RGBA(0,0,0,80));
gr.GdiDrawText("—",gdi.Font("tahoma", 14,1),RGB(100,255,0),-D,8, 30, 12,0x00000001);
gr.GdiDrawText("60",gdi.Font("EuropeExt", 9,1),RGB(0,200,0),5,13, 30, 12,0x00000001);
gr.GdiDrawText("-40",gdi.Font("EuropeExt", 9,1),RGB(0,200,0),4*D+6,13, 30, 12,0x00000001);
gr.GdiDrawText("-20",gdi.Font("EuropeExt", 9,1),RGB(0,200,0),7*D+32,13, 30, 12,0x00000001);
gr.GdiDrawText("-10",gdi.Font("EuropeExt", 9,1),RGB(0,200,0),12*D+32,13, 30, 12,0x00000001);
gr.GdiDrawText("0",gdi.Font("EuropeExt", 9,1),RGB(210,210,100),17*D+33,13, 30, 12,0x00000001);
gr.GdiDrawText("2",gdi.Font("EuropeExt", 9,1),RGB(220,170,100),18*D+36,13, 30, 12,0x00000001);
gr.GdiDrawText("4",gdi.Font("EuropeExt", 9,1),RGB(255,170,100),19*D+36,13, 30, 12,0x00000001);
gr.GdiDrawText("+",gdi.Font("tahoma", 14,1),RGB(255,100,0),20*D+34,8, 30, 20,0x00000001);
// Draw Peak
// left peak
var i = -D;
while (i < ww*LM+1) {
var g_leftcolor = ( i>17*D+34 && i < 18*D+36) ? RGB(177,227,127) : (i > 18*D+36 && i <19*D +38 ) ? RGB(250,222,0) : (i > 19*D +38 && i <20*D +40) ? RGB(255,160,122) : (i > 20*D +40) ? RGB(255,0,50) : RGBA(120,200,255,160) ;
gr.FillSolidRect(i, 2, D, 5*N-6, g_leftcolor);
i = i +D+2;
}
// right peak
var k = -D;
while (k < ww*RM+1) {
var g_rightcolor = ( k>17*D+34 && k < 18*D+36) ? RGB(177,227,127) : (k > 18*D+36 && k <19*D +38 ) ? RGB(250,222,0) : (k > 19*D +38&& k <20*D +40) ? RGB(255,160,122) : (k > 20*D +40) ? RGB(255,0,50) : RGBA(120,200,255,160) ;
gr.FillSolidRect(k, 7*N+4, D, 5*N-6, g_rightcolor);
k = k +D+2;
}
// left level
gr.FillGradRect(0, 0, ww*L, 5*N-3, 0, RGBA(0,0,0,111), RGBA(255,255,255,140), 1);
gr.FillSolidRect(ww*L-3, 0, 3, 4*N, RGB(215,155,75));
// right level
gr.FillGradRect(0, 8*N, ww*R, 5*N, 0, RGBA(0,0,0,111),RGBA(255,255,255,140), 1);
gr.FillSolidRect(ww*R-3, 8*N, 3, 4*N, RGB(215,155,75));
}
Скачать 30 сек видео VU-meter (1мб) http://rghost.ru/download/39527154/a0ad7ae7284621cca1db0f55e0c2a3ed912903ca/wsh-vu meter1.avi
Отредактировано San_dr (2012-08-02 08:17:10)
Вертикальный со шкалой. (WSH, peak-meter, VU-meter )
// @author "VU Meter component/object by DRON, jscript by Br3tt aka Falstaff >> http://br3tt.deviantart.com"
// @adapted - San_dr
window.MaxWidth=window.MinWidth=44;
window.MinHeight=160;
ColorTypeDUI = {
background: 1,
textcolor: 0
};
function RGB(r, g, b) { return (0xff000000 | (r << 16) | (g << 8) | (b));
};
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b));
};
// VUMeter Object
VUMeter = new ActiveXObject("VUMeter");
VUMeter.RegisterWindow(window.ID);
// Globals
var ww = 0, wh = 0;
var g_backcolor = 0;
var g_textcolor = 0;
var g_syscolor = 0;
var COLOR_BTNFACE = 15;
var tooltip_timer = false;
function get_colors() {
g_backcolor = window.GetColorDUI(ColorTypeDUI.background);
g_syscolor = utils.GetSysColor(COLOR_BTNFACE);
g_textcolor = window.GetColorDUI(ColorTypeDUI.textcolor);
}
get_colors();
function on_size() {
ww = window.Width;
wh = window.Height;
};
function on_paint(gr) {
D=(wh-42)/21
N=ww/12;
L=VUMeter.LeftLevel;
R=VUMeter.RightLevel;
LM = VUMeter.LeftPeak;
RM = VUMeter.RightPeak;
// create draw area
// fill bgcolor
gr.FillSolidRect(0, 0, ww, wh,g_syscolor);
gr.FillGradRect(0, 10, ww, wh/2-20,90, g_syscolor,g_backcolor);////g_backcolor&0x88ffffff
gr.FillGradRect(0, wh/2+10, ww, wh/2-20,90, g_backcolor,g_syscolor);
gr.FillSolidRect( 0,wh/2-10, ww, 21,g_backcolor);
gr.FillSolidRect( 0,10, ww, 1,g_syscolor);
// шкала
var S = 0;
while (S < wh+1) {
gr.FillSolidRect(N,S,N*10,1,RGBA(180,255,255,111));
S = S+D+2;
}
gr.FillSolidRect(4*N-3, 0, 4*N+5, wh, RGBA(0,20,35,140));
// Draw Peak
// left peak
var i = -D;
while (i < wh*LM+1) {
var g_leftcolor = ( i>18*D+28 && i < 19*D+38) ? RGB(177,227,127) : (i > 19*D+38 && i <20*D +40 ) ? RGB(255,222,0) : (i > 20*D +40) ? RGB(255,155,0) : RGBA(110,190,255,150) ;
gr.FillSolidRect(1, wh-i, 4*N-2, D, g_leftcolor);
i = i +D+2;
}
// right peak
var k = -D;
while (k < wh*RM+1) {
var g_rightcolor = ( k>18*D+28 && k < 19*D+38) ? RGB(177,227,127) : (k > 19*D+38 && k <20*D +40 ) ? RGB(255,222,0) : (k > 20*D +40) ? RGB(255,155,0) : RGBA(110,190,255,150) ;
gr.FillSolidRect(7*N+3, wh-k, 4*N-1, D, g_rightcolor);
k = k +D+2;
}
// left level
gr.FillGradRect(0, wh-wh*L, 4*N-2, wh*L, -90, RGBA(165,150,145,177), RGBA(80,80,80,137), 1);
gr.FillSolidRect(0, wh-wh*L, 4*N-2, 2, RGB(215,155,75));
// right level
gr.FillGradRect(7*N+4, wh-wh*R, 4*N-2, wh*R, -90, RGBA(165,150,145,177),RGBA(80,80,80,137), 1);
gr.FillSolidRect(7*N+4, wh-wh*R, 4*N-2, 2, RGB(215,155,75));
gr.GdiDrawText("-",gdi.Font("tahoma", 17,1),RGB(0,250,0),2+N,21*D+26, 30, 12,0x00000001);
gr.GdiDrawText("60",gdi.Font("tahoma", 9,1),RGB(0,250,0),2+N,18*D+36, 30, 12,0x00000001);
gr.GdiDrawText("40",gdi.Font("tahoma", 9,1),RGB(0,250,0),2+N,14*D+30, 30, 12,0x00000001);
gr.GdiDrawText("20",gdi.Font("tahoma", 9,1),RGB(0,250,0),2+N,10*D+20,30, 12,0x00000001);
gr.GdiDrawText("10",gdi.Font("tahoma", 9,1),RGB(0,240,0),2+N,6*D+14, 30, 12,0x00000001);
gr.GdiDrawText("0",gdi.Font("tahoma", 9,1),RGB(210,210,100),2+N,3*D+2,30, 12,0x00000001);
gr.GdiDrawText("3",gdi.Font("tahoma", 9,1),RGB(255,210,100),2+N,D+5,30, 12,0x00000001);
gr.GdiDrawText("5",gdi.Font("tahoma", 9,1),RGB(255,150,0),2+N,0, 30, 12,0x00000001);
}
function on_colors_changed() {
get_colors();
window.Repaint();
}
Вы здесь » foobar2000 » Частные конфигурации » VU Meter skins (WSH)