@hyperframes/core 0.7.106 → 0.7.108
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.
- package/dist/audio/audioFxAutomation.d.ts +63 -0
- package/dist/audio/audioFxAutomation.d.ts.map +1 -0
- package/dist/audio/audioFxAutomation.js +219 -0
- package/dist/audio/audioFxAutomation.js.map +1 -0
- package/dist/audio/audioFxGraph.d.ts +73 -0
- package/dist/audio/audioFxGraph.d.ts.map +1 -0
- package/dist/audio/audioFxGraph.js +649 -0
- package/dist/audio/audioFxGraph.js.map +1 -0
- package/dist/audio/audioFxTail.d.ts +28 -0
- package/dist/audio/audioFxTail.d.ts.map +1 -0
- package/dist/audio/audioFxTail.js +95 -0
- package/dist/audio/audioFxTail.js.map +1 -0
- package/dist/audio/audioFxWorklets.d.ts +8 -0
- package/dist/audio/audioFxWorklets.d.ts.map +1 -0
- package/dist/audio/audioFxWorklets.js +263 -0
- package/dist/audio/audioFxWorklets.js.map +1 -0
- package/dist/audioAutomation.d.ts +191 -0
- package/dist/audioAutomation.d.ts.map +1 -0
- package/dist/audioAutomation.js +488 -0
- package/dist/audioAutomation.js.map +1 -0
- package/dist/audioCarve.d.ts +216 -0
- package/dist/audioCarve.d.ts.map +1 -0
- package/dist/audioCarve.js +608 -0
- package/dist/audioCarve.js.map +1 -0
- package/dist/audioFx.d.ts +182 -0
- package/dist/audioFx.d.ts.map +1 -0
- package/dist/audioFx.js +813 -0
- package/dist/audioFx.js.map +1 -0
- package/dist/audioFxCopy.d.ts +89 -0
- package/dist/audioFxCopy.d.ts.map +1 -0
- package/dist/audioFxCopy.js +340 -0
- package/dist/audioFxCopy.js.map +1 -0
- package/dist/audioFxEq.d.ts +75 -0
- package/dist/audioFxEq.d.ts.map +1 -0
- package/dist/audioFxEq.js +153 -0
- package/dist/audioFxEq.js.map +1 -0
- package/dist/audioFxJobs.d.ts +52 -0
- package/dist/audioFxJobs.d.ts.map +1 -0
- package/dist/audioFxJobs.js +92 -0
- package/dist/audioFxJobs.js.map +1 -0
- package/dist/audioFxPresets.d.ts +91 -0
- package/dist/audioFxPresets.d.ts.map +1 -0
- package/dist/audioFxPresets.js +320 -0
- package/dist/audioFxPresets.js.map +1 -0
- package/dist/audioFxProfiles.d.ts +65 -0
- package/dist/audioFxProfiles.d.ts.map +1 -0
- package/dist/audioFxProfiles.js +209 -0
- package/dist/audioFxProfiles.js.map +1 -0
- package/dist/audioLeveller.d.ts +62 -0
- package/dist/audioLeveller.d.ts.map +1 -0
- package/dist/audioLeveller.js +208 -0
- package/dist/audioLeveller.js.map +1 -0
- package/dist/canaryRegistry.d.ts.map +1 -1
- package/dist/canaryRegistry.js +8 -0
- package/dist/canaryRegistry.js.map +1 -1
- package/dist/compiler/compositionScoping.d.ts +3 -0
- package/dist/compiler/compositionScoping.d.ts.map +1 -1
- package/dist/compiler/compositionScoping.js +34 -11
- package/dist/compiler/compositionScoping.js.map +1 -1
- package/dist/compiler/htmlBundler.d.ts.map +1 -1
- package/dist/compiler/htmlBundler.js +42 -2
- package/dist/compiler/htmlBundler.js.map +1 -1
- package/dist/editing/affordances.d.ts +3 -0
- package/dist/editing/affordances.d.ts.map +1 -1
- package/dist/editing/affordances.js +1 -0
- package/dist/editing/affordances.js.map +1 -1
- package/dist/generated/audio-fx-runtime-inline.d.ts +3 -0
- package/dist/generated/audio-fx-runtime-inline.d.ts.map +1 -0
- package/dist/generated/audio-fx-runtime-inline.js +7 -0
- package/dist/generated/audio-fx-runtime-inline.js.map +1 -0
- package/dist/generated/runtime-inline.js +1 -1
- package/dist/generated/runtime-inline.js.map +1 -1
- package/dist/hyperframe.runtime.iife.js +238 -28
- package/dist/runtime/applyVariableBindings.d.ts +45 -0
- package/dist/runtime/applyVariableBindings.d.ts.map +1 -0
- package/dist/runtime/applyVariableBindings.js +194 -0
- package/dist/runtime/applyVariableBindings.js.map +1 -0
- package/dist/runtime/audioAutomationVolume.d.ts +17 -0
- package/dist/runtime/audioAutomationVolume.d.ts.map +1 -0
- package/dist/runtime/audioAutomationVolume.js +49 -0
- package/dist/runtime/audioAutomationVolume.js.map +1 -0
- package/dist/runtime/media.d.ts.map +1 -1
- package/dist/runtime/media.js +24 -2
- package/dist/runtime/media.js.map +1 -1
- package/dist/runtime/mediaVolumeEnvelope.d.ts +9 -2
- package/dist/runtime/mediaVolumeEnvelope.d.ts.map +1 -1
- package/dist/runtime/mediaVolumeEnvelope.js +13 -3
- package/dist/runtime/mediaVolumeEnvelope.js.map +1 -1
- package/dist/runtime/variableScope.d.ts +9 -0
- package/dist/runtime/variableScope.d.ts.map +1 -0
- package/dist/runtime/variableScope.js +21 -0
- package/dist/runtime/variableScope.js.map +1 -0
- package/dist/utils/richTextSanitize.d.ts +32 -0
- package/dist/utils/richTextSanitize.d.ts.map +1 -0
- package/dist/utils/richTextSanitize.js +227 -0
- package/dist/utils/richTextSanitize.js.map +1 -0
- package/package.json +55 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioAutomation.d.ts","sourceRoot":"","sources":["../src/audioAutomation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,488 @@
|
|
|
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 { getAudioFxDef } from "./audioFx.js";
|
|
14
|
+
export const HF_AUDIO_AUTOMATION_ATTR = "data-automation";
|
|
15
|
+
/** The same attribute as a `dataset` / `dataAttributes` key. See `HF_AUDIO_FX_DATA_KEY`. */
|
|
16
|
+
export const HF_AUDIO_AUTOMATION_DATA_KEY = HF_AUDIO_AUTOMATION_ATTR.slice("data-".length);
|
|
17
|
+
/** Automation files are versioned; a reader must refuse a version it doesn't know. */
|
|
18
|
+
export 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 const MAX_AUTOMATION_POINTS = 512;
|
|
25
|
+
export class AudioAutomationError extends Error {
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "AudioAutomationError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const VOLUME_TARGET = "volume";
|
|
32
|
+
/** Split a target string. Returns null for anything unrecognised. */
|
|
33
|
+
export function parseAutomationTarget(target) {
|
|
34
|
+
if (target === VOLUME_TARGET)
|
|
35
|
+
return { kind: "volume" };
|
|
36
|
+
const parts = target.split(".");
|
|
37
|
+
// `fx.preset.<id>` before the 3-part fx form, because it IS a 3-part fx form
|
|
38
|
+
// with a reserved node id — an effect can never be called "preset", since ids
|
|
39
|
+
// are minted `n1`, `n2`, ….
|
|
40
|
+
if (parts.length === 3 && parts[0] === "fx" && parts[1] === PRESET_TARGET_KEY) {
|
|
41
|
+
const presetId = parts[2];
|
|
42
|
+
return presetId ? { kind: "preset", presetId } : null;
|
|
43
|
+
}
|
|
44
|
+
if (parts.length !== 3 || parts[0] !== "fx")
|
|
45
|
+
return null;
|
|
46
|
+
const [, nodeId, param] = parts;
|
|
47
|
+
if (!nodeId || !param)
|
|
48
|
+
return null;
|
|
49
|
+
return { kind: "fx", nodeId, param };
|
|
50
|
+
}
|
|
51
|
+
export function fxAutomationTarget(nodeId, param) {
|
|
52
|
+
return `fx.${nodeId}.${param}`;
|
|
53
|
+
}
|
|
54
|
+
/** The reserved node-id slot that marks a whole-preset target. */
|
|
55
|
+
const PRESET_TARGET_KEY = "preset";
|
|
56
|
+
/**
|
|
57
|
+
* How much of a preset is applied, 0..1.
|
|
58
|
+
*
|
|
59
|
+
* A preset's nodes share no automatable parameter — and its worklet effects
|
|
60
|
+
* expose no AudioParams at all — so there is nothing to aim a lane at
|
|
61
|
+
* node-by-node. The graph wraps a preset's run in a wet/dry pair instead, and
|
|
62
|
+
* this drives the blend: 0 is the dry signal untouched, 1 is the preset fully
|
|
63
|
+
* applied, and between them it crossfades.
|
|
64
|
+
*/
|
|
65
|
+
export function presetAutomationTarget(presetId) {
|
|
66
|
+
return `fx.${PRESET_TARGET_KEY}.${presetId}`;
|
|
67
|
+
}
|
|
68
|
+
/** 0..1 blend, the same shape as a wet/dry mix knob. */
|
|
69
|
+
export const PRESET_RANGE = {
|
|
70
|
+
min: 0,
|
|
71
|
+
max: 1,
|
|
72
|
+
step: 0.01,
|
|
73
|
+
unit: "",
|
|
74
|
+
label: "Amount",
|
|
75
|
+
scale: "linear",
|
|
76
|
+
default: 1,
|
|
77
|
+
};
|
|
78
|
+
export const VOLUME_RANGE = {
|
|
79
|
+
min: 0,
|
|
80
|
+
max: 1,
|
|
81
|
+
step: 0.01,
|
|
82
|
+
unit: "",
|
|
83
|
+
label: "Volume",
|
|
84
|
+
scale: "linear",
|
|
85
|
+
default: 1,
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Resolve a lane's target against a chain. Returns null when the target names
|
|
89
|
+
* a node or parameter that is not there — the effect was deleted, or the
|
|
90
|
+
* parameter is an enum, which has no envelope between its values.
|
|
91
|
+
*/
|
|
92
|
+
export function resolveAutomationRange(target, chain) {
|
|
93
|
+
const parsed = parseAutomationTarget(target);
|
|
94
|
+
if (!parsed)
|
|
95
|
+
return null;
|
|
96
|
+
if (parsed.kind === "volume")
|
|
97
|
+
return VOLUME_RANGE;
|
|
98
|
+
if (parsed.kind === "preset") {
|
|
99
|
+
// Only for a preset the chain actually carries, so a lane left behind by a
|
|
100
|
+
// removed preset resolves to nothing and is dropped at read time — the same
|
|
101
|
+
// contract an orphaned node lane has.
|
|
102
|
+
const present = chain?.nodes.some((n) => n.fromPreset === parsed.presetId);
|
|
103
|
+
return present ? { ...PRESET_RANGE, label: `${parsed.presetId} · Amount` } : null;
|
|
104
|
+
}
|
|
105
|
+
const node = chain?.nodes.find((n) => n.id === parsed.nodeId);
|
|
106
|
+
if (!node)
|
|
107
|
+
return null;
|
|
108
|
+
const def = getAudioFxDef(node.type);
|
|
109
|
+
const param = def?.params.find((p) => p.key === parsed.param);
|
|
110
|
+
if (!param || param.kind !== "number")
|
|
111
|
+
return null;
|
|
112
|
+
return {
|
|
113
|
+
min: param.min,
|
|
114
|
+
max: param.max,
|
|
115
|
+
step: param.step,
|
|
116
|
+
unit: param.unit,
|
|
117
|
+
label: `${def?.label ?? node.type} · ${param.label}`,
|
|
118
|
+
scale: param.scale === "log" && param.min > 0 ? "log" : "linear",
|
|
119
|
+
default: param.default,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Coerce a JSON field to a number, treating anything that is not already one —
|
|
124
|
+
* or a string that plainly reads as one — as absent.
|
|
125
|
+
*
|
|
126
|
+
* Not `Number(raw)`: that turns `null`, `""` and `[]` into 0, which for an
|
|
127
|
+
* envelope means a silent drop to zero rather than a point the reader rejects.
|
|
128
|
+
*/
|
|
129
|
+
function numberOrNull(raw) {
|
|
130
|
+
if (typeof raw === "number")
|
|
131
|
+
return Number.isFinite(raw) ? raw : null;
|
|
132
|
+
if (typeof raw === "string" && raw.trim() !== "") {
|
|
133
|
+
const n = Number(raw);
|
|
134
|
+
return Number.isFinite(n) ? n : null;
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
function clampCurve(v) {
|
|
139
|
+
const n = numberOrNull(v);
|
|
140
|
+
if (n === null || n === 0)
|
|
141
|
+
return 0;
|
|
142
|
+
return Math.min(1, Math.max(-1, n));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A via point, or null when there isn't a usable one.
|
|
146
|
+
*
|
|
147
|
+
* Only two things disqualify one: a coordinate outside the segment, which names a
|
|
148
|
+
* point the curve does not travel through, and a point ON the straight line, which
|
|
149
|
+
* is a straight line — storing that would claim a bend the segment does not have.
|
|
150
|
+
*
|
|
151
|
+
* Depth is deliberately NOT limited. An earlier version held bends to a maximum
|
|
152
|
+
* slope so a segment could never leave a breakpoint steeply, and it was wrong twice
|
|
153
|
+
* over: it capped how far a curve could be pulled, and clamping the two coordinates
|
|
154
|
+
* separately could land a bend exactly on the straight line and flatten it mid-drag.
|
|
155
|
+
* A steep departure is a smooth curve doing what it was asked; what must never
|
|
156
|
+
* happen is a crease, and that is the sampler's job below, not a limit here.
|
|
157
|
+
*/
|
|
158
|
+
function clampVia(rawX, rawY) {
|
|
159
|
+
const x = numberOrNull(rawX);
|
|
160
|
+
const y = numberOrNull(rawY);
|
|
161
|
+
if (x === null || y === null)
|
|
162
|
+
return null;
|
|
163
|
+
const inside = (n) => Math.min(0.999, Math.max(0.001, n));
|
|
164
|
+
const cx = inside(x);
|
|
165
|
+
const cy = inside(y);
|
|
166
|
+
if (Math.abs(cx - cy) < 1e-6)
|
|
167
|
+
return null;
|
|
168
|
+
return { x: cx, y: cy };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The via point a segment will actually be drawn with, given one that was asked
|
|
172
|
+
* for — pulled into the steady region, or null when it describes no bend.
|
|
173
|
+
*
|
|
174
|
+
* Exported so an editor can write what the model will honour rather than what the
|
|
175
|
+
* pointer happened to ask for. Without it a lane's attribute claims a shape the
|
|
176
|
+
* renderer quietly declines to draw, and the two only agree once the file makes a
|
|
177
|
+
* round trip.
|
|
178
|
+
*/
|
|
179
|
+
export function steadyViaPoint(viaX, viaY) {
|
|
180
|
+
const via = clampVia(viaX, viaY);
|
|
181
|
+
return via ? { viaX: via.x, viaY: via.y } : null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The shape fields a point carries, cleaned: whichever of `curve` and the via
|
|
185
|
+
* pair survive, each omitted when it describes nothing.
|
|
186
|
+
*
|
|
187
|
+
* The via pair is kept or dropped together. Half a via point says nothing, and
|
|
188
|
+
* letting one coordinate through would leave the segment's shape depending on
|
|
189
|
+
* which half survived a hand edit.
|
|
190
|
+
*/
|
|
191
|
+
function shapeFields(p) {
|
|
192
|
+
const curve = clampCurve(p?.curve);
|
|
193
|
+
const via = clampVia(p?.viaX, p?.viaY);
|
|
194
|
+
return {
|
|
195
|
+
...(curve ? { curve } : {}),
|
|
196
|
+
...(via ? { viaX: via.x, viaY: via.y } : {}),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Clean one point, or reject it.
|
|
201
|
+
*
|
|
202
|
+
* A missing or non-finite value reaching an AudioParam silences the node for
|
|
203
|
+
* the rest of the render, so such a point is dropped rather than coerced.
|
|
204
|
+
*/
|
|
205
|
+
function cleanPoint(p, range) {
|
|
206
|
+
const t = numberOrNull(p?.t);
|
|
207
|
+
const v = numberOrNull(p?.v);
|
|
208
|
+
if (t === null || v === null)
|
|
209
|
+
return null;
|
|
210
|
+
const clamped = range ? Math.min(range.max, Math.max(range.min, v)) : v;
|
|
211
|
+
return { t: Math.max(0, t), v: clamped, ...shapeFields(p) };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Order points, drop unusable ones, and collapse duplicate times.
|
|
215
|
+
*
|
|
216
|
+
* Later wins on a tie so that dragging a point onto another replaces it rather
|
|
217
|
+
* than leaving an invisible one underneath.
|
|
218
|
+
*/
|
|
219
|
+
function normalizePoints(points, range) {
|
|
220
|
+
const clean = points
|
|
221
|
+
.map((p) => cleanPoint(p, range))
|
|
222
|
+
.filter((p) => p !== null)
|
|
223
|
+
.sort((a, b) => a.t - b.t);
|
|
224
|
+
const out = [];
|
|
225
|
+
for (const p of clean) {
|
|
226
|
+
if (out.length > 0 && out[out.length - 1].t === p.t)
|
|
227
|
+
out[out.length - 1] = p;
|
|
228
|
+
else
|
|
229
|
+
out.push(p);
|
|
230
|
+
}
|
|
231
|
+
return out.slice(0, MAX_AUTOMATION_POINTS);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Structural normalisation, with no knowledge of the chain: sort and clean the
|
|
235
|
+
* points of every lane and drop lanes that carry none. Range clamping and
|
|
236
|
+
* orphan removal need the chain and happen in `resolveAutomation`.
|
|
237
|
+
*/
|
|
238
|
+
export function normalizeAutomation(automation) {
|
|
239
|
+
const lanes = [];
|
|
240
|
+
for (const lane of automation.lanes) {
|
|
241
|
+
if (!parseAutomationTarget(lane.target))
|
|
242
|
+
continue;
|
|
243
|
+
const range = lane.target === VOLUME_TARGET ? VOLUME_RANGE : null;
|
|
244
|
+
const points = normalizePoints(lane.points ?? [], range);
|
|
245
|
+
if (points.length > 0)
|
|
246
|
+
lanes.push({ target: lane.target, points });
|
|
247
|
+
}
|
|
248
|
+
return { version: HF_AUDIO_AUTOMATION_VERSION, lanes };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Bind automation to a chain: clamp each lane into its parameter's declared
|
|
252
|
+
* range and drop lanes whose target no longer exists.
|
|
253
|
+
*
|
|
254
|
+
* Dropping is deliberate. An envelope on a deleted effect has nothing to
|
|
255
|
+
* drive, and keeping it would silently reattach if an unrelated effect later
|
|
256
|
+
* took the same node id.
|
|
257
|
+
*/
|
|
258
|
+
export function resolveAutomation(automation, chain) {
|
|
259
|
+
const lanes = [];
|
|
260
|
+
for (const lane of automation.lanes) {
|
|
261
|
+
const range = resolveAutomationRange(lane.target, chain);
|
|
262
|
+
if (!range)
|
|
263
|
+
continue;
|
|
264
|
+
const points = normalizePoints(lane.points, range);
|
|
265
|
+
if (points.length > 0)
|
|
266
|
+
lanes.push({ target: lane.target, points });
|
|
267
|
+
}
|
|
268
|
+
return { version: HF_AUDIO_AUTOMATION_VERSION, lanes };
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Parse an automation attribute.
|
|
272
|
+
*
|
|
273
|
+
* Malformed input throws rather than being skipped, matching the chain reader:
|
|
274
|
+
* a track that quietly loses its envelope renders differently from the project
|
|
275
|
+
* the author saved, which is worse than refusing.
|
|
276
|
+
*/
|
|
277
|
+
export function parseAutomation(json) {
|
|
278
|
+
let raw;
|
|
279
|
+
try {
|
|
280
|
+
raw = JSON.parse(json);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
throw new AudioAutomationError(`Automation is not valid JSON: ${err.message}`);
|
|
284
|
+
}
|
|
285
|
+
if (typeof raw !== "object" || raw === null) {
|
|
286
|
+
throw new AudioAutomationError("Automation must be a JSON object.");
|
|
287
|
+
}
|
|
288
|
+
const obj = raw;
|
|
289
|
+
if (obj.version !== HF_AUDIO_AUTOMATION_VERSION) {
|
|
290
|
+
throw new AudioAutomationError(`Unsupported automation version: ${String(obj.version)}`);
|
|
291
|
+
}
|
|
292
|
+
if (!Array.isArray(obj.lanes)) {
|
|
293
|
+
throw new AudioAutomationError("Automation is missing a `lanes` array.");
|
|
294
|
+
}
|
|
295
|
+
const lanes = obj.lanes.map((l, i) => {
|
|
296
|
+
if (typeof l !== "object" || l === null) {
|
|
297
|
+
throw new AudioAutomationError(`Lane ${i} is not an object.`);
|
|
298
|
+
}
|
|
299
|
+
const lane = l;
|
|
300
|
+
if (typeof lane.target !== "string" || !parseAutomationTarget(lane.target)) {
|
|
301
|
+
throw new AudioAutomationError(`Lane ${i} has an unreadable target: ${String(lane.target)}`);
|
|
302
|
+
}
|
|
303
|
+
if (!Array.isArray(lane.points)) {
|
|
304
|
+
throw new AudioAutomationError(`Lane ${i} is missing a \`points\` array.`);
|
|
305
|
+
}
|
|
306
|
+
return { target: lane.target, points: lane.points };
|
|
307
|
+
});
|
|
308
|
+
return normalizeAutomation({ version: HF_AUDIO_AUTOMATION_VERSION, lanes });
|
|
309
|
+
}
|
|
310
|
+
/** Serialise for the `data-automation` attribute. */
|
|
311
|
+
export function serializeAutomation(automation) {
|
|
312
|
+
return JSON.stringify({
|
|
313
|
+
version: HF_AUDIO_AUTOMATION_VERSION,
|
|
314
|
+
lanes: automation.lanes.map((lane) => ({
|
|
315
|
+
target: lane.target,
|
|
316
|
+
points: lane.points.map((p) => ({
|
|
317
|
+
t: p.t,
|
|
318
|
+
v: p.v,
|
|
319
|
+
...(p.curve ? { curve: p.curve } : {}),
|
|
320
|
+
...(p.viaX !== undefined && p.viaY !== undefined ? { viaX: p.viaX, viaY: p.viaY } : {}),
|
|
321
|
+
})),
|
|
322
|
+
})),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Shape the 0..1 progress across a segment.
|
|
327
|
+
*
|
|
328
|
+
* `curve` is an exponent in disguise: 0 is linear, and the ends reach a
|
|
329
|
+
* quarter-power and a fourth-power bend, which is about the range a DAW's
|
|
330
|
+
* envelope handle covers before the segment stops reading as a curve.
|
|
331
|
+
*/
|
|
332
|
+
export function applyCurve(x, curve) {
|
|
333
|
+
if (!curve)
|
|
334
|
+
return x;
|
|
335
|
+
return Math.pow(x, Math.pow(2, 2 * curve));
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* The conic that carries a segment through its via point: control point and weight
|
|
339
|
+
* of a rational quadratic Bezier from (0,0) to (1,1).
|
|
340
|
+
*
|
|
341
|
+
* A rational quadratic at its own midparameter is `(P0 + 2wC + P1) / (2 + 2w)`, so
|
|
342
|
+
* demanding that equal the via point `Q` fixes the control point for any weight:
|
|
343
|
+
* `C = Q + (Q - M) / w`, with `M` the straight midpoint. The curve therefore passes
|
|
344
|
+
* exactly through `Q` whatever the weight, and — because it does so at the
|
|
345
|
+
* midparameter, with the two halves symmetric in parameter — its furthest departure
|
|
346
|
+
* from the straight line is at `Q` too. The pointer is the apex, by construction.
|
|
347
|
+
*
|
|
348
|
+
* The weight is what buys reach. A plain quadratic (`w = 1`) needs its control point
|
|
349
|
+
* at `2Q - M`, which leaves the segment as soon as `Q` is past the middle half — so
|
|
350
|
+
* a plain quadratic simply cannot pass through a deep or off-centre point. Raising
|
|
351
|
+
* the weight draws the control point back toward `Q`, so take the smallest weight
|
|
352
|
+
* that keeps `C` inside the segment: inside is what makes progress monotone, and
|
|
353
|
+
* smallest-that-fits is the broadest curve available through that point.
|
|
354
|
+
*
|
|
355
|
+
* Deep bends therefore come out tight and steep near the breakpoint they lean on.
|
|
356
|
+
* That is the shape being asked for, and it stays a single smooth arc while doing
|
|
357
|
+
* it — no join, no inflection, no crease.
|
|
358
|
+
*/
|
|
359
|
+
function viaConic(viaX, viaY) {
|
|
360
|
+
const dx = viaX - 0.5;
|
|
361
|
+
const dy = viaY - 0.5;
|
|
362
|
+
const edge = 0.999;
|
|
363
|
+
// Per axis, `C` stays inside when the weight is at least the pull divided by the
|
|
364
|
+
// room left in the pull's own direction. A via point clamped to `edge` itself
|
|
365
|
+
// leaves zero room — `edge - viaX` is exactly 0 — which would divide out to
|
|
366
|
+
// Infinity and carry NaN into every downstream sample. Capped rather than left
|
|
367
|
+
// unbounded: past this weight the arc already reads as touching the via point,
|
|
368
|
+
// so the cap costs no visible reach.
|
|
369
|
+
const MAX_WEIGHT = 1e6;
|
|
370
|
+
const needX = dx > 0 ? dx / (edge - viaX) : dx < 0 ? -dx / (viaX - (1 - edge)) : 0;
|
|
371
|
+
const needY = dy > 0 ? dy / (edge - viaY) : dy < 0 ? -dy / (viaY - (1 - edge)) : 0;
|
|
372
|
+
const w = Math.min(MAX_WEIGHT, Math.max(1, needX, needY));
|
|
373
|
+
return { cx: viaX + dx / w, cy: viaY + dy / w, w };
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Progress through a segment that passes through its via point: one conic arc, from
|
|
377
|
+
* breakpoint to breakpoint.
|
|
378
|
+
*
|
|
379
|
+
* One curve, not two joined at the via point, because anything joined there can only
|
|
380
|
+
* be as smooth as the join — and keeping such a join monotone forces its tangent
|
|
381
|
+
* down to a fraction of the slope the curve arrives with, creasing the segment
|
|
382
|
+
* exactly where the pointer is. A conic has no join and no inflection: its slope
|
|
383
|
+
* moves one way from end to end, which is what makes it read as one curve rather
|
|
384
|
+
* than a shape with features in it.
|
|
385
|
+
*/
|
|
386
|
+
function shapeVia(x, viaX, viaY) {
|
|
387
|
+
const { cx, cy, w } = viaConic(viaX, viaY);
|
|
388
|
+
// Both coordinates are quadratics over one shared denominator, so `x(t) = x`
|
|
389
|
+
// rearranges into an ordinary quadratic in `t`: closed form, and the same answer on
|
|
390
|
+
// every machine, which a render that has to match its own preview depends on.
|
|
391
|
+
const spread = 2 - 2 * w;
|
|
392
|
+
const a = x * spread - 1 + 2 * w * cx;
|
|
393
|
+
const b = -x * spread - 2 * w * cx;
|
|
394
|
+
const t = conicParam(a, b, x);
|
|
395
|
+
const rest = 1 - t;
|
|
396
|
+
const denominator = rest * rest + 2 * w * t * rest + t * t;
|
|
397
|
+
if (!(denominator > 0))
|
|
398
|
+
return x;
|
|
399
|
+
return (2 * w * cy * t * rest + t * t) / denominator;
|
|
400
|
+
}
|
|
401
|
+
/** The root of `a*t^2 + b*t + c` that lies on the arc the segment travels. */
|
|
402
|
+
function conicParam(a, b, c) {
|
|
403
|
+
if (Math.abs(a) < 1e-12)
|
|
404
|
+
return Math.abs(b) < 1e-12 ? c : -c / b;
|
|
405
|
+
const root = Math.sqrt(Math.max(0, b * b - 4 * a * c));
|
|
406
|
+
const first = (-b + root) / (2 * a);
|
|
407
|
+
const second = (-b - root) / (2 * a);
|
|
408
|
+
const onArc = (t) => t >= -1e-9 && t <= 1 + 1e-9;
|
|
409
|
+
if (onArc(first))
|
|
410
|
+
return Math.min(1, Math.max(0, first));
|
|
411
|
+
if (onArc(second))
|
|
412
|
+
return Math.min(1, Math.max(0, second));
|
|
413
|
+
return c;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* The progress a segment leaving `point` has reached at normalised `x`.
|
|
417
|
+
*
|
|
418
|
+
* A via point wins when it is there, since it says strictly more than an
|
|
419
|
+
* exponent can. Everything authored before via points existed carries only
|
|
420
|
+
* `curve` and takes the exponent path unchanged.
|
|
421
|
+
*/
|
|
422
|
+
export function shapeProgress(x, point) {
|
|
423
|
+
const via = clampVia(point.viaX, point.viaY);
|
|
424
|
+
if (via)
|
|
425
|
+
return shapeVia(Math.min(1, Math.max(0, x)), via.x, via.y);
|
|
426
|
+
return applyCurve(x, point.curve);
|
|
427
|
+
}
|
|
428
|
+
function lerpValue(a, b, x, scale) {
|
|
429
|
+
// A frequency sweep interpolated linearly spends almost all its time in the
|
|
430
|
+
// top octave. Log-scaled parameters interpolate in log space so a 200 Hz to
|
|
431
|
+
// 8 kHz move sounds like an even sweep, which is what the knob's own scale
|
|
432
|
+
// already promises.
|
|
433
|
+
if (scale === "log" && a > 0 && b > 0) {
|
|
434
|
+
return Math.exp(Math.log(a) + (Math.log(b) - Math.log(a)) * x);
|
|
435
|
+
}
|
|
436
|
+
return a + (b - a) * x;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Value of a lane at a clip-local time.
|
|
440
|
+
*
|
|
441
|
+
* Outside the points, the envelope holds — the first value before it starts
|
|
442
|
+
* and the last value after it ends, so a lane never snaps to zero at the edges.
|
|
443
|
+
*/
|
|
444
|
+
export function sampleAutomationLane(lane, t, scale = "linear") {
|
|
445
|
+
const pts = lane.points;
|
|
446
|
+
if (pts.length === 0)
|
|
447
|
+
return 0;
|
|
448
|
+
const first = pts[0];
|
|
449
|
+
if (t <= first.t)
|
|
450
|
+
return first.v;
|
|
451
|
+
const last = pts[pts.length - 1];
|
|
452
|
+
if (t >= last.t)
|
|
453
|
+
return last.v;
|
|
454
|
+
let lo = 0;
|
|
455
|
+
let hi = pts.length - 1;
|
|
456
|
+
while (hi - lo > 1) {
|
|
457
|
+
const mid = (lo + hi) >> 1;
|
|
458
|
+
if (pts[mid].t <= t)
|
|
459
|
+
lo = mid;
|
|
460
|
+
else
|
|
461
|
+
hi = mid;
|
|
462
|
+
}
|
|
463
|
+
const a = pts[lo];
|
|
464
|
+
const b = pts[hi];
|
|
465
|
+
const span = b.t - a.t;
|
|
466
|
+
if (span <= 0)
|
|
467
|
+
return b.v;
|
|
468
|
+
return lerpValue(a.v, b.v, shapeProgress((t - a.t) / span, a), scale);
|
|
469
|
+
}
|
|
470
|
+
/** True when the lane is a single value, i.e. worth setting once and not scheduling. */
|
|
471
|
+
export function isConstantLane(lane) {
|
|
472
|
+
return lane.points.length <= 1 || lane.points.every((p) => p.v === lane.points[0].v);
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Sample a lane onto evenly spaced times, for consumers that want a plain
|
|
476
|
+
* curve rather than a breakpoint list: `setValueCurveAtTime`, the render-side
|
|
477
|
+
* volume envelope, and the lane's own drawing code.
|
|
478
|
+
*/
|
|
479
|
+
export function sampleAutomationCurve(lane, from, to, count, scale = "linear") {
|
|
480
|
+
const n = Math.max(2, Math.floor(count));
|
|
481
|
+
const out = new Float32Array(n);
|
|
482
|
+
const span = to - from;
|
|
483
|
+
for (let i = 0; i < n; i += 1) {
|
|
484
|
+
out[i] = sampleAutomationLane(lane, from + (span * i) / (n - 1), scale);
|
|
485
|
+
}
|
|
486
|
+
return out;
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=audioAutomation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioAutomation.js","sourceRoot":"","sources":["../src/audioAutomation.ts"],"names":[],"mappings":"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"}
|