@effetune/dsp 0.5.0 → 0.7.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.
- package/README.md +17 -15
- package/dist/assets/effetune-dsp.meta.json +32 -13
- package/dist/assets/effetune-dsp.simd.wasm +0 -0
- package/dist/assets/effetune-dsp.wasm +0 -0
- package/dist/assets.js +34 -11
- package/dist/catalog/effects-v1.json +233 -13
- package/dist/denormal-noise.js +15 -0
- package/dist/effect.js +29 -2
- package/dist/generated-effects.d.ts +44 -8
- package/dist/generated-effects.js +29 -3
- package/dist/graph-engine.js +7 -7
- package/dist/graph.js +4 -4
- package/dist/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/internal/dsp-params.generated.js +244 -128
- package/dist/internal/ir-asset-payload.js +4 -4
- package/dist/internal/ir-plugin-contract.js +10 -6
- package/dist/preset.js +6 -2
- package/dist/runtime.js +6 -6
- package/dist/schemas/bundle-v1.schema.json +7 -7
- package/dist/schemas/chain-v1.schema.json +275 -15
- package/dist/schemas/graph-v1.schema.json +275 -15
- package/dist/semantics.js +13 -19
- package/dist/telemetry.js +1 -1
- package/dist/worklet.js +11 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
<!-- BEGIN DSP-LIBRARY-JAVASCRIPT-SUMMARY -->
|
|
4
4
|
EffeTune DSP provides the same MIT-licensed C++ audio kernels used by EffeTune
|
|
5
5
|
as a self-contained WebAssembly package for Node.js and evergreen browsers.
|
|
6
|
-
Version 0.
|
|
7
|
-
`createEffect` APIs and
|
|
6
|
+
Version 0.7.0 exposes all 92 catalog types through the generic Chain and
|
|
7
|
+
`createEffect` APIs and 92 generated named convenience classes,
|
|
8
8
|
decoded analyzer telemetry, versioned semantic presets, deterministic seeds, and an AudioWorklet wrapper.
|
|
9
9
|
<!-- END DSP-LIBRARY-JAVASCRIPT-SUMMARY -->
|
|
10
10
|
|
|
@@ -139,8 +139,9 @@ seed, and DSP state from stream creation.
|
|
|
139
139
|
assets to be staged again. Open a new stream after changing
|
|
140
140
|
`IRReverb.channelMode`, `latency`, or `convolutionRate`;
|
|
141
141
|
`FIRCrossover.bandCount`, `latencyMode`, or `filterDelaySamples`; or
|
|
142
|
-
`latencyMode` / `filterDelaySamples` on `FiveBandFIRPEQ`, `GroupDelayEQ`,
|
|
143
|
-
`RoomEQ`. The same restriction applies to
|
|
142
|
+
`latencyMode` / `filterDelaySamples` on `FiveBandFIRPEQ`, `GroupDelayEQ`,
|
|
143
|
+
`GroupDelayPEQ`, or `RoomEQ`. The same restriction applies to
|
|
144
|
+
`EffeTuneNode.setParam()`.
|
|
144
145
|
|
|
145
146
|
Canonical presets use semantic long parameter names:
|
|
146
147
|
|
|
@@ -167,24 +168,25 @@ Move or copy the desired effects into one serial path in the app and export it
|
|
|
167
168
|
again, or reproduce the branching in the host around separate Chains.
|
|
168
169
|
Unsupported fields produce a validation error.
|
|
169
170
|
|
|
170
|
-
FIR Crossover, Five Band FIR PEQ, Group Delay EQ, IR Reverb,
|
|
171
|
-
require an `assets.impulseResponse` reference and an
|
|
172
|
-
FIR filter effects use prepared coefficient impulses
|
|
173
|
-
rate. Use the public
|
|
171
|
+
FIR Crossover, Five Band FIR PEQ, Group Delay EQ, Group Delay PEQ, IR Reverb,
|
|
172
|
+
and Room EQ require an `assets.impulseResponse` reference and an
|
|
173
|
+
`assetResolver`. The five FIR filter effects use prepared coefficient impulses
|
|
174
|
+
at the processing sample rate. Use the public
|
|
175
|
+
`encodeEta1({ channels, sampleRate, topology, paths })`
|
|
174
176
|
helper to encode raw planar float32 arrays for a resolver. Bundle manifests
|
|
175
177
|
verify exact byte length and SHA-256 before accepting an ETA1 payload. The
|
|
176
178
|
complete payload and convolution footprint must fit the 32 MiB kernel cap.
|
|
177
179
|
|
|
178
180
|
`EFFECT_CATALOG` and `getEffectCatalog()` expose the machine-readable semantic
|
|
179
|
-
catalog for all
|
|
181
|
+
catalog for all 92 root classes and their `create<Type>()` factories. The
|
|
180
182
|
catalog contains channel choices, parameters, required assets, telemetry, and
|
|
181
183
|
latency declarations, but no private implementation mapping.
|
|
182
184
|
|
|
183
|
-
### Modulation
|
|
185
|
+
### Modulation system-preset recipes
|
|
184
186
|
|
|
185
|
-
The application
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
The application exposes these settings as system presets. The following
|
|
188
|
+
JSON-compatible objects are their equivalent public parameter dictionaries.
|
|
189
|
+
Copy one into a named constructor, for example
|
|
188
190
|
`new Chorus(MODULATION_STYLES.Chorus.Flanger)`, or into a Chain effect's
|
|
189
191
|
`parameters` object.
|
|
190
192
|
|
|
@@ -229,8 +231,8 @@ const MODULATION_STYLES = {
|
|
|
229
231
|
"Rotary Slow": { speedState: "Slow", speed: 100, acceleration: 2.2, crossover: 800, rotorBalance: 0, stereoWidth: 75, dopplerDepth: 45, amplitudeDepth: 55, mix: 70 },
|
|
230
232
|
"Rotary Fast": { speedState: "Fast", speed: 100, acceleration: 1.4, crossover: 800, rotorBalance: 0, stereoWidth: 85, dopplerDepth: 65, amplitudeDepth: 70, mix: 78 },
|
|
231
233
|
"Gentle Rotary": { speedState: "Slow", speed: 75, acceleration: 3, crossover: 900, rotorBalance: 0, stereoWidth: 45, dopplerDepth: 25, amplitudeDepth: 30, mix: 55 },
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
+
"Vintage Rotor Slow": { speedState: "Slow", speed: 100, acceleration: 2.8, crossover: 800, rotorBalance: -5, stereoWidth: 80, dopplerDepth: 50, amplitudeDepth: 60, mix: 75 },
|
|
235
|
+
"Vintage Rotor Fast": { speedState: "Fast", speed: 100, acceleration: 1.8, crossover: 800, rotorBalance: -5, stereoWidth: 90, dopplerDepth: 70, amplitudeDepth: 75, mix: 82 }
|
|
234
236
|
}
|
|
235
237
|
};
|
|
236
238
|
```
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"abiVersion": 1,
|
|
3
|
-
"sourceDigest": "sha256:
|
|
3
|
+
"sourceDigest": "sha256:df1bbb523b8c25f3733a6a948c648f3cf627b7e73d576b911c409900e81fbea5",
|
|
4
4
|
"emsdkVersion": "6.0.2",
|
|
5
5
|
"g726PerformanceInput": {
|
|
6
6
|
"contract": "g726-production-performance-input-sha256-v2",
|
|
7
7
|
"hashAlgorithm": "SHA-256 over the contract and ordered UTF-8 components as id\\0content\\0; CRLF and CR normalize to LF",
|
|
8
|
-
"digest": "sha256:
|
|
8
|
+
"digest": "sha256:e7e32b3616dc0bafdee4e807e9aceae8d4afe1aeb2bf41346aa0c8255a26a8e7",
|
|
9
9
|
"inputs": [
|
|
10
10
|
{
|
|
11
11
|
"id": "dsp/core/abi.cpp",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
{
|
|
16
16
|
"id": "dsp/core/allocation_guard.cpp",
|
|
17
17
|
"kind": "file",
|
|
18
|
-
"sha256": "sha256:
|
|
18
|
+
"sha256": "sha256:69dd284b57f2704580778028a33d05f683fa8d5674de22b4aa094c2254475049"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"id": "dsp/core/allocation_guard.h",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
{
|
|
26
26
|
"id": "dsp/core/arena.cpp",
|
|
27
27
|
"kind": "file",
|
|
28
|
-
"sha256": "sha256:
|
|
28
|
+
"sha256": "sha256:9b2795ac6f44ab7cc7708d6f831f180b4df73ebff438e16745519cf00be4f4be"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"id": "dsp/core/arena.h",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
{
|
|
36
36
|
"id": "dsp/core/engine.cpp",
|
|
37
37
|
"kind": "file",
|
|
38
|
-
"sha256": "sha256:
|
|
38
|
+
"sha256": "sha256:04c3257634399acfadf9ee258be827ee26fce0a86d8189397f0d4bae245b1343"
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"id": "dsp/core/engine.h",
|
|
42
42
|
"kind": "file",
|
|
43
|
-
"sha256": "sha256:
|
|
43
|
+
"sha256": "sha256:7a6dab8dcc980bc0535c2571942e0674fe96eba7c3053b6c97460ea2c8807c97"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"id": "dsp/core/registry.cpp",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
{
|
|
96
96
|
"id": "dsp/include/effetune/kernel.h",
|
|
97
97
|
"kind": "file",
|
|
98
|
-
"sha256": "sha256:
|
|
98
|
+
"sha256": "sha256:077893c235793dd2a250404672bbee43f18e91fd0e24753b96fddc846dc853ff"
|
|
99
99
|
},
|
|
100
100
|
{
|
|
101
101
|
"id": "dsp/include/effetune/telemetry.h",
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
{
|
|
116
116
|
"id": "dsp/plugins/lofi/g726_adpcm_simulator/params.json",
|
|
117
117
|
"kind": "file",
|
|
118
|
-
"sha256": "sha256:
|
|
118
|
+
"sha256": "sha256:128c5eb52ac4eecd786065ecc778005a88fef91fb8fb7ea49e74028415f2b5dc"
|
|
119
119
|
},
|
|
120
120
|
{
|
|
121
121
|
"id": "dsp/registry.inc#G726ADPCMSimulatorPlugin-entry",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
{
|
|
161
161
|
"id": "tools/dsp-parity/runners.mjs",
|
|
162
162
|
"kind": "file",
|
|
163
|
-
"sha256": "sha256:
|
|
163
|
+
"sha256": "sha256:cd67baecc50e260dddedb992f50de963caecf9ec7c6fc76bbf415b3fd4b478ec"
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
"id": "tools/dsp-parity/stimuli.mjs",
|
|
@@ -454,7 +454,7 @@
|
|
|
454
454
|
},
|
|
455
455
|
{
|
|
456
456
|
"name": "MultiChannelPanelPlugin",
|
|
457
|
-
"hash":
|
|
457
|
+
"hash": 2638026937,
|
|
458
458
|
"byteCapacity": 0,
|
|
459
459
|
"assets": []
|
|
460
460
|
},
|
|
@@ -622,6 +622,19 @@
|
|
|
622
622
|
}
|
|
623
623
|
]
|
|
624
624
|
},
|
|
625
|
+
{
|
|
626
|
+
"name": "GroupDelayPEQPlugin",
|
|
627
|
+
"hash": 2941825417,
|
|
628
|
+
"byteCapacity": 0,
|
|
629
|
+
"assets": [
|
|
630
|
+
{
|
|
631
|
+
"slot": 0,
|
|
632
|
+
"format": "ET_ASSET_F32_MULTICH",
|
|
633
|
+
"capacity": "32 MiB convolution cap",
|
|
634
|
+
"byteCapacity": 33554432
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
},
|
|
625
638
|
{
|
|
626
639
|
"name": "HiPassFilterPlugin",
|
|
627
640
|
"hash": 299011831,
|
|
@@ -731,6 +744,12 @@
|
|
|
731
744
|
"byteCapacity": 0,
|
|
732
745
|
"assets": []
|
|
733
746
|
},
|
|
747
|
+
{
|
|
748
|
+
"name": "MDSimulatorPlugin",
|
|
749
|
+
"hash": 2124600068,
|
|
750
|
+
"byteCapacity": 0,
|
|
751
|
+
"assets": []
|
|
752
|
+
},
|
|
734
753
|
{
|
|
735
754
|
"name": "MP3CodecSimulatorPlugin",
|
|
736
755
|
"hash": 3523139611,
|
|
@@ -968,7 +987,7 @@
|
|
|
968
987
|
},
|
|
969
988
|
{
|
|
970
989
|
"name": "PhaseSelectEqPlugin",
|
|
971
|
-
"hash":
|
|
990
|
+
"hash": 1371985786,
|
|
972
991
|
"byteCapacity": 0,
|
|
973
992
|
"assets": []
|
|
974
993
|
},
|
|
@@ -980,7 +999,7 @@
|
|
|
980
999
|
}
|
|
981
1000
|
],
|
|
982
1001
|
"sizes": {
|
|
983
|
-
"baseline":
|
|
984
|
-
"simd":
|
|
1002
|
+
"baseline": 1170211,
|
|
1003
|
+
"simd": 1291175
|
|
985
1004
|
}
|
|
986
1005
|
}
|
|
Binary file
|
|
Binary file
|
package/dist/assets.js
CHANGED
|
@@ -138,11 +138,11 @@ function inferEta1Format(bytes, reference) {
|
|
|
138
138
|
const topology = header.getUint32(16, true);
|
|
139
139
|
const pathCount = header.getUint32(20, true);
|
|
140
140
|
if (header.getUint32(0, true) !== 0x31415445 ||
|
|
141
|
-
channels < 1 || channels >
|
|
141
|
+
channels < 1 || channels > 16 ||
|
|
142
142
|
frames < 1 || frames > 8388600 ||
|
|
143
143
|
sampleRate < 1 ||
|
|
144
144
|
topology > IR_ASSET_TOPOLOGY.matrix ||
|
|
145
|
-
pathCount >
|
|
145
|
+
pathCount > 16 ||
|
|
146
146
|
header.getUint32(24, true) !== 0 ||
|
|
147
147
|
header.getUint32(28, true) !== 0) {
|
|
148
148
|
throw new AssetError(`Asset ${reference} has an invalid ETA1 header.`);
|
|
@@ -232,8 +232,8 @@ async function resolverResult(resolver, reference, descriptor, effectId) {
|
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
function validatePaths(paths, channels) {
|
|
235
|
-
if (!Array.isArray(paths) || paths.length < 1 || paths.length >
|
|
236
|
-
throw new AssetError('Matrix impulse responses require between 1 and
|
|
235
|
+
if (!Array.isArray(paths) || paths.length < 1 || paths.length > 16) {
|
|
236
|
+
throw new AssetError('Matrix impulse responses require between 1 and 16 paths.');
|
|
237
237
|
}
|
|
238
238
|
const normalized = paths.map(path => {
|
|
239
239
|
if (!isRecord(path) ||
|
|
@@ -247,8 +247,8 @@ function validatePaths(paths, channels) {
|
|
|
247
247
|
const outputSlot = path?.outputSlot;
|
|
248
248
|
const irChannel = path?.irChannel;
|
|
249
249
|
if (![inputSlot, outputSlot, irChannel].every(Number.isSafeInteger) ||
|
|
250
|
-
inputSlot < 0 || inputSlot >
|
|
251
|
-
outputSlot < 0 || outputSlot >
|
|
250
|
+
inputSlot < 0 || inputSlot > 15 ||
|
|
251
|
+
outputSlot < 0 || outputSlot > 15 ||
|
|
252
252
|
irChannel < 0 || irChannel >= channels) {
|
|
253
253
|
throw new AssetError('Matrix impulse-response paths contain an invalid channel or slot.');
|
|
254
254
|
}
|
|
@@ -288,8 +288,8 @@ export function encodeEta1(options) {
|
|
|
288
288
|
throw new AssetError('ETA1 encoding options must be an object.');
|
|
289
289
|
}
|
|
290
290
|
const { channels, sampleRate, topology = 'unspecified', paths } = options;
|
|
291
|
-
if (!Array.isArray(channels) || channels.length < 1 || channels.length >
|
|
292
|
-
throw new AssetError('ETA1 channels must contain between 1 and
|
|
291
|
+
if (!Array.isArray(channels) || channels.length < 1 || channels.length > 16) {
|
|
292
|
+
throw new AssetError('ETA1 channels must contain between 1 and 16 Float32Array values.');
|
|
293
293
|
}
|
|
294
294
|
const frames = channels[0] instanceof Float32Array ? channels[0].length : 0;
|
|
295
295
|
if (frames < 1) {
|
|
@@ -345,7 +345,7 @@ function normalizeFormatMetadata(format, byteLength, reference, options = {}) {
|
|
|
345
345
|
throw new AssetError(`Asset ${reference} must use the ETA1 planar little-endian float32 format.`);
|
|
346
346
|
}
|
|
347
347
|
const { channels, frames, sampleRate } = format;
|
|
348
|
-
if (!Number.isInteger(channels) || channels < 1 || channels >
|
|
348
|
+
if (!Number.isInteger(channels) || channels < 1 || channels > 16 ||
|
|
349
349
|
!Number.isInteger(frames) || frames < 1 || frames > 8388600 ||
|
|
350
350
|
!Number.isInteger(sampleRate) || sampleRate < 1 || sampleRate > 0xffffffff) {
|
|
351
351
|
throw new AssetError(`Asset ${reference} has invalid channel, frame, or sample-rate metadata.`);
|
|
@@ -679,11 +679,11 @@ function prepareFirFilterAsset(effect, resolvedAssets, {
|
|
|
679
679
|
let inputCount;
|
|
680
680
|
if (effect.type === 'FIRCrossover') {
|
|
681
681
|
const bandCount = effect.parameters.bandCount;
|
|
682
|
-
if (
|
|
682
|
+
if ((processingChannels < 4 || processingChannels > 16 || processingChannels % 2 !== 0) ||
|
|
683
683
|
bandCount * 2 > processingChannels ||
|
|
684
684
|
asset.format.channels !== bandCount) {
|
|
685
685
|
throw new AssetError(
|
|
686
|
-
`${effect.id} requires
|
|
686
|
+
`${effect.id} requires an even number of processing channels from 4 to 16 and one filter channel per band.`
|
|
687
687
|
);
|
|
688
688
|
}
|
|
689
689
|
topology = IR_ASSET_TOPOLOGY.matrix;
|
|
@@ -705,6 +705,29 @@ function prepareFirFilterAsset(effect, resolvedAssets, {
|
|
|
705
705
|
path.irChannel !== paths[index].irChannel))) {
|
|
706
706
|
throw new AssetError(`${effect.id} filter paths do not match its band layout.`);
|
|
707
707
|
}
|
|
708
|
+
} else if (effect.type === 'RoomEQ') {
|
|
709
|
+
const explicitTopology = asset.format.topology;
|
|
710
|
+
if (explicitTopology === IR_ASSET_TOPOLOGY.mono ||
|
|
711
|
+
(explicitTopology === IR_ASSET_TOPOLOGY.unspecified && asset.format.channels === 1)) {
|
|
712
|
+
topology = IR_ASSET_TOPOLOGY.mono;
|
|
713
|
+
} else if (explicitTopology === IR_ASSET_TOPOLOGY.independent ||
|
|
714
|
+
(explicitTopology === IR_ASSET_TOPOLOGY.unspecified &&
|
|
715
|
+
asset.format.channels === processingChannels)) {
|
|
716
|
+
topology = IR_ASSET_TOPOLOGY.independent;
|
|
717
|
+
} else {
|
|
718
|
+
throw new AssetError(
|
|
719
|
+
`${effect.id} requires either one shared filter channel or one filter channel per processing channel.`
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
assetChannels = asset.format.channels;
|
|
723
|
+
paths = [];
|
|
724
|
+
inputCount = 0;
|
|
725
|
+
if ((topology === IR_ASSET_TOPOLOGY.mono && assetChannels !== 1) ||
|
|
726
|
+
(topology === IR_ASSET_TOPOLOGY.independent && assetChannels !== processingChannels)) {
|
|
727
|
+
throw new AssetError(
|
|
728
|
+
`${effect.id} requires either one shared filter channel or one filter channel per processing channel.`
|
|
729
|
+
);
|
|
730
|
+
}
|
|
708
731
|
} else {
|
|
709
732
|
topology = IR_ASSET_TOPOLOGY.mono;
|
|
710
733
|
assetChannels = 1;
|
|
@@ -13,9 +13,21 @@
|
|
|
13
13
|
"6",
|
|
14
14
|
"7",
|
|
15
15
|
"8",
|
|
16
|
+
"9",
|
|
17
|
+
"10",
|
|
18
|
+
"11",
|
|
19
|
+
"12",
|
|
20
|
+
"13",
|
|
21
|
+
"14",
|
|
22
|
+
"15",
|
|
23
|
+
"16",
|
|
16
24
|
"34",
|
|
17
25
|
"56",
|
|
18
|
-
"78"
|
|
26
|
+
"78",
|
|
27
|
+
"910",
|
|
28
|
+
"1112",
|
|
29
|
+
"1314",
|
|
30
|
+
"1516"
|
|
19
31
|
],
|
|
20
32
|
"effects": [
|
|
21
33
|
{
|
|
@@ -340,7 +352,7 @@
|
|
|
340
352
|
"count": 1,
|
|
341
353
|
"default": "0011",
|
|
342
354
|
"maximumLength": 3072,
|
|
343
|
-
"pattern": "^(?:p?[0-
|
|
355
|
+
"pattern": "^(?:p?[0-9a-f][0-9a-f])*$"
|
|
344
356
|
}
|
|
345
357
|
],
|
|
346
358
|
"seeded": false,
|
|
@@ -356,8 +368,16 @@
|
|
|
356
368
|
{
|
|
357
369
|
"name": "mute",
|
|
358
370
|
"type": "boolean",
|
|
359
|
-
"count":
|
|
371
|
+
"count": 16,
|
|
360
372
|
"default": [
|
|
373
|
+
false,
|
|
374
|
+
false,
|
|
375
|
+
false,
|
|
376
|
+
false,
|
|
377
|
+
false,
|
|
378
|
+
false,
|
|
379
|
+
false,
|
|
380
|
+
false,
|
|
361
381
|
false,
|
|
362
382
|
false,
|
|
363
383
|
false,
|
|
@@ -371,8 +391,16 @@
|
|
|
371
391
|
{
|
|
372
392
|
"name": "solo",
|
|
373
393
|
"type": "boolean",
|
|
374
|
-
"count":
|
|
394
|
+
"count": 16,
|
|
375
395
|
"default": [
|
|
396
|
+
false,
|
|
397
|
+
false,
|
|
398
|
+
false,
|
|
399
|
+
false,
|
|
400
|
+
false,
|
|
401
|
+
false,
|
|
402
|
+
false,
|
|
403
|
+
false,
|
|
376
404
|
false,
|
|
377
405
|
false,
|
|
378
406
|
false,
|
|
@@ -386,8 +414,16 @@
|
|
|
386
414
|
{
|
|
387
415
|
"name": "volume",
|
|
388
416
|
"type": "number",
|
|
389
|
-
"count":
|
|
417
|
+
"count": 16,
|
|
390
418
|
"default": [
|
|
419
|
+
0,
|
|
420
|
+
0,
|
|
421
|
+
0,
|
|
422
|
+
0,
|
|
423
|
+
0,
|
|
424
|
+
0,
|
|
425
|
+
0,
|
|
426
|
+
0,
|
|
391
427
|
0,
|
|
392
428
|
0,
|
|
393
429
|
0,
|
|
@@ -404,8 +440,16 @@
|
|
|
404
440
|
{
|
|
405
441
|
"name": "delay",
|
|
406
442
|
"type": "number",
|
|
407
|
-
"count":
|
|
443
|
+
"count": 16,
|
|
408
444
|
"default": [
|
|
445
|
+
0,
|
|
446
|
+
0,
|
|
447
|
+
0,
|
|
448
|
+
0,
|
|
449
|
+
0,
|
|
450
|
+
0,
|
|
451
|
+
0,
|
|
452
|
+
0,
|
|
409
453
|
0,
|
|
410
454
|
0,
|
|
411
455
|
0,
|
|
@@ -422,8 +466,16 @@
|
|
|
422
466
|
{
|
|
423
467
|
"name": "link",
|
|
424
468
|
"type": "boolean",
|
|
425
|
-
"count":
|
|
469
|
+
"count": 15,
|
|
426
470
|
"default": [
|
|
471
|
+
false,
|
|
472
|
+
false,
|
|
473
|
+
false,
|
|
474
|
+
false,
|
|
475
|
+
false,
|
|
476
|
+
false,
|
|
477
|
+
false,
|
|
478
|
+
false,
|
|
427
479
|
false,
|
|
428
480
|
false,
|
|
429
481
|
false,
|
|
@@ -2217,6 +2269,49 @@
|
|
|
2217
2269
|
}
|
|
2218
2270
|
]
|
|
2219
2271
|
},
|
|
2272
|
+
{
|
|
2273
|
+
"type": "GroupDelayPEQ",
|
|
2274
|
+
"parameters": [
|
|
2275
|
+
{
|
|
2276
|
+
"name": "latencyMode",
|
|
2277
|
+
"type": "string",
|
|
2278
|
+
"count": 1,
|
|
2279
|
+
"default": "128",
|
|
2280
|
+
"values": [
|
|
2281
|
+
"0",
|
|
2282
|
+
"128",
|
|
2283
|
+
"256",
|
|
2284
|
+
"512",
|
|
2285
|
+
"1024"
|
|
2286
|
+
]
|
|
2287
|
+
},
|
|
2288
|
+
{
|
|
2289
|
+
"name": "filterDelaySamples",
|
|
2290
|
+
"type": "integer",
|
|
2291
|
+
"count": 1,
|
|
2292
|
+
"default": 8192,
|
|
2293
|
+
"minimum": 0,
|
|
2294
|
+
"maximum": 65536
|
|
2295
|
+
}
|
|
2296
|
+
],
|
|
2297
|
+
"seeded": true,
|
|
2298
|
+
"telemetry": [],
|
|
2299
|
+
"latency": {
|
|
2300
|
+
"kind": "dynamic",
|
|
2301
|
+
"dependsOn": [
|
|
2302
|
+
"latencyMode",
|
|
2303
|
+
"filterDelaySamples",
|
|
2304
|
+
"impulseResponse"
|
|
2305
|
+
]
|
|
2306
|
+
},
|
|
2307
|
+
"assets": [
|
|
2308
|
+
{
|
|
2309
|
+
"name": "impulseResponse",
|
|
2310
|
+
"kind": "impulseResponse",
|
|
2311
|
+
"required": true
|
|
2312
|
+
}
|
|
2313
|
+
]
|
|
2314
|
+
},
|
|
2220
2315
|
{
|
|
2221
2316
|
"type": "HiPassFilter",
|
|
2222
2317
|
"parameters": [
|
|
@@ -3517,6 +3612,59 @@
|
|
|
3517
3612
|
},
|
|
3518
3613
|
"assets": []
|
|
3519
3614
|
},
|
|
3615
|
+
{
|
|
3616
|
+
"type": "MDSimulator",
|
|
3617
|
+
"parameters": [
|
|
3618
|
+
{
|
|
3619
|
+
"name": "mode",
|
|
3620
|
+
"type": "string",
|
|
3621
|
+
"count": 1,
|
|
3622
|
+
"default": "SP (292 kbps)",
|
|
3623
|
+
"values": [
|
|
3624
|
+
"SP (292 kbps)",
|
|
3625
|
+
"LP2 (132 kbps)",
|
|
3626
|
+
"LP4 (66 kbps)"
|
|
3627
|
+
]
|
|
3628
|
+
},
|
|
3629
|
+
{
|
|
3630
|
+
"name": "outputGain",
|
|
3631
|
+
"type": "number",
|
|
3632
|
+
"count": 1,
|
|
3633
|
+
"default": 0,
|
|
3634
|
+
"unit": "dB",
|
|
3635
|
+
"minimum": -24,
|
|
3636
|
+
"maximum": 12
|
|
3637
|
+
},
|
|
3638
|
+
{
|
|
3639
|
+
"name": "mix",
|
|
3640
|
+
"type": "number",
|
|
3641
|
+
"count": 1,
|
|
3642
|
+
"default": 100,
|
|
3643
|
+
"unit": "%",
|
|
3644
|
+
"minimum": 0,
|
|
3645
|
+
"maximum": 100
|
|
3646
|
+
}
|
|
3647
|
+
],
|
|
3648
|
+
"seeded": false,
|
|
3649
|
+
"sampleRates": [
|
|
3650
|
+
44100,
|
|
3651
|
+
48000,
|
|
3652
|
+
88200,
|
|
3653
|
+
96000,
|
|
3654
|
+
176400,
|
|
3655
|
+
192000,
|
|
3656
|
+
352800,
|
|
3657
|
+
384000
|
|
3658
|
+
],
|
|
3659
|
+
"telemetry": [],
|
|
3660
|
+
"latency": {
|
|
3661
|
+
"kind": "sampleRateDependent",
|
|
3662
|
+
"dependsOn": [
|
|
3663
|
+
"sampleRate"
|
|
3664
|
+
]
|
|
3665
|
+
},
|
|
3666
|
+
"assets": []
|
|
3667
|
+
},
|
|
3520
3668
|
{
|
|
3521
3669
|
"type": "MP3CodecSimulator",
|
|
3522
3670
|
"parameters": [
|
|
@@ -4050,7 +4198,7 @@
|
|
|
4050
4198
|
"name": "noiseProfile",
|
|
4051
4199
|
"type": "number",
|
|
4052
4200
|
"count": 1,
|
|
4053
|
-
"default":
|
|
4201
|
+
"default": 10,
|
|
4054
4202
|
"minimum": 0,
|
|
4055
4203
|
"maximum": 10
|
|
4056
4204
|
},
|
|
@@ -5268,7 +5416,7 @@
|
|
|
5268
5416
|
"name": "waveguideGain",
|
|
5269
5417
|
"type": "number",
|
|
5270
5418
|
"count": 1,
|
|
5271
|
-
"default":
|
|
5419
|
+
"default": 26,
|
|
5272
5420
|
"unit": "dB",
|
|
5273
5421
|
"minimum": -36,
|
|
5274
5422
|
"maximum": 36
|
|
@@ -5350,7 +5498,7 @@
|
|
|
5350
5498
|
"name": "waveguideGain",
|
|
5351
5499
|
"type": "number",
|
|
5352
5500
|
"count": 1,
|
|
5353
|
-
"default":
|
|
5501
|
+
"default": 26,
|
|
5354
5502
|
"unit": "dB",
|
|
5355
5503
|
"minimum": -36,
|
|
5356
5504
|
"maximum": 36
|
|
@@ -5877,7 +6025,7 @@
|
|
|
5877
6025
|
"maximum": 100
|
|
5878
6026
|
}
|
|
5879
6027
|
],
|
|
5880
|
-
"seeded":
|
|
6028
|
+
"seeded": false,
|
|
5881
6029
|
"telemetry": [],
|
|
5882
6030
|
"latency": {
|
|
5883
6031
|
"kind": "zero"
|
|
@@ -6865,6 +7013,78 @@
|
|
|
6865
7013
|
"unit": "%",
|
|
6866
7014
|
"minimum": 0,
|
|
6867
7015
|
"maximum": 200
|
|
7016
|
+
},
|
|
7017
|
+
{
|
|
7018
|
+
"name": "regionSolo",
|
|
7019
|
+
"type": "boolean",
|
|
7020
|
+
"count": 5,
|
|
7021
|
+
"default": [
|
|
7022
|
+
false,
|
|
7023
|
+
false,
|
|
7024
|
+
false,
|
|
7025
|
+
false,
|
|
7026
|
+
false
|
|
7027
|
+
]
|
|
7028
|
+
},
|
|
7029
|
+
{
|
|
7030
|
+
"name": "outerBalanceLow",
|
|
7031
|
+
"type": "number",
|
|
7032
|
+
"count": 5,
|
|
7033
|
+
"default": [
|
|
7034
|
+
-100,
|
|
7035
|
+
-100,
|
|
7036
|
+
-100,
|
|
7037
|
+
-100,
|
|
7038
|
+
-100
|
|
7039
|
+
],
|
|
7040
|
+
"unit": "%",
|
|
7041
|
+
"minimum": -100,
|
|
7042
|
+
"maximum": 100
|
|
7043
|
+
},
|
|
7044
|
+
{
|
|
7045
|
+
"name": "coreBalanceLow",
|
|
7046
|
+
"type": "number",
|
|
7047
|
+
"count": 5,
|
|
7048
|
+
"default": [
|
|
7049
|
+
-100,
|
|
7050
|
+
-100,
|
|
7051
|
+
-100,
|
|
7052
|
+
-100,
|
|
7053
|
+
-100
|
|
7054
|
+
],
|
|
7055
|
+
"unit": "%",
|
|
7056
|
+
"minimum": -100,
|
|
7057
|
+
"maximum": 100
|
|
7058
|
+
},
|
|
7059
|
+
{
|
|
7060
|
+
"name": "coreBalanceHigh",
|
|
7061
|
+
"type": "number",
|
|
7062
|
+
"count": 5,
|
|
7063
|
+
"default": [
|
|
7064
|
+
100,
|
|
7065
|
+
100,
|
|
7066
|
+
100,
|
|
7067
|
+
100,
|
|
7068
|
+
100
|
|
7069
|
+
],
|
|
7070
|
+
"unit": "%",
|
|
7071
|
+
"minimum": -100,
|
|
7072
|
+
"maximum": 100
|
|
7073
|
+
},
|
|
7074
|
+
{
|
|
7075
|
+
"name": "outerBalanceHigh",
|
|
7076
|
+
"type": "number",
|
|
7077
|
+
"count": 5,
|
|
7078
|
+
"default": [
|
|
7079
|
+
100,
|
|
7080
|
+
100,
|
|
7081
|
+
100,
|
|
7082
|
+
100,
|
|
7083
|
+
100
|
|
7084
|
+
],
|
|
7085
|
+
"unit": "%",
|
|
7086
|
+
"minimum": -100,
|
|
7087
|
+
"maximum": 100
|
|
6868
7088
|
}
|
|
6869
7089
|
],
|
|
6870
7090
|
"seeded": false,
|
|
@@ -6899,7 +7119,7 @@
|
|
|
6899
7119
|
}
|
|
6900
7120
|
],
|
|
6901
7121
|
"contractDigests": {
|
|
6902
|
-
"publicCatalogSha256": "
|
|
6903
|
-
"privateLayoutSha256": "
|
|
7122
|
+
"publicCatalogSha256": "0f8926c820f825d87f212d7c7fbfa75044caf7aa912bef6a78cc85f820b899c0",
|
|
7123
|
+
"privateLayoutSha256": "61121eb6aec4b52d5492795c2ac81bd4cecfa119b7bfc4e6956fd2b725690685"
|
|
6904
7124
|
}
|
|
6905
7125
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const DENORMAL_NOISE_AMPLITUDE = 1e-19;
|
|
2
|
+
|
|
3
|
+
export function addDenormalNoise(audio, channelCount, frameCount, frameOrigin) {
|
|
4
|
+
const first = (frameOrigin & 1) === 0
|
|
5
|
+
? DENORMAL_NOISE_AMPLITUDE
|
|
6
|
+
: -DENORMAL_NOISE_AMPLITUDE;
|
|
7
|
+
for (let channel = 0; channel < channelCount; channel++) {
|
|
8
|
+
const offset = channel * frameCount;
|
|
9
|
+
let noise = first;
|
|
10
|
+
for (let frame = 0; frame < frameCount; frame++) {
|
|
11
|
+
audio[offset + frame] += noise;
|
|
12
|
+
noise = -noise;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|