@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 +61 -0
- package/package.json +35 -0
- package/pink-noise.d.ts +7 -0
- package/pink-noise.js +34 -0
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
|
+
}
|
package/pink-noise.d.ts
ADDED
|
@@ -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
|
+
}
|