1// ============================================
2// XiForge 自动生成 · 不要手动修改下方 [GEN] 区
3// 文件: peq.cpp · 算法 PEQ_8band_v2
4// 源 UI 描述: peq.xiforge · 控件 W1-W8
5// ============================================
6
7#include "xicore/dsp.h"
8#include "xicore/biquad.h"
9
10// ─── [GEN-START params] 自动同步自 UI 控件 ───
11struct PEQ8BandParams {
12 f32 freq[8] { 120, 300, 800, 2000, 4000, 8000, 12000, 16000 };
13 f32 gain[8] { 3.0, 0.0, -2.0, 0.0, 0.0, 1.5, 0.0, -3.0 };
14 f32 q[8] { 1.4, 1.0, 0.7, 1.0, 1.0, 1.4, 2.0, 0.7 };
15 u8 type[8] { PEAK, PEAK, PEAK, PEAK, PEAK, PEAK, HSHELF, LSHELF };
16};
17// ─── [GEN-END params] ───
18
19class PEQ8Band final :
public XiModule {
20 private:
21 PEQ8BandParams params_;
22 BiQuad filters_[
8];
23
24 public:
25 void init()
override {
26 for (
int i =
0; i <
8; ++i)
27 filters_[i].
setPeq(params_.freq[i], params_.gain[i],
28 params_.q[i], params_.type[i]);
29 }
30
31 void process(
f32* in,
f32* out,
int n)
override {
32 for (
int i =
0; i < n; ++i) {
33 f32 y = in[i];
34 for (
int b =
0; b <
8; ++b)
35 y = filters_[b].
tick(y);
36 out[i] = y;
37 }
38 }
39
40// ─── [GEN-START events] 自动同步自 UI Events ───
41 void onParamChange(const char* key, int idx, f32 v) override {
42 if (strcmp(key, "freq") == 0) params_.freq[idx] = v;
43 else if (strcmp(key, "gain") == 0) params_.gain[idx] = v;
44 else if (strcmp(key, "q") == 0) params_.q[idx] = v;
45 else if (strcmp(key, "type") == 0) params_.type[idx] = (u8)v;
46 filters_[idx].setPeq(params_.freq[idx], params_.gain[idx],
47 params_.q[idx], params_.type[idx]);
48 }
49// ─── [GEN-END events] ───
50};