@vessel-dsp/chain 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +230 -0
  3. package/dist/chain.d.ts +31 -0
  4. package/dist/chain.d.ts.map +1 -0
  5. package/dist/chain.js +208 -0
  6. package/dist/chain.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +13 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/ir-resample.d.ts +2 -0
  12. package/dist/ir-resample.d.ts.map +1 -0
  13. package/dist/ir-resample.js +41 -0
  14. package/dist/ir-resample.js.map +1 -0
  15. package/dist/nam/engine.d.ts +73 -0
  16. package/dist/nam/engine.d.ts.map +1 -0
  17. package/dist/nam/engine.js +89 -0
  18. package/dist/nam/engine.js.map +1 -0
  19. package/dist/nodes/amp-shaper-node.d.ts +37 -0
  20. package/dist/nodes/amp-shaper-node.d.ts.map +1 -0
  21. package/dist/nodes/amp-shaper-node.js +134 -0
  22. package/dist/nodes/amp-shaper-node.js.map +1 -0
  23. package/dist/nodes/gain-node.d.ts +19 -0
  24. package/dist/nodes/gain-node.d.ts.map +1 -0
  25. package/dist/nodes/gain-node.js +49 -0
  26. package/dist/nodes/gain-node.js.map +1 -0
  27. package/dist/nodes/input-profile-node.d.ts +38 -0
  28. package/dist/nodes/input-profile-node.d.ts.map +1 -0
  29. package/dist/nodes/input-profile-node.js +245 -0
  30. package/dist/nodes/input-profile-node.js.map +1 -0
  31. package/dist/nodes/ir-node.d.ts +56 -0
  32. package/dist/nodes/ir-node.d.ts.map +1 -0
  33. package/dist/nodes/ir-node.js +438 -0
  34. package/dist/nodes/ir-node.js.map +1 -0
  35. package/dist/nodes/master-node.d.ts +23 -0
  36. package/dist/nodes/master-node.d.ts.map +1 -0
  37. package/dist/nodes/master-node.js +93 -0
  38. package/dist/nodes/master-node.js.map +1 -0
  39. package/dist/nodes/nam-node.d.ts +81 -0
  40. package/dist/nodes/nam-node.d.ts.map +1 -0
  41. package/dist/nodes/nam-node.js +234 -0
  42. package/dist/nodes/nam-node.js.map +1 -0
  43. package/dist/nodes/runtime-node.d.ts +66 -0
  44. package/dist/nodes/runtime-node.d.ts.map +1 -0
  45. package/dist/nodes/runtime-node.js +247 -0
  46. package/dist/nodes/runtime-node.js.map +1 -0
  47. package/dist/supply-profile.d.ts +56 -0
  48. package/dist/supply-profile.d.ts.map +1 -0
  49. package/dist/supply-profile.js +139 -0
  50. package/dist/supply-profile.js.map +1 -0
  51. package/dist/types.d.ts +66 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +22 -0
  54. package/dist/types.js.map +1 -0
  55. package/nam-engine/NOTICE.md +32 -0
  56. package/nam-engine/nam-engine.js +2 -0
  57. package/nam-engine/nam-engine.wasm +0 -0
  58. package/package.json +67 -0
@@ -0,0 +1,438 @@
1
+ import { resampleImpulseResponse } from "../ir-resample.js";
2
+ const PARTITION_SIZE = 128;
3
+ const FFT_SIZE = PARTITION_SIZE * 2;
4
+ function fftInPlace(re, im, inverse) {
5
+ const n = re.length;
6
+ for (let i = 1, j = 0; i < n; i++) {
7
+ let bit = n >> 1;
8
+ for (; j & bit; bit >>= 1) {
9
+ j ^= bit;
10
+ }
11
+ j ^= bit;
12
+ if (i < j) {
13
+ const tmpRe = re[i] ?? 0;
14
+ re[i] = re[j] ?? 0;
15
+ re[j] = tmpRe;
16
+ const tmpIm = im[i] ?? 0;
17
+ im[i] = im[j] ?? 0;
18
+ im[j] = tmpIm;
19
+ }
20
+ }
21
+ for (let len = 2; len <= n; len <<= 1) {
22
+ const ang = ((inverse ? 2 : -2) * Math.PI) / len;
23
+ const wlenRe = Math.cos(ang);
24
+ const wlenIm = Math.sin(ang);
25
+ for (let i = 0; i < n; i += len) {
26
+ let wRe = 1;
27
+ let wIm = 0;
28
+ for (let k = 0; k < len / 2; k++) {
29
+ const uRe = re[i + k] ?? 0;
30
+ const uIm = im[i + k] ?? 0;
31
+ const vRe = (re[i + k + len / 2] ?? 0) * wRe - (im[i + k + len / 2] ?? 0) * wIm;
32
+ const vIm = (re[i + k + len / 2] ?? 0) * wIm + (im[i + k + len / 2] ?? 0) * wRe;
33
+ re[i + k] = uRe + vRe;
34
+ im[i + k] = uIm + vIm;
35
+ re[i + k + len / 2] = uRe - vRe;
36
+ im[i + k + len / 2] = uIm - vIm;
37
+ const nextRe = wRe * wlenRe - wIm * wlenIm;
38
+ const nextIm = wRe * wlenIm + wIm * wlenRe;
39
+ wRe = nextRe;
40
+ wIm = nextIm;
41
+ }
42
+ }
43
+ }
44
+ if (inverse) {
45
+ for (let i = 0; i < n; i++) {
46
+ re[i] = (re[i] ?? 0) / n;
47
+ im[i] = (im[i] ?? 0) / n;
48
+ }
49
+ }
50
+ }
51
+ function spectrumOfBlock(block) {
52
+ const re = new Float64Array(FFT_SIZE);
53
+ const im = new Float64Array(FFT_SIZE);
54
+ for (let i = 0; i < PARTITION_SIZE; i++) {
55
+ re[i] = block[i] ?? 0;
56
+ }
57
+ fftInPlace(re, im, false);
58
+ return { re, im };
59
+ }
60
+ function lowpassCoeffs(cutoffHz, sampleRate) {
61
+ const w0 = (2 * Math.PI * cutoffHz) / sampleRate;
62
+ const q = 1 / Math.SQRT2;
63
+ const alpha = Math.sin(w0) / (2 * q);
64
+ const cosw0 = Math.cos(w0);
65
+ const b0 = (1 - cosw0) / 2;
66
+ const b1 = 1 - cosw0;
67
+ const b2 = (1 - cosw0) / 2;
68
+ const a0 = 1 + alpha;
69
+ return {
70
+ b0: b0 / a0,
71
+ b1: b1 / a0,
72
+ b2: b2 / a0,
73
+ a1: (-2 * cosw0) / a0,
74
+ a2: (1 - alpha) / a0,
75
+ };
76
+ }
77
+ function highpassCoeffs(cutoffHz, sampleRate) {
78
+ const w0 = (2 * Math.PI * cutoffHz) / sampleRate;
79
+ const q = 1 / Math.SQRT2;
80
+ const alpha = Math.sin(w0) / (2 * q);
81
+ const cosw0 = Math.cos(w0);
82
+ const b0 = (1 + cosw0) / 2;
83
+ const b1 = -(1 + cosw0);
84
+ const b2 = (1 + cosw0) / 2;
85
+ const a0 = 1 + alpha;
86
+ return {
87
+ b0: b0 / a0,
88
+ b1: b1 / a0,
89
+ b2: b2 / a0,
90
+ a1: (-2 * cosw0) / a0,
91
+ a2: (1 - alpha) / a0,
92
+ };
93
+ }
94
+ export class CabinetIrNode {
95
+ id;
96
+ name;
97
+ kind = "cabinet-ir";
98
+ bypassed = false;
99
+ mix = 1.0;
100
+ sourceIr;
101
+ sourceRate;
102
+ ir;
103
+ direct = new Float64Array(0);
104
+ partitions = [];
105
+ sampleRate = 48000;
106
+ lowCutHz = 20;
107
+ highCutHz = 20000;
108
+ hp = {
109
+ b0: 1,
110
+ b1: 0,
111
+ b2: 0,
112
+ a1: 0,
113
+ a2: 0,
114
+ x1: 0,
115
+ x2: 0,
116
+ y1: 0,
117
+ y2: 0,
118
+ };
119
+ lp = {
120
+ b0: 1,
121
+ b1: 0,
122
+ b2: 0,
123
+ a1: 0,
124
+ a2: 0,
125
+ x1: 0,
126
+ x2: 0,
127
+ y1: 0,
128
+ y2: 0,
129
+ };
130
+ hpActive = false;
131
+ lpActive = false;
132
+ history = new Float64Array(PARTITION_SIZE);
133
+ historyPos = 0;
134
+ blockBuf = new Float64Array(PARTITION_SIZE);
135
+ globalPos = 0;
136
+ fdl = [];
137
+ overlap = new Float64Array(PARTITION_SIZE);
138
+ tailBlockNum = -1;
139
+ tailBlock = new Float64Array(PARTITION_SIZE);
140
+ accumRe = new Float64Array(FFT_SIZE);
141
+ accumIm = new Float64Array(FFT_SIZE);
142
+ constructor(id = "cab-ir", name = "Cabinet IR", config) {
143
+ this.id = id;
144
+ this.name = name;
145
+ if (config?.mix !== undefined)
146
+ this.mix = Math.max(0, Math.min(1, config.mix));
147
+ if (config?.lowCutHz !== undefined)
148
+ this.lowCutHz = Math.max(20, Math.min(500, config.lowCutHz));
149
+ if (config?.highCutHz !== undefined)
150
+ this.highCutHz = Math.max(1000, Math.min(20000, config.highCutHz));
151
+ if (config?.irSampleRate !== undefined)
152
+ this.sourceRate = config.irSampleRate;
153
+ if (config?.ir && config.ir.length > 0) {
154
+ this.sourceIr = new Float64Array(config.ir);
155
+ if (this.sourceRate === undefined)
156
+ this.sourceRate = undefined;
157
+ }
158
+ else {
159
+ // Synthetic placeholder IR, not a 4x12 capture. 128 samples at 48 kHz.
160
+ this.sourceIr = this.generateDefaultCabinetIr();
161
+ this.sourceRate = 48000;
162
+ }
163
+ this.ir = new Float64Array(this.sourceIr);
164
+ this.rebuild();
165
+ this.updateFilters();
166
+ }
167
+ setIr(irData, irSampleRate) {
168
+ this.sourceIr = new Float64Array(irData);
169
+ if (irSampleRate !== undefined) {
170
+ this.sourceRate = irSampleRate;
171
+ }
172
+ else {
173
+ this.sourceRate = undefined;
174
+ }
175
+ this.deriveEffectiveIr();
176
+ this.rebuild();
177
+ this.clearState();
178
+ }
179
+ getIr() {
180
+ return new Float64Array(this.ir);
181
+ }
182
+ prepare(sampleRate) {
183
+ this.sampleRate = sampleRate;
184
+ this.deriveEffectiveIr();
185
+ this.rebuild();
186
+ this.updateFilters();
187
+ this.clearState();
188
+ }
189
+ reset() {
190
+ this.clearState();
191
+ }
192
+ getParam(id) {
193
+ switch (id) {
194
+ case "lowCutHz":
195
+ return this.lowCutHz;
196
+ case "highCutHz":
197
+ return this.highCutHz;
198
+ case "mix":
199
+ return this.mix;
200
+ default:
201
+ return undefined;
202
+ }
203
+ }
204
+ setParam(id, value) {
205
+ switch (id) {
206
+ case "lowCutHz":
207
+ this.lowCutHz = Math.max(20, Math.min(500, value));
208
+ this.updateFilters();
209
+ break;
210
+ case "highCutHz":
211
+ this.highCutHz = Math.max(1000, Math.min(20000, value));
212
+ this.updateFilters();
213
+ break;
214
+ case "mix":
215
+ this.mix = Math.max(0, Math.min(1, value));
216
+ break;
217
+ }
218
+ }
219
+ getParams() {
220
+ return {
221
+ lowCutHz: this.lowCutHz,
222
+ highCutHz: this.highCutHz,
223
+ mix: this.mix,
224
+ };
225
+ }
226
+ process(input) {
227
+ const length = input.length;
228
+ const output = new Float64Array(length);
229
+ const directLen = this.direct.length;
230
+ if (this.bypassed || this.ir.length === 0) {
231
+ for (let i = 0; i < length; i++) {
232
+ output[i] = input[i] ?? 0;
233
+ }
234
+ return output;
235
+ }
236
+ const useMix = this.mix < 1;
237
+ const dryMix = 1 - this.mix;
238
+ for (let i = 0; i < length; i++) {
239
+ const x = input[i] ?? 0;
240
+ const m = Math.floor(this.globalPos / PARTITION_SIZE);
241
+ const o = this.globalPos - m * PARTITION_SIZE;
242
+ if (m !== this.tailBlockNum) {
243
+ this.computeTailBlock(m);
244
+ }
245
+ this.history[this.historyPos] = x;
246
+ let wet = this.tailBlock[o] ?? 0;
247
+ for (let j = 0; j < directLen; j++) {
248
+ wet +=
249
+ (this.direct[j] ?? 0) *
250
+ (this.history[(this.historyPos - j + PARTITION_SIZE * 2) % PARTITION_SIZE] ?? 0);
251
+ }
252
+ this.historyPos = (this.historyPos + 1) % PARTITION_SIZE;
253
+ let shaped = wet;
254
+ if (this.hpActive) {
255
+ const y = this.hp.b0 * shaped +
256
+ this.hp.b1 * this.hp.x1 +
257
+ this.hp.b2 * this.hp.x2 -
258
+ this.hp.a1 * this.hp.y1 -
259
+ this.hp.a2 * this.hp.y2;
260
+ this.hp.x2 = this.hp.x1;
261
+ this.hp.x1 = shaped;
262
+ this.hp.y2 = this.hp.y1;
263
+ this.hp.y1 = y;
264
+ shaped = y;
265
+ }
266
+ if (this.lpActive) {
267
+ const y = this.lp.b0 * shaped +
268
+ this.lp.b1 * this.lp.x1 +
269
+ this.lp.b2 * this.lp.x2 -
270
+ this.lp.a1 * this.lp.y1 -
271
+ this.lp.a2 * this.lp.y2;
272
+ this.lp.x2 = this.lp.x1;
273
+ this.lp.x1 = shaped;
274
+ this.lp.y2 = this.lp.y1;
275
+ this.lp.y1 = y;
276
+ shaped = y;
277
+ }
278
+ output[i] = useMix ? this.mix * shaped + dryMix * x : shaped;
279
+ if (this.mix <= 0) {
280
+ output[i] = x;
281
+ }
282
+ this.blockBuf[o] = x;
283
+ this.globalPos += 1;
284
+ if (o === PARTITION_SIZE - 1) {
285
+ this.storeCompletedBlock(m);
286
+ }
287
+ }
288
+ return output;
289
+ }
290
+ computeTailBlock(m) {
291
+ const kCount = this.partitions.length;
292
+ if (kCount === 0) {
293
+ this.tailBlock.fill(0);
294
+ this.tailBlockNum = m;
295
+ return;
296
+ }
297
+ this.accumRe.fill(0);
298
+ this.accumIm.fill(0);
299
+ for (let k = 0; k < kCount; k++) {
300
+ const idx = m - 1 - k;
301
+ if (idx < 0)
302
+ continue;
303
+ const entry = this.fdl[idx % kCount];
304
+ if (!entry || entry.block !== idx)
305
+ continue;
306
+ const h = this.partitions[k];
307
+ if (!h)
308
+ continue;
309
+ const hRe = h.re;
310
+ const hIm = h.im;
311
+ const xRe = entry.re;
312
+ const xIm = entry.im;
313
+ for (let b = 0; b < FFT_SIZE; b++) {
314
+ const xr = xRe[b] ?? 0;
315
+ const xi = xIm[b] ?? 0;
316
+ const hr = hRe[b] ?? 0;
317
+ const hi = hIm[b] ?? 0;
318
+ this.accumRe[b] = (this.accumRe[b] ?? 0) + xr * hr - xi * hi;
319
+ this.accumIm[b] = (this.accumIm[b] ?? 0) + xr * hi + xi * hr;
320
+ }
321
+ }
322
+ fftInPlace(this.accumRe, this.accumIm, true);
323
+ for (let i = 0; i < PARTITION_SIZE; i++) {
324
+ this.tailBlock[i] = (this.accumRe[i] ?? 0) + (this.overlap[i] ?? 0);
325
+ }
326
+ for (let i = 0; i < PARTITION_SIZE; i++) {
327
+ this.overlap[i] = this.accumRe[PARTITION_SIZE + i] ?? 0;
328
+ }
329
+ this.tailBlockNum = m;
330
+ }
331
+ storeCompletedBlock(m) {
332
+ const kCount = this.partitions.length;
333
+ if (kCount === 0)
334
+ return;
335
+ const spec = spectrumOfBlock(this.blockBuf);
336
+ const slot = m % kCount;
337
+ this.fdl[slot] = { re: spec.re, im: spec.im, block: m };
338
+ }
339
+ deriveEffectiveIr() {
340
+ if (this.sourceRate !== undefined && this.sourceRate !== this.sampleRate) {
341
+ this.ir = resampleImpulseResponse(this.sourceIr, this.sourceRate, this.sampleRate);
342
+ }
343
+ else {
344
+ this.ir = new Float64Array(this.sourceIr);
345
+ }
346
+ }
347
+ rebuild() {
348
+ const len = this.ir.length;
349
+ const directLen = Math.min(PARTITION_SIZE, len);
350
+ this.direct = new Float64Array(directLen);
351
+ for (let i = 0; i < directLen; i++) {
352
+ this.direct[i] = this.ir[i] ?? 0;
353
+ }
354
+ this.partitions = [];
355
+ if (len > PARTITION_SIZE) {
356
+ const tailLen = len - PARTITION_SIZE;
357
+ const kCount = Math.ceil(tailLen / PARTITION_SIZE);
358
+ for (let k = 0; k < kCount; k++) {
359
+ const re = new Float64Array(FFT_SIZE);
360
+ const im = new Float64Array(FFT_SIZE);
361
+ for (let i = 0; i < PARTITION_SIZE; i++) {
362
+ const srcIdx = PARTITION_SIZE + k * PARTITION_SIZE + i;
363
+ re[i] = srcIdx < len ? (this.ir[srcIdx] ?? 0) : 0;
364
+ }
365
+ fftInPlace(re, im, false);
366
+ this.partitions.push({ re, im });
367
+ }
368
+ }
369
+ const kCount = this.partitions.length;
370
+ this.fdl = kCount > 0 ? new Array(kCount).fill(null) : [];
371
+ }
372
+ updateFilters() {
373
+ this.hpActive = this.lowCutHz > 20;
374
+ this.lpActive = this.highCutHz < 20000;
375
+ if (this.hpActive) {
376
+ const c = highpassCoeffs(this.lowCutHz, this.sampleRate);
377
+ this.hp.b0 = c.b0;
378
+ this.hp.b1 = c.b1;
379
+ this.hp.b2 = c.b2;
380
+ this.hp.a1 = c.a1;
381
+ this.hp.a2 = c.a2;
382
+ }
383
+ if (this.lpActive) {
384
+ const c = lowpassCoeffs(this.highCutHz, this.sampleRate);
385
+ this.lp.b0 = c.b0;
386
+ this.lp.b1 = c.b1;
387
+ this.lp.b2 = c.b2;
388
+ this.lp.a1 = c.a1;
389
+ this.lp.a2 = c.a2;
390
+ }
391
+ }
392
+ clearState() {
393
+ this.history = new Float64Array(PARTITION_SIZE);
394
+ this.historyPos = 0;
395
+ this.blockBuf = new Float64Array(PARTITION_SIZE);
396
+ this.globalPos = 0;
397
+ this.overlap = new Float64Array(PARTITION_SIZE);
398
+ this.tailBlock = new Float64Array(PARTITION_SIZE);
399
+ this.tailBlockNum = -1;
400
+ this.hp.x1 = 0;
401
+ this.hp.x2 = 0;
402
+ this.hp.y1 = 0;
403
+ this.hp.y2 = 0;
404
+ this.lp.x1 = 0;
405
+ this.lp.x2 = 0;
406
+ this.lp.y1 = 0;
407
+ this.lp.y2 = 0;
408
+ const kCount = this.partitions.length;
409
+ this.fdl = kCount > 0 ? new Array(kCount).fill(null) : [];
410
+ }
411
+ generateDefaultCabinetIr() {
412
+ // Synthetic placeholder IR, not a 4x12 capture. 128 samples at 48 kHz.
413
+ const len = 128;
414
+ const ir = new Float64Array(len);
415
+ const decay = 0.04;
416
+ for (let i = 0; i < len; i++) {
417
+ const t = i / 48000;
418
+ const f1 = 110;
419
+ const f2 = 3200;
420
+ const env = Math.exp(-i * decay);
421
+ ir[i] =
422
+ env *
423
+ (0.6 * Math.sin(2 * Math.PI * f1 * t) +
424
+ 0.4 * Math.sin(2 * Math.PI * f2 * t));
425
+ }
426
+ let maxVal = 0;
427
+ for (let i = 0; i < len; i++) {
428
+ maxVal = Math.max(maxVal, Math.abs(ir[i] ?? 0));
429
+ }
430
+ if (maxVal > 0) {
431
+ for (let i = 0; i < len; i++) {
432
+ ir[i] = (ir[i] ?? 0) / maxVal;
433
+ }
434
+ }
435
+ return ir;
436
+ }
437
+ }
438
+ //# sourceMappingURL=ir-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ir-node.js","sourceRoot":"","sources":["../../src/nodes/ir-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ChainNode, MasterConfig } from "../types.js";
2
+ export declare class MasterNode implements ChainNode {
3
+ readonly id = "master";
4
+ readonly name = "Master Output";
5
+ readonly kind = "master";
6
+ bypassed: boolean;
7
+ mix: number;
8
+ private config;
9
+ private linearGain;
10
+ constructor(config?: Partial<MasterConfig>);
11
+ getConfig(): MasterConfig;
12
+ setVolumeDb(db: number): void;
13
+ setMuted(muted: boolean): void;
14
+ setLimiter(enabled: boolean): void;
15
+ prepare(_sampleRate: number): void;
16
+ reset(): void;
17
+ getParam(id: string): number | undefined;
18
+ setParam(id: string, value: number): void;
19
+ getParams(): Record<string, number>;
20
+ process(input: Float64Array | Float32Array): Float64Array;
21
+ private updateGain;
22
+ }
23
+ //# sourceMappingURL=master-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"master-node.d.ts","sourceRoot":"","sources":["../../src/nodes/master-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,qBAAa,UAAW,YAAW,SAAS;IAC3C,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,UAAS;IACjB,GAAG,SAAO;IAEV,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAO;gBAEb,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAS1C,SAAS,IAAI,YAAY;IAIzB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK7B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI9B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAEb,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAaxC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAczC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQnC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY;IA6BzD,OAAO,CAAC,UAAU;CAGlB"}
@@ -0,0 +1,93 @@
1
+ export class MasterNode {
2
+ id = "master";
3
+ name = "Master Output";
4
+ kind = "master";
5
+ bypassed = false;
6
+ mix = 1.0;
7
+ config;
8
+ linearGain = 1.0;
9
+ constructor(config) {
10
+ this.config = {
11
+ volumeDb: config?.volumeDb ?? 0,
12
+ muted: config?.muted ?? false,
13
+ limiter: config?.limiter ?? true,
14
+ };
15
+ this.updateGain();
16
+ }
17
+ getConfig() {
18
+ return { ...this.config };
19
+ }
20
+ setVolumeDb(db) {
21
+ this.config.volumeDb = Math.max(-60, Math.min(12, db));
22
+ this.updateGain();
23
+ }
24
+ setMuted(muted) {
25
+ this.config.muted = muted;
26
+ }
27
+ setLimiter(enabled) {
28
+ this.config.limiter = enabled;
29
+ }
30
+ prepare(_sampleRate) {
31
+ this.reset();
32
+ }
33
+ reset() { }
34
+ getParam(id) {
35
+ switch (id) {
36
+ case "volumeDb":
37
+ return this.config.volumeDb;
38
+ case "muted":
39
+ return this.config.muted ? 1 : 0;
40
+ case "limiter":
41
+ return this.config.limiter ? 1 : 0;
42
+ default:
43
+ return undefined;
44
+ }
45
+ }
46
+ setParam(id, value) {
47
+ switch (id) {
48
+ case "volumeDb":
49
+ this.setVolumeDb(value);
50
+ break;
51
+ case "muted":
52
+ this.setMuted(value > 0.5);
53
+ break;
54
+ case "limiter":
55
+ this.setLimiter(value > 0.5);
56
+ break;
57
+ }
58
+ }
59
+ getParams() {
60
+ return {
61
+ volumeDb: this.config.volumeDb,
62
+ muted: this.config.muted ? 1 : 0,
63
+ limiter: this.config.limiter ? 1 : 0,
64
+ };
65
+ }
66
+ process(input) {
67
+ const length = input.length;
68
+ const output = new Float64Array(length);
69
+ if (this.config.muted) {
70
+ return output; // All zeros
71
+ }
72
+ const gain = this.linearGain;
73
+ const useLimiter = this.config.limiter;
74
+ for (let i = 0; i < length; i++) {
75
+ let sample = (input[i] ?? 0) * gain;
76
+ if (useLimiter) {
77
+ // Soft-knee tanh limiter above 0.8 to prevent harsh digital clipping
78
+ if (sample > 0.8) {
79
+ sample = 0.8 + 0.2 * Math.tanh((sample - 0.8) / 0.2);
80
+ }
81
+ else if (sample < -0.8) {
82
+ sample = -0.8 + 0.2 * Math.tanh((sample + 0.8) / 0.2);
83
+ }
84
+ }
85
+ output[i] = sample;
86
+ }
87
+ return output;
88
+ }
89
+ updateGain() {
90
+ this.linearGain = 10 ** (this.config.volumeDb / 20);
91
+ }
92
+ }
93
+ //# sourceMappingURL=master-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"master-node.js","sourceRoot":"","sources":["../../src/nodes/master-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { type NamEngineModule, type NamLoudness } from "../nam/engine.js";
2
+ import type { ChainNode } from "../types.js";
3
+ export interface NamNodeConfig {
4
+ /** An instantiated engine. Async instantiation belongs to the caller -- see `nam/engine.js`. */
5
+ readonly engine: NamEngineModule;
6
+ /** The `.nam` document's text. Parsed by the engine, not here. */
7
+ readonly model: string;
8
+ /** A2/slimmable size in [0,1]; negative selects full size. Ignored by other architectures. */
9
+ readonly slimSize?: number;
10
+ /** Input trim in dB, applied before the model. Clamped to -24..24. */
11
+ readonly inputGainDb?: number;
12
+ /** Output trim in dB, applied after the model. Clamped to -24..24. */
13
+ readonly outputGainDb?: number;
14
+ }
15
+ export interface NamNodeInfo {
16
+ /** What the engine will do to this instance's level, read from the loaded model's metadata. */
17
+ readonly loudness: NamLoudness;
18
+ /** The rate the model was captured at, or `null` when it states none. */
19
+ readonly expectedSampleRate: number | null;
20
+ /** True for A2 models -- NAM's newer architecture. */
21
+ readonly slimmable: boolean;
22
+ /** The model's internal slimmable-size breakpoints in (0,1); 0.0 and 1.0 bounds are implied. */
23
+ readonly slimmableBreakpoints: number[];
24
+ }
25
+ /**
26
+ * A NAM (Neural Amp Modeler) capture as a chain node.
27
+ *
28
+ * **The node applies no loudness gain of its own, deliberately.** `nam_process` already implements
29
+ * NAM's `Normalized` output mode internally -- `10^((-18 - modelLoudness)/20)`, smoothed against
30
+ * clicks -- which is the policy the workbench validated by listening. Applying it again here would
31
+ * double it. `getInfo().loudness` reports what the engine did so a host can show it.
32
+ *
33
+ * The engine instance is created at `prepare`, not in the constructor, because instantiation is
34
+ * asynchronous and belongs to the caller. Until then the node passes audio through.
35
+ */
36
+ export declare class NamNode implements ChainNode {
37
+ readonly id: string;
38
+ readonly name: string;
39
+ readonly kind = "nam";
40
+ /** The engine adds no algorithmic delay; the buffer is in-place and sample-aligned. */
41
+ readonly latencySamples = 0;
42
+ bypassed: boolean;
43
+ mix: number;
44
+ private readonly engine;
45
+ private modelJson;
46
+ private slimSize;
47
+ private inputGainDb;
48
+ private outputGainDb;
49
+ private sampleRate;
50
+ private instanceId;
51
+ private bufferPointer;
52
+ private view;
53
+ private loudness;
54
+ private expectedSampleRate;
55
+ private slimmable;
56
+ private slimmableBreakpoints;
57
+ constructor(id: string | undefined, name: string | undefined, config: NamNodeConfig);
58
+ prepare(sampleRate: number): void;
59
+ reset(): void;
60
+ getParam(id: string): number | undefined;
61
+ setParam(id: string, value: number): void;
62
+ getParams(): Record<string, number>;
63
+ getInfo(): NamNodeInfo;
64
+ /**
65
+ * Swap the model. The replacement is loaded into a **new** instance; the current one keeps
66
+ * running until the new one is ready, and is released only then. A refused model therefore
67
+ * never interrupts playback -- the engine's own reason is thrown and the old model stays.
68
+ */
69
+ setModel(modelJson: string): void;
70
+ process(input: Float64Array | Float32Array): Float64Array;
71
+ dispose(): void;
72
+ /**
73
+ * Create an instance with `modelJson` loaded, or throw. The instance is released on every
74
+ * failure path so a refused model does not strand one.
75
+ */
76
+ private createLoadedInstance;
77
+ private adoptInstance;
78
+ private bufferView;
79
+ private destroyInstance;
80
+ }
81
+ //# sourceMappingURL=nam-node.d.ts.map