@carbonenginejs/runtime-resource 0.7.0 → 0.8.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/FORMAT-PROVENANCE.md +155 -144
- package/LICENSE +21 -21
- package/NOTICE +29 -29
- package/README.md +11 -0
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3005 -3005
- package/dist/CjsResManQueue.js +214 -214
- package/dist/CjsResource.js +566 -566
- package/dist/CjsResourceSource.js +59 -59
- package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
- package/dist/format/CjsBlueReader.js +269 -269
- package/dist/format/CjsFormat.js +192 -192
- package/dist/format/CjsReader.js +18 -18
- package/dist/format/CjsResourceProbe.js +277 -277
- package/dist/format/payloadContract.js +173 -173
- package/dist/formats/black/CjsBlackFormat.js +278 -278
- package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
- package/dist/formats/black/core/CjsBlackReader.js +639 -639
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackEnums.js +6 -6
- package/dist/formats/black/core/blackSchema.js +3 -3
- package/dist/formats/black/core/blackVersion.js +22 -22
- package/dist/formats/black/core/helpers.js +182 -182
- package/dist/formats/black/core/schema.js +4 -4
- package/dist/formats/black/index.js +2 -2
- package/dist/formats/bnk/CjsBnkFormat.js +125 -125
- package/dist/formats/bnk/core/graph.js +140 -140
- package/dist/formats/bnk/core/helpers.js +409 -409
- package/dist/formats/bnk/core/musicNodes.js +489 -489
- package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
- package/dist/formats/bnk/index.js +2 -2
- package/dist/formats/cmf/CjsCmfFormat.js +497 -497
- package/dist/formats/cmf/core/binary.js +118 -118
- package/dist/formats/cmf/core/buffers.js +233 -233
- package/dist/formats/cmf/core/constants.js +47 -47
- package/dist/formats/cmf/core/gr2Anim.js +453 -453
- package/dist/formats/cmf/core/helpers.js +287 -287
- package/dist/formats/cmf/core/pack.js +276 -276
- package/dist/formats/cmf/core/schema.js +364 -364
- package/dist/formats/cmf/core/shared.js +268 -268
- package/dist/formats/cmf/core/writer.js +517 -517
- package/dist/formats/cmf/index.js +2 -2
- package/dist/formats/dds/CjsDdsFormat.js +193 -193
- package/dist/formats/dds/core/bc6h.js +288 -0
- package/dist/formats/dds/core/bc6h.js.map +1 -0
- package/dist/formats/dds/core/bc7.js +251 -0
- package/dist/formats/dds/core/bc7.js.map +1 -0
- package/dist/formats/dds/core/helpers.js +815 -812
- package/dist/formats/dds/core/helpers.js.map +1 -1
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/fbx/CjsFbxFormat.js +266 -266
- package/dist/formats/fbx/core/helpers.js +3901 -3901
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +87 -87
- package/dist/formats/flac/core/helpers.js +295 -295
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +87 -87
- package/dist/formats/gif/core/helpers.js +360 -360
- package/dist/formats/gif/index.js +2 -2
- package/dist/formats/gltf/CjsGltfFormat.js +290 -290
- package/dist/formats/gltf/core/helpers.js +292 -292
- package/dist/formats/gltf/core/json.js +79 -79
- package/dist/formats/gltf/core/parser.js +666 -666
- package/dist/formats/gltf/core/targets.js +163 -163
- package/dist/formats/gltf/index.js +2 -2
- package/dist/formats/index.js +23 -23
- package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
- package/dist/formats/jpeg/core/helpers.js +350 -350
- package/dist/formats/jpeg/core/jpeg.js +377 -377
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +192 -192
- package/dist/formats/mp3/core/helpers.js +338 -338
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +191 -191
- package/dist/formats/mp4/core/helpers.js +449 -449
- package/dist/formats/mp4/index.js +2 -2
- package/dist/formats/obj/CjsObjFormat.js +253 -253
- package/dist/formats/obj/core/helpers.js +573 -573
- package/dist/formats/obj/core/json.js +64 -64
- package/dist/formats/obj/core/parser.js +321 -321
- package/dist/formats/obj/index.js +2 -2
- package/dist/formats/ogg/CjsOggFormat.js +88 -88
- package/dist/formats/ogg/core/helpers.js +387 -387
- package/dist/formats/ogg/core/imdct.js +178 -178
- package/dist/formats/ogg/core/vorbis.js +999 -999
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/png/CjsPngFormat.js +195 -195
- package/dist/formats/png/core/helpers.js +583 -583
- package/dist/formats/png/index.js +2 -2
- package/dist/formats/red/CjsRedFormat.js +261 -261
- package/dist/formats/red/core/CjsRedReader.js +194 -194
- package/dist/formats/red/core/blackDefinitions.js +3 -3
- package/dist/formats/red/core/helpers.js +139 -139
- package/dist/formats/red/core/redGraph.js +68 -68
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +365 -365
- package/dist/formats/stl/core/helpers.js +261 -261
- package/dist/formats/stl/core/json.js +51 -51
- package/dist/formats/stl/core/stl.js +629 -629
- package/dist/formats/stl/core/targets.js +163 -163
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +192 -192
- package/dist/formats/tga/core/helpers.js +446 -446
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +192 -192
- package/dist/formats/wav/core/helpers.js +328 -328
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +191 -191
- package/dist/formats/webm/core/helpers.js +537 -537
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +86 -86
- package/dist/formats/webp/core/helpers.js +214 -214
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +241 -241
- package/dist/formats/wem/core/bitStream.js +259 -259
- package/dist/formats/wem/core/codebookLibrary.js +164 -164
- package/dist/formats/wem/core/helpers.js +417 -417
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
- package/dist/formats/wem/core/ptadpcm.js +77 -77
- package/dist/formats/wem/core/resolve.js +121 -121
- package/dist/formats/wem/core/wemToOgg.js +485 -485
- package/dist/formats/wem/index.js +2 -2
- package/dist/formats/yaml/CjsYamlFormat.js +83 -83
- package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
- package/dist/formats/yaml/core/helpers.js +160 -160
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +48 -48
- package/dist/resourcePath.js +18 -18
- package/dist/resourceStates.js +9 -9
- package/dist/resources/AudioGeometryResData.js +47 -47
- package/dist/resources/GStateBindingCallbackData.js +31 -31
- package/dist/resources/MeshDecalData.js +37 -37
- package/dist/resources/MeshDecalLodData.js +34 -34
- package/dist/resources/Tr2EffectRes.js +71 -71
- package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
- package/dist/resources/Tr2GrannyStateRes.js +44 -44
- package/dist/resources/Tr2ImageRes.js +114 -114
- package/dist/resources/Tr2LightProfileRes.js +40 -40
- package/dist/resources/Tr2MaterialArea.js +34 -34
- package/dist/resources/Tr2MaterialMesh.js +31 -31
- package/dist/resources/Tr2MaterialRes.js +34 -34
- package/dist/resources/Tr2ShaderPermutation.js +43 -43
- package/dist/resources/Tr2TextureLodManager.js +80 -80
- package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
- package/dist/resources/Tr2TexturePackChannel.js +37 -37
- package/dist/resources/Tr2TexturePipeline.js +52 -52
- package/dist/resources/Tr2TexturePipelineParams.js +34 -34
- package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
- package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
- package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
- package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
- package/dist/resources/TriGeometryRes.js +239 -216
- package/dist/resources/TriGeometryRes.js.map +1 -1
- package/dist/resources/TriGeometryResAreaData.js +59 -59
- package/dist/resources/TriGeometryResJointData.js +38 -38
- package/dist/resources/TriGeometryResLodData.js +88 -88
- package/dist/resources/TriGeometryResMeshData.js +63 -63
- package/dist/resources/TriGeometryResSkeletonData.js +34 -34
- package/dist/resources/TriGrannyRes.js +43 -43
- package/dist/resources/TriJointBinding.js +38 -38
- package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
- package/dist/resources/TriRtGeometryConstants.js +88 -88
- package/dist/resources/TriTextureRes.js +304 -304
- package/dist/resources/enums.js +18 -18
- package/dist/resources/resourceBoundary.js +47 -47
- package/dist/resources/texturePipelineBehavior.js +308 -308
- package/dist/texture/CjsTextureArrayRes.js +406 -406
- package/dist/texture/CjsTextureParameterProxy.js +133 -133
- package/format-notices/black/LICENSE +21 -21
- package/format-notices/black/NOTICE +47 -47
- package/format-notices/bnk/LICENSE +21 -21
- package/format-notices/bnk/NOTICE +20 -20
- package/format-notices/cmf/LICENSE +21 -21
- package/format-notices/cmf/NOTICE +36 -36
- package/format-notices/dds/LICENSE +21 -21
- package/format-notices/dds/NOTICE +14 -14
- package/format-notices/fbx/LICENSE +21 -21
- package/format-notices/fbx/NOTICE +14 -14
- package/format-notices/flac/LICENSE +21 -21
- package/format-notices/flac/NOTICE +14 -14
- package/format-notices/gif/LICENSE +21 -21
- package/format-notices/gif/NOTICE +14 -14
- package/format-notices/gltf/LICENSE +21 -21
- package/format-notices/gltf/NOTICE +27 -27
- package/format-notices/jpeg/LICENSE +21 -21
- package/format-notices/jpeg/NOTICE +14 -14
- package/format-notices/mp3/LICENSE +21 -21
- package/format-notices/mp3/NOTICE +14 -14
- package/format-notices/mp4/LICENSE +21 -21
- package/format-notices/mp4/NOTICE +14 -14
- package/format-notices/obj/LICENSE +21 -21
- package/format-notices/obj/NOTICE +26 -26
- package/format-notices/ogg/LICENSE +21 -21
- package/format-notices/ogg/NOTICE +28 -28
- package/format-notices/png/LICENSE +21 -21
- package/format-notices/png/NOTICE +14 -14
- package/format-notices/red/LICENSE +21 -21
- package/format-notices/red/NOTICE +31 -31
- package/format-notices/stl/LICENSE +21 -21
- package/format-notices/stl/NOTICE +21 -21
- package/format-notices/tga/LICENSE +21 -21
- package/format-notices/tga/NOTICE +14 -14
- package/format-notices/wav/LICENSE +21 -21
- package/format-notices/wav/NOTICE +14 -14
- package/format-notices/webm/LICENSE +21 -21
- package/format-notices/webm/NOTICE +14 -14
- package/format-notices/webp/LICENSE +21 -21
- package/format-notices/webp/NOTICE +14 -14
- package/format-notices/wem/LICENSE +57 -57
- package/format-notices/wem/NOTICE +33 -33
- package/format-notices/yaml/LICENSE +21 -21
- package/format-notices/yaml/NOTICE +44 -44
- package/package.json +2 -2
- package/resource-lifecycle.md +679 -679
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fast IMDCT for Vorbis synthesis.
|
|
3
|
-
*
|
|
4
|
-
* The IMDCT is computed as a DCT-IV of half the block size followed by the
|
|
5
|
-
* standard three-segment rearrangement; the DCT-IV itself runs on a complex
|
|
6
|
-
* FFT of a quarter block with pre/post twiddles. The factorization was
|
|
7
|
-
* derived analytically and is verified against the naive transforms to float
|
|
8
|
-
* precision in the test suite.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const tableCache = new Map();
|
|
12
|
-
function getTables(m) {
|
|
13
|
-
let tables = tableCache.get(m);
|
|
14
|
-
if (tables) return tables;
|
|
15
|
-
const h = m >> 1;
|
|
16
|
-
const preCos = new Float32Array(h);
|
|
17
|
-
const preSin = new Float32Array(h);
|
|
18
|
-
const postCos = new Float32Array(h);
|
|
19
|
-
const postSin = new Float32Array(h);
|
|
20
|
-
for (let i = 0; i < h; i++) {
|
|
21
|
-
const pre = Math.PI * i / m;
|
|
22
|
-
preCos[i] = Math.cos(pre);
|
|
23
|
-
preSin[i] = Math.sin(pre);
|
|
24
|
-
const post = Math.PI * (4 * i + 1) / (4 * m);
|
|
25
|
-
postCos[i] = Math.cos(post);
|
|
26
|
-
postSin[i] = Math.sin(post);
|
|
27
|
-
}
|
|
28
|
-
const bitrev = new Uint32Array(h);
|
|
29
|
-
for (let i = 1, j = 0; i < h; i++) {
|
|
30
|
-
let bit = h >> 1;
|
|
31
|
-
for (; j & bit; bit >>= 1) j ^= bit;
|
|
32
|
-
j ^= bit;
|
|
33
|
-
bitrev[i] = j;
|
|
34
|
-
}
|
|
35
|
-
const twiddles = [];
|
|
36
|
-
for (let len = 2; len <= h; len <<= 1) {
|
|
37
|
-
const half = len >> 1;
|
|
38
|
-
const cos = new Float32Array(half);
|
|
39
|
-
const sin = new Float32Array(half);
|
|
40
|
-
for (let j = 0; j < half; j++) {
|
|
41
|
-
const angle = -2 * Math.PI * j / len;
|
|
42
|
-
cos[j] = Math.cos(angle);
|
|
43
|
-
sin[j] = Math.sin(angle);
|
|
44
|
-
}
|
|
45
|
-
twiddles.push({
|
|
46
|
-
len,
|
|
47
|
-
cos,
|
|
48
|
-
sin
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
tables = {
|
|
52
|
-
preCos,
|
|
53
|
-
preSin,
|
|
54
|
-
postCos,
|
|
55
|
-
postSin,
|
|
56
|
-
bitrev,
|
|
57
|
-
twiddles,
|
|
58
|
-
workRe: new Float32Array(h),
|
|
59
|
-
workIm: new Float32Array(h),
|
|
60
|
-
dct: new Float32Array(m)
|
|
61
|
-
};
|
|
62
|
-
tableCache.set(m, tables);
|
|
63
|
-
return tables;
|
|
64
|
-
}
|
|
65
|
-
function fftInPlace(re, im, tables) {
|
|
66
|
-
const n = re.length;
|
|
67
|
-
const bitrev = tables.bitrev;
|
|
68
|
-
for (let i = 1; i < n; i++) {
|
|
69
|
-
const j = bitrev[i];
|
|
70
|
-
if (i < j) {
|
|
71
|
-
const tr = re[i];
|
|
72
|
-
re[i] = re[j];
|
|
73
|
-
re[j] = tr;
|
|
74
|
-
const ti = im[i];
|
|
75
|
-
im[i] = im[j];
|
|
76
|
-
im[j] = ti;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
for (const {
|
|
80
|
-
len,
|
|
81
|
-
cos,
|
|
82
|
-
sin
|
|
83
|
-
} of tables.twiddles) {
|
|
84
|
-
const half = len >> 1;
|
|
85
|
-
for (let i = 0; i < n; i += len) {
|
|
86
|
-
for (let j = 0; j < half; j++) {
|
|
87
|
-
const wr = cos[j];
|
|
88
|
-
const wi = sin[j];
|
|
89
|
-
const a = i + j;
|
|
90
|
-
const b = a + half;
|
|
91
|
-
const vr = re[b] * wr - im[b] * wi;
|
|
92
|
-
const vi = re[b] * wi + im[b] * wr;
|
|
93
|
-
re[b] = re[a] - vr;
|
|
94
|
-
im[b] = im[a] - vi;
|
|
95
|
-
re[a] += vr;
|
|
96
|
-
im[a] += vi;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* In-place unnormalized DCT-IV of `input` (length must be a power of two ≥ 4)
|
|
104
|
-
* into `output`.
|
|
105
|
-
*
|
|
106
|
-
* @param {Float32Array} input Input samples (not modified).
|
|
107
|
-
* @param {Float32Array} output Output buffer of the same length.
|
|
108
|
-
*/
|
|
109
|
-
function dctIv(input, output) {
|
|
110
|
-
const m = input.length;
|
|
111
|
-
const h = m >> 1;
|
|
112
|
-
const tables = getTables(m);
|
|
113
|
-
const {
|
|
114
|
-
preCos,
|
|
115
|
-
preSin,
|
|
116
|
-
postCos,
|
|
117
|
-
postSin,
|
|
118
|
-
workRe,
|
|
119
|
-
workIm
|
|
120
|
-
} = tables;
|
|
121
|
-
for (let i = 0; i < h; i++) {
|
|
122
|
-
const xr = input[2 * i];
|
|
123
|
-
const xi = input[m - 1 - 2 * i];
|
|
124
|
-
workRe[i] = xr * preCos[i] + xi * preSin[i];
|
|
125
|
-
workIm[i] = xi * preCos[i] - xr * preSin[i];
|
|
126
|
-
}
|
|
127
|
-
fftInPlace(workRe, workIm, tables);
|
|
128
|
-
for (let k = 0; k < h; k++) {
|
|
129
|
-
const wr = workRe[k] * postCos[k] + workIm[k] * postSin[k];
|
|
130
|
-
const wi = workIm[k] * postCos[k] - workRe[k] * postSin[k];
|
|
131
|
-
output[2 * k] = wr;
|
|
132
|
-
output[m - 1 - 2 * k] = -wi;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* IMDCT: `spectrum` (n/2 coefficients) to `output` (n samples).
|
|
138
|
-
*
|
|
139
|
-
* Matches y[i] = Σ x[j]·cos(π/(2n)·(2i+1+n/2)·(2j+1)).
|
|
140
|
-
*
|
|
141
|
-
* @param {Float32Array} spectrum Input coefficients (length n/2, not modified).
|
|
142
|
-
* @param {Float32Array} output Output buffer (length n).
|
|
143
|
-
* @param {number} n Block size (power of two).
|
|
144
|
-
*/
|
|
145
|
-
function imdct(spectrum, output, n) {
|
|
146
|
-
const n2 = n >> 1;
|
|
147
|
-
const n4 = n >> 2;
|
|
148
|
-
const n34 = n - n4;
|
|
149
|
-
const tables = getTables(n2);
|
|
150
|
-
const t = tables.dct;
|
|
151
|
-
dctIv(spectrum, t);
|
|
152
|
-
for (let i = 0; i < n4; i++) output[i] = t[i + n4];
|
|
153
|
-
for (let i = n4; i < n34; i++) output[i] = -t[n34 - i - 1];
|
|
154
|
-
for (let i = n34; i < n; i++) output[i] = -t[i - n34];
|
|
155
|
-
}
|
|
156
|
-
const windowCache = new Map();
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* The Vorbis synthesis window slope of `length` samples:
|
|
160
|
-
* sin(π/2 · sin²(π·(i+0.5)/(2·length))).
|
|
161
|
-
*
|
|
162
|
-
* @param {number} length Slope length in samples.
|
|
163
|
-
* @returns {Float32Array} Cached window slope values.
|
|
164
|
-
*/
|
|
165
|
-
function vorbisWindowSlope(length) {
|
|
166
|
-
let slope = windowCache.get(length);
|
|
167
|
-
if (slope) return slope;
|
|
168
|
-
slope = new Float32Array(length);
|
|
169
|
-
for (let i = 0; i < length; i++) {
|
|
170
|
-
const s = Math.sin(Math.PI * (i + 0.5) / (2 * length));
|
|
171
|
-
slope[i] = Math.sin(Math.PI / 2 * s * s);
|
|
172
|
-
}
|
|
173
|
-
windowCache.set(length, slope);
|
|
174
|
-
return slope;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export { dctIv, imdct, vorbisWindowSlope };
|
|
178
|
-
//# sourceMappingURL=imdct.js.map
|
|
1
|
+
/**
|
|
2
|
+
* Fast IMDCT for Vorbis synthesis.
|
|
3
|
+
*
|
|
4
|
+
* The IMDCT is computed as a DCT-IV of half the block size followed by the
|
|
5
|
+
* standard three-segment rearrangement; the DCT-IV itself runs on a complex
|
|
6
|
+
* FFT of a quarter block with pre/post twiddles. The factorization was
|
|
7
|
+
* derived analytically and is verified against the naive transforms to float
|
|
8
|
+
* precision in the test suite.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const tableCache = new Map();
|
|
12
|
+
function getTables(m) {
|
|
13
|
+
let tables = tableCache.get(m);
|
|
14
|
+
if (tables) return tables;
|
|
15
|
+
const h = m >> 1;
|
|
16
|
+
const preCos = new Float32Array(h);
|
|
17
|
+
const preSin = new Float32Array(h);
|
|
18
|
+
const postCos = new Float32Array(h);
|
|
19
|
+
const postSin = new Float32Array(h);
|
|
20
|
+
for (let i = 0; i < h; i++) {
|
|
21
|
+
const pre = Math.PI * i / m;
|
|
22
|
+
preCos[i] = Math.cos(pre);
|
|
23
|
+
preSin[i] = Math.sin(pre);
|
|
24
|
+
const post = Math.PI * (4 * i + 1) / (4 * m);
|
|
25
|
+
postCos[i] = Math.cos(post);
|
|
26
|
+
postSin[i] = Math.sin(post);
|
|
27
|
+
}
|
|
28
|
+
const bitrev = new Uint32Array(h);
|
|
29
|
+
for (let i = 1, j = 0; i < h; i++) {
|
|
30
|
+
let bit = h >> 1;
|
|
31
|
+
for (; j & bit; bit >>= 1) j ^= bit;
|
|
32
|
+
j ^= bit;
|
|
33
|
+
bitrev[i] = j;
|
|
34
|
+
}
|
|
35
|
+
const twiddles = [];
|
|
36
|
+
for (let len = 2; len <= h; len <<= 1) {
|
|
37
|
+
const half = len >> 1;
|
|
38
|
+
const cos = new Float32Array(half);
|
|
39
|
+
const sin = new Float32Array(half);
|
|
40
|
+
for (let j = 0; j < half; j++) {
|
|
41
|
+
const angle = -2 * Math.PI * j / len;
|
|
42
|
+
cos[j] = Math.cos(angle);
|
|
43
|
+
sin[j] = Math.sin(angle);
|
|
44
|
+
}
|
|
45
|
+
twiddles.push({
|
|
46
|
+
len,
|
|
47
|
+
cos,
|
|
48
|
+
sin
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
tables = {
|
|
52
|
+
preCos,
|
|
53
|
+
preSin,
|
|
54
|
+
postCos,
|
|
55
|
+
postSin,
|
|
56
|
+
bitrev,
|
|
57
|
+
twiddles,
|
|
58
|
+
workRe: new Float32Array(h),
|
|
59
|
+
workIm: new Float32Array(h),
|
|
60
|
+
dct: new Float32Array(m)
|
|
61
|
+
};
|
|
62
|
+
tableCache.set(m, tables);
|
|
63
|
+
return tables;
|
|
64
|
+
}
|
|
65
|
+
function fftInPlace(re, im, tables) {
|
|
66
|
+
const n = re.length;
|
|
67
|
+
const bitrev = tables.bitrev;
|
|
68
|
+
for (let i = 1; i < n; i++) {
|
|
69
|
+
const j = bitrev[i];
|
|
70
|
+
if (i < j) {
|
|
71
|
+
const tr = re[i];
|
|
72
|
+
re[i] = re[j];
|
|
73
|
+
re[j] = tr;
|
|
74
|
+
const ti = im[i];
|
|
75
|
+
im[i] = im[j];
|
|
76
|
+
im[j] = ti;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const {
|
|
80
|
+
len,
|
|
81
|
+
cos,
|
|
82
|
+
sin
|
|
83
|
+
} of tables.twiddles) {
|
|
84
|
+
const half = len >> 1;
|
|
85
|
+
for (let i = 0; i < n; i += len) {
|
|
86
|
+
for (let j = 0; j < half; j++) {
|
|
87
|
+
const wr = cos[j];
|
|
88
|
+
const wi = sin[j];
|
|
89
|
+
const a = i + j;
|
|
90
|
+
const b = a + half;
|
|
91
|
+
const vr = re[b] * wr - im[b] * wi;
|
|
92
|
+
const vi = re[b] * wi + im[b] * wr;
|
|
93
|
+
re[b] = re[a] - vr;
|
|
94
|
+
im[b] = im[a] - vi;
|
|
95
|
+
re[a] += vr;
|
|
96
|
+
im[a] += vi;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* In-place unnormalized DCT-IV of `input` (length must be a power of two ≥ 4)
|
|
104
|
+
* into `output`.
|
|
105
|
+
*
|
|
106
|
+
* @param {Float32Array} input Input samples (not modified).
|
|
107
|
+
* @param {Float32Array} output Output buffer of the same length.
|
|
108
|
+
*/
|
|
109
|
+
function dctIv(input, output) {
|
|
110
|
+
const m = input.length;
|
|
111
|
+
const h = m >> 1;
|
|
112
|
+
const tables = getTables(m);
|
|
113
|
+
const {
|
|
114
|
+
preCos,
|
|
115
|
+
preSin,
|
|
116
|
+
postCos,
|
|
117
|
+
postSin,
|
|
118
|
+
workRe,
|
|
119
|
+
workIm
|
|
120
|
+
} = tables;
|
|
121
|
+
for (let i = 0; i < h; i++) {
|
|
122
|
+
const xr = input[2 * i];
|
|
123
|
+
const xi = input[m - 1 - 2 * i];
|
|
124
|
+
workRe[i] = xr * preCos[i] + xi * preSin[i];
|
|
125
|
+
workIm[i] = xi * preCos[i] - xr * preSin[i];
|
|
126
|
+
}
|
|
127
|
+
fftInPlace(workRe, workIm, tables);
|
|
128
|
+
for (let k = 0; k < h; k++) {
|
|
129
|
+
const wr = workRe[k] * postCos[k] + workIm[k] * postSin[k];
|
|
130
|
+
const wi = workIm[k] * postCos[k] - workRe[k] * postSin[k];
|
|
131
|
+
output[2 * k] = wr;
|
|
132
|
+
output[m - 1 - 2 * k] = -wi;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* IMDCT: `spectrum` (n/2 coefficients) to `output` (n samples).
|
|
138
|
+
*
|
|
139
|
+
* Matches y[i] = Σ x[j]·cos(π/(2n)·(2i+1+n/2)·(2j+1)).
|
|
140
|
+
*
|
|
141
|
+
* @param {Float32Array} spectrum Input coefficients (length n/2, not modified).
|
|
142
|
+
* @param {Float32Array} output Output buffer (length n).
|
|
143
|
+
* @param {number} n Block size (power of two).
|
|
144
|
+
*/
|
|
145
|
+
function imdct(spectrum, output, n) {
|
|
146
|
+
const n2 = n >> 1;
|
|
147
|
+
const n4 = n >> 2;
|
|
148
|
+
const n34 = n - n4;
|
|
149
|
+
const tables = getTables(n2);
|
|
150
|
+
const t = tables.dct;
|
|
151
|
+
dctIv(spectrum, t);
|
|
152
|
+
for (let i = 0; i < n4; i++) output[i] = t[i + n4];
|
|
153
|
+
for (let i = n4; i < n34; i++) output[i] = -t[n34 - i - 1];
|
|
154
|
+
for (let i = n34; i < n; i++) output[i] = -t[i - n34];
|
|
155
|
+
}
|
|
156
|
+
const windowCache = new Map();
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The Vorbis synthesis window slope of `length` samples:
|
|
160
|
+
* sin(π/2 · sin²(π·(i+0.5)/(2·length))).
|
|
161
|
+
*
|
|
162
|
+
* @param {number} length Slope length in samples.
|
|
163
|
+
* @returns {Float32Array} Cached window slope values.
|
|
164
|
+
*/
|
|
165
|
+
function vorbisWindowSlope(length) {
|
|
166
|
+
let slope = windowCache.get(length);
|
|
167
|
+
if (slope) return slope;
|
|
168
|
+
slope = new Float32Array(length);
|
|
169
|
+
for (let i = 0; i < length; i++) {
|
|
170
|
+
const s = Math.sin(Math.PI * (i + 0.5) / (2 * length));
|
|
171
|
+
slope[i] = Math.sin(Math.PI / 2 * s * s);
|
|
172
|
+
}
|
|
173
|
+
windowCache.set(length, slope);
|
|
174
|
+
return slope;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { dctIv, imdct, vorbisWindowSlope };
|
|
178
|
+
//# sourceMappingURL=imdct.js.map
|