@fluex/fluexgl-dsp 0.3.1 → 0.3.2

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.
@@ -22,29 +22,31 @@ export class Channel {
22
22
  }
23
23
  rebuildEffectChain() {
24
24
  Debug.Log("Attempting to rebuild effect chain.");
25
- if (!this.audioClipsInputGainNode || !this.gainNode)
26
- return Debug.Error("Could not rebuild effect chain, because one or more gain nodes on this channel are undefined.", [
25
+ if (!this.audioClipsInputGainNode || !this.stereoPannerNode) {
26
+ return Debug.Error("Could not rebuild effect chain, because one or more nodes on this channel are undefined.", [
27
27
  `Channel id: ${this.id}.`,
28
28
  `Current amount of effects: ${this.effects.length}.`
29
29
  ]);
30
+ }
30
31
  this.audioClipsInputGainNode.disconnect();
31
32
  for (const effect of this.effects) {
32
33
  effect.audioWorkletNode?.disconnect();
33
34
  }
34
- const activeEffects = this.effects.filter(e => !!e.audioWorkletNode);
35
+ const activeEffects = this.effects.filter(function (e) {
36
+ return !!e.audioWorkletNode;
37
+ });
35
38
  if (activeEffects.length === 0) {
36
- this.audioClipsInputGainNode.connect(this.gainNode);
39
+ this.audioClipsInputGainNode.connect(this.stereoPannerNode);
37
40
  }
38
41
  else {
39
- const firstEffectGain = activeEffects[0].audioWorkletNode;
40
- this.audioClipsInputGainNode.connect(firstEffectGain);
42
+ this.audioClipsInputGainNode.connect(activeEffects[0].audioWorkletNode);
41
43
  for (let i = 0; i < activeEffects.length - 1; i++) {
42
44
  const current = activeEffects[i].audioWorkletNode;
43
45
  const next = activeEffects[i + 1].audioWorkletNode;
44
46
  current.connect(next);
45
47
  }
46
- const lastEffectGain = activeEffects[activeEffects.length - 1].audioWorkletNode;
47
- lastEffectGain.connect(this.gainNode);
48
+ const lastEffectNode = activeEffects[activeEffects.length - 1].audioWorkletNode;
49
+ lastEffectNode.connect(this.stereoPannerNode);
48
50
  }
49
51
  Debug.Success("Successfully rebuilt effect chain.", [
50
52
  `Channel id: ${this.id}.`,
@@ -4,11 +4,13 @@ export declare class LowPassFilter extends Effector {
4
4
  name: string;
5
5
  label: string | null;
6
6
  cutoff: number;
7
+ q: number;
7
8
  minFrequency: number;
8
- constructor({ cutoff, minFrequency }: Partial<LowPassFilterOptions>);
9
+ constructor({ cutoff, minFrequency, q }: Partial<LowPassFilterOptions>);
9
10
  InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
10
11
  ReturnOptionsAsObject(): LowPassFilterOptions;
11
12
  SetCutoff(cutoff?: number): boolean;
12
13
  SetMinFrequency(minFrequency?: number): boolean;
14
+ SetQ(q?: number): boolean;
13
15
  }
14
16
  //# sourceMappingURL=LowPassFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LowPassFilter.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/filters/LowPassFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAA6D,MAAM,kBAAkB,CAAC;AAEnH,qBAAa,aAAc,SAAQ,QAAQ;IAEhC,IAAI,EAAE,MAAM,CAAmB;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAmB;IAEvC,MAAM,EAAE,MAAM,CAAQ;IACtB,YAAY,EAAE,MAAM,CAAM;gBAErB,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAOtD,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,qBAAqB,IAAI,oBAAoB;IAO7C,SAAS,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO;IAWzC,eAAe,CAAC,YAAY,GAAE,MAAW,GAAG,OAAO;CAS7D"}
1
+ {"version":3,"file":"LowPassFilter.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/filters/LowPassFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAA6D,MAAM,kBAAkB,CAAC;AAEnH,qBAAa,aAAc,SAAQ,QAAQ;IAEhC,IAAI,EAAE,MAAM,CAAmB;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAmB;IAEvC,MAAM,EAAE,MAAM,CAAQ;IACtB,CAAC,EAAE,MAAM,CAAO;IAChB,YAAY,EAAE,MAAM,CAAM;gBAErB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAQzD,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,qBAAqB,IAAI,oBAAoB;IAQ7C,SAAS,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO;IAWzC,eAAe,CAAC,YAAY,GAAE,MAAW,GAAG,OAAO;IASnD,IAAI,CAAC,CAAC,GAAE,MAAY,GAAG,OAAO;CAQxC"}
@@ -4,12 +4,14 @@ import { LowPassFilterMessageCommandId, AudioWorkletProcessorNames } from "../..
4
4
  export class LowPassFilter extends Effector {
5
5
  name = "LowPassFilter";
6
6
  label = "LowPassFilter";
7
- cutoff = 4000;
7
+ cutoff = 1000;
8
+ q = 0.7;
8
9
  minFrequency = 10;
9
- constructor({ cutoff, minFrequency }) {
10
+ constructor({ cutoff, minFrequency, q }) {
10
11
  super();
11
12
  this.cutoff = cutoff ?? this.cutoff;
12
13
  this.minFrequency = minFrequency ?? this.minFrequency;
14
+ this.q = q ?? this.q;
13
15
  }
14
16
  async InitializeOnAttachment(parentialContext) {
15
17
  this.parentialContext = parentialContext;
@@ -18,10 +20,11 @@ export class LowPassFilter extends Effector {
18
20
  ReturnOptionsAsObject() {
19
21
  return {
20
22
  cutoff: this.cutoff,
21
- minFrequency: this.minFrequency
23
+ minFrequency: this.minFrequency,
24
+ q: this.q
22
25
  };
23
26
  }
24
- SetCutoff(cutoff = 4000) {
27
+ SetCutoff(cutoff = 1000) {
25
28
  if (!this.parentialContext)
26
29
  return false;
27
30
  if (cutoff >= this.parentialContext.sampleRate)
@@ -35,4 +38,10 @@ export class LowPassFilter extends Effector {
35
38
  this.minFrequency = minFrequency;
36
39
  return SendMessageToWorklet(this.audioWorkletNode, LowPassFilterMessageCommandId.SetMinFrequency, minFrequency);
37
40
  }
41
+ SetQ(q = 0.7) {
42
+ if (q > 4)
43
+ q = 4;
44
+ this.q = q;
45
+ return SendMessageToWorklet(this.audioWorkletNode, LowPassFilterMessageCommandId.SetQ, q);
46
+ }
38
47
  }
@@ -6,7 +6,8 @@ export type AudioClipEvents = {
6
6
  };
7
7
  export declare enum LowPassFilterMessageCommandId {
8
8
  SetCutoff = 0,
9
- SetMinFrequency = 1
9
+ SetMinFrequency = 1,
10
+ SetQ = 2
10
11
  }
11
12
  export declare enum ChorusMessageCommandId {
12
13
  SetBaseDelayMs = 0,
@@ -104,6 +105,7 @@ export interface ChorusEffectOptions {
104
105
  export interface LowPassFilterOptions {
105
106
  cutoff: number;
106
107
  minFrequency: number;
108
+ q: number;
107
109
  }
108
110
  export interface SoftClipOptions {
109
111
  drive: number;
@@ -1 +1 @@
1
- {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../src/typings.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEnE,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,MAAM,CAAC;AACnD,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,GAAG,uBAAuB,CAAC;AAE5G,MAAM,MAAM,eAAe,GAAI;KAC1B,CAAC,IAAI,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE;CACzD,CAAA;AAID,oBAAY,6BAA6B;IACrC,SAAS,IAAA;IACT,eAAe,IAAA;CAClB;AAED,oBAAY,sBAAsB;IAC9B,cAAc,IAAA;IACd,UAAU,IAAA;IACV,SAAS,IAAA;IACT,MAAM,IAAA;IACN,WAAW,IAAA;CACd;AAED,oBAAY,wBAAwB;IAChC,QAAQ,IAAA;IACR,OAAO,IAAA;CACV;AAED,oBAAY,wBAAwB;IAChC,QAAQ,IAAA;IACR,OAAO,IAAA;CACV;AAED,oBAAY,0BAA0B;IAClC,UAAU,wBAAwB;IAClC,mBAAmB,iCAAiC;IACpD,aAAa,2BAA2B;IACxC,SAAS,uBAAuB;IAChC,aAAa,2BAA2B;IACxC,WAAW,yBAAyB;IACpC,aAAa,2BAA2B;IACxC,cAAc,4BAA4B;IAC1C,cAAc,4BAA4B;IAC1C,WAAW,yBAAyB;IACpC,MAAM,oBAAoB;IAC1B,OAAO,qBAAqB;IAC5B,MAAM,oBAAoB;IAC1B,MAAM,oBAAoB;IAC1B,QAAQ,sBAAsB;IAC9B,QAAQ,sBAAsB;CACjC;AAED,MAAM,WAAW,2BAA2B;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,qBAAqB,CAAC;IACtC,QAAQ,EAAE,2BAA2B,CAAC;CACzC;AAED,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,mBAAmB,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACnC,qBAAqB,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,gCAAgC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,8BAA8B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAID,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../src/typings.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export var LowPassFilterMessageCommandId;
3
3
  (function (LowPassFilterMessageCommandId) {
4
4
  LowPassFilterMessageCommandId[LowPassFilterMessageCommandId["SetCutoff"] = 0] = "SetCutoff";
5
5
  LowPassFilterMessageCommandId[LowPassFilterMessageCommandId["SetMinFrequency"] = 1] = "SetMinFrequency";
6
+ LowPassFilterMessageCommandId[LowPassFilterMessageCommandId["SetQ"] = 2] = "SetQ";
6
7
  })(LowPassFilterMessageCommandId || (LowPassFilterMessageCommandId = {}));
7
8
  export var ChorusMessageCommandId;
8
9
  (function (ChorusMessageCommandId) {
@@ -37,38 +37,38 @@ export class Channel {
37
37
  private rebuildEffectChain() {
38
38
  Debug.Log("Attempting to rebuild effect chain.");
39
39
 
40
- if (!this.audioClipsInputGainNode || !this.gainNode) return Debug.Error("Could not rebuild effect chain, because one or more gain nodes on this channel are undefined.", [
41
- `Channel id: ${this.id}.`,
42
- `Current amount of effects: ${this.effects.length}.`
43
- ]);
44
-
40
+ if (!this.audioClipsInputGainNode || !this.stereoPannerNode) {
41
+ return Debug.Error(
42
+ "Could not rebuild effect chain, because one or more nodes on this channel are undefined.",
43
+ [
44
+ `Channel id: ${this.id}.`,
45
+ `Current amount of effects: ${this.effects.length}.`
46
+ ]
47
+ );
48
+ }
45
49
  this.audioClipsInputGainNode.disconnect();
46
50
 
47
51
  for (const effect of this.effects) {
48
52
  effect.audioWorkletNode?.disconnect();
49
53
  }
50
54
 
51
- const activeEffects = this.effects.filter(e => !!e.audioWorkletNode);
55
+ const activeEffects = this.effects.filter(function (e) {
56
+ return !!e.audioWorkletNode;
57
+ });
52
58
 
53
59
  if (activeEffects.length === 0) {
54
-
55
- this.audioClipsInputGainNode.connect(this.gainNode);
60
+ this.audioClipsInputGainNode.connect(this.stereoPannerNode);
56
61
  } else {
57
-
58
- const firstEffectGain = activeEffects[0].audioWorkletNode!;
59
- this.audioClipsInputGainNode.connect(firstEffectGain);
62
+ this.audioClipsInputGainNode.connect(activeEffects[0].audioWorkletNode!);
60
63
 
61
64
  for (let i = 0; i < activeEffects.length - 1; i++) {
62
-
63
65
  const current = activeEffects[i].audioWorkletNode!;
64
66
  const next = activeEffects[i + 1].audioWorkletNode!;
65
-
66
67
  current.connect(next);
67
68
  }
68
69
 
69
- const lastEffectGain = activeEffects[activeEffects.length - 1].audioWorkletNode!;
70
-
71
- lastEffectGain.connect(this.gainNode);
70
+ const lastEffectNode = activeEffects[activeEffects.length - 1].audioWorkletNode!;
71
+ lastEffectNode.connect(this.stereoPannerNode);
72
72
  }
73
73
 
74
74
  Debug.Success("Successfully rebuilt effect chain.", [
@@ -258,7 +258,7 @@ export class Channel {
258
258
 
259
259
  public SetAnalyserOptions(options: AnalyserOptions): Channel | null {
260
260
 
261
- this.analyserOptions = {...options};
261
+ this.analyserOptions = { ...options };
262
262
 
263
263
  if (!this.analyserNode) return null;
264
264
 
@@ -9,14 +9,16 @@ export class LowPassFilter extends Effector {
9
9
  public name: string = "LowPassFilter";
10
10
  public label: string | null = "LowPassFilter";
11
11
 
12
- public cutoff: number = 4000;
12
+ public cutoff: number = 1000;
13
+ public q: number = 0.7;
13
14
  public minFrequency: number = 10;
14
15
 
15
- constructor({ cutoff, minFrequency }: Partial<LowPassFilterOptions>) {
16
+ constructor({ cutoff, minFrequency, q }: Partial<LowPassFilterOptions>) {
16
17
  super();
17
18
 
18
19
  this.cutoff = cutoff ?? this.cutoff;
19
20
  this.minFrequency = minFrequency ?? this.minFrequency;
21
+ this.q = q ?? this.q;
20
22
  }
21
23
 
22
24
  public async InitializeOnAttachment(parentialContext: AudioContext): Promise<void> {
@@ -28,11 +30,12 @@ export class LowPassFilter extends Effector {
28
30
  public ReturnOptionsAsObject(): LowPassFilterOptions {
29
31
  return {
30
32
  cutoff: this.cutoff,
31
- minFrequency: this.minFrequency
33
+ minFrequency: this.minFrequency,
34
+ q: this.q
32
35
  }
33
36
  }
34
37
 
35
- public SetCutoff(cutoff: number = 4000): boolean {
38
+ public SetCutoff(cutoff: number = 1000): boolean {
36
39
 
37
40
  if (!this.parentialContext) return false;
38
41
 
@@ -45,11 +48,19 @@ export class LowPassFilter extends Effector {
45
48
 
46
49
  public SetMinFrequency(minFrequency: number = 10): boolean {
47
50
 
48
-
49
51
  if (minFrequency < 10)
50
52
  minFrequency = 10;
51
53
 
52
54
  this.minFrequency = minFrequency;
53
55
  return SendMessageToWorklet<LowPassFilterMessageCommandId, number>(this.audioWorkletNode, LowPassFilterMessageCommandId.SetMinFrequency, minFrequency);
54
56
  }
57
+
58
+ public SetQ(q: number = 0.7): boolean {
59
+
60
+ if(q > 4)
61
+ q = 4;
62
+
63
+ this.q = q;
64
+ return SendMessageToWorklet<LowPassFilterMessageCommandId, number>(this.audioWorkletNode, LowPassFilterMessageCommandId.SetQ, q);
65
+ }
55
66
  }
@@ -11,7 +11,8 @@ export type AudioClipEvents = {
11
11
 
12
12
  export enum LowPassFilterMessageCommandId {
13
13
  SetCutoff,
14
- SetMinFrequency
14
+ SetMinFrequency,
15
+ SetQ
15
16
  }
16
17
 
17
18
  export enum ChorusMessageCommandId {
@@ -127,6 +128,7 @@ export interface ChorusEffectOptions {
127
128
  export interface LowPassFilterOptions {
128
129
  cutoff: number;
129
130
  minFrequency: number;
131
+ q: number;
130
132
  }
131
133
 
132
134
  export interface SoftClipOptions {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluex/fluexgl-dsp",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "An open-source, web-based DSP library developed alongside FluexGL, designed for creating and manipulating sounds in various contexts.",
5
5
  "main": "lib/dist/index.js",
6
6
  "types": "lib/dist/index.d.ts",