Skip to content

Instantly share code, notes, and snippets.

@X-Raym
Last active April 28, 2024 20:10
Show Gist options
  • Save X-Raym/5d8a79a6a247921a7b17622dac21d38e to your computer and use it in GitHub Desktop.
Save X-Raym/5d8a79a6a247921a7b17622dac21d38e to your computer and use it in GitHub Desktop.
desc:MIDI Pad audio meter
// based on Akai LPD8 VU meter by Tale
// Mod by X-Raym
// https://forum.cockos.com/showthread.php?t=290733
slider1:pads=4<1,16,1>Pads per Row
slider2:range_min=-20<-150,12,1>Range Min (dB)
slider3:range_max=0<-150,12,1>Range Max (dB)
slider4:midi_note_dest=36<1,127,1>MIDI Note Start
@init
l = r = 1;
a = 1 / (0.2 * srate + 1);
function ValFromdB(dB_val) ( pow(10, dB_val/20) );
function dBFromVal(val) ( 20*log10(val) );
function MapLinear (num, in_min, in_max, out_min, out_max) (
(num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
);
function draw_pads() local (a,row,rolumn, border, pad_w,pad_h, pad_mouse, db_step, format, a_boost, color) (
border = 1;
columns = pads;
rows = 2;
pad = 0; // zero based, up to 15
pad_w = floor(gfx_w / columns);
pad_h = floor(gfx_h / rows);
pad_mouse = 0;
format = "%d";
row = 0;
loop( rows,
column = 0;
loop( columns,
db_step = floor( range_min + (range_max-range_min)/pads * column +0.5);
a_boost = 0;
gfx_set(1, 0.2, 0.1 );
(row == 0 && dBFromVal(l) >= db_step ) || (row == 1 && dBFromVal(r) >= db_step ) ? (
a_boost = 0.5;
);
gfx_a = 0.5 + a_boost;
gfx_rect(column * pad_w, row * pad_h, pad_w - border, pad_h - border );
gfx_a = 1;
// Text
gfx_r = 1; gfx_g = 1; gfx_b = 1;
gfx_setfont(1);
gfx_measurestr(sprintf(#, format, db_step),w,h);
gfx_x = column * pad_w + pad_w / 2 - w / 2;
gfx_y = row * pad_h + pad_h/2 - h/4;
gfx_drawstr(sprintf(#, format, db_step));
pad += 1;
column +=1;
);
j += 1;
row += 1;
);
);
@gfx 100 200
gfx_size = min(gfx_w, gfx_h);
gfx_setfont(1,"Tahoma Bold",gfx_size / 4 / 2);
draw_pads();
@block
function midisend(idx, on)
(
on != buf[idx] ? (
buf[idx] = on;
midisend(0, 0x90, midi_note_dest + idx, 127 * on);
);
);
i = 0;
loop(pads,
x = floor(range_min + (range_max-range_min)/pads * i + 0.5);
midisend(i, dBFromVal(r) >= x );
midisend(i + pads, dBFromVal(l) >= x );
i += 1;
);
@sample
l += a * (abs(1.41 * spl0) - l);
r += a * (abs(1.41 * spl1) - r);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment