@fluex/fluexgl-dsp 0.1.2 → 0.1.3
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/README.md +1 -1
- package/lib/dist/console-codes.d.ts +13 -13
- package/lib/dist/console-codes.js +16 -16
- package/lib/dist/core/classes/AudioClip.d.ts +62 -66
- package/lib/dist/core/classes/AudioClip.d.ts.map +1 -1
- package/lib/dist/core/classes/AudioClip.js +386 -410
- package/lib/dist/core/classes/AudioDevice.d.ts +12 -12
- package/lib/dist/core/classes/AudioDevice.js +30 -30
- package/lib/dist/core/classes/Channel.d.ts +29 -29
- package/lib/dist/core/classes/Channel.js +144 -144
- package/lib/dist/core/classes/DpsPipeline.d.ts +59 -59
- package/lib/dist/core/classes/DpsPipeline.js +115 -115
- package/lib/dist/core/classes/Effector.d.ts +11 -7
- package/lib/dist/core/classes/Effector.d.ts.map +1 -1
- package/lib/dist/core/classes/Effector.js +20 -7
- package/lib/dist/core/classes/Master.d.ts +11 -11
- package/lib/dist/core/classes/Master.js +35 -35
- package/lib/dist/core/exports.d.ts +6 -6
- package/lib/dist/core/exports.js +6 -6
- package/lib/dist/effects/classes/Chorus.d.ts +2 -18
- package/lib/dist/effects/classes/Chorus.d.ts.map +1 -1
- package/lib/dist/effects/classes/Chorus.js +2 -83
- package/lib/dist/effects/classes/Distortion.d.ts +2 -2
- package/lib/dist/effects/classes/Distortion.js +2 -2
- package/lib/dist/effects/classes/Equalizer.d.ts +2 -2
- package/lib/dist/effects/classes/Equalizer.js +2 -2
- package/lib/dist/effects/classes/Filter.d.ts +2 -2
- package/lib/dist/effects/classes/Filter.js +2 -2
- package/lib/dist/effects/classes/Limiter.d.ts +2 -2
- package/lib/dist/effects/classes/Limiter.js +2 -2
- package/lib/dist/effects/classes/Saturation.d.ts +2 -2
- package/lib/dist/effects/classes/Saturation.js +2 -2
- package/lib/dist/effects/classes/SoftClip.d.ts +7 -7
- package/lib/dist/effects/classes/SoftClip.d.ts.map +1 -1
- package/lib/dist/effects/classes/SoftClip.js +38 -37
- package/lib/dist/effects/classes/StereoPanner.d.ts +2 -2
- package/lib/dist/effects/classes/StereoPanner.js +2 -2
- package/lib/dist/effects/classes/compressors/Compressor.d.ts +2 -2
- package/lib/dist/effects/classes/compressors/Compressor.js +2 -2
- package/lib/dist/effects/classes/compressors/MultibandCompressor.d.ts +2 -2
- package/lib/dist/effects/classes/compressors/MultibandCompressor.js +2 -2
- package/lib/dist/effects/classes/delays/AdvancedDelay.d.ts +2 -2
- package/lib/dist/effects/classes/delays/AdvancedDelay.js +2 -2
- package/lib/dist/effects/classes/delays/MonoDelay.d.ts +2 -2
- package/lib/dist/effects/classes/delays/MonoDelay.js +2 -2
- package/lib/dist/effects/classes/delays/PingPongDelay.d.ts +2 -2
- package/lib/dist/effects/classes/delays/PingPongDelay.js +2 -2
- package/lib/dist/effects/classes/delays/StereoDelay.d.ts +2 -2
- package/lib/dist/effects/classes/delays/StereoDelay.js +2 -2
- package/lib/dist/effects/classes/reverbs/ChamberReverb.d.ts +2 -2
- package/lib/dist/effects/classes/reverbs/ChamberReverb.js +2 -2
- package/lib/dist/effects/classes/reverbs/ConvolverReverb.d.ts +2 -2
- package/lib/dist/effects/classes/reverbs/ConvolverReverb.js +2 -2
- package/lib/dist/effects/classes/reverbs/GenericReverb.d.ts +2 -2
- package/lib/dist/effects/classes/reverbs/GenericReverb.js +2 -2
- package/lib/dist/effects/classes/reverbs/HallReverb.d.ts +2 -2
- package/lib/dist/effects/classes/reverbs/HallReverb.js +2 -2
- package/lib/dist/effects/classes/reverbs/RoomReverb.d.ts +2 -2
- package/lib/dist/effects/classes/reverbs/RoomReverb.js +2 -2
- package/lib/dist/effects/exports.d.ts +19 -19
- package/lib/dist/effects/exports.js +19 -19
- package/lib/dist/index.d.ts +12 -12
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +28 -28
- package/lib/dist/typings.d.ts +59 -66
- package/lib/dist/typings.d.ts.map +1 -1
- package/lib/dist/typings.js +1 -1
- package/lib/dist/utilities/constants.d.ts +1 -1
- package/lib/dist/utilities/constants.js +9 -9
- package/lib/dist/utilities/debugger.d.ts +7 -7
- package/lib/dist/utilities/debugger.js +49 -49
- package/lib/dist/utilities/helpers.d.ts +40 -40
- package/lib/dist/utilities/helpers.d.ts.map +1 -1
- package/lib/dist/utilities/helpers.js +143 -148
- package/lib/dist/utilities/web-assembly.d.ts +3 -3
- package/lib/dist/utilities/web-assembly.js +12 -12
- package/lib/src/core/classes/AudioClip.ts +2 -7
- package/lib/src/core/classes/Channel.ts +94 -4
- package/lib/src/core/classes/Effector.ts +2 -0
- package/lib/src/effects/classes/Chorus.ts +3 -0
- package/lib/src/effects/classes/Distortion.ts +14 -1
- package/lib/src/effects/classes/Saturation.ts +3 -1
- package/lib/src/effects/classes/SoftClip.ts +3 -0
- package/lib/src/effects/classes/StereoPanner.ts +3 -1
- package/lib/src/index.ts +1 -0
- package/lib/src/utilities/helpers.ts +28 -6
- package/lib/src/utilities/web-assembly.ts +4 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export declare enum ErrorCodes {
|
|
2
|
-
NO_CONTEXT_PERMISSION = "FLUEXGL@AUDIO_ERROR_0001",
|
|
3
|
-
NO_FILE_TYPE_FOUND = "FLUEXGL@AUDIO_ERROR_0002",
|
|
4
|
-
PATH_TO_FILE_NOT_FOUND = "FLUEXGL@AUDIO_ERROR_0003",
|
|
5
|
-
SAME_MASTER_CHANNEL = "FLUEXGL@AUDIO_ERROR_0004",
|
|
6
|
-
WASM_MODULE_INITIALIZATION_FAILED = "FLUEXGL@AUDIO_ERROR_0005",
|
|
7
|
-
PATH_TO_WASM_FILE_NOT_FOUND = "FLUEXGL@AUDIO_ERROR_0006"
|
|
8
|
-
}
|
|
9
|
-
export declare enum WarningCodes {
|
|
10
|
-
NO_DEFAULT_AUDIO_DEVICE_FOUND = "FLUEXGL@AUDIO_WARNING_0001"
|
|
11
|
-
}
|
|
12
|
-
export declare enum SuccessCodes {
|
|
13
|
-
}
|
|
1
|
+
export declare enum ErrorCodes {
|
|
2
|
+
NO_CONTEXT_PERMISSION = "FLUEXGL@AUDIO_ERROR_0001",
|
|
3
|
+
NO_FILE_TYPE_FOUND = "FLUEXGL@AUDIO_ERROR_0002",
|
|
4
|
+
PATH_TO_FILE_NOT_FOUND = "FLUEXGL@AUDIO_ERROR_0003",
|
|
5
|
+
SAME_MASTER_CHANNEL = "FLUEXGL@AUDIO_ERROR_0004",
|
|
6
|
+
WASM_MODULE_INITIALIZATION_FAILED = "FLUEXGL@AUDIO_ERROR_0005",
|
|
7
|
+
PATH_TO_WASM_FILE_NOT_FOUND = "FLUEXGL@AUDIO_ERROR_0006"
|
|
8
|
+
}
|
|
9
|
+
export declare enum WarningCodes {
|
|
10
|
+
NO_DEFAULT_AUDIO_DEVICE_FOUND = "FLUEXGL@AUDIO_WARNING_0001"
|
|
11
|
+
}
|
|
12
|
+
export declare enum SuccessCodes {
|
|
13
|
+
}
|
|
14
14
|
//# sourceMappingURL=console-codes.d.ts.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
export var ErrorCodes;
|
|
2
|
-
(function (ErrorCodes) {
|
|
3
|
-
ErrorCodes["NO_CONTEXT_PERMISSION"] = "FLUEXGL@AUDIO_ERROR_0001";
|
|
4
|
-
ErrorCodes["NO_FILE_TYPE_FOUND"] = "FLUEXGL@AUDIO_ERROR_0002";
|
|
5
|
-
ErrorCodes["PATH_TO_FILE_NOT_FOUND"] = "FLUEXGL@AUDIO_ERROR_0003";
|
|
6
|
-
ErrorCodes["SAME_MASTER_CHANNEL"] = "FLUEXGL@AUDIO_ERROR_0004";
|
|
7
|
-
ErrorCodes["WASM_MODULE_INITIALIZATION_FAILED"] = "FLUEXGL@AUDIO_ERROR_0005";
|
|
8
|
-
ErrorCodes["PATH_TO_WASM_FILE_NOT_FOUND"] = "FLUEXGL@AUDIO_ERROR_0006";
|
|
9
|
-
})(ErrorCodes || (ErrorCodes = {}));
|
|
10
|
-
export var WarningCodes;
|
|
11
|
-
(function (WarningCodes) {
|
|
12
|
-
WarningCodes["NO_DEFAULT_AUDIO_DEVICE_FOUND"] = "FLUEXGL@AUDIO_WARNING_0001";
|
|
13
|
-
})(WarningCodes || (WarningCodes = {}));
|
|
14
|
-
export var SuccessCodes;
|
|
15
|
-
(function (SuccessCodes) {
|
|
16
|
-
})(SuccessCodes || (SuccessCodes = {}));
|
|
1
|
+
export var ErrorCodes;
|
|
2
|
+
(function (ErrorCodes) {
|
|
3
|
+
ErrorCodes["NO_CONTEXT_PERMISSION"] = "FLUEXGL@AUDIO_ERROR_0001";
|
|
4
|
+
ErrorCodes["NO_FILE_TYPE_FOUND"] = "FLUEXGL@AUDIO_ERROR_0002";
|
|
5
|
+
ErrorCodes["PATH_TO_FILE_NOT_FOUND"] = "FLUEXGL@AUDIO_ERROR_0003";
|
|
6
|
+
ErrorCodes["SAME_MASTER_CHANNEL"] = "FLUEXGL@AUDIO_ERROR_0004";
|
|
7
|
+
ErrorCodes["WASM_MODULE_INITIALIZATION_FAILED"] = "FLUEXGL@AUDIO_ERROR_0005";
|
|
8
|
+
ErrorCodes["PATH_TO_WASM_FILE_NOT_FOUND"] = "FLUEXGL@AUDIO_ERROR_0006";
|
|
9
|
+
})(ErrorCodes || (ErrorCodes = {}));
|
|
10
|
+
export var WarningCodes;
|
|
11
|
+
(function (WarningCodes) {
|
|
12
|
+
WarningCodes["NO_DEFAULT_AUDIO_DEVICE_FOUND"] = "FLUEXGL@AUDIO_WARNING_0001";
|
|
13
|
+
})(WarningCodes || (WarningCodes = {}));
|
|
14
|
+
export var SuccessCodes;
|
|
15
|
+
(function (SuccessCodes) {
|
|
16
|
+
})(SuccessCodes || (SuccessCodes = {}));
|
|
@@ -1,67 +1,63 @@
|
|
|
1
|
-
import { AudioClipAnalyserProperty, AudioClipAnalyserType, AudioClipEventMap, AudioSourceData } from "../../typings";
|
|
2
|
-
import { Channel } from "./Channel";
|
|
3
|
-
export declare class AudioClip {
|
|
4
|
-
data: AudioSourceData;
|
|
5
|
-
id: string;
|
|
6
|
-
hasAttachedToChannel: boolean;
|
|
7
|
-
loop: boolean;
|
|
8
|
-
isPlaying: boolean;
|
|
9
|
-
startTime: number;
|
|
10
|
-
offsetAtStart: number;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
private
|
|
28
|
-
private
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
private
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
get
|
|
59
|
-
get
|
|
60
|
-
get
|
|
61
|
-
get
|
|
62
|
-
|
|
63
|
-
get sampleRate(): number;
|
|
64
|
-
get numberOfChannels(): number;
|
|
65
|
-
get byteLength(): number;
|
|
66
|
-
}
|
|
1
|
+
import { AudioClipAnalyserProperty, AudioClipAnalyserType, AudioClipEventMap, AudioSourceData } from "../../typings";
|
|
2
|
+
import { Channel } from "./Channel";
|
|
3
|
+
export declare class AudioClip {
|
|
4
|
+
data: AudioSourceData;
|
|
5
|
+
id: string;
|
|
6
|
+
hasAttachedToChannel: boolean;
|
|
7
|
+
loop: boolean;
|
|
8
|
+
isPlaying: boolean;
|
|
9
|
+
startTime: number;
|
|
10
|
+
offsetAtStart: number;
|
|
11
|
+
gainNode: GainNode | null;
|
|
12
|
+
stereoPannerNode: StereoPannerNode | null;
|
|
13
|
+
parentialAudioContext: AudioContext | null;
|
|
14
|
+
parentialChannel: Channel | null;
|
|
15
|
+
preAnalyser: AnalyserNode | null;
|
|
16
|
+
postAnalyser: AnalyserNode | null;
|
|
17
|
+
preAnalyserEnabled: boolean;
|
|
18
|
+
postAnalyserEnabled: boolean;
|
|
19
|
+
preAnalyserOptions: AnalyserOptions;
|
|
20
|
+
postAnalyserOptions: AnalyserOptions;
|
|
21
|
+
preAnalyserFloatArrayBuffer: Float32Array;
|
|
22
|
+
postAnalyserFloatArrayBuffer: Float32Array;
|
|
23
|
+
preAnalyserByteArrayBuffer: Uint8Array;
|
|
24
|
+
postAnalyserByteArrayBuffer: Uint8Array;
|
|
25
|
+
private audioBufferSourceNodes;
|
|
26
|
+
private maxAudioBufferSourceNodes;
|
|
27
|
+
private progressInterval;
|
|
28
|
+
private events;
|
|
29
|
+
constructor(data: AudioSourceData);
|
|
30
|
+
private createBufferSource;
|
|
31
|
+
private connectSourcesTo;
|
|
32
|
+
private safeDisconnect;
|
|
33
|
+
private rebuildNodeChain;
|
|
34
|
+
InitializeAudioClipOnAttaching(channel: Channel): AudioClip | null;
|
|
35
|
+
Play(timestamp?: number, offset?: number): AudioClip | null;
|
|
36
|
+
Stop(): AudioClip | null;
|
|
37
|
+
SetVolume(volume: number): AudioClip | void;
|
|
38
|
+
SetPanLevel(panLevel: number): AudioClip | void;
|
|
39
|
+
Loop(loop?: boolean): AudioClip;
|
|
40
|
+
SetMaxAudioBufferSourceNodes(value: number): AudioClip;
|
|
41
|
+
DisconnectAllAudioBufferSourceNodes(): boolean;
|
|
42
|
+
AddEventListener<K extends keyof AudioClipEventMap>(event: K, cb: AudioClipEventMap[K]): () => void;
|
|
43
|
+
Once<K extends keyof AudioClipEventMap>(event: K, cb: AudioClipEventMap[K]): () => void;
|
|
44
|
+
RemoveEventListener<K extends keyof AudioClipEventMap>(event: K, cb: AudioClipEventMap[K]): AudioClip;
|
|
45
|
+
ClearEventListeners(event?: keyof AudioClipEventMap): AudioClip;
|
|
46
|
+
GetChannelData(channel?: number): Float32Array;
|
|
47
|
+
EnablePreAnalyser(): boolean;
|
|
48
|
+
DisablePreAnalyser(): boolean;
|
|
49
|
+
EnablePostAnalyser(): boolean;
|
|
50
|
+
DisablePostAnalyser(): boolean;
|
|
51
|
+
SetPreAnalyserOptions(options: AnalyserOptions): void;
|
|
52
|
+
SetPostAnalyserOptions(options: AnalyserOptions): void;
|
|
53
|
+
SetAnalyserOption(analyserType: AudioClipAnalyserType, property: AudioClipAnalyserProperty, value: number): boolean;
|
|
54
|
+
GetWaveformFloatData(analyserType: AudioClipAnalyserType): Float32Array | null;
|
|
55
|
+
GetWaveformByteData(analyserType: AudioClipAnalyserType): Uint8Array | null;
|
|
56
|
+
get currentPlaybackTime(): number;
|
|
57
|
+
get duration(): number;
|
|
58
|
+
get formattedDuration(): string;
|
|
59
|
+
get sampleRate(): number;
|
|
60
|
+
get numberOfChannels(): number;
|
|
61
|
+
get byteLength(): number;
|
|
62
|
+
}
|
|
67
63
|
//# sourceMappingURL=AudioClip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioClip.d.ts","sourceRoot":"","sources":["../../../src/core/classes/AudioClip.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,iBAAiB,EAAmB,eAAe,EAAE,MAAM,eAAe,CAAC;AAEtI,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,qBAAa,SAAS;
|
|
1
|
+
{"version":3,"file":"AudioClip.d.ts","sourceRoot":"","sources":["../../../src/core/classes/AudioClip.ts"],"names":[],"mappings":"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"}
|