desc:DRZ WAVEFORM METER v2//tags: analysis meter scope waveform//author: PROYECTOS DRZ
in_pin:left inputin_pin:right inputout_pin:left outputout_pin:right outputoptions:no_meter
slider1:s_ch1=0<0,4,1{Left,Right,Mid,Side,Mono}>-CH1 fuenteslider2:s_ch2=2<0,5,1{Off,Left,Right,Mid,Side,Mono}>-CH2 fuenteslider3:s_color=1<0,2,1{Solido,Espectral,Calor}>-Colorslider4:s_hold=2<0,3,1{Off,Rapido,Medio,Lento}>-Peak holdslider5:s_time=1000<5,10000,1>-Ventana (ms)slider6:s_gain=0<-24,24,0.1>-Ganancia visual (dB)slider7:s_scale=0<0,1,1{Lineal,dB}>-Escala amplitudslider8:s_floor=-60<-96,-24,1>-Piso dBslider9:s_style=0<0,2,1{Relleno,Contorno,Relleno+centro}>-Estiloslider10:s_grid=2<0,2,1{Off,dB,dB + tiempo}>-Rejillaslider11:s_read=1<0,1,1{Off,On}>-Lecturasslider12:s_hue_lo=0<0,360,1>-Hue gravesslider13:s_hue_md=130<0,360,1>-Hue mediosslider14:s_hue_hi=225<0,360,1>-Hue agudosslider15:s_xlo=200<40,1000,1>-Cruce graves/medios (Hz)slider16:s_xhi=3000<800,12000,10>-Cruce medios/agudos (Hz)slider17:s_freeze=0<0,1,1{No,Si}>-Congelar
@init
gfx_ext_retina = 1;
BINSZ = 64; // samples por bin (resolucion de bandas ~1.3 ms)MAXSEC = 10; // historial maximo en segundosMAXSPL = 1000000; // tope de muestras por canal (protege RAM a 96/192 kHz)
nbins = floor(min(srate * MAXSEC, MAXSPL) / BINSZ);nbins < 64 ? nbins = 64;histsize = nbins * BINSZ;
// ---------- mapa de memoria ----------_p = 0;c1_raw = _p; _p += histsize; // muestra cruda con signo (nivel fino)c1_mn = _p; _p += nbins; // minimo por binc1_mx = _p; _p += nbins; // maximo por binc1_lo = _p; _p += nbins; // energia gravesc1_md = _p; _p += nbins; // energia mediosc1_hi = _p; _p += nbins; // energia agudosc1_ev = _p; _p += nbins; // envolvente peak-hold
c2_raw = _p; _p += histsize;c2_mn = _p; _p += nbins;c2_mx = _p; _p += nbins;c2_lo = _p; _p += nbins;c2_md = _p; _p += nbins;c2_hi = _p; _p += nbins;c2_ev = _p; _p += nbins;
memtop = _p;memset(0, 0, memtop);freembuf(memtop);
recpos = 0; binpos = 0; bincnt = 0;panel_open = 0; last_cap = 0;
// ================= FUNCIONES =================
function clampv(v, lo, hi) ( v < lo ? lo : v > hi ? hi : v );
function wrapv(v, lo, hi) ( v < lo ? hi : v > hi ? lo : v );
// HSV -> RGB, deja el resultado en hr/hg/hbfunction hsv2rgb(h, s, v) local(i, f, p, q, t) ( h = h / 60; h < 0 ? h += 6; h >= 6 ? h -= 6; i = floor(h); f = h - i; p = v * (1 - s); q = v * (1 - s * f); t = v * (1 - s * (1 - f)); i == 0 ? (hr = v; hg = t; hb = p) : i == 1 ? (hr = q; hg = v; hb = p) : i == 2 ? (hr = p; hg = v; hb = t) : i == 3 ? (hr = p; hg = q; hb = v) : i == 4 ? (hr = t; hg = p; hb = v) : (hr = v; hg = p; hb = q););
// amplitud 0..1 -> altura normalizada 0..1 (lineal o dB)function amp_norm(a) ( a *= vgain; s_scale < 0.5 ? ( a > 1 ? 1 : a < 0 ? 0 : a ) : ( a <= 0.0000001 ? 0 : ( a = (20 * log10(a) + db_range) / db_range; a < 0 ? 0 : a > 1 ? 1 : a; ) ));
function y_of(v, cy, half) ( v >= 0 ? cy - amp_norm(v) * half : cy + amp_norm(-v) * half);
function update_params() ( ch1_src = s_ch1; ch2_src = s_ch2 - 1; ch2_on = s_ch2 > 0.5;
vgain = pow(10, s_gain / 20); db_range = -s_floor;
a_lo = 1 - exp(-2 * $pi * min(s_xlo, srate * 0.45) / srate); a_hi = 1 - exp(-2 * $pi * min(s_xhi, srate * 0.45) / srate);
hold_t = s_hold == 1 ? 0.12 : s_hold == 2 ? 0.45 : 1.4; hold_dec = exp(-1 / (srate * hold_t)); rms_a = 1 - exp(-1 / (srate * 0.3)); pk_dec = exp(-1 / (srate * 1.2));
hsv2rgb(s_hue_lo, 0.95, 1); lo_r = hr; lo_g = hg; lo_b = hb; hsv2rgb(s_hue_md, 0.95, 1); md_r = hr; md_g = hg; md_b = hb; hsv2rgb(s_hue_hi, 0.95, 1); hi_r = hr; hi_g = hg; hi_b = hb;);
// ---------- nombres para el panel ----------function nm_src(dst, v) ( v == 0 ? strcpy(dst, "Left") : v == 1 ? strcpy(dst, "Right") : v == 2 ? strcpy(dst, "Mid") : v == 3 ? strcpy(dst, "Side") : strcpy(dst, "Mono"););function nm_src2(dst, v) ( v == 0 ? strcpy(dst, "Off") : nm_src(dst, v - 1); );function nm_col(dst, v) ( v == 0 ? strcpy(dst, "Solido") : v == 1 ? strcpy(dst, "Espectral") : strcpy(dst, "Calor"); );function nm_hold(dst, v) ( v == 0 ? strcpy(dst, "Off") : v == 1 ? strcpy(dst, "Rapido") : v == 2 ? strcpy(dst, "Medio") : strcpy(dst, "Lento"); );function nm_scl(dst, v) ( v == 0 ? strcpy(dst, "Lineal") : strcpy(dst, "dB"); );function nm_sty(dst, v) ( v == 0 ? strcpy(dst, "Relleno") : v == 1 ? strcpy(dst, "Contorno") : strcpy(dst, "Rell+centro"); );function nm_grid(dst, v) ( v == 0 ? strcpy(dst, "Off") : v == 1 ? strcpy(dst, "dB") : strcpy(dst, "dB+tiempo"); );function nm_ono(dst, v) ( v < 0.5 ? strcpy(dst, "No") : strcpy(dst, "Si"); );
// ---------- fila de ajuste: devuelve -1 / 0 / +1 ----------function ui_row(rx, ry, rw, label, val) local(rh, bw, hov, dv, ax, bx, hl, hb2) ( rh = 22; bw = 18; dv = 0; hov = mouse_x >= rx && mouse_x < rx + rw && mouse_y >= ry && mouse_y < ry + rh; hov ? ( gfx_set(1, 1, 1, 0.07); gfx_rect(rx, ry, rw, rh); );
ax = rx + rw - bw * 2 - 100; bx = rx + rw - bw - 4;
hl = mouse_x >= ax && mouse_x < ax + bw && mouse_y >= ry && mouse_y < ry + rh; hb2 = mouse_x >= bx && mouse_x < bx + bw && mouse_y >= ry && mouse_y < ry + rh;
gfx_set(0.72, 0.75, 0.84, 1); gfx_x = rx + 8; gfx_y = ry + 4; gfx_drawstr(label);
gfx_set(1, 1, 1, hl ? 1 : 0.35); gfx_x = ax + 6; gfx_y = ry + 4; gfx_drawstr("<"); gfx_set(1, 1, 1, hb2 ? 1 : 0.35); gfx_x = bx + 6; gfx_y = ry + 4; gfx_drawstr(">");
gfx_set(1, 0.88, 0.45, 1); gfx_x = ax + bw + 6; gfx_y = ry + 4; gfx_drawstr(val);
has_click ? ( hl ? dv = -1 : hb2 ? dv = 1 ); hov && wheel != 0 ? ( dv = wheel > 0 ? 1 : -1; wheel_used = 1; ); dv;);
// ---------- dibujo de una lane ----------function draw_lane(cy, lh, o_raw, o_mn, o_mx, o_lo, o_md, o_hi, o_ev, sr, sg, sb) local(half, spp, sptr, n, j, k, bi, bn, idx, v, vmn, vmx, vlo, vmd, vhi, vev, ytop, ybot, hh, tot, wl, wm, wh, mxc, t, cury, prevy, ye, i) (
half = lh * 0.5 - 4; half < 4 ? half = 4;
spp = viewspl / gfx_w; sptr = recpos - viewspl; sptr < 0 ? sptr += histsize;
prevy = cy; i = 0;
loop(gfx_w, idx = floor(sptr); idx >= histsize ? idx -= histsize; bi = floor(idx / BINSZ); bi >= nbins ? bi -= nbins;
vmn = 0; vmx = 0; vlo = 0; vmd = 0; vhi = 0; vev = 0;
spp < BINSZ ? ( // ---- nivel fino: recorre TODAS las muestras del pixel ---- n = floor(spp); n < 1 ? n = 1; j = 0; loop(n, k = idx + j; k >= histsize ? k -= histsize; v = o_raw[k]; v < vmn ? vmn = v; v > vmx ? vmx = v; j += 1; ); vlo = o_lo[bi]; vmd = o_md[bi]; vhi = o_hi[bi]; vev = o_ev[bi]; ) : ( // ---- nivel bin: min/max reales, sin brincar nada ---- bn = floor(spp / BINSZ); bn < 1 ? bn = 1; j = 0; loop(bn, k = bi + j; k >= nbins ? k -= nbins; o_mn[k] < vmn ? vmn = o_mn[k]; o_mx[k] > vmx ? vmx = o_mx[k]; o_lo[k] > vlo ? vlo = o_lo[k]; o_md[k] > vmd ? vmd = o_md[k]; o_hi[k] > vhi ? vhi = o_hi[k]; o_ev[k] > vev ? vev = o_ev[k]; j += 1; ); );
// ---------- fantasma / peak hold ---------- s_hold > 0.5 ? ( ye = amp_norm(vev) * half; gfx_set(sr, sg, sb, 0.16); gfx_rect(i, cy - ye, 1, ye * 2 + 1); );
// ---------- color ---------- s_color < 0.5 ? gfx_set(sr, sg, sb, 1) : s_color < 1.5 ? ( tot = vlo + vmd + vhi + 0.000000001; wl = pow(vlo / tot, 0.7); wm = pow(vmd / tot, 0.7); wh = pow(vhi / tot, 0.7); tot = wl + wm + wh + 0.000000001; wl /= tot; wm /= tot; wh /= tot; gfx_r = lo_r * wl + md_r * wm + hi_r * wh; gfx_g = lo_g * wl + md_g * wm + hi_g * wh; gfx_b = lo_b * wl + md_b * wm + hi_b * wh; mxc = max(max(gfx_r, gfx_g), gfx_b) + 0.000000001; gfx_r /= mxc; gfx_g /= mxc; gfx_b /= mxc; gfx_a = 1; ) : ( t = amp_norm(max(vmx, -vmn)); t < 0.25 ? gfx_set(0, t * 4, 1, 1) : t < 0.50 ? gfx_set(0, 1, 1 - (t - 0.25) * 4, 1) : t < 0.75 ? gfx_set((t - 0.50) * 4, 1, 0, 1) : gfx_set(1, 1 - (t - 0.75) * 3.2, 0, 1); );
// ---------- trazo ---------- spp < 1 ? ( // osciloscopio: linea continua entre muestras cury = y_of(o_raw[idx], cy, half); i > 0 ? gfx_line(i - 1, prevy, i, cury, 1) : gfx_rect(i, cury, 1, 1); prevy = cury; ) : ( ytop = cy - amp_norm(vmx) * half; ybot = cy + amp_norm(-vmn) * half; hh = ybot - ytop; hh < 1 ? hh = 1; s_style < 0.5 ? gfx_rect(i, ytop, 1, hh) : s_style < 1.5 ? ( gfx_rect(i, ytop, 1, 2); gfx_rect(i, ybot - 2, 1, 2); ) : ( gfx_rect(i, ytop, 1, hh); gfx_a = 0.9; gfx_set(1, 1, 1, 0.5); gfx_rect(i, cy, 1, 1); ); );
i += 1; sptr += spp; sptr >= histsize ? sptr -= histsize; ););
// ---------- rejilla ----------function draw_grid(cy, lh) local(half, d, a, yy, i) ( half = lh * 0.5 - 4; s_grid > 0.5 ? ( i = 0; loop(5, d = i == 0 ? -3 : i == 1 ? -6 : i == 2 ? -12 : i == 3 ? -18 : -24; a = amp_norm(pow(10, d / 20)); a > 0.02 && a < 1 ? ( yy = a * half; gfx_set(1, 1, 1, 0.09); gfx_line(0, cy - yy, gfx_w - 46, cy - yy); gfx_line(0, cy + yy, gfx_w - 46, cy + yy); gfx_set(1, 1, 1, 0.30); gfx_x = gfx_w - 42; gfx_y = cy - yy - 6; gfx_drawnumber(d, 0); gfx_drawstr(" dB"); ); i += 1; ); ); gfx_set(1, 1, 1, 0.22); gfx_line(0, cy, gfx_w, cy););
update_params();
@slider
prev_on = ch2_on;update_params();// al encender CH2, limpia su historial para que no salga basura!prev_on && ch2_on ? memset(c2_raw, 0, histsize + nbins * 6);
@sample
s_freeze < 0.5 ? (
s1 = ch1_src == 0 ? spl0 : ch1_src == 1 ? spl1 : ch1_src == 3 ? (spl0 - spl1) * 0.5 : (spl0 + spl1) * 0.5;
// bandas CH1 (dos polos por banda) f1a += a_lo * (s1 - f1a); f1b += a_lo * (f1a - f1b); g1a += a_hi * (s1 - g1a); g1b += a_hi * (g1a - g1b);
e1 = abs(s1); env1 = max(env1 * hold_dec, e1); pk1 = max(pk1 * pk_dec, e1); rms1 += rms_a * (s1 * s1 - rms1); e1 >= 0.999 ? clip1 = 1;
c1_raw[recpos] = s1; s1 < b1mn ? b1mn = s1; s1 > b1mx ? b1mx = s1; abs(f1b) > b1lo ? b1lo = abs(f1b); abs(g1b - f1b) > b1md ? b1md = abs(g1b - f1b); abs(s1 - g1b) > b1hi ? b1hi = abs(s1 - g1b); env1 > b1ev ? b1ev = env1;
ch2_on ? ( s2 = ch2_src == 0 ? spl0 : ch2_src == 1 ? spl1 : ch2_src == 3 ? (spl0 - spl1) * 0.5 : (spl0 + spl1) * 0.5;
f2a += a_lo * (s2 - f2a); f2b += a_lo * (f2a - f2b); g2a += a_hi * (s2 - g2a); g2b += a_hi * (g2a - g2b);
e2 = abs(s2); env2 = max(env2 * hold_dec, e2); pk2 = max(pk2 * pk_dec, e2); rms2 += rms_a * (s2 * s2 - rms2); e2 >= 0.999 ? clip2 = 1;
c2_raw[recpos] = s2; s2 < b2mn ? b2mn = s2; s2 > b2mx ? b2mx = s2; abs(f2b) > b2lo ? b2lo = abs(f2b); abs(g2b - f2b) > b2md ? b2md = abs(g2b - f2b); abs(s2 - g2b) > b2hi ? b2hi = abs(s2 - g2b); env2 > b2ev ? b2ev = env2; );
bincnt += 1; bincnt >= BINSZ ? ( c1_mn[binpos] = b1mn; c1_mx[binpos] = b1mx; c1_lo[binpos] = b1lo; c1_md[binpos] = b1md; c1_hi[binpos] = b1hi; c1_ev[binpos] = b1ev; b1mn = 0; b1mx = 0; b1lo = 0; b1md = 0; b1hi = 0; b1ev = 0;
ch2_on ? ( c2_mn[binpos] = b2mn; c2_mx[binpos] = b2mx; c2_lo[binpos] = b2lo; c2_md[binpos] = b2md; c2_hi[binpos] = b2hi; c2_ev[binpos] = b2ev; b2mn = 0; b2mx = 0; b2lo = 0; b2md = 0; b2hi = 0; b2ev = 0; );
bincnt = 0; binpos += 1; binpos >= nbins ? binpos = 0; );
recpos += 1; recpos >= histsize ? recpos = 0;);
@gfx 700 400
// ---------------- estado de mouse ----------------has_click = (mouse_cap & 1) && !(last_cap & 1);last_cap = mouse_cap;wheel = mouse_wheel; mouse_wheel = 0; wheel_used = 0;kc = gfx_getchar();kc == 27 ? panel_open = 0;
gfx_setfont(1, "Arial", 13);
// fondogfx_set(0.055, 0.058, 0.07, 1);gfx_rect(0, 0, gfx_w, gfx_h);
lane_h = ch2_on ? gfx_h / 2 : gfx_h;cy1 = ch2_on ? lane_h * 0.5 : gfx_h * 0.5;cy2 = ch2_on ? lane_h * 1.5 : 0;
viewspl = floor(s_time * 0.001 * srate);viewspl > histsize ? viewspl = histsize;viewspl < 8 ? viewspl = 8;
// ---------------- rejilla de tiempo ----------------s_grid > 1.5 ? ( gi = 1; loop(7, gx = gfx_w * gi / 8; gfx_set(1, 1, 1, 0.05); gfx_line(gx, 0, gx, gfx_h); gi += 1; ); gfx_set(1, 1, 1, 0.35); gfx_x = 6; gfx_y = gfx_h - 16; gfx_drawstr("-"); gfx_drawnumber(s_time, 0); gfx_drawstr(" ms"); gfx_x = gfx_w - 34; gfx_y = gfx_h - 16; gfx_drawstr("0 ms"););
draw_grid(cy1, lane_h);ch2_on ? draw_grid(cy2, lane_h);
// ---------------- ondas ----------------draw_lane(cy1, lane_h, c1_raw, c1_mn, c1_mx, c1_lo, c1_md, c1_hi, c1_ev, 0.25, 0.95, 1.0);ch2_on ? ( draw_lane(cy2, lane_h, c2_raw, c2_mn, c2_mx, c2_lo, c2_md, c2_hi, c2_ev, 1.0, 0.42, 0.78); gfx_set(1, 1, 1, 0.16); gfx_line(0, gfx_h * 0.5, gfx_w, gfx_h * 0.5););
// ---------------- lecturas ----------------clip1 ? (clipf1 = 40; clip1 = 0);clip2 ? (clipf2 = 40; clip2 = 0);
function readout(cy, lh, nm, pk, rms, clipf, cr, cg, cb) local(ty) ( ty = cy - lh * 0.5 + 6; gfx_set(cr, cg, cb, 1); gfx_rect(8, ty + 3, 8, 8); gfx_set(0.9, 0.92, 0.96, 0.9); gfx_x = 22; gfx_y = ty; gfx_drawstr(nm); s_read > 0.5 ? ( gfx_set(0.75, 0.78, 0.85, 0.85); gfx_x = 78; gfx_y = ty; gfx_drawstr("Pk "); gfx_drawnumber(pk > 0.0000001 ? 20 * log10(pk) : -99, 1); gfx_drawstr(" RMS "); gfx_drawnumber(rms > 0.0000000001 ? 10 * log10(rms) : -99, 1); gfx_drawstr(" dB"); ); clipf > 0 ? ( gfx_set(1, 0.15, 0.15, min(clipf / 40, 1)); gfx_rect(gfx_w - 120, ty, 34, 14); gfx_set(1, 1, 1, 1); gfx_x = gfx_w - 115; gfx_y = ty + 1; gfx_drawstr("CLIP"); ););
nm_src(#n1, s_ch1);readout(cy1, lane_h, #n1, pk1, rms1, clipf1, 0.25, 0.95, 1.0);ch2_on ? ( nm_src(#n2, s_ch2 - 1); readout(cy2, lane_h, #n2, pk2, rms2, clipf2, 1.0, 0.42, 0.78); );
clipf1 > 0 ? clipf1 -= 1;clipf2 > 0 ? clipf2 -= 1;
// congelados_freeze > 0.5 ? ( gfx_set(0.4, 0.8, 1, 0.85); gfx_x = gfx_w * 0.5 - 34; gfx_y = 6; gfx_drawstr("CONGELADO"););
// ---------------- boton de ajustes ----------------bw2 = 74; bh2 = 20;bx2 = gfx_w - bw2 - 6; by2 = 6;hovb = mouse_x >= bx2 && mouse_x <= bx2 + bw2 && mouse_y >= by2 && mouse_y <= by2 + bh2;gfx_set(0.16, 0.17, 0.21, 0.92);hovb ? gfx_set(0.28, 0.30, 0.38, 0.95);gfx_rect(bx2, by2, bw2, bh2);gfx_set(0.85, 0.88, 0.95, 1);gfx_x = bx2 + 9; gfx_y = by2 + 3; gfx_drawstr("AJUSTES");has_click && hovb ? (panel_open = !panel_open; has_click = 0);
// ---------------- zoom con rueda sobre el scope ----------------!panel_open && wheel != 0 && !wheel_used ? ( mouse_cap & 8 ? ( // shift = ganancia s_gain = clampv(s_gain + (wheel > 0 ? 0.5 : -0.5), -24, 24); ) : ( s_time = clampv(floor(s_time * (wheel > 0 ? 0.8 : 1.25)), 5, 10000); ); update_params(););
// ---------------- panel de ajustes ----------------panel_open ? ( pw = min(gfx_w - 30, 620); ph = min(gfx_h - 30, 300); px = (gfx_w - pw) * 0.5; py = (gfx_h - ph) * 0.5;
gfx_set(0, 0, 0, 0.55); gfx_rect(0, 0, gfx_w, gfx_h); gfx_set(0.10, 0.11, 0.14, 0.98); gfx_rect(px, py, pw, ph); gfx_set(1, 1, 1, 0.12); gfx_line(px, py, px + pw, py); gfx_line(px, py + ph, px + pw, py + ph); gfx_line(px, py, px, py + ph); gfx_line(px + pw, py, px + pw, py + ph);
gfx_set(0.95, 0.96, 1, 1); gfx_x = px + 12; gfx_y = py + 9; gfx_drawstr("AJUSTES - DRZ Waveform Meter");
cw = (pw - 24) * 0.5; cx1 = px + 8; cx2 = px + 16 + cw; ry = py + 34; ry2 = ry;
// ---- columna izquierda ---- nm_src(#v, s_ch1); d = ui_row(cx1, ry, cw, "CH1 fuente", #v); d ? s_ch1 = wrapv(s_ch1 + d, 0, 4); ry += 22; nm_src2(#v, s_ch2); d = ui_row(cx1, ry, cw, "CH2 fuente", #v); d ? s_ch2 = wrapv(s_ch2 + d, 0, 5); ry += 22; nm_col(#v, s_color); d = ui_row(cx1, ry, cw, "Color", #v); d ? s_color = wrapv(s_color + d, 0, 2); ry += 22; nm_hold(#v, s_hold); d = ui_row(cx1, ry, cw, "Peak hold", #v); d ? s_hold = wrapv(s_hold + d, 0, 3); ry += 22; nm_scl(#v, s_scale); d = ui_row(cx1, ry, cw, "Escala", #v); d ? s_scale = wrapv(s_scale + d, 0, 1); ry += 22; sprintf(#v, "%d dB", s_floor); d = ui_row(cx1, ry, cw, "Piso dB", #v); d ? s_floor = clampv(s_floor + d * 3, -96, -24); ry += 22; nm_sty(#v, s_style); d = ui_row(cx1, ry, cw, "Estilo", #v); d ? s_style = wrapv(s_style + d, 0, 2); ry += 22; nm_grid(#v, s_grid); d = ui_row(cx1, ry, cw, "Rejilla", #v); d ? s_grid = wrapv(s_grid + d, 0, 2); ry += 22; nm_ono(#v, s_read); d = ui_row(cx1, ry, cw, "Lecturas", #v); d ? s_read = wrapv(s_read + d, 0, 1); ry += 22;
// ---- columna derecha ---- sprintf(#v, "%d ms", s_time); d = ui_row(cx2, ry2, cw, "Ventana", #v); d ? s_time = clampv(floor(s_time * (d > 0 ? 1.25 : 0.8)), 5, 10000); ry2 += 22; sprintf(#v, "%.1f dB", s_gain); d = ui_row(cx2, ry2, cw, "Ganancia", #v); d ? s_gain = clampv(s_gain + d * 0.5, -24, 24); ry2 += 22; sprintf(#v, "%d", s_hue_lo); d = ui_row(cx2, ry2, cw, "Hue graves", #v); d ? s_hue_lo = wrapv(s_hue_lo + d * 10, 0, 360); ry2 += 22; sprintf(#v, "%d", s_hue_md); d = ui_row(cx2, ry2, cw, "Hue medios", #v); d ? s_hue_md = wrapv(s_hue_md + d * 10, 0, 360); ry2 += 22; sprintf(#v, "%d", s_hue_hi); d = ui_row(cx2, ry2, cw, "Hue agudos", #v); d ? s_hue_hi = wrapv(s_hue_hi + d * 10, 0, 360); ry2 += 22; sprintf(#v, "%d Hz", s_xlo); d = ui_row(cx2, ry2, cw, "Cruce L/M", #v); d ? s_xlo = clampv(floor(s_xlo * (d > 0 ? 1.15 : 0.87)), 40, 1000); ry2 += 22; sprintf(#v, "%d Hz", s_xhi); d = ui_row(cx2, ry2, cw, "Cruce M/H", #v); d ? s_xhi = clampv(floor(s_xhi * (d > 0 ? 1.15 : 0.87)), 800, 12000); ry2 += 22; nm_ono(#v, s_freeze); d = ui_row(cx2, ry2, cw, "Congelar", #v); d ? s_freeze = wrapv(s_freeze + d, 0, 1); ry2 += 22;
// muestra de colores de banda gfx_set(lo_r, lo_g, lo_b, 1); gfx_rect(cx2 + 8, ry2 + 6, 40, 10); gfx_set(md_r, md_g, md_b, 1); gfx_rect(cx2 + 52, ry2 + 6, 40, 10); gfx_set(hi_r, hi_g, hi_b, 1); gfx_rect(cx2 + 96, ry2 + 6, 40, 10);
update_params();
// pie gfx_set(0.55, 0.58, 0.66, 1); gfx_x = px + 12; gfx_y = py + ph - 20; gfx_drawstr("Rueda = zoom | Shift+rueda = ganancia | ESC = cerrar");
// boton cerrar cxb = px + pw - 70; cyb = py + ph - 26; hovc = mouse_x >= cxb && mouse_x <= cxb + 60 && mouse_y >= cyb && mouse_y <= cyb + 20; gfx_set(0.2, 0.21, 0.26, 1); hovc ? gfx_set(0.35, 0.37, 0.45, 1); gfx_rect(cxb, cyb, 60, 20); gfx_set(0.9, 0.92, 1, 1); gfx_x = cxb + 12; gfx_y = cyb + 3; gfx_drawstr("Cerrar"); has_click && hovc ? panel_open = 0;);