@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 CHANGED
@@ -1,3 +1,22 @@
1
- # Temporary Holding Version
1
+ # @debuffjp/audio
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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`)
@@ -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.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
+ }