@hyperframes/core 0.7.107 → 0.7.109

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 (89) hide show
  1. package/dist/audio/audioFxAutomation.d.ts +63 -0
  2. package/dist/audio/audioFxAutomation.d.ts.map +1 -0
  3. package/dist/audio/audioFxAutomation.js +219 -0
  4. package/dist/audio/audioFxAutomation.js.map +1 -0
  5. package/dist/audio/audioFxGraph.d.ts +73 -0
  6. package/dist/audio/audioFxGraph.d.ts.map +1 -0
  7. package/dist/audio/audioFxGraph.js +649 -0
  8. package/dist/audio/audioFxGraph.js.map +1 -0
  9. package/dist/audio/audioFxTail.d.ts +28 -0
  10. package/dist/audio/audioFxTail.d.ts.map +1 -0
  11. package/dist/audio/audioFxTail.js +95 -0
  12. package/dist/audio/audioFxTail.js.map +1 -0
  13. package/dist/audio/audioFxWorklets.d.ts +8 -0
  14. package/dist/audio/audioFxWorklets.d.ts.map +1 -0
  15. package/dist/audio/audioFxWorklets.js +263 -0
  16. package/dist/audio/audioFxWorklets.js.map +1 -0
  17. package/dist/audioAutomation.d.ts +191 -0
  18. package/dist/audioAutomation.d.ts.map +1 -0
  19. package/dist/audioAutomation.js +488 -0
  20. package/dist/audioAutomation.js.map +1 -0
  21. package/dist/audioCarve.d.ts +216 -0
  22. package/dist/audioCarve.d.ts.map +1 -0
  23. package/dist/audioCarve.js +608 -0
  24. package/dist/audioCarve.js.map +1 -0
  25. package/dist/audioFx.d.ts +182 -0
  26. package/dist/audioFx.d.ts.map +1 -0
  27. package/dist/audioFx.js +813 -0
  28. package/dist/audioFx.js.map +1 -0
  29. package/dist/audioFxCopy.d.ts +89 -0
  30. package/dist/audioFxCopy.d.ts.map +1 -0
  31. package/dist/audioFxCopy.js +340 -0
  32. package/dist/audioFxCopy.js.map +1 -0
  33. package/dist/audioFxEq.d.ts +75 -0
  34. package/dist/audioFxEq.d.ts.map +1 -0
  35. package/dist/audioFxEq.js +153 -0
  36. package/dist/audioFxEq.js.map +1 -0
  37. package/dist/audioFxJobs.d.ts +52 -0
  38. package/dist/audioFxJobs.d.ts.map +1 -0
  39. package/dist/audioFxJobs.js +92 -0
  40. package/dist/audioFxJobs.js.map +1 -0
  41. package/dist/audioFxPresets.d.ts +91 -0
  42. package/dist/audioFxPresets.d.ts.map +1 -0
  43. package/dist/audioFxPresets.js +320 -0
  44. package/dist/audioFxPresets.js.map +1 -0
  45. package/dist/audioFxProfiles.d.ts +65 -0
  46. package/dist/audioFxProfiles.d.ts.map +1 -0
  47. package/dist/audioFxProfiles.js +209 -0
  48. package/dist/audioFxProfiles.js.map +1 -0
  49. package/dist/audioLeveller.d.ts +62 -0
  50. package/dist/audioLeveller.d.ts.map +1 -0
  51. package/dist/audioLeveller.js +208 -0
  52. package/dist/audioLeveller.js.map +1 -0
  53. package/dist/canaryRegistry.d.ts.map +1 -1
  54. package/dist/canaryRegistry.js +8 -0
  55. package/dist/canaryRegistry.js.map +1 -1
  56. package/dist/compiler/compositionScoping.d.ts +3 -0
  57. package/dist/compiler/compositionScoping.d.ts.map +1 -1
  58. package/dist/compiler/compositionScoping.js +34 -11
  59. package/dist/compiler/compositionScoping.js.map +1 -1
  60. package/dist/compiler/htmlBundler.d.ts.map +1 -1
  61. package/dist/compiler/htmlBundler.js +42 -2
  62. package/dist/compiler/htmlBundler.js.map +1 -1
  63. package/dist/editing/affordances.d.ts +3 -0
  64. package/dist/editing/affordances.d.ts.map +1 -1
  65. package/dist/editing/affordances.js +1 -0
  66. package/dist/editing/affordances.js.map +1 -1
  67. package/dist/generated/audio-fx-runtime-inline.d.ts +3 -0
  68. package/dist/generated/audio-fx-runtime-inline.d.ts.map +1 -0
  69. package/dist/generated/audio-fx-runtime-inline.js +7 -0
  70. package/dist/generated/audio-fx-runtime-inline.js.map +1 -0
  71. package/dist/generated/runtime-inline.js +1 -1
  72. package/dist/generated/runtime-inline.js.map +1 -1
  73. package/dist/hyperframe.runtime.iife.js +238 -28
  74. package/dist/runtime/applyVariableBindings.d.ts +45 -0
  75. package/dist/runtime/applyVariableBindings.d.ts.map +1 -0
  76. package/dist/runtime/applyVariableBindings.js +194 -0
  77. package/dist/runtime/applyVariableBindings.js.map +1 -0
  78. package/dist/runtime/audioAutomationVolume.d.ts +17 -0
  79. package/dist/runtime/audioAutomationVolume.d.ts.map +1 -0
  80. package/dist/runtime/audioAutomationVolume.js +49 -0
  81. package/dist/runtime/audioAutomationVolume.js.map +1 -0
  82. package/dist/runtime/media.d.ts.map +1 -1
  83. package/dist/runtime/media.js +17 -1
  84. package/dist/runtime/media.js.map +1 -1
  85. package/dist/runtime/variableScope.d.ts +9 -0
  86. package/dist/runtime/variableScope.d.ts.map +1 -0
  87. package/dist/runtime/variableScope.js +21 -0
  88. package/dist/runtime/variableScope.js.map +1 -0
  89. package/package.json +51 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxGraph.js","sourceRoot":"","sources":["../../src/audio/audioFxGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * How long a chain keeps ringing after its input stops.
3
+ *
4
+ * The render used to end the offline context at the last input sample, so a
5
+ * reverb or a delay was cut mid-tail — the one place the render did not match
6
+ * preview. The length is not a guess: every tail-producing effect here has a
7
+ * decay that follows from its own settings, so the render can ask for exactly
8
+ * the room it needs.
9
+ */
10
+ import { type HfAutomation } from "../audioAutomation.js";
11
+ import { type HfAudioFxChain } from "../audioFx.js";
12
+ /**
13
+ * Ceiling on the extension, in seconds.
14
+ *
15
+ * Delay is unbounded in principle: 5 s between repeats at 0.95 feedback decays
16
+ * for eleven minutes, and the panel can dial exactly that. A tail that outruns
17
+ * the composition costs render time and mixes into everything after it, so the
18
+ * chain gets the room it asks for up to here and is cut beyond it.
19
+ */
20
+ export declare const MAX_FX_TAIL_SECONDS = 5;
21
+ /**
22
+ * The whole chain's tail, in seconds.
23
+ *
24
+ * Summed, not maxed: the chain is serial, so a delay in front of a reverb hands
25
+ * each of its repeats to the room and the last one still gets a full tail.
26
+ */
27
+ export declare function chainTailSeconds(chain: HfAudioFxChain, automation?: HfAutomation): number;
28
+ //# sourceMappingURL=audioFxTail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxTail.d.ts","sourceRoot":"","sources":["../../src/audio/audioFxTail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAA0B,KAAK,cAAc,EAAsB,MAAM,eAAe,CAAC;AAEhG;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAiErC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,YAAY,GAAG,MAAM,CAGzF"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * How long a chain keeps ringing after its input stops.
3
+ *
4
+ * The render used to end the offline context at the last input sample, so a
5
+ * reverb or a delay was cut mid-tail — the one place the render did not match
6
+ * preview. The length is not a guess: every tail-producing effect here has a
7
+ * decay that follows from its own settings, so the render can ask for exactly
8
+ * the room it needs.
9
+ */
10
+ import { fxAutomationTarget } from "../audioAutomation.js";
11
+ import { normalizeAudioFxParams } from "../audioFx.js";
12
+ /**
13
+ * Ceiling on the extension, in seconds.
14
+ *
15
+ * Delay is unbounded in principle: 5 s between repeats at 0.95 feedback decays
16
+ * for eleven minutes, and the panel can dial exactly that. A tail that outruns
17
+ * the composition costs render time and mixes into everything after it, so the
18
+ * chain gets the room it asks for up to here and is cut beyond it.
19
+ */
20
+ export const MAX_FX_TAIL_SECONDS = 5;
21
+ /**
22
+ * Where a tail stops counting as audible: -60 dB below the signal that fed it,
23
+ * the usual convention for a reverb time. Anything quieter is under the noise
24
+ * floor of every codec this renders to.
25
+ */
26
+ const TAIL_FLOOR = 0.001;
27
+ /**
28
+ * The largest value a knob reaches, over the whole clip.
29
+ *
30
+ * A lane's `curve` is an exponent, so a segment is monotone between its two
31
+ * points and cannot overshoot either — the maximum point value is the maximum
32
+ * of the lane, no sampling needed. Room size has to be sized for the loudest
33
+ * moment regardless of where in the clip it falls.
34
+ */
35
+ function knobMax(node, key, automation) {
36
+ // Normalised, so a knob missing from the attribute reads as its default and
37
+ // an out-of-range one is clamped the way the graph builder would clamp it.
38
+ const fallback = Number(normalizeAudioFxParams(node.type, node.params)[key] ?? 0);
39
+ if (!node.id || !automation)
40
+ return Number.isFinite(fallback) ? fallback : 0;
41
+ const lane = automation.lanes.find((l) => l.target === fxAutomationTarget(node.id ?? "", key));
42
+ if (!lane || lane.points.length === 0)
43
+ return Number.isFinite(fallback) ? fallback : 0;
44
+ return lane.points.reduce((max, p) => Math.max(max, p.v), -Infinity);
45
+ }
46
+ /**
47
+ * Repeats until a feedback loop falls under the floor, times the gap between
48
+ * them. `feedback` is capped below 1 by the registry, so this terminates.
49
+ */
50
+ function delayTail(time, feedback) {
51
+ const gap = Math.min(5, time / 1000);
52
+ if (gap <= 0)
53
+ return 0;
54
+ const fb = Math.max(0, Math.min(0.999, feedback));
55
+ if (fb <= 0)
56
+ return gap;
57
+ return Math.ceil(Math.log(TAIL_FLOOR) / Math.log(fb)) * gap;
58
+ }
59
+ /** One node's tail. Zero when it has none, or when it is mixed out entirely. */
60
+ function nodeTail(node, automation) {
61
+ if (node.enabled === false)
62
+ return 0;
63
+ switch (node.type) {
64
+ case "reverb":
65
+ // Exactly the generated impulse's length — see synthesizeReverbImpulse,
66
+ // which is the same expression. A convolution is as long as its impulse.
67
+ return knobMax(node, "wet", automation) > 0
68
+ ? 0.6 + Math.max(0, Math.min(1, knobMax(node, "size", automation))) * 2.6
69
+ : 0;
70
+ case "delay":
71
+ return knobMax(node, "mix", automation) > 0
72
+ ? delayTail(knobMax(node, "time", automation), knobMax(node, "feedback", automation))
73
+ : 0;
74
+ case "chorus":
75
+ // A single delay line, no feedback: it rings for one delay (≤100 ms).
76
+ return knobMax(node, "mix", automation) > 0 ? knobMax(node, "delay", automation) / 1000 : 0;
77
+ default:
78
+ // Everything else settles with its input. The phaser is an all-pass chain
79
+ // with no recirculation (group delay, not a tail); the dynamics nodes have
80
+ // long releases but no signal to release — silence in, silence out; a
81
+ // biquad rings for ~Q/f, which is microseconds.
82
+ return 0;
83
+ }
84
+ }
85
+ /**
86
+ * The whole chain's tail, in seconds.
87
+ *
88
+ * Summed, not maxed: the chain is serial, so a delay in front of a reverb hands
89
+ * each of its repeats to the room and the last one still gets a full tail.
90
+ */
91
+ export function chainTailSeconds(chain, automation) {
92
+ const total = chain.nodes.reduce((sum, node) => sum + nodeTail(node, automation), 0);
93
+ return Math.min(MAX_FX_TAIL_SECONDS, total);
94
+ }
95
+ //# sourceMappingURL=audioFxTail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxTail.js","sourceRoot":"","sources":["../../src/audio/audioFxTail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAqB,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAA2C,MAAM,eAAe,CAAC;AAEhG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB;;;;;;;GAOG;AACH,SAAS,OAAO,CAAC,IAAmB,EAAE,GAAW,EAAE,UAAyB;IAC1E,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,QAAgB;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IACrC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClD,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;AAC9D,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,IAAmB,EAAE,UAAyB;IAC9D,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,wEAAwE;YACxE,yEAAyE;YACzE,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;gBACzC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG;gBACzE,CAAC,CAAC,CAAC,CAAC;QACR,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;gBACzC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBACrF,CAAC,CAAC,CAAC,CAAC;QACR,KAAK,QAAQ;YACX,sEAAsE;YACtE,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F;YACE,0EAA0E;YAC1E,2EAA2E;YAC3E,sEAAsE;YACtE,gDAAgD;YAChD,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAqB,EAAE,UAAyB;IAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** True once the processors are usable on this context. */
2
+ export declare function audioFxWorkletsReady(ctx: BaseAudioContext): boolean;
3
+ /**
4
+ * Register the processors on a context. Idempotent per context, since
5
+ * addModule throws if the same processor name is registered twice.
6
+ */
7
+ export declare function ensureAudioFxWorklets(ctx: BaseAudioContext): Promise<void>;
8
+ //# sourceMappingURL=audioFxWorklets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxWorklets.d.ts","sourceRoot":"","sources":["../../src/audio/audioFxWorklets.ts"],"names":[],"mappings":"AAoOA,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAEnE;AAGD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1E"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * AudioWorklet processors for the effects Web Audio has no native node for.
3
+ *
4
+ * Each one targets the behaviour of its FFmpeg counterpart rather than of any
5
+ * particular plugin, because the render is FFmpeg and preview only earns its
6
+ * keep by predicting the render. How closely each lands is measured, not
7
+ * assumed — see the preview/render parity harness.
8
+ *
9
+ * Kept as a source string so it can be registered from a Blob URL without a
10
+ * separate bundled asset, which keeps the studio's build unchanged.
11
+ */
12
+ const AUDIO_FX_WORKLET_SOURCE = `
13
+ const dbToLin = (db) => Math.pow(10, db / 20);
14
+
15
+ /**
16
+ * One-pole envelope followers, one per channel.
17
+ *
18
+ * Per channel matters: the followers advance once per sample, so a single shared
19
+ * follower stepped once per channel per sample. On stereo that ran a 20 ms attack
20
+ * as 10 ms, and gave the right channel a gain computed from an envelope that had
21
+ * already traversed the left — so the two channels ducked by different amounts
22
+ * from the same input and the image pumped.
23
+ */
24
+ class EnvBank {
25
+ constructor(attackMs, releaseMs) { this.set(attackMs, releaseMs); this.values = []; }
26
+ set(attackMs, releaseMs) {
27
+ this.a = Math.exp(-1 / (sampleRate * Math.max(1e-5, attackMs / 1000)));
28
+ this.r = Math.exp(-1 / (sampleRate * Math.max(1e-5, releaseMs / 1000)));
29
+ }
30
+ push(ch, x) {
31
+ const prev = this.values[ch] ?? 0;
32
+ const m = Math.abs(x);
33
+ const c = m > prev ? this.a : this.r;
34
+ const next = m + c * (prev - m);
35
+ this.values[ch] = next;
36
+ return next;
37
+ }
38
+ }
39
+
40
+ /** Soft-knee gain computer in dB, matching acompressor's shape. */
41
+ function kneeGain(envDb, thresholdDb, ratio, kneeDb) {
42
+ const over = envDb - thresholdDb;
43
+ if (kneeDb > 0 && over > -kneeDb && over < kneeDb) {
44
+ const t = (over + kneeDb) / (2 * kneeDb);
45
+ return -((1 - 1 / ratio) * kneeDb * t * t);
46
+ }
47
+ return over > 0 ? -(over * (1 - 1 / ratio)) : 0;
48
+ }
49
+
50
+ // log10/exp per sample is the single most expensive thing a dynamics processor
51
+ // can do on the audio thread, and every sample below the knee needs neither:
52
+ // its gain is exactly unity. Comparing envelopes in the linear domain lets the
53
+ // quiet majority of samples skip the transcendentals entirely.
54
+ const LN10_OVER_20 = Math.LN10 / 20;
55
+ const dbToLinFast = (db) => Math.exp(db * LN10_OVER_20);
56
+
57
+ class HfCompressor extends AudioWorkletProcessor {
58
+ constructor(o) {
59
+ super();
60
+ this.p = o.processorOptions || {};
61
+ this.env = new EnvBank(this.p.attack ?? 20, this.p.release ?? 250);
62
+ this.port.onmessage = (e) => {
63
+ if (e.data && e.data.__hfDispose) { this.dead = true; return; }
64
+ this.p = { ...this.p, ...e.data };
65
+ this.env.set(this.p.attack ?? 20, this.p.release ?? 250);
66
+ };
67
+ }
68
+ process(inputs, outputs) {
69
+ if (this.dead) return false;
70
+ const i = inputs[0], o = outputs[0];
71
+ if (!i || !i.length) return true;
72
+ const p = this.p;
73
+ const makeup = dbToLin(p.makeup ?? 0);
74
+ const mix = p.mix ?? 1;
75
+ // Knee is expressed as a ratio in FFmpeg; convert to dB width.
76
+ const kneeDb = 20 * Math.log10(Math.max(1.0001, p.knee ?? 2.83));
77
+ const thresholdDb = p.threshold ?? -24;
78
+ const ratio = p.ratio ?? 4;
79
+ // Below this the gain computer returns unity, so the sample needs no
80
+ // logarithm at all.
81
+ const kneeStartLin = dbToLin(thresholdDb - kneeDb);
82
+ const dry = 1 - mix;
83
+ for (let ch = 0; ch < i.length; ch++) {
84
+ const inp = i[ch], out = o[ch];
85
+ for (let n = 0; n < inp.length; n++) {
86
+ const x = inp[n];
87
+ // Per-channel follower, and the sub-knee shortcut: below the knee the
88
+ // gain is exactly unity, so the sample needs no logarithm at all.
89
+ const env = this.env.push(ch, x);
90
+ if (env <= kneeStartLin) {
91
+ out[n] = x * makeup * mix + x * dry;
92
+ continue;
93
+ }
94
+ const envDb = 20 * Math.log10(env);
95
+ const g = dbToLinFast(kneeGain(envDb, thresholdDb, ratio, kneeDb));
96
+ out[n] = x * g * makeup * mix + x * dry;
97
+ }
98
+ }
99
+ return true;
100
+ }
101
+ }
102
+ registerProcessor("hf-compressor", HfCompressor);
103
+
104
+ class HfLimiter extends AudioWorkletProcessor {
105
+ constructor(o) {
106
+ super();
107
+ this.p = o.processorOptions || {};
108
+ this.env = new EnvBank(this.p.attack ?? 5, this.p.release ?? 50);
109
+ this.port.onmessage = (e) => {
110
+ if (e.data && e.data.__hfDispose) { this.dead = true; return; }
111
+ this.p = { ...this.p, ...e.data };
112
+ this.env.set(this.p.attack ?? 5, this.p.release ?? 50);
113
+ };
114
+ }
115
+ process(inputs, outputs) {
116
+ if (this.dead) return false;
117
+ const i = inputs[0], o = outputs[0];
118
+ if (!i || !i.length) return true;
119
+ const ceiling = dbToLin(this.p.limit ?? -1);
120
+ const outGain = dbToLin(this.p.level_out ?? 0);
121
+ for (let ch = 0; ch < i.length; ch++) {
122
+ const inp = i[ch], out = o[ch];
123
+ for (let n = 0; n < inp.length; n++) {
124
+ const x = inp[n];
125
+ const env = this.env.push(ch, x);
126
+ // Only ever attenuate: a limiter that can raise level is a compressor.
127
+ const g = env > ceiling ? ceiling / env : 1;
128
+ out[n] = x * g * outGain;
129
+ }
130
+ }
131
+ return true;
132
+ }
133
+ }
134
+ registerProcessor("hf-limiter", HfLimiter);
135
+
136
+ class HfGate extends AudioWorkletProcessor {
137
+ constructor(o) {
138
+ super();
139
+ this.p = o.processorOptions || {};
140
+ this.env = new EnvBank(this.p.attack ?? 1, this.p.release ?? 100);
141
+ this.gains = [];
142
+ this.port.onmessage = (e) => {
143
+ if (e.data && e.data.__hfDispose) { this.dead = true; return; }
144
+ this.p = { ...this.p, ...e.data };
145
+ this.env.set(this.p.attack ?? 1, this.p.release ?? 100);
146
+ };
147
+ }
148
+ process(inputs, outputs) {
149
+ if (this.dead) return false;
150
+ const i = inputs[0], o = outputs[0];
151
+ if (!i || !i.length) return true;
152
+ const p = this.p;
153
+ const threshold = dbToLin(p.threshold ?? -35);
154
+ const floor = dbToLin(p.range ?? -24);
155
+ const ratio = p.ratio ?? 10;
156
+ // Knee is declared in the registry as a ratio, like the compressor's; a
157
+ // hard threshold ignored it and chattered on material sitting right at the
158
+ // gate point.
159
+ const kneeDb = 20 * Math.log10(Math.max(1.0001, p.knee ?? 2.83));
160
+ const kneeLin = dbToLin((p.threshold ?? -35) + kneeDb);
161
+ for (let ch = 0; ch < i.length; ch++) {
162
+ const inp = i[ch], out = o[ch];
163
+ for (let n = 0; n < inp.length; n++) {
164
+ const x = inp[n];
165
+ const env = this.env.push(ch, x);
166
+ let target = 1;
167
+ // Above the threshold the gate is fully open; skip the pow entirely.
168
+ if (env < threshold) {
169
+ const under = env > 1e-9 ? threshold / env : 1e9;
170
+ target = Math.max(floor, 1 / Math.pow(under, ratio - 1));
171
+ if (!isFinite(target)) target = floor;
172
+ }
173
+ // Smooth toward the target so the gate does not click on every sample.
174
+ const held = this.gains[ch] ?? 1;
175
+ const c = target < held ? this.env.r : this.env.a;
176
+ const smoothed = target + c * (held - target);
177
+ this.gains[ch] = smoothed;
178
+ out[n] = x * smoothed;
179
+ }
180
+ }
181
+ return true;
182
+ }
183
+ }
184
+ registerProcessor("hf-gate", HfGate);
185
+
186
+ class HfBitcrush extends AudioWorkletProcessor {
187
+ constructor(o) {
188
+ super();
189
+ this.p = o.processorOptions || {};
190
+ this.holds = [];
191
+ this.held = [];
192
+ this.port.onmessage = (e) => {
193
+ if (e.data && e.data.__hfDispose) { this.dead = true; return; }
194
+ this.p = { ...this.p, ...e.data };
195
+ };
196
+ }
197
+ process(inputs, outputs) {
198
+ if (this.dead) return false;
199
+ const i = inputs[0], o = outputs[0];
200
+ if (!i || !i.length) return true;
201
+ const p = this.p;
202
+ const levels = Math.pow(2, (p.bits ?? 8) - 1);
203
+ const step = Math.max(1, Math.round(p.samples ?? 1));
204
+ const mix = p.mix ?? 1;
205
+ for (let ch = 0; ch < i.length; ch++) {
206
+ const inp = i[ch], out = o[ch];
207
+ if (this.held[ch] === undefined) this.held[ch] = 0;
208
+ if (this.holds[ch] === undefined) this.holds[ch] = 0;
209
+ for (let n = 0; n < inp.length; n++) {
210
+ // Per channel: advancing one shared counter only on the last channel
211
+ // left every earlier channel either unheld or frozen for a whole
212
+ // 128-sample quantum, clicking once a block.
213
+ if (this.holds[ch] === 0) this.held[ch] = Math.round(inp[n] * levels) / levels;
214
+ out[n] = this.held[ch] * mix + inp[n] * (1 - mix);
215
+ this.holds[ch] = (this.holds[ch] + 1) % step;
216
+ }
217
+ }
218
+ return true;
219
+ }
220
+ }
221
+ registerProcessor("hf-bitcrush", HfBitcrush);
222
+ `;
223
+ // Registration is per context, not per module: a processor registered on one
224
+ // AudioContext does not exist on another, so caching a single promise made
225
+ // every context after the first believe it was ready when it was not.
226
+ const registered = new WeakMap();
227
+ /** True once the processors are usable on this context. */
228
+ export function audioFxWorkletsReady(ctx) {
229
+ return readyContexts.has(ctx);
230
+ }
231
+ const readyContexts = new WeakSet();
232
+ /**
233
+ * Register the processors on a context. Idempotent per context, since
234
+ * addModule throws if the same processor name is registered twice.
235
+ */
236
+ export function ensureAudioFxWorklets(ctx) {
237
+ let modulePromise = registered.get(ctx);
238
+ if (!modulePromise) {
239
+ modulePromise = (async () => {
240
+ if (!ctx.audioWorklet) {
241
+ throw new Error("AudioWorklet is unavailable — the page needs a secure context (https, localhost or file://)");
242
+ }
243
+ // A data: URL rather than a blob:, because a blob inherits the page origin
244
+ // and is treated as opaque on a file:// page, where the module then fails
245
+ // to load with an unhelpful AbortError.
246
+ const url = `data:text/javascript;base64,${btoa(String.fromCharCode(...new TextEncoder().encode(AUDIO_FX_WORKLET_SOURCE)))}`;
247
+ await ctx.audioWorklet.addModule(url);
248
+ readyContexts.add(ctx);
249
+ })().catch((err) => {
250
+ // A failed registration must not be remembered. `readyContexts` is only
251
+ // written on success, so callers correctly keep asking — and every ask
252
+ // replayed this same rejected promise, leaving the limiter, compressor,
253
+ // gate and bitcrush silent for the life of the context with no way back.
254
+ // One transient failure (a slow module load, a context still warming up)
255
+ // permanently disabled half the rack.
256
+ registered.delete(ctx);
257
+ throw err;
258
+ });
259
+ registered.set(ctx, modulePromise);
260
+ }
261
+ return modulePromise;
262
+ }
263
+ //# sourceMappingURL=audioFxWorklets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioFxWorklets.js","sourceRoot":"","sources":["../../src/audio/audioFxWorklets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkN/B,CAAC;AAEF,6EAA6E;AAC7E,2EAA2E;AAC3E,sEAAsE;AACtE,MAAM,UAAU,GAAG,IAAI,OAAO,EAAmC,CAAC;AAElE,2DAA2D;AAC3D,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AACD,MAAM,aAAa,GAAG,IAAI,OAAO,EAAoB,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAqB;IACzD,IAAI,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;YACJ,CAAC;YACD,2EAA2E;YAC3E,0EAA0E;YAC1E,wCAAwC;YACxC,MAAM,GAAG,GAAG,+BAA+B,IAAI,CAC7C,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAC1E,EAAE,CAAC;YACJ,MAAM,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC1B,wEAAwE;YACxE,uEAAuE;YACvE,wEAAwE;YACxE,yEAAyE;YACzE,yEAAyE;YACzE,sCAAsC;YACtC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Automation envelopes for audio tracks.
3
+ *
4
+ * A lane is a list of breakpoints over one parameter — track volume, or one
5
+ * knob of one effect in the track's FX chain. Ableton's clip-envelope model:
6
+ * times are clip-local, so an envelope travels with the clip when it moves.
7
+ *
8
+ * Nothing here touches Web Audio. This module owns the format and the
9
+ * interpolation, and the same `sampleAutomationLane` is used to draw the lane
10
+ * in the timeline, to schedule it in preview, and to bake it at render — one
11
+ * curve, three consumers, or the picture and the sound disagree.
12
+ */
13
+ import { type HfAudioFxChain } from "./audioFx.js";
14
+ export declare const HF_AUDIO_AUTOMATION_ATTR = "data-automation";
15
+ /** The same attribute as a `dataset` / `dataAttributes` key. See `HF_AUDIO_FX_DATA_KEY`. */
16
+ export declare const HF_AUDIO_AUTOMATION_DATA_KEY: string;
17
+ /** Automation files are versioned; a reader must refuse a version it doesn't know. */
18
+ export declare const HF_AUDIO_AUTOMATION_VERSION = 1;
19
+ /**
20
+ * A pathological document should not be able to hang the scheduler, which
21
+ * expands every segment into scheduled ramps. Well past any hand-drawn
22
+ * envelope; a lane is dense at 100 points.
23
+ */
24
+ export declare const MAX_AUTOMATION_POINTS = 512;
25
+ export interface HfAutomationPoint {
26
+ /** Seconds from the start of the clip, not the composition. */
27
+ t: number;
28
+ /** Value in the parameter's own unit — dB for a threshold, Hz for a cutoff. */
29
+ v: number;
30
+ /**
31
+ * Curvature of the segment *leaving* this point, -1..1. Absent or 0 is a
32
+ * straight line; positive holds low then rises late, negative rises early.
33
+ */
34
+ curve?: number;
35
+ /**
36
+ * An interior point the segment *leaving* this point passes through, in
37
+ * normalised segment space: `viaX` is progress 0..1 between the two
38
+ * breakpoints, `viaY` is how far the value has travelled by then. Both are
39
+ * needed for either to mean anything; without them the segment falls back to
40
+ * `curve` above, so everything authored before this existed reads unchanged.
41
+ *
42
+ * Two numbers rather than one because `curve` answers only "how hard", and an
43
+ * exponent cannot say "and where". Every upward bend a single exponent can
44
+ * draw has its deepest deviation in the first fifth of the segment, whatever
45
+ * the author aimed at, and an exponent steep enough to reach a point near
46
+ * either end runs past the ±1 the model accepts — so a bend dragged near the
47
+ * right-hand breakpoint bulged on the left and then stopped following the
48
+ * pointer at all. Naming the point the curve goes through makes both the
49
+ * height and the position of the bend the author's to choose, and takes the
50
+ * saturation with it: any interior point is reachable exactly.
51
+ */
52
+ viaX?: number;
53
+ viaY?: number;
54
+ }
55
+ export interface HfAutomationLane {
56
+ /** `volume`, or `fx.<nodeId>.<paramKey>`. */
57
+ target: string;
58
+ points: HfAutomationPoint[];
59
+ }
60
+ export interface HfAutomation {
61
+ version: number;
62
+ lanes: HfAutomationLane[];
63
+ }
64
+ export declare class AudioAutomationError extends Error {
65
+ constructor(message: string);
66
+ }
67
+ export declare const VOLUME_TARGET = "volume";
68
+ export type HfAutomationTarget = {
69
+ kind: "volume";
70
+ } | {
71
+ kind: "fx";
72
+ nodeId: string;
73
+ param: string;
74
+ } | {
75
+ kind: "preset";
76
+ presetId: string;
77
+ };
78
+ /** Split a target string. Returns null for anything unrecognised. */
79
+ export declare function parseAutomationTarget(target: string): HfAutomationTarget | null;
80
+ export declare function fxAutomationTarget(nodeId: string, param: string): string;
81
+ /**
82
+ * How much of a preset is applied, 0..1.
83
+ *
84
+ * A preset's nodes share no automatable parameter — and its worklet effects
85
+ * expose no AudioParams at all — so there is nothing to aim a lane at
86
+ * node-by-node. The graph wraps a preset's run in a wet/dry pair instead, and
87
+ * this drives the blend: 0 is the dry signal untouched, 1 is the preset fully
88
+ * applied, and between them it crossfades.
89
+ */
90
+ export declare function presetAutomationTarget(presetId: string): string;
91
+ /** 0..1 blend, the same shape as a wet/dry mix knob. */
92
+ export declare const PRESET_RANGE: AutomationRange;
93
+ /**
94
+ * The value range a lane is drawn and clamped against.
95
+ *
96
+ * Volume is linear 0..1, matching `data-volume` and the existing volume
97
+ * envelope machinery — no dB conversion enters the volume path. Everything
98
+ * else is read from the effect registry, so a lane can never offer a value the
99
+ * renderer would reject, and the log-scaled knobs sweep the way a DAW's do.
100
+ */
101
+ export interface AutomationRange {
102
+ min: number;
103
+ max: number;
104
+ step: number;
105
+ unit: string;
106
+ label: string;
107
+ scale: "linear" | "log";
108
+ /** Where an empty lane draws its flat line, and what a new point starts at. */
109
+ default: number;
110
+ }
111
+ export declare const VOLUME_RANGE: AutomationRange;
112
+ /**
113
+ * Resolve a lane's target against a chain. Returns null when the target names
114
+ * a node or parameter that is not there — the effect was deleted, or the
115
+ * parameter is an enum, which has no envelope between its values.
116
+ */
117
+ export declare function resolveAutomationRange(target: string, chain: HfAudioFxChain | undefined): AutomationRange | null;
118
+ /**
119
+ * The via point a segment will actually be drawn with, given one that was asked
120
+ * for — pulled into the steady region, or null when it describes no bend.
121
+ *
122
+ * Exported so an editor can write what the model will honour rather than what the
123
+ * pointer happened to ask for. Without it a lane's attribute claims a shape the
124
+ * renderer quietly declines to draw, and the two only agree once the file makes a
125
+ * round trip.
126
+ */
127
+ export declare function steadyViaPoint(viaX: number | undefined, viaY: number | undefined): {
128
+ viaX: number;
129
+ viaY: number;
130
+ } | null;
131
+ /**
132
+ * Structural normalisation, with no knowledge of the chain: sort and clean the
133
+ * points of every lane and drop lanes that carry none. Range clamping and
134
+ * orphan removal need the chain and happen in `resolveAutomation`.
135
+ */
136
+ export declare function normalizeAutomation(automation: HfAutomation): HfAutomation;
137
+ /**
138
+ * Bind automation to a chain: clamp each lane into its parameter's declared
139
+ * range and drop lanes whose target no longer exists.
140
+ *
141
+ * Dropping is deliberate. An envelope on a deleted effect has nothing to
142
+ * drive, and keeping it would silently reattach if an unrelated effect later
143
+ * took the same node id.
144
+ */
145
+ export declare function resolveAutomation(automation: HfAutomation, chain: HfAudioFxChain | undefined): HfAutomation;
146
+ /**
147
+ * Parse an automation attribute.
148
+ *
149
+ * Malformed input throws rather than being skipped, matching the chain reader:
150
+ * a track that quietly loses its envelope renders differently from the project
151
+ * the author saved, which is worse than refusing.
152
+ */
153
+ export declare function parseAutomation(json: string): HfAutomation;
154
+ /** Serialise for the `data-automation` attribute. */
155
+ export declare function serializeAutomation(automation: HfAutomation): string;
156
+ /**
157
+ * Shape the 0..1 progress across a segment.
158
+ *
159
+ * `curve` is an exponent in disguise: 0 is linear, and the ends reach a
160
+ * quarter-power and a fourth-power bend, which is about the range a DAW's
161
+ * envelope handle covers before the segment stops reading as a curve.
162
+ */
163
+ export declare function applyCurve(x: number, curve: number | undefined): number;
164
+ /**
165
+ * The progress a segment leaving `point` has reached at normalised `x`.
166
+ *
167
+ * A via point wins when it is there, since it says strictly more than an
168
+ * exponent can. Everything authored before via points existed carries only
169
+ * `curve` and takes the exponent path unchanged.
170
+ */
171
+ export declare function shapeProgress(x: number, point: {
172
+ curve?: number | undefined;
173
+ viaX?: number | undefined;
174
+ viaY?: number | undefined;
175
+ }): number;
176
+ /**
177
+ * Value of a lane at a clip-local time.
178
+ *
179
+ * Outside the points, the envelope holds — the first value before it starts
180
+ * and the last value after it ends, so a lane never snaps to zero at the edges.
181
+ */
182
+ export declare function sampleAutomationLane(lane: HfAutomationLane, t: number, scale?: "linear" | "log"): number;
183
+ /** True when the lane is a single value, i.e. worth setting once and not scheduling. */
184
+ export declare function isConstantLane(lane: HfAutomationLane): boolean;
185
+ /**
186
+ * Sample a lane onto evenly spaced times, for consumers that want a plain
187
+ * curve rather than a breakpoint list: `setValueCurveAtTime`, the render-side
188
+ * volume envelope, and the lane's own drawing code.
189
+ */
190
+ export declare function sampleAutomationCurve(lane: HfAutomationLane, from: number, to: number, count: number, scale?: "linear" | "log"): Float32Array;
191
+ //# sourceMappingURL=audioAutomation.d.ts.map