@beatbax/engine 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 (174) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/audio/bufferedRenderer.d.ts +32 -0
  3. package/dist/audio/bufferedRenderer.d.ts.map +1 -0
  4. package/dist/audio/bufferedRenderer.js +309 -0
  5. package/dist/audio/bufferedRenderer.js.map +1 -0
  6. package/dist/audio/pcmRenderer.d.ts +25 -0
  7. package/dist/audio/pcmRenderer.d.ts.map +1 -0
  8. package/dist/audio/pcmRenderer.js +1288 -0
  9. package/dist/audio/pcmRenderer.js.map +1 -0
  10. package/dist/audio/playback.d.ts +57 -0
  11. package/dist/audio/playback.d.ts.map +1 -0
  12. package/dist/audio/playback.js +794 -0
  13. package/dist/audio/playback.js.map +1 -0
  14. package/dist/chips/gameboy/apu.d.ts +9 -0
  15. package/dist/chips/gameboy/apu.d.ts.map +1 -0
  16. package/dist/chips/gameboy/apu.js +27 -0
  17. package/dist/chips/gameboy/apu.js.map +1 -0
  18. package/dist/chips/gameboy/noise.d.ts +6 -0
  19. package/dist/chips/gameboy/noise.d.ts.map +1 -0
  20. package/dist/chips/gameboy/noise.js +155 -0
  21. package/dist/chips/gameboy/noise.js.map +1 -0
  22. package/dist/chips/gameboy/packet.d.ts +3 -0
  23. package/dist/chips/gameboy/packet.d.ts.map +1 -0
  24. package/dist/chips/gameboy/packet.js +3 -0
  25. package/dist/chips/gameboy/packet.js.map +1 -0
  26. package/dist/chips/gameboy/periodTables.d.ts +16 -0
  27. package/dist/chips/gameboy/periodTables.d.ts.map +1 -0
  28. package/dist/chips/gameboy/periodTables.js +29 -0
  29. package/dist/chips/gameboy/periodTables.js.map +1 -0
  30. package/dist/chips/gameboy/pulse.d.ts +12 -0
  31. package/dist/chips/gameboy/pulse.d.ts.map +1 -0
  32. package/dist/chips/gameboy/pulse.js +275 -0
  33. package/dist/chips/gameboy/pulse.js.map +1 -0
  34. package/dist/chips/gameboy/wave.d.ts +8 -0
  35. package/dist/chips/gameboy/wave.d.ts.map +1 -0
  36. package/dist/chips/gameboy/wave.js +146 -0
  37. package/dist/chips/gameboy/wave.js.map +1 -0
  38. package/dist/effects/index.d.ts +7 -0
  39. package/dist/effects/index.d.ts.map +1 -0
  40. package/dist/effects/index.js +1028 -0
  41. package/dist/effects/index.js.map +1 -0
  42. package/dist/effects/types.d.ts +8 -0
  43. package/dist/effects/types.d.ts.map +1 -0
  44. package/dist/effects/types.js +2 -0
  45. package/dist/effects/types.js.map +1 -0
  46. package/dist/expand/refExpander.d.ts +14 -0
  47. package/dist/expand/refExpander.d.ts.map +1 -0
  48. package/dist/expand/refExpander.js +130 -0
  49. package/dist/expand/refExpander.js.map +1 -0
  50. package/dist/export/index.d.ts +5 -0
  51. package/dist/export/index.d.ts.map +1 -0
  52. package/dist/export/index.js +5 -0
  53. package/dist/export/index.js.map +1 -0
  54. package/dist/export/jsonExport.d.ts +9 -0
  55. package/dist/export/jsonExport.d.ts.map +1 -0
  56. package/dist/export/jsonExport.js +184 -0
  57. package/dist/export/jsonExport.js.map +1 -0
  58. package/dist/export/midiExport.d.ts +9 -0
  59. package/dist/export/midiExport.d.ts.map +1 -0
  60. package/dist/export/midiExport.js +390 -0
  61. package/dist/export/midiExport.js.map +1 -0
  62. package/dist/export/ugeWriter.d.ts +33 -0
  63. package/dist/export/ugeWriter.d.ts.map +1 -0
  64. package/dist/export/ugeWriter.js +1997 -0
  65. package/dist/export/ugeWriter.js.map +1 -0
  66. package/dist/export/wavWriter.d.ts +24 -0
  67. package/dist/export/wavWriter.d.ts.map +1 -0
  68. package/dist/export/wavWriter.js +126 -0
  69. package/dist/export/wavWriter.js.map +1 -0
  70. package/dist/import/index.d.ts +5 -0
  71. package/dist/import/index.d.ts.map +1 -0
  72. package/dist/import/index.js +8 -0
  73. package/dist/import/index.js.map +1 -0
  74. package/dist/import/remoteCache.d.ts +60 -0
  75. package/dist/import/remoteCache.d.ts.map +1 -0
  76. package/dist/import/remoteCache.js +194 -0
  77. package/dist/import/remoteCache.js.map +1 -0
  78. package/dist/import/uge/uge.reader.d.ts +27 -0
  79. package/dist/import/uge/uge.reader.d.ts.map +1 -0
  80. package/dist/import/uge/uge.reader.js +545 -0
  81. package/dist/import/uge/uge.reader.js.map +1 -0
  82. package/dist/import/urlUtils.d.ts +50 -0
  83. package/dist/import/urlUtils.d.ts.map +1 -0
  84. package/dist/import/urlUtils.js +87 -0
  85. package/dist/import/urlUtils.js.map +1 -0
  86. package/dist/index.d.ts +18 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +318 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/instruments/instrumentState.d.ts +15 -0
  91. package/dist/instruments/instrumentState.d.ts.map +1 -0
  92. package/dist/instruments/instrumentState.js +24 -0
  93. package/dist/instruments/instrumentState.js.map +1 -0
  94. package/dist/parser/ast.d.ts +22 -0
  95. package/dist/parser/ast.d.ts.map +1 -0
  96. package/dist/parser/ast.js +5 -0
  97. package/dist/parser/ast.js.map +1 -0
  98. package/dist/parser/index.d.ts +14 -0
  99. package/dist/parser/index.d.ts.map +1 -0
  100. package/dist/parser/index.js +10 -0
  101. package/dist/parser/index.js.map +1 -0
  102. package/dist/parser/peggy/generated/parser.d.ts +8 -0
  103. package/dist/parser/peggy/generated/parser.d.ts.map +1 -0
  104. package/dist/parser/peggy/generated/parser.js +6269 -0
  105. package/dist/parser/peggy/generated/parser.js.map +1 -0
  106. package/dist/parser/peggy/index.d.ts +3 -0
  107. package/dist/parser/peggy/index.d.ts.map +1 -0
  108. package/dist/parser/peggy/index.js +555 -0
  109. package/dist/parser/peggy/index.js.map +1 -0
  110. package/dist/parser/structured.d.ts +16 -0
  111. package/dist/parser/structured.d.ts.map +1 -0
  112. package/dist/parser/structured.js +232 -0
  113. package/dist/parser/structured.js.map +1 -0
  114. package/dist/parser/tokenizer.d.ts +12 -0
  115. package/dist/parser/tokenizer.d.ts.map +1 -0
  116. package/dist/parser/tokenizer.js +14 -0
  117. package/dist/parser/tokenizer.js.map +1 -0
  118. package/dist/patterns/expand.d.ts +32 -0
  119. package/dist/patterns/expand.d.ts.map +1 -0
  120. package/dist/patterns/expand.js +184 -0
  121. package/dist/patterns/expand.js.map +1 -0
  122. package/dist/patterns/index.d.ts +2 -0
  123. package/dist/patterns/index.d.ts.map +1 -0
  124. package/dist/patterns/index.js +2 -0
  125. package/dist/patterns/index.js.map +1 -0
  126. package/dist/scheduler/index.d.ts +6 -0
  127. package/dist/scheduler/index.d.ts.map +1 -0
  128. package/dist/scheduler/index.js +9 -0
  129. package/dist/scheduler/index.js.map +1 -0
  130. package/dist/scheduler/tickScheduler.d.ts +27 -0
  131. package/dist/scheduler/tickScheduler.d.ts.map +1 -0
  132. package/dist/scheduler/tickScheduler.js +74 -0
  133. package/dist/scheduler/tickScheduler.js.map +1 -0
  134. package/dist/sequences/expand.d.ts +14 -0
  135. package/dist/sequences/expand.d.ts.map +1 -0
  136. package/dist/sequences/expand.js +137 -0
  137. package/dist/sequences/expand.js.map +1 -0
  138. package/dist/song/importResolver.browser.d.ts +29 -0
  139. package/dist/song/importResolver.browser.d.ts.map +1 -0
  140. package/dist/song/importResolver.browser.js +168 -0
  141. package/dist/song/importResolver.browser.js.map +1 -0
  142. package/dist/song/importResolver.d.ts +40 -0
  143. package/dist/song/importResolver.d.ts.map +1 -0
  144. package/dist/song/importResolver.js +445 -0
  145. package/dist/song/importResolver.js.map +1 -0
  146. package/dist/song/index.browser.d.ts +9 -0
  147. package/dist/song/index.browser.d.ts.map +1 -0
  148. package/dist/song/index.browser.js +7 -0
  149. package/dist/song/index.browser.js.map +1 -0
  150. package/dist/song/index.d.ts +8 -0
  151. package/dist/song/index.d.ts.map +1 -0
  152. package/dist/song/index.js +6 -0
  153. package/dist/song/index.js.map +1 -0
  154. package/dist/song/resolver.browser.d.ts +50 -0
  155. package/dist/song/resolver.browser.d.ts.map +1 -0
  156. package/dist/song/resolver.browser.js +536 -0
  157. package/dist/song/resolver.browser.js.map +1 -0
  158. package/dist/song/resolver.d.ts +20 -0
  159. package/dist/song/resolver.d.ts.map +1 -0
  160. package/dist/song/resolver.js +540 -0
  161. package/dist/song/resolver.js.map +1 -0
  162. package/dist/song/songModel.d.ts +34 -0
  163. package/dist/song/songModel.d.ts.map +1 -0
  164. package/dist/song/songModel.js +2 -0
  165. package/dist/song/songModel.js.map +1 -0
  166. package/dist/tests/refExpander.test.d.ts +2 -0
  167. package/dist/tests/refExpander.test.d.ts.map +1 -0
  168. package/dist/tests/refExpander.test.js +37 -0
  169. package/dist/tests/refExpander.test.js.map +1 -0
  170. package/dist/util/diag.d.ts +16 -0
  171. package/dist/util/diag.d.ts.map +1 -0
  172. package/dist/util/diag.js +29 -0
  173. package/dist/util/diag.js.map +1 -0
  174. package/package.json +84 -0
@@ -0,0 +1,309 @@
1
+ import { playPulse as playPulseImpl } from '../chips/gameboy/pulse.js';
2
+ import { playWavetable as playWavetableImpl } from '../chips/gameboy/wave.js';
3
+ import { playNoise as playNoiseImpl } from '../chips/gameboy/noise.js';
4
+ export class BufferedRenderer {
5
+ ctx;
6
+ scheduler;
7
+ segmentDur;
8
+ lookahead;
9
+ segments = new Map();
10
+ pendingRenders = new Set();
11
+ scheduledNodes = [];
12
+ maxPreRenderSegments;
13
+ applyEffectsToNodes(ctx, nodes, pan, effects, start, dur) {
14
+ // Apply inline effect array first
15
+ if (Array.isArray(effects)) {
16
+ for (const fx of effects) {
17
+ try {
18
+ const name = fx && fx.type ? fx.type : fx;
19
+ // If resolver attached a normalized duration in seconds, prefer that
20
+ let params = fx && fx.params ? fx.params : (Array.isArray(fx) ? fx : []);
21
+ if (fx && typeof fx.durationSec === 'number') {
22
+ // shallow copy so we don't mutate original parsed params
23
+ const pcopy = Array.isArray(params) ? params.slice() : [];
24
+ pcopy[3] = fx.durationSec;
25
+ params = pcopy;
26
+ }
27
+ const handler = require('../effects/index.js').get(name);
28
+ if (handler) {
29
+ try {
30
+ handler(ctx, nodes, params, start, dur);
31
+ }
32
+ catch (e) { }
33
+ }
34
+ }
35
+ catch (e) { }
36
+ }
37
+ }
38
+ // Apply pan as fallback if provided and not already covered by an effect
39
+ if (pan !== undefined && pan !== null) {
40
+ const handler = require('../effects/index.js').get('pan');
41
+ if (handler) {
42
+ // If pan is object with enum/value, convert to numeric for handler when possible
43
+ if (typeof pan === 'object') {
44
+ if (pan.value !== undefined)
45
+ handler(ctx, nodes, [pan.value], start, dur);
46
+ else if (pan.enum) {
47
+ const s = String(pan.enum).toUpperCase();
48
+ const mapped = s === 'L' ? -1 : (s === 'R' ? 1 : 0);
49
+ handler(ctx, nodes, [mapped], start, dur);
50
+ }
51
+ }
52
+ else if (typeof pan === 'number') {
53
+ handler(ctx, nodes, [pan], start, dur);
54
+ }
55
+ else if (typeof pan === 'string') {
56
+ // L/C/R or numeric string
57
+ const up = pan.toUpperCase();
58
+ if (up === 'L' || up === 'R' || up === 'C') {
59
+ const mapped = up === 'L' ? -1 : (up === 'R' ? 1 : 0);
60
+ handler(ctx, nodes, [mapped], start, dur);
61
+ }
62
+ else {
63
+ const n = Number(pan);
64
+ if (!Number.isNaN(n))
65
+ handler(ctx, nodes, [n], start, dur);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ constructor(ctx, scheduler, opts = {}) {
72
+ this.ctx = ctx;
73
+ this.scheduler = scheduler;
74
+ // Allow overriding segment duration via options or environment for debugging/exports
75
+ const envSegRaw = typeof process !== 'undefined' && (process.env && process.env.BEATBAX_SEGMENT_DUR) ? process.env.BEATBAX_SEGMENT_DUR : undefined;
76
+ const envSeg = typeof envSegRaw !== 'undefined' ? Number(envSegRaw) : undefined;
77
+ const envSegNum = (typeof envSeg === 'number' && Number.isFinite(envSeg) && envSeg > 0) ? envSeg : undefined;
78
+ this.segmentDur = (typeof opts.segmentDuration === 'number') ? opts.segmentDuration : (envSegNum ?? 0.5);
79
+ this.lookahead = opts.lookahead || 0.25;
80
+ this.maxPreRenderSegments = opts.maxPreRenderSegments;
81
+ }
82
+ segmentKeyForTime(t) {
83
+ return Math.floor(t / this.segmentDur) * this.segmentDur;
84
+ }
85
+ enqueueEvent(absTime, dur, renderFn, chId) {
86
+ const segStart = this.segmentKeyForTime(absTime);
87
+ const localStart = absTime - segStart;
88
+ const arr = this.segments.get(segStart) || [];
89
+ const ev = { localStart, dur, renderFn };
90
+ if (renderFn.__chId !== undefined)
91
+ ev.chId = renderFn.__chId;
92
+ if (typeof chId === 'number')
93
+ ev.chId = chId;
94
+ arr.push(ev);
95
+ this.segments.set(segStart, arr);
96
+ if (!this.pendingRenders.has(segStart)) {
97
+ if (typeof this.maxPreRenderSegments === 'number') {
98
+ const pendingCount = this.pendingRenders.size;
99
+ if (pendingCount >= this.maxPreRenderSegments) {
100
+ return false;
101
+ }
102
+ }
103
+ this.pendingRenders.add(segStart);
104
+ const renderAt = Math.max(0, segStart - this.lookahead);
105
+ this.scheduler.schedule(renderAt, () => this.renderSegment(segStart));
106
+ }
107
+ return true;
108
+ }
109
+ async renderSegment(segStart) {
110
+ if (!this.pendingRenders.has(segStart))
111
+ return;
112
+ this.pendingRenders.delete(segStart);
113
+ const events = this.segments.get(segStart) || [];
114
+ if (!events.length)
115
+ return;
116
+ const sampleRate = (this.ctx && this.ctx.sampleRate) ? this.ctx.sampleRate : 44100;
117
+ const renderDur = this.segmentDur + 0.05;
118
+ const length = Math.ceil(renderDur * sampleRate);
119
+ const offline = new globalThis.OfflineAudioContext(1, length, sampleRate);
120
+ for (const ev of events) {
121
+ try {
122
+ ev.renderFn(offline);
123
+ }
124
+ catch (e) { }
125
+ }
126
+ try {
127
+ const rendered = await offline.startRendering();
128
+ const src = this.ctx.createBufferSource();
129
+ src.buffer = rendered;
130
+ src.loop = false;
131
+ const gain = this.ctx.createGain();
132
+ src.connect(gain);
133
+ gain.connect(this.ctx.destination);
134
+ try {
135
+ src.start(segStart);
136
+ }
137
+ catch (e) {
138
+ try {
139
+ src.start();
140
+ }
141
+ catch (_) { }
142
+ }
143
+ try {
144
+ src.stop(segStart + renderDur);
145
+ }
146
+ catch (e) { }
147
+ const chId = (events && events.length && events[0].chId) ? events[0].chId : undefined;
148
+ this.scheduledNodes.push({ src, gain, segStart, chId });
149
+ }
150
+ catch (e) {
151
+ for (const ev of events) {
152
+ try {
153
+ ev.renderFn(undefined);
154
+ }
155
+ catch (_) { }
156
+ }
157
+ }
158
+ this.segments.delete(segStart);
159
+ }
160
+ stop(chId) {
161
+ if (typeof chId === 'number') {
162
+ for (const [segStart, events] of Array.from(this.segments.entries())) {
163
+ const remaining = events.filter((ev) => ev.chId !== chId);
164
+ if (remaining.length)
165
+ this.segments.set(segStart, remaining);
166
+ else {
167
+ this.segments.delete(segStart);
168
+ this.pendingRenders.delete(segStart);
169
+ }
170
+ }
171
+ const keep = [];
172
+ for (const n of this.scheduledNodes) {
173
+ if (n.chId === chId) {
174
+ try {
175
+ if (n.src && typeof n.src.stop === 'function')
176
+ n.src.stop();
177
+ }
178
+ catch (_) { }
179
+ try {
180
+ if (n.src && typeof n.src.disconnect === 'function')
181
+ n.src.disconnect();
182
+ }
183
+ catch (_) { }
184
+ try {
185
+ if (n.gain && typeof n.gain.disconnect === 'function')
186
+ n.gain.disconnect();
187
+ }
188
+ catch (_) { }
189
+ }
190
+ else
191
+ keep.push(n);
192
+ }
193
+ this.scheduledNodes = keep;
194
+ }
195
+ else {
196
+ this.segments.clear();
197
+ this.pendingRenders.clear();
198
+ for (const n of this.scheduledNodes) {
199
+ try {
200
+ if (n.src && typeof n.src.stop === 'function')
201
+ n.src.stop();
202
+ }
203
+ catch (_) { }
204
+ try {
205
+ if (n.src && typeof n.src.disconnect === 'function')
206
+ n.src.disconnect();
207
+ }
208
+ catch (_) { }
209
+ try {
210
+ if (n.gain && typeof n.gain.disconnect === 'function')
211
+ n.gain.disconnect();
212
+ }
213
+ catch (_) { }
214
+ }
215
+ this.scheduledNodes = [];
216
+ }
217
+ }
218
+ drainScheduledNodes(chId) {
219
+ if (typeof chId === 'number') {
220
+ const matched = this.scheduledNodes.filter(n => n.chId === chId);
221
+ this.scheduledNodes = this.scheduledNodes.filter(n => n.chId !== chId);
222
+ return matched;
223
+ }
224
+ const out = this.scheduledNodes.slice();
225
+ this.scheduledNodes = [];
226
+ return out;
227
+ }
228
+ enqueuePulse(absTime, freq, duty, dur, inst, chId, pan, effects) {
229
+ const enq = this.enqueueEvent(absTime, dur, (offlineCtx) => {
230
+ const local = absTime - (this.segmentKeyForTime(absTime));
231
+ try {
232
+ const nodes = playPulseImpl(offlineCtx, freq, duty, local, dur, inst) || [];
233
+ // apply effects and baked pan inside offline render
234
+ try {
235
+ this.applyEffectsToNodes(offlineCtx, nodes, pan, effects, local, dur);
236
+ }
237
+ catch (e) { }
238
+ }
239
+ catch (e) { }
240
+ }, chId);
241
+ if (!enq) {
242
+ this.scheduler.schedule(absTime, () => {
243
+ try {
244
+ const nodes = playPulseImpl(this.ctx, freq, duty, absTime, dur, inst) || [];
245
+ try {
246
+ this.applyEffectsToNodes(this.ctx, nodes, pan, effects, absTime, dur);
247
+ }
248
+ catch (e) { }
249
+ }
250
+ catch (_) { }
251
+ });
252
+ }
253
+ return enq;
254
+ }
255
+ enqueueWavetable(absTime, freq, table, dur, inst, chId, pan, effects) {
256
+ const enq = this.enqueueEvent(absTime, dur, (offlineCtx) => {
257
+ const local = absTime - (this.segmentKeyForTime(absTime));
258
+ try {
259
+ const nodes = playWavetableImpl(offlineCtx, freq, table, local, dur, inst) || [];
260
+ try {
261
+ this.applyEffectsToNodes(offlineCtx, nodes, pan, effects, local, dur);
262
+ }
263
+ catch (e) { }
264
+ }
265
+ catch (e) { }
266
+ }, chId);
267
+ if (!enq) {
268
+ this.scheduler.schedule(absTime, () => {
269
+ try {
270
+ const nodes = playWavetableImpl(this.ctx, freq, table, absTime, dur, inst) || [];
271
+ try {
272
+ this.applyEffectsToNodes(this.ctx, nodes, pan, effects, absTime, dur);
273
+ }
274
+ catch (e) { }
275
+ }
276
+ catch (_) { }
277
+ });
278
+ }
279
+ return enq;
280
+ }
281
+ enqueueNoise(absTime, dur, inst, chId, pan, effects) {
282
+ const enq = this.enqueueEvent(absTime, dur, (offlineCtx) => {
283
+ const local = absTime - (this.segmentKeyForTime(absTime));
284
+ try {
285
+ const nodes = playNoiseImpl(offlineCtx, local, dur, inst) || [];
286
+ try {
287
+ this.applyEffectsToNodes(offlineCtx, nodes, pan, effects, local, dur);
288
+ }
289
+ catch (e) { }
290
+ }
291
+ catch (e) { }
292
+ }, chId);
293
+ if (!enq) {
294
+ this.scheduler.schedule(absTime, () => {
295
+ try {
296
+ const nodes = playNoiseImpl(this.ctx, absTime, dur, inst) || [];
297
+ try {
298
+ this.applyEffectsToNodes(this.ctx, nodes, pan, effects, absTime, dur);
299
+ }
300
+ catch (e) { }
301
+ }
302
+ catch (_) { }
303
+ });
304
+ }
305
+ return enq;
306
+ }
307
+ }
308
+ export default BufferedRenderer;
309
+ //# sourceMappingURL=bufferedRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bufferedRenderer.js","sourceRoot":"","sources":["../../src/audio/bufferedRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { SongModel } from '../song/songModel.js';
2
+ /**
3
+ * Render a song to PCM samples without using WebAudio.
4
+ * This is a simplified renderer for CLI/offline use.
5
+ */
6
+ export interface RenderOptions {
7
+ sampleRate?: number;
8
+ duration?: number;
9
+ channels?: 1 | 2;
10
+ bpm?: number;
11
+ renderChannels?: number[];
12
+ normalize?: boolean;
13
+ vibDepthScale?: number;
14
+ regPerTrackerBaseFactor?: number;
15
+ regPerTrackerUnit?: number;
16
+ }
17
+ /**
18
+ * Renders a complete song to a PCM buffer.
19
+ *
20
+ * @param song The song model containing channels and events.
21
+ * @param opts Rendering options (sampleRate, channels, bpm, etc.).
22
+ * @returns a Float32Array containing the interleaved PCM samples.
23
+ */
24
+ export declare function renderSongToPCM(song: SongModel, opts?: RenderOptions): Float32Array;
25
+ //# sourceMappingURL=pcmRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pcmRenderer.d.ts","sourceRoot":"","sources":["../../src/audio/pcmRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAC;AA+E5D;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IAIpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAwCD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,CAsEvF"}