@thi.ng/dsp 4.6.15 → 4.6.17

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 (66) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/add.js +24 -38
  4. package/addg.js +4 -19
  5. package/adsr.js +148 -156
  6. package/agen.js +17 -21
  7. package/allpass.js +37 -38
  8. package/alt.js +26 -22
  9. package/anti-alias.js +8 -37
  10. package/api.js +0 -1
  11. package/aproc.js +24 -30
  12. package/biquad.js +188 -184
  13. package/bounce.js +15 -16
  14. package/complex.js +4 -1
  15. package/const.js +12 -13
  16. package/convert.js +18 -64
  17. package/cosine.js +43 -48
  18. package/curve.js +12 -41
  19. package/dcblock.js +9 -10
  20. package/delay.js +100 -111
  21. package/feedback-delay.js +23 -30
  22. package/fft.js +188 -334
  23. package/filter-delay.js +23 -27
  24. package/filter-response.js +22 -33
  25. package/foldback.js +26 -35
  26. package/impulse-train.js +35 -37
  27. package/impulse.js +27 -42
  28. package/integrator.js +27 -32
  29. package/internal/ensure.js +4 -1
  30. package/internal/take.js +8 -5
  31. package/iterable.js +32 -43
  32. package/line.js +10 -25
  33. package/madd.js +25 -40
  34. package/mapg.js +77 -69
  35. package/merge.js +18 -20
  36. package/mix.js +20 -16
  37. package/mul.js +24 -38
  38. package/multiplex.js +15 -11
  39. package/onepole.js +41 -42
  40. package/osc-additive.js +25 -53
  41. package/osc-cos.js +4 -1
  42. package/osc-dsf.js +15 -52
  43. package/osc-mix.js +6 -20
  44. package/osc-parabolic.js +4 -13
  45. package/osc-rect.js +6 -8
  46. package/osc-saw.js +4 -1
  47. package/osc-sin.js +4 -1
  48. package/osc-tri.js +4 -1
  49. package/osc-wavetable.js +12 -9
  50. package/osc.js +40 -74
  51. package/package.json +12 -10
  52. package/pan.js +23 -29
  53. package/pink-noise.js +35 -57
  54. package/pipe.js +6 -4
  55. package/power.js +40 -96
  56. package/product.js +5 -4
  57. package/reciprocal.js +20 -22
  58. package/ref.js +24 -20
  59. package/serial.js +59 -60
  60. package/sincos.js +45 -61
  61. package/sum.js +5 -4
  62. package/svf.js +74 -78
  63. package/sweep.js +4 -27
  64. package/waveshaper.js +41 -60
  65. package/white-noise.js +17 -23
  66. package/window.js +67 -52
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Change Log
2
2
 
3
- - **Last updated**: 2023-12-03T12:13:31Z
3
+ - **Last updated**: 2023-12-11T10:07:09Z
4
4
  - **Generator**: [thi.ng/monopub](https://thi.ng/monopub)
5
5
 
6
6
  All notable changes to this project will be documented in this file.
package/README.md CHANGED
@@ -84,7 +84,7 @@ For Node.js REPL:
84
84
  const dsp = await import("@thi.ng/dsp");
85
85
  ```
86
86
 
87
- Package sizes (brotli'd, pre-treeshake): ESM: 7.74 KB
87
+ Package sizes (brotli'd, pre-treeshake): ESM: 7.52 KB
88
88
 
89
89
  ## Dependencies
90
90
 
package/add.js CHANGED
@@ -1,40 +1,26 @@
1
1
  import { AGen } from "./agen.js";
2
- /**
3
- * Creates a new `Add` gen using given `step` (default: 1.0) and `start`
4
- * (default: 0.0) values, producing: `y(t) = step + y(t-1)`. If `clamp` is
5
- * given, the resulting output will be clamped to that value (min or max depends
6
- * on sign of `start - clamp`).
7
- *
8
- * @param step -
9
- * @param start -
10
- * @param clamp -
11
- */
12
- export const add = (step, start, clamp) => new Add(step, start, clamp);
13
- export class Add extends AGen {
14
- _step;
15
- _start;
16
- _clamp;
17
- constructor(_step = 1, _start = 0, _clamp) {
18
- super(0);
19
- this._step = _step;
20
- this._start = _start;
21
- this._clamp = _clamp;
22
- this.reset();
23
- }
24
- copy() {
25
- return new Add(this._step, this._start, this._clamp);
26
- }
27
- reset() {
28
- this._val = this._start - this._step;
29
- return this;
30
- }
31
- next() {
32
- let v = this._val + this._step;
33
- return (this._val =
34
- this._clamp !== undefined
35
- ? this._start < this._clamp
36
- ? Math.min(v, this._clamp)
37
- : Math.max(v, this._clamp)
38
- : v);
39
- }
2
+ const add = (step, start, clamp) => new Add(step, start, clamp);
3
+ class Add extends AGen {
4
+ constructor(_step = 1, _start = 0, _clamp) {
5
+ super(0);
6
+ this._step = _step;
7
+ this._start = _start;
8
+ this._clamp = _clamp;
9
+ this.reset();
10
+ }
11
+ copy() {
12
+ return new Add(this._step, this._start, this._clamp);
13
+ }
14
+ reset() {
15
+ this._val = this._start - this._step;
16
+ return this;
17
+ }
18
+ next() {
19
+ let v = this._val + this._step;
20
+ return this._val = this._clamp !== void 0 ? this._start < this._clamp ? Math.min(v, this._clamp) : Math.max(v, this._clamp) : v;
21
+ }
40
22
  }
23
+ export {
24
+ Add,
25
+ add
26
+ };
package/addg.js CHANGED
@@ -1,20 +1,5 @@
1
1
  import { MapG1 } from "./mapg.js";
2
- /**
3
- * Creates a new {@link IGen} using given `step` gen and `start
4
- * (default: 0) value, producing: `y(t) = step(t) + y(t-1)`.
5
- *
6
- * @remarks
7
- * Note this is different to {@link sum}, which merely sums given
8
- * argument gens for each step, but doesn't for a reduction like this
9
- * gen.
10
- *
11
- * @example
12
- * ```ts
13
- * addg(constant(1), 10).take(5)
14
- * // [ 10, 11, 12, 13, 14 ]
15
- * ```
16
- *
17
- * @param step -
18
- * @param start -
19
- */
20
- export const addG = (step, start = 0) => new MapG1((a, b) => a + b, step, start - step.deref());
2
+ const addG = (step, start = 0) => new MapG1((a, b) => a + b, step, start - step.deref());
3
+ export {
4
+ addG
5
+ };
package/adsr.js CHANGED
@@ -2,164 +2,156 @@ import { clamp01 } from "@thi.ng/math/interval";
2
2
  import { add } from "./add.js";
3
3
  import { AGen } from "./agen.js";
4
4
  import { curve } from "./curve.js";
5
- var EnvPhase;
6
- (function (EnvPhase) {
7
- EnvPhase[EnvPhase["ATTACK"] = 0] = "ATTACK";
8
- EnvPhase[EnvPhase["DECAY"] = 1] = "DECAY";
9
- EnvPhase[EnvPhase["SUSTAIN"] = 2] = "SUSTAIN";
10
- EnvPhase[EnvPhase["RELEASE"] = 3] = "RELEASE";
11
- EnvPhase[EnvPhase["IDLE"] = 4] = "IDLE";
12
- })(EnvPhase || (EnvPhase = {}));
13
- /**
14
- * Time based ADSR envelope gen with customizable exponential attack,
15
- * decay and release curves.
16
- *
17
- * @remarks
18
- * The attack, decay and release options are to be given in samples
19
- * (`num = time_in_seconds * sample_rate`). Unless the sustain length
20
- * (`slen` opt) is finite (default: ∞), the release phase of the
21
- * envelope MUST be triggered manually by calling {@link ADSR.release}.
22
- * If only attack & decay phases are required, initialize the sustain
23
- * level to zero and configure `dcurve` to adjust falloff shape.
24
- *
25
- * The envelope can be re-used & restarted by calling
26
- * {@link ADSR.reset}. This will move the internal state back to the
27
- * beginning of the attack phase and start producing a new envelope with
28
- * current settings. Note: Any changes done to the envelope parameters
29
- * are only guaranteed to be fully applied after reset.
30
- *
31
- * The `acurve` and `dcurve` options can be used to control the
32
- * exponential curvature of the attack, decay and release phases.
33
- * Recommended range [0.0001 - 100] (curved -> linear).
34
- *
35
- * @param opts -
36
- */
37
- export const adsr = (opts) => new ADSR(opts);
38
- export class ADSR extends AGen {
39
- _phase;
40
- _curve;
41
- _atime;
42
- _dtime;
43
- _rtime;
44
- _acurve;
45
- _dcurve;
46
- _sustain;
47
- _speriod;
48
- _gain;
49
- constructor(opts) {
50
- super(0);
51
- opts = {
52
- a: 0,
53
- d: 0,
54
- s: 1,
55
- r: 0,
56
- acurve: 0.1,
57
- dcurve: 0.001,
58
- slen: Infinity,
59
- gain: 1,
60
- ...opts,
61
- };
62
- this.setAttack(opts.a);
63
- this.setDecay(opts.d);
64
- this.setRelease(opts.r);
65
- this.setSustain(opts.s, opts.slen);
66
- this.setCurveA(opts.acurve);
67
- this.setCurveD(opts.dcurve);
68
- this.setGain(opts.gain);
69
- this.reset();
5
+ var EnvPhase = /* @__PURE__ */ ((EnvPhase2) => {
6
+ EnvPhase2[EnvPhase2["ATTACK"] = 0] = "ATTACK";
7
+ EnvPhase2[EnvPhase2["DECAY"] = 1] = "DECAY";
8
+ EnvPhase2[EnvPhase2["SUSTAIN"] = 2] = "SUSTAIN";
9
+ EnvPhase2[EnvPhase2["RELEASE"] = 3] = "RELEASE";
10
+ EnvPhase2[EnvPhase2["IDLE"] = 4] = "IDLE";
11
+ return EnvPhase2;
12
+ })(EnvPhase || {});
13
+ const adsr = (opts) => new ADSR(opts);
14
+ class ADSR extends AGen {
15
+ _phase;
16
+ _curve;
17
+ _atime;
18
+ _dtime;
19
+ _rtime;
20
+ _acurve;
21
+ _dcurve;
22
+ _sustain;
23
+ _speriod;
24
+ _gain;
25
+ constructor(opts) {
26
+ super(0);
27
+ opts = {
28
+ a: 0,
29
+ d: 0,
30
+ s: 1,
31
+ r: 0,
32
+ acurve: 0.1,
33
+ dcurve: 1e-3,
34
+ slen: Infinity,
35
+ gain: 1,
36
+ ...opts
37
+ };
38
+ this.setAttack(opts.a);
39
+ this.setDecay(opts.d);
40
+ this.setRelease(opts.r);
41
+ this.setSustain(opts.s, opts.slen);
42
+ this.setCurveA(opts.acurve);
43
+ this.setCurveD(opts.dcurve);
44
+ this.setGain(opts.gain);
45
+ this.reset();
46
+ }
47
+ copy() {
48
+ return new ADSR({
49
+ a: this._atime,
50
+ d: this._dtime,
51
+ s: this._sustain,
52
+ r: this._rtime,
53
+ acurve: this._acurve,
54
+ dcurve: this._dcurve,
55
+ gain: this._gain,
56
+ slen: this._speriod
57
+ });
58
+ }
59
+ reset() {
60
+ this._phase = 0 /* ATTACK */;
61
+ this._curve = curve(0, 1, this._atime + 1, this._acurve, true);
62
+ this._val = 0;
63
+ return this;
64
+ }
65
+ release() {
66
+ if (this._phase < 3 /* RELEASE */) {
67
+ this._phase = 3 /* RELEASE */;
68
+ this._curve = curve(
69
+ this._sustain,
70
+ 0,
71
+ this._rtime + 1,
72
+ this._dcurve,
73
+ true
74
+ );
70
75
  }
71
- copy() {
72
- return new ADSR({
73
- a: this._atime,
74
- d: this._dtime,
75
- s: this._sustain,
76
- r: this._rtime,
77
- acurve: this._acurve,
78
- dcurve: this._dcurve,
79
- gain: this._gain,
80
- slen: this._speriod,
81
- });
82
- }
83
- reset() {
84
- this._phase = EnvPhase.ATTACK;
85
- this._curve = curve(0, 1, this._atime + 1, this._acurve, true);
86
- this._val = 0;
87
- return this;
88
- }
89
- release() {
90
- if (this._phase < EnvPhase.RELEASE) {
91
- this._phase = EnvPhase.RELEASE;
92
- this._curve = curve(this._sustain, 0, this._rtime + 1, this._dcurve, true);
76
+ }
77
+ isSustained() {
78
+ return this._phase === 2 /* SUSTAIN */;
79
+ }
80
+ isDone() {
81
+ return this._phase === 4 /* IDLE */;
82
+ }
83
+ next() {
84
+ let v;
85
+ switch (this._phase) {
86
+ case 4 /* IDLE */:
87
+ return 0;
88
+ case 0 /* ATTACK */:
89
+ v = this._curve.next();
90
+ if (v >= 1) {
91
+ v = 1;
92
+ this._phase = 1 /* DECAY */;
93
+ this._curve = curve(
94
+ 1,
95
+ this._sustain,
96
+ this._dtime + 1,
97
+ this._dcurve,
98
+ true
99
+ );
93
100
  }
94
- }
95
- isSustained() {
96
- return this._phase === EnvPhase.SUSTAIN;
97
- }
98
- isDone() {
99
- return this._phase === EnvPhase.IDLE;
100
- }
101
- next() {
102
- let v;
103
- switch (this._phase) {
104
- case EnvPhase.IDLE:
105
- return 0;
106
- case EnvPhase.ATTACK:
107
- v = this._curve.next();
108
- if (v >= 1) {
109
- v = 1;
110
- this._phase = EnvPhase.DECAY;
111
- this._curve = curve(1, this._sustain, this._dtime + 1, this._dcurve, true);
112
- }
113
- break;
114
- case EnvPhase.DECAY:
115
- v = this._curve.next();
116
- if (v <= this._sustain) {
117
- v = this._sustain;
118
- this._phase = EnvPhase.SUSTAIN;
119
- this._curve = add(1, 1);
120
- }
121
- break;
122
- case EnvPhase.SUSTAIN:
123
- if (this._curve.next() >= this._speriod) {
124
- this.release();
125
- }
126
- return this._val;
127
- case EnvPhase.RELEASE:
128
- v = this._curve.next();
129
- if (v < 0) {
130
- v = 0;
131
- this._phase = EnvPhase.IDLE;
132
- }
101
+ break;
102
+ case 1 /* DECAY */:
103
+ v = this._curve.next();
104
+ if (v <= this._sustain) {
105
+ v = this._sustain;
106
+ this._phase = 2 /* SUSTAIN */;
107
+ this._curve = add(1, 1);
108
+ }
109
+ break;
110
+ case 2 /* SUSTAIN */:
111
+ if (this._curve.next() >= this._speriod) {
112
+ this.release();
113
+ }
114
+ return this._val;
115
+ case 3 /* RELEASE */:
116
+ v = this._curve.next();
117
+ if (v < 0) {
118
+ v = 0;
119
+ this._phase = 4 /* IDLE */;
133
120
  }
134
- return (this._val = v * this._gain);
135
- }
136
- setAttack(steps) {
137
- this._atime = Math.max(steps, 0);
138
- }
139
- setDecay(steps) {
140
- this._dtime = Math.max(steps, 0);
141
- }
142
- setRelease(steps) {
143
- this._rtime = Math.max(steps, 0);
144
- }
145
- /**
146
- * Sets sustain level & duration. If the latter is omitted, the
147
- * current value will be retained.
148
- *
149
- * @param level -
150
- * @param duration -
151
- */
152
- setSustain(level, duration) {
153
- this._sustain = clamp01(level);
154
- duration !== undefined && (this._speriod = duration);
155
- }
156
- setCurveA(ratio) {
157
- this._acurve = Math.max(ratio, 1e-9);
158
- }
159
- setCurveD(ratio) {
160
- this._dcurve = Math.max(ratio, 1e-9);
161
- }
162
- setGain(gain) {
163
- this._gain = gain;
164
121
  }
122
+ return this._val = v * this._gain;
123
+ }
124
+ setAttack(steps) {
125
+ this._atime = Math.max(steps, 0);
126
+ }
127
+ setDecay(steps) {
128
+ this._dtime = Math.max(steps, 0);
129
+ }
130
+ setRelease(steps) {
131
+ this._rtime = Math.max(steps, 0);
132
+ }
133
+ /**
134
+ * Sets sustain level & duration. If the latter is omitted, the
135
+ * current value will be retained.
136
+ *
137
+ * @param level -
138
+ * @param duration -
139
+ */
140
+ setSustain(level, duration) {
141
+ this._sustain = clamp01(level);
142
+ duration !== void 0 && (this._speriod = duration);
143
+ }
144
+ setCurveA(ratio) {
145
+ this._acurve = Math.max(ratio, 1e-9);
146
+ }
147
+ setCurveD(ratio) {
148
+ this._dcurve = Math.max(ratio, 1e-9);
149
+ }
150
+ setGain(gain) {
151
+ this._gain = gain;
152
+ }
165
153
  }
154
+ export {
155
+ ADSR,
156
+ adsr
157
+ };
package/agen.js CHANGED
@@ -1,23 +1,19 @@
1
1
  import { __take } from "./internal/take.js";
2
- /**
3
- * Abstract base class for unit gens in this package. Provides
4
- * [`IDeref`](https://docs.thi.ng/umbrella/api/interfaces/IDeref.html) to obtain
5
- * the gen's current value and `Iterable` implementations to use gens as ES6
6
- * iterables.
7
- */
8
- export class AGen {
9
- _val;
10
- constructor(_val) {
11
- this._val = _val;
12
- }
13
- deref() {
14
- return this._val;
15
- }
16
- *[Symbol.iterator]() {
17
- while (true)
18
- yield this.next();
19
- }
20
- take(num, out = [], idx = 0) {
21
- return __take(this, num, out, idx);
22
- }
2
+ class AGen {
3
+ constructor(_val) {
4
+ this._val = _val;
5
+ }
6
+ deref() {
7
+ return this._val;
8
+ }
9
+ *[Symbol.iterator]() {
10
+ while (true)
11
+ yield this.next();
12
+ }
13
+ take(num, out = [], idx = 0) {
14
+ return __take(this, num, out, idx);
15
+ }
23
16
  }
17
+ export {
18
+ AGen
19
+ };
package/allpass.js CHANGED
@@ -1,42 +1,41 @@
1
1
  import { PI, QUARTER_PI } from "@thi.ng/math/api";
2
2
  import { clamp05 } from "@thi.ng/math/interval";
3
3
  import { AProc } from "./aproc.js";
4
- /**
5
- * One-pole allpass filter.
6
- *
7
- * @param freq - normalized center freq
8
- */
9
- export const allpass = (freq) => new AllPass1(freq);
10
- export class AllPass1 extends AProc {
11
- _freq;
12
- _coeff;
13
- _z1;
14
- constructor(freq) {
15
- super(0);
16
- this.setFreq(freq);
17
- this.reset();
18
- }
19
- reset() {
20
- this._z1 = 0;
21
- return this;
22
- }
23
- next(x) {
24
- const { _coeff, _z1 } = this;
25
- x -= _z1 * _coeff;
26
- this._z1 = x;
27
- return x * _coeff + _z1;
28
- }
29
- low(x) {
30
- return (x + this.next(x)) * 0.5;
31
- }
32
- high(x) {
33
- return (x - this.next(x)) * 0.5;
34
- }
35
- freq() {
36
- return this._freq;
37
- }
38
- setFreq(freq) {
39
- this._freq = clamp05(freq);
40
- this._coeff = Math.tan(freq * PI - QUARTER_PI);
41
- }
4
+ const allpass = (freq) => new AllPass1(freq);
5
+ class AllPass1 extends AProc {
6
+ _freq;
7
+ _coeff;
8
+ _z1;
9
+ constructor(freq) {
10
+ super(0);
11
+ this.setFreq(freq);
12
+ this.reset();
13
+ }
14
+ reset() {
15
+ this._z1 = 0;
16
+ return this;
17
+ }
18
+ next(x) {
19
+ const { _coeff, _z1 } = this;
20
+ x -= _z1 * _coeff;
21
+ this._z1 = x;
22
+ return x * _coeff + _z1;
23
+ }
24
+ low(x) {
25
+ return (x + this.next(x)) * 0.5;
26
+ }
27
+ high(x) {
28
+ return (x - this.next(x)) * 0.5;
29
+ }
30
+ freq() {
31
+ return this._freq;
32
+ }
33
+ setFreq(freq) {
34
+ this._freq = clamp05(freq);
35
+ this._coeff = Math.tan(freq * PI - QUARTER_PI);
36
+ }
42
37
  }
38
+ export {
39
+ AllPass1,
40
+ allpass
41
+ };
package/alt.js CHANGED
@@ -1,24 +1,28 @@
1
1
  import { AGen } from "./agen.js";
2
- export const alt = (n = 1) => new Alt(n, -n);
3
- export const altT = (a, b) => new Alt(a, b);
4
- export const altB = (x = true) => new Alt(x, !x);
5
- export class Alt extends AGen {
6
- _a;
7
- _b;
8
- _flip = true;
9
- constructor(_a, _b) {
10
- super(_b);
11
- this._a = _a;
12
- this._b = _b;
13
- }
14
- copy() {
15
- return new Alt(this._a, this._b);
16
- }
17
- reset() {
18
- this._flip = true;
19
- return this;
20
- }
21
- next() {
22
- return (this._val = (this._flip = !this._flip) ? this._b : this._a);
23
- }
2
+ const alt = (n = 1) => new Alt(n, -n);
3
+ const altT = (a, b) => new Alt(a, b);
4
+ const altB = (x = true) => new Alt(x, !x);
5
+ class Alt extends AGen {
6
+ constructor(_a, _b) {
7
+ super(_b);
8
+ this._a = _a;
9
+ this._b = _b;
10
+ }
11
+ _flip = true;
12
+ copy() {
13
+ return new Alt(this._a, this._b);
14
+ }
15
+ reset() {
16
+ this._flip = true;
17
+ return this;
18
+ }
19
+ next() {
20
+ return this._val = (this._flip = !this._flip) ? this._b : this._a;
21
+ }
24
22
  }
23
+ export {
24
+ Alt,
25
+ alt,
26
+ altB,
27
+ altT
28
+ };
package/anti-alias.js CHANGED
@@ -1,38 +1,9 @@
1
1
  import { HALF_PI } from "@thi.ng/math/api";
2
- /**
3
- * Reference:
4
- * - https://en.wikipedia.org/wiki/Gibbs_phenomenon
5
- * - https://web.archive.org/web/20031210115616/http://www.musicdsp.org/files/bandlimited.pdf
6
- *
7
- * [Interactive graph](https://www.desmos.com/calculator/irugw6gnhy)
8
- *
9
- * @param n - number of octaves
10
- * @param i - curr octave [1..n]
11
- */
12
- export const gibbs = (n, i) => Math.cos(((i - 1) * HALF_PI) / n) ** 2;
13
- /**
14
- * Fejér weight for `k`-th harmonic in a Fourier series of length `n`.
15
- *
16
- * @remarks
17
- * Used for attenuating the {@link gibbs} factor when summing a Fourier series.
18
- * Linearly attentuates higher harmonics, with the first bin receiving a weight
19
- * on 1 and the last bin `1/n`.
20
- *
21
- * @param k -
22
- * @param n -
23
- */
24
- export const fejer = (k, n) => (n - k) / n;
25
- /**
26
- * Polynomial attenuation to create bandlimited version of a signal.
27
- *
28
- * - http://research.spa.aalto.fi/publications/papers/smc2010-phaseshaping/
29
- * - http://www.kvraudio.com/forum/viewtopic.php?t=375517
30
- *
31
- * @param dt - time step
32
- * @param t - normalized phase
33
- */
34
- export const polyBLEP = (dt, t) => t < dt
35
- ? ((t /= dt), t + t - t * t - 1)
36
- : t > 1 - dt
37
- ? ((t = (t - 1) / dt), t * t + t + t + 1)
38
- : 0;
2
+ const gibbs = (n, i) => Math.cos((i - 1) * HALF_PI / n) ** 2;
3
+ const fejer = (k, n) => (n - k) / n;
4
+ const polyBLEP = (dt, t) => t < dt ? (t /= dt, t + t - t * t - 1) : t > 1 - dt ? (t = (t - 1) / dt, t * t + t + t + 1) : 0;
5
+ export {
6
+ fejer,
7
+ gibbs,
8
+ polyBLEP
9
+ };
package/api.js CHANGED
@@ -1 +0,0 @@
1
- export {};