@audio/effect-flanger 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.
Files changed (2) hide show
  1. package/flanger.js +50 -0
  2. package/package.json +38 -0
package/flanger.js ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Flanger — modulated short delay with feedback
3
+ */
4
+
5
+ let {sin, floor, PI} = Math
6
+
7
+ export default function flanger (data, params) {
8
+ let rate = params.rate == null ? 0.3 : params.rate
9
+ let depth = params.depth == null ? 0.7 : params.depth
10
+ let delay = params.delay == null ? 3 : params.delay
11
+ let feedback = params.feedback == null ? 0.5 : params.feedback
12
+ let fs = params.fs || 44100
13
+
14
+ let maxDelay = (delay * 2 * fs / 1000) | 0
15
+ let delaySamples = delay * fs / 1000
16
+
17
+ if (!params.buffer || params.buffer.length < maxDelay) {
18
+ params.buffer = new Float64Array(maxDelay)
19
+ params.ptr = 0
20
+ params._phase = 0
21
+ }
22
+ let buf = params.buffer, ptr = params.ptr, phase = params._phase
23
+ let inc = 2 * PI * rate / fs
24
+
25
+ for (let i = 0, l = data.length; i < l; i++) {
26
+ let lfo = sin(phase)
27
+ phase += inc
28
+ if (phase > 2 * PI) phase -= 2 * PI
29
+
30
+ let d = delaySamples * (1 + depth * lfo)
31
+ let readPos = ptr - d
32
+ if (readPos < 0) readPos += maxDelay
33
+
34
+ let idx = floor(readPos)
35
+ let frac = readPos - idx
36
+ let a = buf[idx % maxDelay]
37
+ let b = buf[(idx + 1) % maxDelay]
38
+ let delayed = a + frac * (b - a)
39
+
40
+ let x = data[i]
41
+ buf[ptr] = x + feedback * delayed
42
+ ptr = (ptr + 1) % maxDelay
43
+ data[i] = x + delayed
44
+ }
45
+
46
+ params.ptr = ptr
47
+ params._phase = phase
48
+
49
+ return data
50
+ }
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@audio/effect-flanger",
3
+ "version": "1.0.0",
4
+ "description": "Flanger — modulated short delay with feedback",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "flanger.js",
8
+ "exports": {
9
+ ".": "./flanger.js",
10
+ "./package.json": "./package.json"
11
+ },
12
+ "files": [
13
+ "flanger.js"
14
+ ],
15
+ "keywords": [
16
+ "audio",
17
+ "dsp",
18
+ "effect",
19
+ "flanger"
20
+ ],
21
+ "license": "MIT",
22
+ "author": "Dmitry Iv. <dfcreative@gmail.com>",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/audiojs/effect.git",
26
+ "directory": "packages/effect-flanger"
27
+ },
28
+ "homepage": "https://github.com/audiojs/effect/tree/main/packages/effect-flanger",
29
+ "bugs": {
30
+ "url": "https://github.com/audiojs/effect/issues"
31
+ },
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ }
38
+ }