waa-play 0.1.0

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 (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/dist/adapters.cjs +28 -0
  4. package/dist/adapters.cjs.map +1 -0
  5. package/dist/adapters.d.cts +42 -0
  6. package/dist/adapters.d.ts +42 -0
  7. package/dist/adapters.js +3 -0
  8. package/dist/adapters.js.map +1 -0
  9. package/dist/buffer.cjs +24 -0
  10. package/dist/buffer.cjs.map +1 -0
  11. package/dist/buffer.d.cts +34 -0
  12. package/dist/buffer.d.ts +34 -0
  13. package/dist/buffer.js +3 -0
  14. package/dist/buffer.js.map +1 -0
  15. package/dist/chunk-2DL7CAEP.js +69 -0
  16. package/dist/chunk-2DL7CAEP.js.map +1 -0
  17. package/dist/chunk-37CPPRLV.js +24 -0
  18. package/dist/chunk-37CPPRLV.js.map +1 -0
  19. package/dist/chunk-4LNVRSTM.cjs +72 -0
  20. package/dist/chunk-4LNVRSTM.cjs.map +1 -0
  21. package/dist/chunk-5J7S6QV3.cjs +44 -0
  22. package/dist/chunk-5J7S6QV3.cjs.map +1 -0
  23. package/dist/chunk-6UTN73HG.cjs +29 -0
  24. package/dist/chunk-6UTN73HG.cjs.map +1 -0
  25. package/dist/chunk-AGP2IRC6.js +63 -0
  26. package/dist/chunk-AGP2IRC6.js.map +1 -0
  27. package/dist/chunk-C2ASIYN5.js +67 -0
  28. package/dist/chunk-C2ASIYN5.js.map +1 -0
  29. package/dist/chunk-CJJC6ASU.js +73 -0
  30. package/dist/chunk-CJJC6ASU.js.map +1 -0
  31. package/dist/chunk-CPAT75WD.cjs +60 -0
  32. package/dist/chunk-CPAT75WD.cjs.map +1 -0
  33. package/dist/chunk-CRODJ4KS.js +71 -0
  34. package/dist/chunk-CRODJ4KS.js.map +1 -0
  35. package/dist/chunk-D5CD5KQZ.cjs +72 -0
  36. package/dist/chunk-D5CD5KQZ.cjs.map +1 -0
  37. package/dist/chunk-GYH2JSCY.js +42 -0
  38. package/dist/chunk-GYH2JSCY.js.map +1 -0
  39. package/dist/chunk-HTGOHC73.cjs +69 -0
  40. package/dist/chunk-HTGOHC73.cjs.map +1 -0
  41. package/dist/chunk-LETS7FKB.js +33 -0
  42. package/dist/chunk-LETS7FKB.js.map +1 -0
  43. package/dist/chunk-M5PDY5EZ.cjs +84 -0
  44. package/dist/chunk-M5PDY5EZ.cjs.map +1 -0
  45. package/dist/chunk-PZE6HTZR.cjs +358 -0
  46. package/dist/chunk-PZE6HTZR.cjs.map +1 -0
  47. package/dist/chunk-QFFQQMU4.cjs +75 -0
  48. package/dist/chunk-QFFQQMU4.cjs.map +1 -0
  49. package/dist/chunk-QWNV2BZ5.cjs +37 -0
  50. package/dist/chunk-QWNV2BZ5.cjs.map +1 -0
  51. package/dist/chunk-RWJ4EWJT.js +356 -0
  52. package/dist/chunk-RWJ4EWJT.js.map +1 -0
  53. package/dist/chunk-T74FBKTY.js +55 -0
  54. package/dist/chunk-T74FBKTY.js.map +1 -0
  55. package/dist/chunk-TULV7V5M.cjs +1710 -0
  56. package/dist/chunk-TULV7V5M.cjs.map +1 -0
  57. package/dist/chunk-V2QX5K42.js +1708 -0
  58. package/dist/chunk-V2QX5K42.js.map +1 -0
  59. package/dist/context.cjs +24 -0
  60. package/dist/context.cjs.map +1 -0
  61. package/dist/context.d.cts +27 -0
  62. package/dist/context.d.ts +27 -0
  63. package/dist/context.js +3 -0
  64. package/dist/context.js.map +1 -0
  65. package/dist/emitter.cjs +12 -0
  66. package/dist/emitter.cjs.map +1 -0
  67. package/dist/emitter.d.cts +24 -0
  68. package/dist/emitter.d.ts +24 -0
  69. package/dist/emitter.js +3 -0
  70. package/dist/emitter.js.map +1 -0
  71. package/dist/engine-5JK2FCNL.cjs +13 -0
  72. package/dist/engine-5JK2FCNL.cjs.map +1 -0
  73. package/dist/engine-M2U4LE3F.js +4 -0
  74. package/dist/engine-M2U4LE3F.js.map +1 -0
  75. package/dist/fade.cjs +24 -0
  76. package/dist/fade.cjs.map +1 -0
  77. package/dist/fade.d.cts +21 -0
  78. package/dist/fade.d.ts +21 -0
  79. package/dist/fade.js +3 -0
  80. package/dist/fade.js.map +1 -0
  81. package/dist/index.cjs +165 -0
  82. package/dist/index.cjs.map +1 -0
  83. package/dist/index.d.cts +11 -0
  84. package/dist/index.d.ts +11 -0
  85. package/dist/index.js +12 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/nodes.cjs +48 -0
  88. package/dist/nodes.cjs.map +1 -0
  89. package/dist/nodes.d.cts +61 -0
  90. package/dist/nodes.d.ts +61 -0
  91. package/dist/nodes.js +3 -0
  92. package/dist/nodes.js.map +1 -0
  93. package/dist/play.cjs +13 -0
  94. package/dist/play.cjs.map +1 -0
  95. package/dist/play.d.cts +19 -0
  96. package/dist/play.d.ts +19 -0
  97. package/dist/play.js +4 -0
  98. package/dist/play.js.map +1 -0
  99. package/dist/scheduler.cjs +16 -0
  100. package/dist/scheduler.cjs.map +1 -0
  101. package/dist/scheduler.d.cts +39 -0
  102. package/dist/scheduler.d.ts +39 -0
  103. package/dist/scheduler.js +3 -0
  104. package/dist/scheduler.js.map +1 -0
  105. package/dist/stretcher.cjs +13 -0
  106. package/dist/stretcher.cjs.map +1 -0
  107. package/dist/stretcher.d.cts +171 -0
  108. package/dist/stretcher.d.ts +171 -0
  109. package/dist/stretcher.js +4 -0
  110. package/dist/stretcher.js.map +1 -0
  111. package/dist/synth.cjs +20 -0
  112. package/dist/synth.cjs.map +1 -0
  113. package/dist/synth.d.cts +15 -0
  114. package/dist/synth.d.ts +15 -0
  115. package/dist/synth.js +3 -0
  116. package/dist/synth.js.map +1 -0
  117. package/dist/types-DUrbEbPl.d.cts +177 -0
  118. package/dist/types-DUrbEbPl.d.ts +177 -0
  119. package/dist/waveform.cjs +20 -0
  120. package/dist/waveform.cjs.map +1 -0
  121. package/dist/waveform.d.cts +22 -0
  122. package/dist/waveform.d.ts +22 -0
  123. package/dist/waveform.js +3 -0
  124. package/dist/waveform.js.map +1 -0
  125. package/package.json +123 -0
@@ -0,0 +1,177 @@
1
+ /** Possible states of a Playback instance. */
2
+ type PlaybackState = "playing" | "paused" | "stopped";
3
+ /** Options accepted by `play()`. */
4
+ interface PlayOptions {
5
+ /** Start offset in seconds within the buffer. @default 0 */
6
+ offset?: number;
7
+ /** Whether the source should loop. @default false */
8
+ loop?: boolean;
9
+ /** Loop region start in seconds. */
10
+ loopStart?: number;
11
+ /** Loop region end in seconds. */
12
+ loopEnd?: number;
13
+ /** Playback speed multiplier. @default 1 */
14
+ playbackRate?: number;
15
+ /**
16
+ * A chain of AudioNodes the source should route through before reaching the
17
+ * destination. The first node receives the source output; the last node is
18
+ * connected to `destination`.
19
+ */
20
+ through?: AudioNode[];
21
+ /**
22
+ * Final destination node. Defaults to `ctx.destination`.
23
+ */
24
+ destination?: AudioNode;
25
+ /**
26
+ * Interval (ms) for `timeupdate` events. @default 50
27
+ */
28
+ timeupdateInterval?: number;
29
+ /**
30
+ * Enable pitch-preserving time-stretch via WSOLA.
31
+ * When true, `playbackRate` controls tempo without changing pitch.
32
+ * @default true
33
+ */
34
+ preservePitch?: boolean;
35
+ }
36
+ /** Stretcher snapshot extension (re-declared here to avoid static import). */
37
+ interface StretcherSnapshotExtension {
38
+ tempo: number;
39
+ converting: boolean;
40
+ conversionProgress: number;
41
+ bufferHealth: "healthy" | "low" | "critical" | "empty";
42
+ aheadSeconds: number;
43
+ buffering: boolean;
44
+ chunkStates: ("pending" | "queued" | "converting" | "ready" | "failed" | "skipped" | "evicted")[];
45
+ currentChunkIndex: number;
46
+ activeWindowStart: number;
47
+ activeWindowEnd: number;
48
+ totalChunks: number;
49
+ windowConversionProgress: number;
50
+ }
51
+ /** An immutable snapshot of a Playback's current state. */
52
+ interface PlaybackSnapshot {
53
+ state: PlaybackState;
54
+ position: number;
55
+ duration: number;
56
+ progress: number;
57
+ stretcher?: StretcherSnapshotExtension;
58
+ }
59
+ /** Event map emitted by a Playback instance. */
60
+ interface PlaybackEventMap {
61
+ play: void;
62
+ pause: void;
63
+ resume: void;
64
+ seek: {
65
+ position: number;
66
+ };
67
+ stop: void;
68
+ ended: void;
69
+ loop: void;
70
+ statechange: {
71
+ state: PlaybackState;
72
+ };
73
+ timeupdate: {
74
+ position: number;
75
+ duration: number;
76
+ };
77
+ buffering: {
78
+ reason: "initial" | "seek" | "tempo-change" | "underrun";
79
+ };
80
+ buffered: {
81
+ stallDuration: number;
82
+ };
83
+ }
84
+ /** The object returned by `play()`. */
85
+ interface Playback {
86
+ /** Current playback state. */
87
+ getState(): PlaybackState;
88
+ /** Current playback position in seconds (AudioContext‑accurate). */
89
+ getCurrentTime(): number;
90
+ /** Total duration of the underlying buffer in seconds. */
91
+ getDuration(): number;
92
+ /** Current progress as a ratio 0 – 1. */
93
+ getProgress(): number;
94
+ pause(): void;
95
+ resume(): void;
96
+ togglePlayPause(): void;
97
+ seek(position: number): void;
98
+ stop(): void;
99
+ setPlaybackRate(rate: number): void;
100
+ setLoop(loop: boolean): void;
101
+ /** Subscribe to a playback event. Returns an unsubscribe function. */
102
+ on<K extends keyof PlaybackEventMap>(event: K, handler: (data: PlaybackEventMap[K]) => void): () => void;
103
+ /** Unsubscribe a previously registered handler. */
104
+ off<K extends keyof PlaybackEventMap>(event: K, handler: (data: PlaybackEventMap[K]) => void): void;
105
+ /** Release all resources (source node, timers, listeners). */
106
+ dispose(): void;
107
+ }
108
+ /** Options for `loadBuffer`. */
109
+ interface LoadBufferOptions {
110
+ /** Progress callback receiving a value between 0 and 1 (if available). */
111
+ onProgress?: (progress: number) => void;
112
+ }
113
+ /** Information about an AudioBuffer. */
114
+ interface BufferInfo {
115
+ duration: number;
116
+ numberOfChannels: number;
117
+ sampleRate: number;
118
+ length: number;
119
+ }
120
+ /** Options for waveform extraction functions. */
121
+ interface ExtractPeaksOptions {
122
+ /** Number of output data points. @default 200 */
123
+ resolution?: number;
124
+ /** Channel index to analyze. @default 0 */
125
+ channel?: number;
126
+ }
127
+ /** A min/max pair representing a single segment of the waveform. */
128
+ interface PeakPair {
129
+ min: number;
130
+ max: number;
131
+ }
132
+ /** Curve types for fade operations. */
133
+ type FadeCurve = "linear" | "exponential" | "equal-power";
134
+ /** Options for fade functions. */
135
+ interface FadeOptions {
136
+ /** Duration of the fade in seconds. @default 1 */
137
+ duration?: number;
138
+ /** Easing curve. @default "linear" */
139
+ curve?: FadeCurve;
140
+ }
141
+ /** Options for crossfade. */
142
+ interface CrossfadeOptions extends FadeOptions {
143
+ }
144
+ /** Options for autoFade. */
145
+ interface AutoFadeOptions {
146
+ /** Fade-in duration at the start in seconds. @default 0 */
147
+ fadeIn?: number;
148
+ /** Fade-out duration before the end in seconds. @default 0 */
149
+ fadeOut?: number;
150
+ /** Curve for both fades. @default "linear" */
151
+ curve?: FadeCurve;
152
+ }
153
+ /** Options for `createScheduler`. */
154
+ interface SchedulerOptions {
155
+ /** How far ahead (seconds) to schedule events. @default 0.1 */
156
+ lookahead?: number;
157
+ /** Interval (ms) between scheduler ticks. @default 25 */
158
+ interval?: number;
159
+ }
160
+ /** A scheduled event entry. */
161
+ interface ScheduledEvent {
162
+ id: string;
163
+ time: number;
164
+ callback: (time: number) => void;
165
+ }
166
+ /** Options for `createClock`. */
167
+ interface ClockOptions {
168
+ /** Beats per minute. @default 120 */
169
+ bpm?: number;
170
+ }
171
+ /** Options for `createContext`. */
172
+ interface CreateContextOptions {
173
+ sampleRate?: number;
174
+ latencyHint?: AudioContextLatencyCategory | number;
175
+ }
176
+
177
+ export type { AutoFadeOptions as A, BufferInfo as B, ClockOptions as C, ExtractPeaksOptions as E, FadeCurve as F, LoadBufferOptions as L, PeakPair as P, ScheduledEvent as S, CreateContextOptions as a, CrossfadeOptions as b, FadeOptions as c, PlayOptions as d, Playback as e, PlaybackEventMap as f, PlaybackSnapshot as g, PlaybackState as h, SchedulerOptions as i, StretcherSnapshotExtension as j };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var chunkQFFQQMU4_cjs = require('./chunk-QFFQQMU4.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "extractPeakPairs", {
8
+ enumerable: true,
9
+ get: function () { return chunkQFFQQMU4_cjs.extractPeakPairs; }
10
+ });
11
+ Object.defineProperty(exports, "extractPeaks", {
12
+ enumerable: true,
13
+ get: function () { return chunkQFFQQMU4_cjs.extractPeaks; }
14
+ });
15
+ Object.defineProperty(exports, "extractRMS", {
16
+ enumerable: true,
17
+ get: function () { return chunkQFFQQMU4_cjs.extractRMS; }
18
+ });
19
+ //# sourceMappingURL=waveform.cjs.map
20
+ //# sourceMappingURL=waveform.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"waveform.cjs"}
@@ -0,0 +1,22 @@
1
+ import { E as ExtractPeaksOptions, P as PeakPair } from './types-DUrbEbPl.cjs';
2
+
3
+ /**
4
+ * Extract normalised peak amplitude values from an `AudioBuffer`.
5
+ * Returns an array of numbers in the range `[0, 1]`.
6
+ */
7
+ declare function extractPeaks(buffer: AudioBuffer, options?: ExtractPeaksOptions): number[];
8
+ /**
9
+ * Extract min/max peak pairs for detailed waveform rendering.
10
+ */
11
+ declare function extractPeakPairs(buffer: AudioBuffer, options?: ExtractPeaksOptions): PeakPair[];
12
+ /**
13
+ * Extract RMS (root mean square) values representing perceived loudness.
14
+ * Returns values in the range `[0, 1]`.
15
+ *
16
+ * When `channel` is set to `-1`, all channels are averaged.
17
+ */
18
+ declare function extractRMS(buffer: AudioBuffer, options?: ExtractPeaksOptions & {
19
+ channel?: number;
20
+ }): number[];
21
+
22
+ export { extractPeakPairs, extractPeaks, extractRMS };
@@ -0,0 +1,22 @@
1
+ import { E as ExtractPeaksOptions, P as PeakPair } from './types-DUrbEbPl.js';
2
+
3
+ /**
4
+ * Extract normalised peak amplitude values from an `AudioBuffer`.
5
+ * Returns an array of numbers in the range `[0, 1]`.
6
+ */
7
+ declare function extractPeaks(buffer: AudioBuffer, options?: ExtractPeaksOptions): number[];
8
+ /**
9
+ * Extract min/max peak pairs for detailed waveform rendering.
10
+ */
11
+ declare function extractPeakPairs(buffer: AudioBuffer, options?: ExtractPeaksOptions): PeakPair[];
12
+ /**
13
+ * Extract RMS (root mean square) values representing perceived loudness.
14
+ * Returns values in the range `[0, 1]`.
15
+ *
16
+ * When `channel` is set to `-1`, all channels are averaged.
17
+ */
18
+ declare function extractRMS(buffer: AudioBuffer, options?: ExtractPeaksOptions & {
19
+ channel?: number;
20
+ }): number[];
21
+
22
+ export { extractPeakPairs, extractPeaks, extractRMS };
@@ -0,0 +1,3 @@
1
+ export { extractPeakPairs, extractPeaks, extractRMS } from './chunk-CRODJ4KS.js';
2
+ //# sourceMappingURL=waveform.js.map
3
+ //# sourceMappingURL=waveform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"waveform.js"}
package/package.json ADDED
@@ -0,0 +1,123 @@
1
+ {
2
+ "name": "waa-play",
3
+ "version": "0.1.0",
4
+ "description": "Composable Web Audio API utilities. BYO AudioContext. Framework-agnostic. Sample-accurate. Pitch-preserving time-stretch.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./context": {
21
+ "import": {
22
+ "types": "./dist/context.d.ts",
23
+ "default": "./dist/context.js"
24
+ }
25
+ },
26
+ "./buffer": {
27
+ "import": {
28
+ "types": "./dist/buffer.d.ts",
29
+ "default": "./dist/buffer.js"
30
+ }
31
+ },
32
+ "./play": {
33
+ "import": {
34
+ "types": "./dist/play.d.ts",
35
+ "default": "./dist/play.js"
36
+ }
37
+ },
38
+ "./emitter": {
39
+ "import": {
40
+ "types": "./dist/emitter.d.ts",
41
+ "default": "./dist/emitter.js"
42
+ }
43
+ },
44
+ "./nodes": {
45
+ "import": {
46
+ "types": "./dist/nodes.d.ts",
47
+ "default": "./dist/nodes.js"
48
+ }
49
+ },
50
+ "./waveform": {
51
+ "import": {
52
+ "types": "./dist/waveform.d.ts",
53
+ "default": "./dist/waveform.js"
54
+ }
55
+ },
56
+ "./fade": {
57
+ "import": {
58
+ "types": "./dist/fade.d.ts",
59
+ "default": "./dist/fade.js"
60
+ }
61
+ },
62
+ "./scheduler": {
63
+ "import": {
64
+ "types": "./dist/scheduler.d.ts",
65
+ "default": "./dist/scheduler.js"
66
+ }
67
+ },
68
+ "./synth": {
69
+ "import": {
70
+ "types": "./dist/synth.d.ts",
71
+ "default": "./dist/synth.js"
72
+ }
73
+ },
74
+ "./adapters": {
75
+ "import": {
76
+ "types": "./dist/adapters.d.ts",
77
+ "default": "./dist/adapters.js"
78
+ }
79
+ },
80
+ "./stretcher": {
81
+ "import": {
82
+ "types": "./dist/stretcher.d.ts",
83
+ "default": "./dist/stretcher.js"
84
+ }
85
+ }
86
+ },
87
+ "sideEffects": false,
88
+ "files": [
89
+ "dist"
90
+ ],
91
+ "scripts": {
92
+ "build": "tsup",
93
+ "dev": "tsup --watch",
94
+ "test": "vitest run",
95
+ "test:watch": "vitest",
96
+ "typecheck": "tsc --noEmit",
97
+ "lint": "tsc --noEmit",
98
+ "prepublishOnly": "npm run build"
99
+ },
100
+ "keywords": [
101
+ "web-audio",
102
+ "audio",
103
+ "sound",
104
+ "webaudio",
105
+ "audiocontext",
106
+ "composable",
107
+ "tree-shakeable"
108
+ ],
109
+ "license": "MIT",
110
+ "author": "ivgtr",
111
+ "repository": {
112
+ "type": "git",
113
+ "url": "https://github.com/ivgtr/waa.git"
114
+ },
115
+ "homepage": "https://ivgtr.github.io/waa/",
116
+ "bugs": "https://github.com/ivgtr/waa/issues",
117
+ "dependencies": {},
118
+ "devDependencies": {
119
+ "tsup": "^8.4.0",
120
+ "typescript": "^5.7.0",
121
+ "vitest": "^2.1.0"
122
+ }
123
+ }