@debuffjp/audio 0.0.0-stage → 0.1.1
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 +21 -2
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -4
package/README.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @debuffjp/audio
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A small Web Audio facade: music and SFX buses, autoplay unlock on the first gesture, buffer playback with pitch variation, and an asset-free synth for placeholder or stylised SFX. No dependencies.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { Audio } from "@debuffjp/audio";
|
|
7
|
+
|
|
8
|
+
const audio = new Audio();
|
|
9
|
+
await audio.decode("coin", assets.audio("coin"));
|
|
10
|
+
|
|
11
|
+
audio.play("coin", { volume: 0.8, rateJitter: 0.05 });
|
|
12
|
+
audio.synth({ freq: 660, freqEnd: 220, decay: 0.15 }); // no file needed
|
|
13
|
+
audio.volume("music", 0.5);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## API
|
|
17
|
+
|
|
18
|
+
- `decode(id, arrayBuffer)`, `has(id)`
|
|
19
|
+
- `play(id, { bus, volume, rate, rateJitter, pan, loop })` → `Voice`
|
|
20
|
+
- `synth({ wave, freq, freqEnd, attack, decay, volume, bus })` → `Voice` (`wave`: any `OscillatorType` or `"noise"`)
|
|
21
|
+
- `voice.stop(fadeSeconds?)`
|
|
22
|
+
- `volume("sfx" | "music" | "master", value)`, `unlocked`, `ctx` (the underlying `AudioContext`)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Web Audio facade: decoded buffers, music/sfx buses, autoplay unlock, and a tiny
|
|
2
|
+
* parametric synth for placeholder or stylised sound effects. */
|
|
3
|
+
export type Bus = "sfx" | "music";
|
|
4
|
+
export interface PlayOptions {
|
|
5
|
+
bus?: Bus;
|
|
6
|
+
volume?: number;
|
|
7
|
+
/** Playback rate; 1 = original pitch. */
|
|
8
|
+
rate?: number;
|
|
9
|
+
/** Random ± variation added to rate, for less repetitive SFX. */
|
|
10
|
+
rateJitter?: number;
|
|
11
|
+
/** Stereo pan in [-1, 1]. */
|
|
12
|
+
pan?: number;
|
|
13
|
+
loop?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface Voice {
|
|
16
|
+
stop(fadeSeconds?: number): void;
|
|
17
|
+
}
|
|
18
|
+
export interface StreamOptions {
|
|
19
|
+
/** Default "music". */
|
|
20
|
+
bus?: Bus;
|
|
21
|
+
volume?: number;
|
|
22
|
+
/** Default true. */
|
|
23
|
+
loop?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** A streamed track. */
|
|
26
|
+
export interface Stream extends Voice {
|
|
27
|
+
readonly element: HTMLAudioElement;
|
|
28
|
+
pause(): void;
|
|
29
|
+
resume(): void;
|
|
30
|
+
volume(value: number, fadeSeconds?: number): void;
|
|
31
|
+
}
|
|
32
|
+
export interface SynthOptions {
|
|
33
|
+
wave?: OscillatorType | "noise";
|
|
34
|
+
/** Start and end frequency in Hz (exponential slide). */
|
|
35
|
+
freq: number;
|
|
36
|
+
freqEnd?: number;
|
|
37
|
+
attack?: number;
|
|
38
|
+
decay: number;
|
|
39
|
+
volume?: number;
|
|
40
|
+
bus?: Bus;
|
|
41
|
+
}
|
|
42
|
+
export declare class Audio {
|
|
43
|
+
readonly ctx: AudioContext;
|
|
44
|
+
private readonly buses;
|
|
45
|
+
private readonly master;
|
|
46
|
+
private readonly buffers;
|
|
47
|
+
private noise;
|
|
48
|
+
constructor();
|
|
49
|
+
get unlocked(): boolean;
|
|
50
|
+
decode(id: string, data: ArrayBuffer): Promise<void>;
|
|
51
|
+
has(id: string): boolean;
|
|
52
|
+
play(id: string, options?: PlayOptions): Voice;
|
|
53
|
+
/** Synthesize a short blip/zap/hit without any asset. */
|
|
54
|
+
synth(o: SynthOptions): Voice;
|
|
55
|
+
/**
|
|
56
|
+
* Stream a long track (music, ambience) through an `<audio>` element into a bus. Unlike `play`, it
|
|
57
|
+
* isn't decoded into memory up front, so it starts immediately and stays light on mobile.
|
|
58
|
+
* If audio is still locked by the browser's autoplay policy, playback starts on the first gesture.
|
|
59
|
+
*/
|
|
60
|
+
stream(url: string, options?: StreamOptions): Stream;
|
|
61
|
+
volume(bus: Bus | "master", value: number): void;
|
|
62
|
+
private voice;
|
|
63
|
+
private noiseBuffer;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;kEACkE;AAClE,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,OAAO,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAwB;AACxB,MAAM,WAAW,MAAO,SAAQ,KAAK;IACnC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAChC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED,qBAAa,KAAK;IAChB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,KAAK,CAA0B;IAEvC,cAiBC;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvB;IAED,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,KAAK,CAiBjD;IAED,yDAAyD;IACzD,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,KAAK,CA6B5B;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA2CvD;IAED,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG/C;IAED,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,WAAW;CASpB"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
export class Audio {
|
|
2
|
+
ctx;
|
|
3
|
+
buses;
|
|
4
|
+
master;
|
|
5
|
+
buffers = new Map();
|
|
6
|
+
noise;
|
|
7
|
+
constructor() {
|
|
8
|
+
this.ctx = new AudioContext();
|
|
9
|
+
this.master = this.ctx.createGain();
|
|
10
|
+
this.master.connect(this.ctx.destination);
|
|
11
|
+
this.buses = { sfx: this.ctx.createGain(), music: this.ctx.createGain() };
|
|
12
|
+
this.buses.sfx.connect(this.master);
|
|
13
|
+
this.buses.music.connect(this.master);
|
|
14
|
+
// Browsers start the context suspended until a user gesture.
|
|
15
|
+
const unlock = () => {
|
|
16
|
+
void this.ctx.resume();
|
|
17
|
+
if (this.ctx.state === "running") {
|
|
18
|
+
removeEventListener("pointerdown", unlock);
|
|
19
|
+
removeEventListener("keydown", unlock);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
addEventListener("pointerdown", unlock);
|
|
23
|
+
addEventListener("keydown", unlock);
|
|
24
|
+
}
|
|
25
|
+
get unlocked() {
|
|
26
|
+
return this.ctx.state === "running";
|
|
27
|
+
}
|
|
28
|
+
async decode(id, data) {
|
|
29
|
+
// decodeAudioData detaches its input; copy so the asset cache stays usable.
|
|
30
|
+
this.buffers.set(id, await this.ctx.decodeAudioData(data.slice(0)));
|
|
31
|
+
}
|
|
32
|
+
has(id) {
|
|
33
|
+
return this.buffers.has(id);
|
|
34
|
+
}
|
|
35
|
+
play(id, options = {}) {
|
|
36
|
+
const buffer = this.buffers.get(id);
|
|
37
|
+
if (!buffer)
|
|
38
|
+
throw new Error(`Audio "${id}" not decoded. Call audio.decode("${id}", assets.audio("${id}")) first.`);
|
|
39
|
+
const src = this.ctx.createBufferSource();
|
|
40
|
+
src.buffer = buffer;
|
|
41
|
+
src.loop = options.loop ?? false;
|
|
42
|
+
src.playbackRate.value = (options.rate ?? 1) + (options.rateJitter ?? 0) * (Math.random() * 2 - 1);
|
|
43
|
+
const gain = this.ctx.createGain();
|
|
44
|
+
gain.gain.value = options.volume ?? 1;
|
|
45
|
+
const pan = this.ctx.createStereoPanner();
|
|
46
|
+
pan.pan.value = options.pan ?? 0;
|
|
47
|
+
src
|
|
48
|
+
.connect(gain)
|
|
49
|
+
.connect(pan)
|
|
50
|
+
.connect(this.buses[options.bus ?? "sfx"]);
|
|
51
|
+
src.start();
|
|
52
|
+
return this.voice(src, gain);
|
|
53
|
+
}
|
|
54
|
+
/** Synthesize a short blip/zap/hit without any asset. */
|
|
55
|
+
synth(o) {
|
|
56
|
+
const t = this.ctx.currentTime;
|
|
57
|
+
const attack = o.attack ?? 0.005;
|
|
58
|
+
const gain = this.ctx.createGain();
|
|
59
|
+
gain.gain.setValueAtTime(0, t);
|
|
60
|
+
gain.gain.linearRampToValueAtTime(o.volume ?? 0.3, t + attack);
|
|
61
|
+
gain.gain.exponentialRampToValueAtTime(0.0001, t + attack + o.decay);
|
|
62
|
+
gain.connect(this.buses[o.bus ?? "sfx"]);
|
|
63
|
+
let src;
|
|
64
|
+
if (o.wave === "noise") {
|
|
65
|
+
const n = this.ctx.createBufferSource();
|
|
66
|
+
n.buffer = this.noiseBuffer();
|
|
67
|
+
const filter = this.ctx.createBiquadFilter();
|
|
68
|
+
filter.type = "bandpass";
|
|
69
|
+
filter.frequency.setValueAtTime(o.freq, t);
|
|
70
|
+
if (o.freqEnd)
|
|
71
|
+
filter.frequency.exponentialRampToValueAtTime(Math.max(o.freqEnd, 1), t + attack + o.decay);
|
|
72
|
+
n.connect(filter).connect(gain);
|
|
73
|
+
src = n;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const osc = this.ctx.createOscillator();
|
|
77
|
+
osc.type = o.wave ?? "square";
|
|
78
|
+
osc.frequency.setValueAtTime(o.freq, t);
|
|
79
|
+
if (o.freqEnd)
|
|
80
|
+
osc.frequency.exponentialRampToValueAtTime(Math.max(o.freqEnd, 1), t + attack + o.decay);
|
|
81
|
+
osc.connect(gain);
|
|
82
|
+
src = osc;
|
|
83
|
+
}
|
|
84
|
+
src.start(t);
|
|
85
|
+
src.stop(t + attack + o.decay + 0.05);
|
|
86
|
+
return this.voice(src, gain);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Stream a long track (music, ambience) through an `<audio>` element into a bus. Unlike `play`, it
|
|
90
|
+
* isn't decoded into memory up front, so it starts immediately and stays light on mobile.
|
|
91
|
+
* If audio is still locked by the browser's autoplay policy, playback starts on the first gesture.
|
|
92
|
+
*/
|
|
93
|
+
stream(url, options = {}) {
|
|
94
|
+
const el = new globalThis.Audio();
|
|
95
|
+
el.crossOrigin = "anonymous";
|
|
96
|
+
el.preload = "auto";
|
|
97
|
+
el.loop = options.loop ?? true;
|
|
98
|
+
el.src = url;
|
|
99
|
+
const gain = this.ctx.createGain();
|
|
100
|
+
gain.gain.value = options.volume ?? 1;
|
|
101
|
+
this.ctx
|
|
102
|
+
.createMediaElementSource(el)
|
|
103
|
+
.connect(gain)
|
|
104
|
+
.connect(this.buses[options.bus ?? "music"]);
|
|
105
|
+
let wanted = true;
|
|
106
|
+
const start = () => {
|
|
107
|
+
if (wanted)
|
|
108
|
+
el.play().catch(() => this.ctx.addEventListener("statechange", start, { once: true }));
|
|
109
|
+
};
|
|
110
|
+
start();
|
|
111
|
+
return {
|
|
112
|
+
element: el,
|
|
113
|
+
pause: () => {
|
|
114
|
+
wanted = false;
|
|
115
|
+
el.pause();
|
|
116
|
+
},
|
|
117
|
+
resume: () => {
|
|
118
|
+
wanted = true;
|
|
119
|
+
start();
|
|
120
|
+
},
|
|
121
|
+
volume: (value, fadeSeconds = 0) => {
|
|
122
|
+
if (fadeSeconds > 0)
|
|
123
|
+
gain.gain.setTargetAtTime(value, this.ctx.currentTime, fadeSeconds / 3);
|
|
124
|
+
else
|
|
125
|
+
gain.gain.value = value;
|
|
126
|
+
},
|
|
127
|
+
stop: (fadeSeconds = 0) => {
|
|
128
|
+
wanted = false;
|
|
129
|
+
const end = () => {
|
|
130
|
+
el.pause();
|
|
131
|
+
el.removeAttribute("src");
|
|
132
|
+
el.load();
|
|
133
|
+
};
|
|
134
|
+
if (fadeSeconds <= 0)
|
|
135
|
+
return end();
|
|
136
|
+
gain.gain.setTargetAtTime(0, this.ctx.currentTime, fadeSeconds / 3);
|
|
137
|
+
setTimeout(end, fadeSeconds * 1000);
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
volume(bus, value) {
|
|
142
|
+
const node = bus === "master" ? this.master : this.buses[bus];
|
|
143
|
+
node.gain.setTargetAtTime(value, this.ctx.currentTime, 0.02);
|
|
144
|
+
}
|
|
145
|
+
voice(src, gain) {
|
|
146
|
+
return {
|
|
147
|
+
stop: (fade = 0) => {
|
|
148
|
+
const t = this.ctx.currentTime;
|
|
149
|
+
if (fade > 0) {
|
|
150
|
+
gain.gain.setTargetAtTime(0, t, fade / 3);
|
|
151
|
+
src.stop(t + fade);
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
src.stop();
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
noiseBuffer() {
|
|
159
|
+
if (!this.noise) {
|
|
160
|
+
const len = this.ctx.sampleRate;
|
|
161
|
+
this.noise = this.ctx.createBuffer(1, len, this.ctx.sampleRate);
|
|
162
|
+
const data = this.noise.getChannelData(0);
|
|
163
|
+
for (let i = 0; i < len; i++)
|
|
164
|
+
data[i] = Math.random() * 2 - 1;
|
|
165
|
+
}
|
|
166
|
+
return this.noise;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@debuffjp/audio",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Web Audio facade with buses, autoplay unlock and a tiny synth for debuff",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"game",
|
|
7
|
+
"audio",
|
|
8
|
+
"web-audio",
|
|
9
|
+
"sfx",
|
|
10
|
+
"debuff"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"homepage": "https://debuff.jp",
|
|
14
|
+
"bugs": "https://github.com/debuffjp/debuff/issues",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/debuffjp/debuff.git",
|
|
18
|
+
"directory": "packages/audio"
|
|
19
|
+
},
|
|
20
|
+
"type": "module",
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"default": "./dist/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -b"
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public",
|
|
39
|
+
"provenance": false
|
|
40
|
+
}
|
|
41
|
+
}
|