diff --git a/build/generator/out/iem_nextgen/EDX_HD_NextGEN_candidate.eel b/build/generator/out/iem_nextgen/EDX_HD_NextGEN_candidate.eel new file mode 100644 index 0000000..cff796d --- /dev/null +++ b/build/generator/out/iem_nextgen/EDX_HD_NextGEN_candidate.eel @@ -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; );