@audio/synth-noise 1.0.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/colors.js ADDED
@@ -0,0 +1,61 @@
1
+ // Colors of noise — seeded, deterministic generators with defined spectral slopes:
2
+ // white 0 dB/oct · pink −3 (Kellet filter) · brown −6 (leaky integration) ·
3
+ // blue +3 (differentiated pink) · violet +6 (differentiated white).
4
+
5
+ import pinkNoise from './pink-noise.js'
6
+
7
+ function lcg (seed) {
8
+ let s = seed >>> 0 || 1
9
+ return () => {
10
+ s = (s * 1103515245 + 12345) & 0x7fffffff
11
+ return s / 0x3fffffff - 1
12
+ }
13
+ }
14
+ function normalize (d, peak = 0.9) {
15
+ let m = 0
16
+ for (let i = 0; i < d.length; i++) { let a = Math.abs(d[i]); if (a > m) m = a }
17
+ if (m > 0) for (let i = 0; i < d.length; i++) d[i] *= peak / m
18
+ return d
19
+ }
20
+
21
+ export function white (n, { seed = 1 } = {}) {
22
+ let rand = lcg(seed)
23
+ let d = new Float32Array(n)
24
+ for (let i = 0; i < n; i++) d[i] = rand() * 0.9
25
+ return d
26
+ }
27
+
28
+ export function pink (n, opts = {}) {
29
+ let d = Float64Array.from(white(n, opts))
30
+ pinkNoise(d, {})
31
+ return normalize(Float32Array.from(d))
32
+ }
33
+
34
+ export function brown (n, { seed = 1, leak = 0.999 } = {}) {
35
+ let rand = lcg(seed)
36
+ let d = new Float32Array(n)
37
+ let y = 0
38
+ for (let i = 0; i < n; i++) d[i] = y = y * leak + rand() * 0.02
39
+ return normalize(d)
40
+ }
41
+
42
+ export function blue (n, opts = {}) {
43
+ let p = pink(n + 1, opts)
44
+ let d = new Float32Array(n)
45
+ for (let i = 0; i < n; i++) d[i] = p[i + 1] - p[i]
46
+ return normalize(d)
47
+ }
48
+
49
+ export function violet (n, opts = {}) {
50
+ let w = white(n + 1, opts)
51
+ let d = new Float32Array(n)
52
+ for (let i = 0; i < n; i++) d[i] = w[i + 1] - w[i]
53
+ return normalize(d)
54
+ }
55
+
56
+ /** noise(n, { color: 'white'|'pink'|'brown'|'blue'|'violet', seed }) */
57
+ export default function noise (n, { color = 'white', ...opts } = {}) {
58
+ const GEN = { white, pink, brown, blue, violet }
59
+ if (!GEN[color]) throw new RangeError(`noise: unknown color "${color}"`)
60
+ return GEN[color](n, opts)
61
+ }
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@audio/synth-noise",
3
+ "version": "1.0.0",
4
+ "description": "Colors of noise — white, pink (Kellet), brown, blue, violet; seeded, slope-verified",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "pink-noise.js",
8
+ "exports": {
9
+ ".": "./pink-noise.js",
10
+ "./package.json": "./package.json",
11
+ "./colors": "./colors.js",
12
+ "./pink": "./pink-noise.js"
13
+ },
14
+ "files": [
15
+ "pink-noise.js",
16
+ "pink-noise.d.ts",
17
+ "colors.js"
18
+ ],
19
+ "keywords": [
20
+ "audio",
21
+ "dsp",
22
+ "synth",
23
+ "noise",
24
+ "pink-noise"
25
+ ],
26
+ "license": "MIT",
27
+ "author": "Dmitry Iv. <dfcreative@gmail.com>",
28
+ "engines": {
29
+ "node": ">=18"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "types": "pink-noise.d.ts"
35
+ }
@@ -0,0 +1,7 @@
1
+ type Buf = Float32Array | Float64Array | number[]
2
+ interface BiquadCoef { b0: number; b1: number; b2: number; a1: number; a2: number }
3
+ type SOS = BiquadCoef[]
4
+
5
+ /** Paul Kellet pink-noise filter (IIR approximation, -3dB/oct) applied to white noise input */
6
+ declare function pinkNoise(data: Buf, params?: Record<string, unknown>): Buf
7
+ export default pinkNoise
package/pink-noise.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Pink noise filter (1/f spectral slope, -3dB/octave).
3
+ * IIR approximation using Paul Kellet's refined method.
4
+ * Apply to white noise to produce pink noise.
5
+ *
6
+ * @param {Float64Array} data - White noise input (modified in-place)
7
+ * @param {object} params - {b0-b6: state variables}
8
+ * @returns {Float64Array} pink noise
9
+ */
10
+ export default function pinkNoise (data, params) {
11
+ let b0 = params.b0 || 0
12
+ let b1 = params.b1 || 0
13
+ let b2 = params.b2 || 0
14
+ let b3 = params.b3 || 0
15
+ let b4 = params.b4 || 0
16
+ let b5 = params.b5 || 0
17
+ let b6 = params.b6 || 0
18
+
19
+ for (let i = 0; i < data.length; i++) {
20
+ let white = data[i]
21
+ b0 = 0.99886 * b0 + white * 0.0555179
22
+ b1 = 0.99332 * b1 + white * 0.0750759
23
+ b2 = 0.96900 * b2 + white * 0.1538520
24
+ b3 = 0.86650 * b3 + white * 0.3104856
25
+ b4 = 0.55000 * b4 + white * 0.5329522
26
+ b5 = -0.7616 * b5 - white * 0.0168980
27
+ data[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362
28
+ b6 = white * 0.115926
29
+ }
30
+
31
+ params.b0 = b0; params.b1 = b1; params.b2 = b2
32
+ params.b3 = b3; params.b4 = b4; params.b5 = b5; params.b6 = b6
33
+ return data
34
+ }