Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 141 additions & 0 deletions stage/iem-hd-v8/EDX_HD.eel
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
desc:HyperAudio IEM EDX HD v8 (NextGEN)
//tags: iem limiter true-peak tone-control

preGain10:0<-120,60,1>Pre Gain tenths dB
ceilDb10:-15<-600,-3,1>Limiter Ceiling tenths dBFS
relMs:80<10,500,1>Limiter Release ms
tpDetect:1<0,1,1{Off,On}>True Peak Detect
bassDb:0<-6,6,1>Bass (dB)
trebDb:0<-6,6,1>Treble (dB)

@init
// Explicit slider defaults for RootlessJamesDSP UI compatibility.
tpDetect = 1;
preGain10 = 0;
ceilDb10 = -15;
relMs = 80;
bassDb = 0;
trebDb = 0;
fs = srate > 0 ? srate : 48000;
pre_k = 1.0 - exp(-1.0 / (0.01 * fs)); preLin = 1.0; preTgt = 1.0; ceilLin = 0.841395; rel_k = 0.001;
prev_pre = -99999; prev_ceil = -99999; prev_rel = -99999;
dcR = exp(-2.0 * $PI * 2.0 / fs); dxL = 0; dyL = 0; dxR = 0; dyR = 0;

// Tone control state
last_bass = -999; last_treb = -999;
bass_l = 0; bass_r = 0; treb_l = 0; treb_r = 0;
bass_k = 1.0 - exp(-2.0 * $PI * 150.0 / fs);
treb_k = 1.0 - exp(-2.0 * $PI * 4000.0 / fs);
tone_smooth_k = 1.0 - exp(-1.0 / (0.02 * fs));
b_gain = 1.0; b_target = 1.0;
t_gain = 1.0; t_target = 1.0;

// shared limiter core v7: 1.5 ms lookahead + 7 samples detector alignment, O(1) sliding minimum (monotonic deque), moving-average ramp, gated true-peak (16-tap Kaiser sinc, 4x)
L_D = max(2, min(500, floor(0.0015 * fs + 0.5)));
L_N = L_D + 1; L_cap = L_N + 1; L_NA = L_N + 7;
L_dlyL = 40000; L_dlyR = L_dlyL + L_NA; L_dqV = L_dlyR + L_NA; L_dqI = L_dqV + L_cap; L_eB = L_dqI + L_cap;
L_fadeLen = max(1, floor(0.05 * fs));
L_i = 0;
loop(L_NA, L_dlyL[L_i] = 0; L_dlyR[L_i] = 0; L_i += 1; );
L_i = 0;
loop(L_cap, L_dqV[L_i] = 1.0; L_dqI[L_i] = 0; L_i += 1; );
L_i = 0;
loop(L_D, L_eB[L_i] = 1.0; L_i += 1; );
L_w = 0; L_head = 0; L_tail = 0; L_t = 0; L_ew = 0; L_eprev = 1.0; L_esum = L_D; L_chk = 0; L_fadeN = 0;
isp_hot = 0;
ia0 = 0; ib0 = 0;
ia1 = 0; ib1 = 0;
ia2 = 0; ib2 = 0;
ia3 = 0; ib3 = 0;
ia4 = 0; ib4 = 0;
ia5 = 0; ib5 = 0;
ia6 = 0; ib6 = 0;
ia7 = 0; ib7 = 0;
ia8 = 0; ib8 = 0;
ia9 = 0; ib9 = 0;
ia10 = 0; ib10 = 0;
ia11 = 0; ib11 = 0;
ia12 = 0; ib12 = 0;
ia13 = 0; ib13 = 0;
ia14 = 0; ib14 = 0;
ia15 = 0; ib15 = 0;

@sample
(preGain10 != prev_pre || ceilDb10 != prev_ceil || relMs != prev_rel) ? (
prev_pre = preGain10; prev_ceil = ceilDb10; prev_rel = relMs;
preTgt = pow(10.0, preGain10 / 200.0);
ceilLin = pow(10.0, min(ceilDb10, -3) / 200.0);
rel_k = 1.0 - exp(-1.0 / (max(relMs, 10) * 0.001 * fs));
);
preLin += (preTgt - preLin) * pre_k;
abs(spl0) < 1e6 ? 0 : (spl0 = 0.0);
abs(spl1) < 1e6 ? 0 : (spl1 = 0.0);

l = spl0 * preLin;
r = spl1 * preLin;
// Tone controls: shelf states update every sample; output is bypassed exactly at 0 dB
(bassDb != last_bass || trebDb != last_treb) ? (
last_bass = bassDb; last_treb = trebDb;
b_target = pow(10.0, bassDb / 20.0);
t_target = pow(10.0, trebDb / 20.0);
);
b_gain += (b_target - b_gain) * tone_smooth_k;
t_gain += (t_target - t_gain) * tone_smooth_k;
abs(b_target - b_gain) < 1e-6 ? ( b_gain = b_target; );
abs(t_target - t_gain) < 1e-6 ? ( t_gain = t_target; );
bass_l += (l - bass_l) * bass_k; bass_r += (r - bass_r) * bass_k;
b_gain != 1.0 ? ( l = l - bass_l + bass_l * b_gain; r = r - bass_r + bass_r * b_gain; );
treb_l += (l - treb_l) * treb_k; treb_r += (r - treb_r) * treb_k;
t_gain != 1.0 ? ( l = treb_l + (l - treb_l) * t_gain; r = treb_r + (r - treb_r) * t_gain; );
yl = l - dxL + dcR * dyL; dxL = l; dyL = yl; abs(dyL) < 1e-30 ? ( dyL = 0.0; ); l = yl;
yr = r - dxR + dcR * dyR; dxR = r; dyR = yr; abs(dyR) < 1e-30 ? ( dyR = 0.0; ); r = yr;


// ---- limiter core (input l,r; output spl0,spl1; needs ceilLin, rel_k) ----
// true-peak (gated, unrolled, 16-tap Kaiser sinc): history shift
ia0 = ia1; ib0 = ib1;
ia1 = ia2; ib1 = ib2;
ia2 = ia3; ib2 = ib3;
ia3 = ia4; ib3 = ib4;
ia4 = ia5; ib4 = ib5;
ia5 = ia6; ib5 = ib6;
ia6 = ia7; ib6 = ib7;
ia7 = ia8; ib7 = ib8;
ia8 = ia9; ib8 = ib9;
ia9 = ia10; ib9 = ib10;
ia10 = ia11; ib10 = ib11;
ia11 = ia12; ib11 = ib12;
ia12 = ia13; ib12 = ib13;
ia13 = ia14; ib13 = ib14;
ia14 = ia15; ib14 = ib15;
ia15 = l; ib15 = r;
isp_pk = 0;
(tpDetect > 0 && max(abs(l), abs(r)) > ceilLin * 0.4) ? ( isp_hot = 16; ) : ( isp_hot -= 1; );
isp_hot > 0 ? (
isp_pk = max(isp_pk, abs((ia0 * -0.005102525 + ia1 * 0.010482265 + ia2 * -0.018833394 + ia3 * 0.031572326 + ia4 * -0.051661508 + ia5 * 0.087265300 + ia6 * -0.172996348 + ia7 * 0.900904607 + ia8 * 0.296268866 + ia9 * -0.118593909 + ia10 * 0.066546515 + ia11 * -0.040392769 + ia12 * 0.024525659 + ia13 * -0.014217483 + ia14 * 0.007482058 + ia15 * -0.003249660)));
isp_pk = max(isp_pk, abs((ia0 * -0.005825492 + ia1 * 0.012595005 + ia2 * -0.023220457 + ia3 * 0.039432255 + ia4 * -0.064636538 + ia5 * 0.107531911 + ia6 * -0.200264293 + ia7 * 0.634387609 + ia8 * 0.634387609 + ia9 * -0.200264293 + ia10 * 0.107531911 + ia11 * -0.064636538 + ia12 * 0.039432255 + ia13 * -0.023220457 + ia14 * 0.012595005 + ia15 * -0.005825492)));
isp_pk = max(isp_pk, abs((ia0 * -0.003249660 + ia1 * 0.007482058 + ia2 * -0.014217483 + ia3 * 0.024525659 + ia4 * -0.040392769 + ia5 * 0.066546515 + ia6 * -0.118593909 + ia7 * 0.296268866 + ia8 * 0.900904607 + ia9 * -0.172996348 + ia10 * 0.087265300 + ia11 * -0.051661508 + ia12 * 0.031572326 + ia13 * -0.018833394 + ia14 * 0.010482265 + ia15 * -0.005102525)));
isp_pk = max(isp_pk, abs((ib0 * -0.005102525 + ib1 * 0.010482265 + ib2 * -0.018833394 + ib3 * 0.031572326 + ib4 * -0.051661508 + ib5 * 0.087265300 + ib6 * -0.172996348 + ib7 * 0.900904607 + ib8 * 0.296268866 + ib9 * -0.118593909 + ib10 * 0.066546515 + ib11 * -0.040392769 + ib12 * 0.024525659 + ib13 * -0.014217483 + ib14 * 0.007482058 + ib15 * -0.003249660)));
isp_pk = max(isp_pk, abs((ib0 * -0.005825492 + ib1 * 0.012595005 + ib2 * -0.023220457 + ib3 * 0.039432255 + ib4 * -0.064636538 + ib5 * 0.107531911 + ib6 * -0.200264293 + ib7 * 0.634387609 + ib8 * 0.634387609 + ib9 * -0.200264293 + ib10 * 0.107531911 + ib11 * -0.064636538 + ib12 * 0.039432255 + ib13 * -0.023220457 + ib14 * 0.012595005 + ib15 * -0.005825492)));
isp_pk = max(isp_pk, abs((ib0 * -0.003249660 + ib1 * 0.007482058 + ib2 * -0.014217483 + ib3 * 0.024525659 + ib4 * -0.040392769 + ib5 * 0.066546515 + ib6 * -0.118593909 + ib7 * 0.296268866 + ib8 * 0.900904607 + ib9 * -0.172996348 + ib10 * 0.087265300 + ib11 * -0.051661508 + ib12 * 0.031572326 + ib13 * -0.018833394 + ib14 * 0.010482265 + ib15 * -0.005102525)));
);
pk = max(max(abs(ia7), abs(ib7)), isp_pk * 1.015);
req = pk > ceilLin ? ceilLin / pk : 1.0;
req = min(max(req, 0.0), 1.0);
L_t += 1;
while (L_tail > L_head && L_dqV[(L_tail - 1) % L_cap] >= req) ( L_tail -= 1; );
L_dqV[L_tail % L_cap] = req; L_dqI[L_tail % L_cap] = L_t; L_tail += 1;
while (L_dqI[L_head % L_cap] <= L_t - L_N) ( L_head += 1; );
m = L_dqV[L_head % L_cap];
L_dlyL[L_w] = l; L_dlyR[L_w] = r;
rec = L_eprev + (1.0 - L_eprev) * rel_k;
e = min(m, rec); L_eprev = e;
L_esum += e - L_eB[L_ew]; L_eB[L_ew] = e; L_ew += 1; L_ew >= L_D ? ( L_ew = 0; );
L_chk += 1;
L_chk >= L_N * 8 ? ( L_i = 0; L_s = 0.0; loop(L_D, L_s += L_eB[L_i]; L_i += 1; ); L_esum = L_s; L_chk = 0; );
g = min(1.0, L_esum / L_D);
L_rp = L_w + 1; L_rp >= L_NA ? ( L_rp = 0; );
L_fadeN < L_fadeLen ? ( L_fadeN += 1; fg = L_fadeN / L_fadeLen; ) : ( fg = 1.0; );
spl0 = min(max(L_dlyL[L_rp] * g * fg, -ceilLin), ceilLin);
spl1 = min(max(L_dlyR[L_rp] * g * fg, -ceilLin), ceilLin);
L_w += 1; L_w >= L_NA ? ( L_w = 0; );
Binary file added stage/iem-hd-v8/EDX_HD.irs
Binary file not shown.
2 changes: 2 additions & 0 deletions stage/iem-hd-v8/EDX_HD.vdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
SR_44100:0.814246528,-1.569468044,0.756991544,1.902755065,-0.906635569,0.615793994,0.534621851,0.240446710,-0.108157563,-0.282704993,0.887365088,0.164456943,0.783958246,-0.164456943,-0.671323335,0.832216023,-0.653166515,0.710252685,0.653166515,-0.542468708,1.308123385,-0.855354021,-0.016137848,0.855354021,-0.291985537,0.928927539,-1.353918665,0.815555560,1.353918665,-0.744483099,0.971131416,-1.779946627,0.891112728,1.779946627,-0.862244144,1.069634594,0.648799715,0.777933148,-0.648799715,-0.847567741,1.100331029,-0.409020475,0.698051714,0.409020475,-0.798382743,1.010149426,-1.889255851,0.894848819,1.889255851,-0.904998245
SR_48000:0.815065946,-1.575818830,0.762252910,1.910590208,-0.913878790,0.575695202,0.389147413,0.225515594,0.145628730,-0.335986940,0.892258460,-0.063454302,0.794734292,0.063454302,-0.686992752,0.830638928,-0.779324596,0.717014639,0.779324596,-0.547653567,1.297746058,-0.927462674,0.019016416,0.927462674,-0.316762474,0.933648444,-1.427063942,0.828396339,1.427063942,-0.762044783,0.973297881,-1.802645034,0.899286784,1.802645034,-0.872584665,1.072529611,0.370944666,0.781720650,-0.370944666,-0.854250261,1.094199435,-0.606745198,0.716504150,0.606745198,-0.810703585,1.009372991,-1.898970202,0.902941837,1.898970202,-0.912314828