@sudobility/music_player 0.1.0 → 0.1.2

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 (159) hide show
  1. package/CLAUDE.md +335 -0
  2. package/dist/core.d.ts +33 -0
  3. package/dist/core.d.ts.map +1 -0
  4. package/dist/core.js +33 -0
  5. package/dist/core.js.map +1 -0
  6. package/dist/engine.d.ts +103 -0
  7. package/dist/engine.d.ts.map +1 -0
  8. package/dist/engine.js +2 -0
  9. package/dist/engine.js.map +1 -0
  10. package/dist/mocks/index.d.ts +46 -0
  11. package/dist/mocks/index.d.ts.map +1 -0
  12. package/dist/mocks/index.js +93 -0
  13. package/dist/mocks/index.js.map +1 -0
  14. package/dist/player.d.ts +81 -0
  15. package/dist/player.d.ts.map +1 -0
  16. package/dist/player.js +209 -0
  17. package/dist/player.js.map +1 -0
  18. package/dist/rn/audio/offline-render.d.ts +29 -0
  19. package/dist/rn/audio/offline-render.d.ts.map +1 -0
  20. package/dist/rn/audio/offline-render.js +134 -0
  21. package/dist/rn/audio/offline-render.js.map +1 -0
  22. package/dist/rn/index.d.ts +50 -0
  23. package/dist/rn/index.d.ts.map +1 -0
  24. package/dist/rn/index.js +39 -0
  25. package/dist/rn/index.js.map +1 -0
  26. package/dist/rn/playback/audio-api.d.ts +93 -0
  27. package/dist/rn/playback/audio-api.d.ts.map +1 -0
  28. package/dist/rn/playback/audio-api.js +24 -0
  29. package/dist/rn/playback/audio-api.js.map +1 -0
  30. package/dist/rn/playback/expression-table.d.ts +22 -0
  31. package/dist/rn/playback/expression-table.d.ts.map +1 -0
  32. package/dist/rn/playback/expression-table.js +926 -0
  33. package/dist/rn/playback/expression-table.js.map +1 -0
  34. package/dist/rn/playback/expression.d.ts +48 -0
  35. package/dist/rn/playback/expression.d.ts.map +1 -0
  36. package/dist/rn/playback/expression.js +120 -0
  37. package/dist/rn/playback/expression.js.map +1 -0
  38. package/dist/rn/playback/gm-pack-name.d.ts +40 -0
  39. package/dist/rn/playback/gm-pack-name.d.ts.map +1 -0
  40. package/dist/rn/playback/gm-pack-name.js +61 -0
  41. package/dist/rn/playback/gm-pack-name.js.map +1 -0
  42. package/dist/rn/playback/pack-library.d.ts +44 -0
  43. package/dist/rn/playback/pack-library.d.ts.map +1 -0
  44. package/dist/rn/playback/pack-library.js +85 -0
  45. package/dist/rn/playback/pack-library.js.map +1 -0
  46. package/dist/rn/playback/pack-names.json +130 -0
  47. package/dist/rn/playback/sample-engine.d.ts +216 -0
  48. package/dist/rn/playback/sample-engine.d.ts.map +1 -0
  49. package/dist/rn/playback/sample-engine.js +669 -0
  50. package/dist/rn/playback/sample-engine.js.map +1 -0
  51. package/dist/rn/playback/sample-pack.d.ts +71 -0
  52. package/dist/rn/playback/sample-pack.d.ts.map +1 -0
  53. package/dist/rn/playback/sample-pack.js +112 -0
  54. package/dist/rn/playback/sample-pack.js.map +1 -0
  55. package/dist/rn/playback/sustain-loop.d.ts +24 -0
  56. package/dist/rn/playback/sustain-loop.d.ts.map +1 -0
  57. package/dist/rn/playback/sustain-loop.js +111 -0
  58. package/dist/rn/playback/sustain-loop.js.map +1 -0
  59. package/dist/rn/playback/voice-plan.d.ts +60 -0
  60. package/dist/rn/playback/voice-plan.d.ts.map +1 -0
  61. package/dist/rn/playback/voice-plan.js +38 -0
  62. package/dist/rn/playback/voice-plan.js.map +1 -0
  63. package/dist/shared/bus.d.ts +73 -0
  64. package/dist/shared/bus.d.ts.map +1 -0
  65. package/dist/shared/bus.js +83 -0
  66. package/dist/shared/bus.js.map +1 -0
  67. package/dist/shared/midi.d.ts +18 -0
  68. package/dist/shared/midi.d.ts.map +1 -0
  69. package/dist/shared/midi.js +25 -0
  70. package/dist/shared/midi.js.map +1 -0
  71. package/dist/shared/mix.d.ts +75 -0
  72. package/dist/shared/mix.d.ts.map +1 -0
  73. package/dist/shared/mix.js +115 -0
  74. package/dist/shared/mix.js.map +1 -0
  75. package/dist/shared/note-queue.d.ts +43 -0
  76. package/dist/shared/note-queue.d.ts.map +1 -0
  77. package/dist/shared/note-queue.js +54 -0
  78. package/dist/shared/note-queue.js.map +1 -0
  79. package/dist/shared/plan.d.ts +34 -0
  80. package/dist/shared/plan.d.ts.map +1 -0
  81. package/dist/shared/plan.js +134 -0
  82. package/dist/shared/plan.js.map +1 -0
  83. package/dist/shared/pump-window.d.ts +38 -0
  84. package/dist/shared/pump-window.d.ts.map +1 -0
  85. package/dist/shared/pump-window.js +13 -0
  86. package/dist/shared/pump-window.js.map +1 -0
  87. package/dist/shared/render-events.d.ts +25 -0
  88. package/dist/shared/render-events.d.ts.map +1 -0
  89. package/dist/shared/render-events.js +79 -0
  90. package/dist/shared/render-events.js.map +1 -0
  91. package/dist/shared/sounding-set.d.ts +45 -0
  92. package/dist/shared/sounding-set.d.ts.map +1 -0
  93. package/dist/shared/sounding-set.js +81 -0
  94. package/dist/shared/sounding-set.js.map +1 -0
  95. package/dist/shared/test-plan.d.ts +36 -0
  96. package/dist/shared/test-plan.d.ts.map +1 -0
  97. package/dist/shared/test-plan.js +83 -0
  98. package/dist/shared/test-plan.js.map +1 -0
  99. package/dist/singleton.d.ts +23 -0
  100. package/dist/singleton.d.ts.map +1 -0
  101. package/dist/singleton.js +26 -0
  102. package/dist/singleton.js.map +1 -0
  103. package/dist/types.d.ts +84 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/web/audio/offline-synth.d.ts +24 -0
  108. package/dist/web/audio/offline-synth.d.ts.map +1 -0
  109. package/dist/web/audio/offline-synth.js +92 -0
  110. package/dist/web/audio/offline-synth.js.map +1 -0
  111. package/dist/web/audio/soundfont-render.d.ts +31 -0
  112. package/dist/web/audio/soundfont-render.d.ts.map +1 -0
  113. package/dist/web/audio/soundfont-render.js +130 -0
  114. package/dist/web/audio/soundfont-render.js.map +1 -0
  115. package/dist/web/audio/synth-types.d.ts +24 -0
  116. package/dist/web/audio/synth-types.d.ts.map +1 -0
  117. package/dist/web/audio/synth-types.js +2 -0
  118. package/dist/web/audio/synth-types.js.map +1 -0
  119. package/dist/web/index.d.ts +40 -0
  120. package/dist/web/index.d.ts.map +1 -0
  121. package/dist/web/index.js +59 -0
  122. package/dist/web/index.js.map +1 -0
  123. package/dist/web/playback/channel-allocator.d.ts +54 -0
  124. package/dist/web/playback/channel-allocator.d.ts.map +1 -0
  125. package/dist/web/playback/channel-allocator.js +72 -0
  126. package/dist/web/playback/channel-allocator.js.map +1 -0
  127. package/dist/web/playback/click.d.ts +9 -0
  128. package/dist/web/playback/click.d.ts.map +1 -0
  129. package/dist/web/playback/click.js +61 -0
  130. package/dist/web/playback/click.js.map +1 -0
  131. package/dist/web/playback/clock.d.ts +36 -0
  132. package/dist/web/playback/clock.d.ts.map +1 -0
  133. package/dist/web/playback/clock.js +64 -0
  134. package/dist/web/playback/clock.js.map +1 -0
  135. package/dist/web/playback/governor.d.ts +45 -0
  136. package/dist/web/playback/governor.d.ts.map +1 -0
  137. package/dist/web/playback/governor.js +33 -0
  138. package/dist/web/playback/governor.js.map +1 -0
  139. package/dist/web/playback/quiet-stub-notices.d.ts +55 -0
  140. package/dist/web/playback/quiet-stub-notices.d.ts.map +1 -0
  141. package/dist/web/playback/quiet-stub-notices.js +93 -0
  142. package/dist/web/playback/quiet-stub-notices.js.map +1 -0
  143. package/dist/web/playback/soundfont-engine.d.ts +281 -0
  144. package/dist/web/playback/soundfont-engine.d.ts.map +1 -0
  145. package/dist/web/playback/soundfont-engine.js +735 -0
  146. package/dist/web/playback/soundfont-engine.js.map +1 -0
  147. package/dist/web/playback/soundfont-loader.d.ts +30 -0
  148. package/dist/web/playback/soundfont-loader.d.ts.map +1 -0
  149. package/dist/web/playback/soundfont-loader.js +68 -0
  150. package/dist/web/playback/soundfont-loader.js.map +1 -0
  151. package/dist/web/playback/synth-host.d.ts +142 -0
  152. package/dist/web/playback/synth-host.d.ts.map +1 -0
  153. package/dist/web/playback/synth-host.js +293 -0
  154. package/dist/web/playback/synth-host.js.map +1 -0
  155. package/package.json +18 -3
  156. package/dist/index.d.ts +0 -14
  157. package/dist/index.d.ts.map +0 -1
  158. package/dist/index.js +0 -2
  159. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soundfont-engine.js","sourceRoot":"","sources":["../../../src/web/playback/soundfont-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Fetches the soundfont once and keeps it in the Cache API.
3
+ *
4
+ * The font is tens of megabytes even as SF3, so this is the difference between
5
+ * a wait on every visit and a wait on the first. `cache` is injected rather
6
+ * than reached for globally, so tests need no real CacheStorage and a caller
7
+ * without one still works — just without the caching.
8
+ *
9
+ * A failed fetch throws. Resolving an empty buffer would load a synth with no
10
+ * instruments, which presents as silent playback with no error anywhere — the
11
+ * exact failure this whole engine exists to stop happening.
12
+ */
13
+ export type LoadProgress = {
14
+ loaded: number;
15
+ total: number;
16
+ };
17
+ /**
18
+ * The cache the soundfont lives in, or `null` where the Cache API is missing.
19
+ *
20
+ * Worth its own function because forgetting it is expensive and silent: without
21
+ * a cache the font is refetched and re-decoded on every engine init and every
22
+ * export — tens of megabytes and seconds of work each time, with nothing
23
+ * visibly wrong.
24
+ */
25
+ export declare function openSoundfontCache(): Promise<Cache | null>;
26
+ export declare function loadSoundfont(url: string, opts?: {
27
+ onProgress?: (progress: LoadProgress) => void;
28
+ cache?: Cache | null;
29
+ }): Promise<ArrayBuffer>;
30
+ //# sourceMappingURL=soundfont-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soundfont-loader.d.ts","sourceRoot":"","sources":["../../../src/web/playback/soundfont-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAK7D;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAOhE;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CAAO,GACjF,OAAO,CAAC,WAAW,CAAC,CAmBtB"}
@@ -0,0 +1,68 @@
1
+ /** Bumped when the stored representation changes, so old entries are not reused. */
2
+ const CACHE_NAME = 'music-soundfont-v1';
3
+ /**
4
+ * The cache the soundfont lives in, or `null` where the Cache API is missing.
5
+ *
6
+ * Worth its own function because forgetting it is expensive and silent: without
7
+ * a cache the font is refetched and re-decoded on every engine init and every
8
+ * export — tens of megabytes and seconds of work each time, with nothing
9
+ * visibly wrong.
10
+ */
11
+ export async function openSoundfontCache() {
12
+ if (typeof caches === 'undefined')
13
+ return null;
14
+ try {
15
+ return await caches.open(CACHE_NAME);
16
+ }
17
+ catch {
18
+ return null; // private browsing and similar; the font still loads
19
+ }
20
+ }
21
+ export async function loadSoundfont(url, opts = {}) {
22
+ const cached = await opts.cache?.match(url);
23
+ if (cached)
24
+ return await cached.arrayBuffer();
25
+ const response = await fetch(url);
26
+ if (!response.ok) {
27
+ throw new Error(`Soundfont fetch failed: ${response.status} ${response.statusText} (${url})`);
28
+ }
29
+ const declared = Number(response.headers.get('content-length') ?? 0);
30
+ opts.onProgress?.({ loaded: 0, total: declared });
31
+ const buffer = await readWithProgress(response, declared, opts.onProgress);
32
+ // Rebuilt rather than cloned: the body has already been consumed to report
33
+ // progress, and a body can only be read once.
34
+ await opts.cache?.put(url, new Response(buffer, { headers: response.headers }));
35
+ opts.onProgress?.({ loaded: buffer.byteLength, total: declared || buffer.byteLength });
36
+ return buffer;
37
+ }
38
+ /**
39
+ * Reads the body a chunk at a time so progress is real.
40
+ *
41
+ * `arrayBuffer()` resolves once, at the end, which over a slow connection is
42
+ * tens of megabytes of silence followed by a jump to 100% — a progress bar that
43
+ * only ever shows nothing or everything. Falls back to it where the body cannot
44
+ * be streamed, which costs only the granularity.
45
+ */
46
+ async function readWithProgress(response, declared, onProgress) {
47
+ const reader = response.body?.getReader();
48
+ if (!reader)
49
+ return await response.arrayBuffer();
50
+ const chunks = [];
51
+ let loaded = 0;
52
+ for (;;) {
53
+ const { done, value } = await reader.read();
54
+ if (done)
55
+ break;
56
+ chunks.push(value);
57
+ loaded += value.byteLength;
58
+ onProgress?.({ loaded, total: declared || loaded });
59
+ }
60
+ const buffer = new Uint8Array(loaded);
61
+ let at = 0;
62
+ for (const chunk of chunks) {
63
+ buffer.set(chunk, at);
64
+ at += chunk.byteLength;
65
+ }
66
+ return buffer.buffer;
67
+ }
68
+ //# sourceMappingURL=soundfont-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soundfont-loader.js","sourceRoot":"","sources":["../../../src/web/playback/soundfont-loader.ts"],"names":[],"mappings":"AAcA,oFAAoF;AACpF,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,qDAAqD;IACpE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,OAAgF,EAAE;IAElF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAE9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,GAAG,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3E,2EAA2E;IAC3E,8CAA8C;IAC9C,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEhF,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,gBAAgB,CAC7B,QAAkB,EAClB,QAAgB,EAChB,UAA6C;IAE7C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;QAC3B,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * The subset of `js-synthesizer`'s `SynthesizerSettings` this host sets.
3
+ *
4
+ * Both are init-time only. `ISynthesizer` exposes `setInterpolation` and
5
+ * `setGain` and nothing else, so neither can be changed on a running synth.
6
+ */
7
+ export type SynthSettings = {
8
+ /** int [16-256], and a multiple of 16. */
9
+ midiChannelCount?: number;
10
+ /** int [1-65535]. Above it, fluidsynth steals by its own overflow priority. */
11
+ polyphony?: number;
12
+ };
13
+ /** The slice of `AudioWorkletNodeSynthesizer` this host uses. */
14
+ export type SynthInstance = {
15
+ init(sampleRate: number, settings?: SynthSettings): void;
16
+ createAudioNode(context: BaseAudioContext, bufferSize: number): AudioNode;
17
+ loadSFont(data: ArrayBuffer): Promise<number>;
18
+ createSequencer?(): Promise<SynthSequencer>;
19
+ midiNoteOn(channel: number, midi: number, velocity: number): void;
20
+ midiNoteOff(channel: number, midi: number): void;
21
+ midiProgramSelect(channel: number, sfontId: number, bank: number, preset: number): void;
22
+ midiControl(channel: number, control: number, value: number): void;
23
+ midiSetChannelType(channel: number, isDrum: boolean): void;
24
+ midiAllSoundsOff(channel?: number): void;
25
+ setInterpolation(order: number): void;
26
+ close(): void;
27
+ };
28
+ export type SynthSequencer = {
29
+ registerSynthesizer(synth: SynthInstance): Promise<number>;
30
+ setTimeScale(scale: number): void;
31
+ sendEventAt(event: {
32
+ type: 'noteon';
33
+ channel: number;
34
+ key: number;
35
+ vel: number;
36
+ } | {
37
+ type: 'note';
38
+ channel: number;
39
+ key: number;
40
+ vel: number;
41
+ duration: number;
42
+ }, tick: number, isAbsolute: boolean): void;
43
+ removeAllEvents(): void;
44
+ close(): void;
45
+ };
46
+ export type SynthHostOptions = {
47
+ fluidsynthModuleUrl: string;
48
+ workletModuleUrl: string;
49
+ soundfont: ArrayBuffer;
50
+ instanceCount: number;
51
+ };
52
+ export declare class SynthHost {
53
+ private readonly deps;
54
+ private synths;
55
+ private sequencers;
56
+ private sfontIds;
57
+ /** `instance:channel` for every channel that is percussion — see `programSelect`. */
58
+ private percussionChannels;
59
+ private master;
60
+ private masterVolume;
61
+ private trackCount;
62
+ /** Kept so instances can be added later; see `ensureInstances`. */
63
+ private context;
64
+ private soundfont;
65
+ /** The governor's current setting, so an instance opened later starts where the others are. */
66
+ private interpolation;
67
+ /** Serialises growth, so two scores loading at once cannot both build instance 1. */
68
+ private growing;
69
+ constructor(deps: {
70
+ /** May be async: the real factory imports `js-synthesizer` on first use. */
71
+ createSynth: () => SynthInstance | Promise<SynthInstance>;
72
+ });
73
+ init(context: BaseAudioContext, options: SynthHostOptions): Promise<void>;
74
+ /**
75
+ * Opens instances until there are at least `count` of them.
76
+ *
77
+ * Scores outgrow sixteen channels, and which channel a track lands on is
78
+ * decided per score — so the number of synths needed is not known at init
79
+ * time. Growing here rather than sizing up front is what keeps the common
80
+ * case cheap: every extra instance is another copy of the font in WASM
81
+ * memory and seconds of loading, so one is opened only when a score genuinely
82
+ * has more parts than one synth can address. Without this, a track allocated
83
+ * to instance 1 reached `synths[1]`, found nothing, and played silently — no
84
+ * error, no missing note, just a part that was not there.
85
+ */
86
+ ensureInstances(count: number): Promise<void>;
87
+ private grow;
88
+ private createSequencerFor;
89
+ /**
90
+ * Marks a channel as percussion.
91
+ *
92
+ * Channel 9 already is one in fluidsynth's GM mode and needs no call; any
93
+ * other channel does, which is what lets a second drum track share an
94
+ * instance rather than costing a whole synth for its own channel 9.
95
+ */
96
+ setChannelPercussion(instance: number, channel: number, kit?: number): void;
97
+ /**
98
+ * Selects a GM program — **never on channel 9**.
99
+ *
100
+ * The spike measured this directly: selecting a melodic program on channel 9
101
+ * replaces fluidsynth's working default with a preset that is not at that
102
+ * address, and the channel goes silent. Every explicit selection route gave
103
+ * peak 0.0000; leaving it alone gave 0.3120. This guard is why drums sound.
104
+ *
105
+ * Any *other* channel that was made percussion is switched back rather than
106
+ * refused. Channel assignment is per score, so the channel a second drum
107
+ * track borrowed is handed to a pitched track by the next score that has one
108
+ * fewer kit — and refusing here left that track playing congas under a violin
109
+ * label, permanently, because nothing ever cleared the flag. Switching the
110
+ * type back before the select is exactly what the offline renderer already
111
+ * does for the same situation.
112
+ */
113
+ programSelect(instance: number, channel: number, program: number): void;
114
+ noteOn(instance: number, channel: number, midi: number, velocity: number): void;
115
+ /**
116
+ * Schedules a note and its release together, ahead of time.
117
+ *
118
+ * The sequencer's `note` event carries its own duration, so fluidsynth
119
+ * releases the note on the audio thread. Note-offs used to be fired from the
120
+ * main thread as the pump noticed them, which made every note's length track
121
+ * main-thread lateness — and a stall that held notes long added voices,
122
+ * loading the audio thread in turn.
123
+ *
124
+ * The time scale is milliseconds (`setTimeScale(1000)` in
125
+ * `createSequencerFor`). A negative delay clamps to now rather than being
126
+ * refused: a note whose moment passed during a stall should still sound, and
127
+ * the sequencer still holds its release.
128
+ */
129
+ noteAt(instance: number, channel: number, midi: number, velocity: number, delaySeconds: number, durationSeconds: number): void;
130
+ noteOff(instance: number, channel: number, midi: number): void;
131
+ controlChange(instance: number, channel: number, control: number, value: number): void;
132
+ /** Silences everything immediately — stop, seek, and panic all go through here. */
133
+ allSoundOff(): void;
134
+ /** The governor's one confirmed knob; applies to every instance at once. */
135
+ setInterpolation(order: number): void;
136
+ setMasterVolume(volume: number): void;
137
+ /** How many channels are summing, which sizes the headroom trim. */
138
+ setTrackCount(count: number): void;
139
+ private applyMasterGain;
140
+ dispose(): void;
141
+ }
142
+ //# sourceMappingURL=synth-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth-host.d.ts","sourceRoot":"","sources":["../../../src/web/playback/synth-host.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACzD,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1E,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,eAAe,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACxF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3D,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,CACT,KAAK,EACD;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAC7D;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EACjF,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,OAAO,GAClB,IAAI,CAAC;IACR,eAAe,IAAI,IAAI,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AA4BF,qBAAa,SAAS;IAkBlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,QAAQ,CAAgB;IAChC,qFAAqF;IACrF,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,mEAAmE;IACnE,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,SAAS,CAA4B;IAC7C,+FAA+F;IAC/F,OAAO,CAAC,aAAa,CAAuB;IAC5C,qFAAqF;IACrF,OAAO,CAAC,OAAO,CAAoC;gBAGhC,IAAI,EAAE;QACrB,4EAA4E;QAC5E,WAAW,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;KAC3D;IAGG,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC/E;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAK/B,IAAI;YAiBJ,kBAAkB;IAchC;;;;;;OAMG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAe,GAAG,IAAI;IAiCjF;;;;;;;;;;;;;;;OAeG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQvE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/E;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,IAAI;IAwBP,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAItF,mFAAmF;IACnF,WAAW,IAAI,IAAI;IAKnB,4EAA4E;IAC5E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKrC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKrC,oEAAoE;IACpE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlC,OAAO,CAAC,eAAe;IAIvB,OAAO,IAAI,IAAI;CAWhB"}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * The one module that talks to `js-synthesizer`.
3
+ *
4
+ * Hosts N libfluidsynth instances inside an `AudioWorklet`, so synthesis runs
5
+ * on the audio thread where React and the garbage collector cannot starve it.
6
+ * Everything above this only knows about instances, channels and notes.
7
+ *
8
+ * **The worklet module URLs are injected, not resolved here.** `music_io` is a
9
+ * library and cannot assume how a consuming app serves assets; the app decides
10
+ * (a `?url` import, a copy into its public directory) and passes them in.
11
+ *
12
+ * The synth factory is injected too, which lets the rules that matter be
13
+ * tested against a stub instead of being verifiable only by ear. The
14
+ * percussion guard below is the one that most needs it.
15
+ */
16
+ import { headroomTrimFor, LIMITER_CEILING_DB } from '../../shared/mix.js';
17
+ import { CHANNELS_PER_INSTANCE } from './channel-allocator.js';
18
+ import { createWorkletQuietModuleUrl } from './quiet-stub-notices.js';
19
+ /** Big enough that the worklet is not woken constantly, small enough not to add audible latency. */
20
+ const RENDER_BUFFER_SIZE = 8192;
21
+ /** Channels each instance addresses; the allocator's own constant, so the two cannot drift. */
22
+ const MIDI_CHANNEL_COUNT = CHANNELS_PER_INSTANCE;
23
+ /**
24
+ * The voice ceiling, chosen once at init because fluidsynth exposes no runtime
25
+ * setter for it.
26
+ *
27
+ * Its default of 256 is low for a score with hundreds of parts. Set generously
28
+ * instead: a voice slot is a small struct, only *sounding* voices cost CPU, and
29
+ * above the ceiling fluidsynth steals by its own overflow priority — quietest
30
+ * and oldest first — rather than refusing the newest note.
31
+ */
32
+ const POLYPHONY = 2048;
33
+ /**
34
+ * Where General MIDI keeps its drum kits. Channel 9 is already there in GM
35
+ * mode; any other channel has to be sent there explicitly.
36
+ */
37
+ const DRUM_BANK = 128;
38
+ /** The kit channel 9 defaults to, so a switched channel matches it. */
39
+ const STANDARD_KIT = 0;
40
+ /** The one channel General MIDI reserves for drums, and the one that may never go melodic. */
41
+ const PERCUSSION_CHANNEL = 9;
42
+ export class SynthHost {
43
+ deps;
44
+ synths = [];
45
+ sequencers = [];
46
+ sfontIds = [];
47
+ /** `instance:channel` for every channel that is percussion — see `programSelect`. */
48
+ percussionChannels = new Set();
49
+ master = null;
50
+ masterVolume = 1;
51
+ trackCount = 1;
52
+ /** Kept so instances can be added later; see `ensureInstances`. */
53
+ context = null;
54
+ soundfont = null;
55
+ /** The governor's current setting, so an instance opened later starts where the others are. */
56
+ interpolation = null;
57
+ /** Serialises growth, so two scores loading at once cannot both build instance 1. */
58
+ growing = Promise.resolve();
59
+ constructor(deps) {
60
+ this.deps = deps;
61
+ }
62
+ async init(context, options) {
63
+ // Before libfluidsynth, so its emscripten module adopts a printErr that
64
+ // drops the build-stub notices. Best-effort: if blobs are unavailable the
65
+ // notices stay and nothing else changes.
66
+ const quietUrl = createWorkletQuietModuleUrl();
67
+ if (quietUrl) {
68
+ try {
69
+ await context.audioWorklet.addModule(quietUrl);
70
+ }
71
+ finally {
72
+ URL.revokeObjectURL(quietUrl);
73
+ }
74
+ }
75
+ // Order matters: the worklet build expects libfluidsynth already present.
76
+ await context.audioWorklet.addModule(options.fluidsynthModuleUrl);
77
+ await context.audioWorklet.addModule(options.workletModuleUrl);
78
+ // Master chain, same arithmetic as the engine it replaces: a headroom trim
79
+ // sized by how many channels sum into it, then a limiter catching the
80
+ // phase-aligned peaks the trim cannot predict. The spike measured 64 voices
81
+ // peaking at 1.004, so the limiter is not optional.
82
+ const master = context.createGain();
83
+ const limiter = context.createDynamicsCompressor();
84
+ limiter.threshold.value = LIMITER_CEILING_DB;
85
+ limiter.knee.value = 0;
86
+ limiter.ratio.value = 20;
87
+ limiter.attack.value = 0.003;
88
+ limiter.release.value = 0.25;
89
+ master.connect(limiter);
90
+ limiter.connect(context.destination);
91
+ this.master = master;
92
+ this.context = context;
93
+ this.soundfont = options.soundfont;
94
+ await this.ensureInstances(options.instanceCount);
95
+ this.applyMasterGain();
96
+ }
97
+ /**
98
+ * Opens instances until there are at least `count` of them.
99
+ *
100
+ * Scores outgrow sixteen channels, and which channel a track lands on is
101
+ * decided per score — so the number of synths needed is not known at init
102
+ * time. Growing here rather than sizing up front is what keeps the common
103
+ * case cheap: every extra instance is another copy of the font in WASM
104
+ * memory and seconds of loading, so one is opened only when a score genuinely
105
+ * has more parts than one synth can address. Without this, a track allocated
106
+ * to instance 1 reached `synths[1]`, found nothing, and played silently — no
107
+ * error, no missing note, just a part that was not there.
108
+ */
109
+ ensureInstances(count) {
110
+ this.growing = this.growing.then(() => this.grow(count));
111
+ return this.growing;
112
+ }
113
+ async grow(count) {
114
+ const context = this.context;
115
+ const soundfont = this.soundfont;
116
+ // Before `init`, so there is nothing to build on yet; `init` sizes it.
117
+ if (!context || !soundfont || !this.master)
118
+ return;
119
+ for (let i = this.synths.length; i < count; i += 1) {
120
+ const synth = await this.deps.createSynth();
121
+ synth.init(context.sampleRate, { midiChannelCount: MIDI_CHANNEL_COUNT, polyphony: POLYPHONY });
122
+ synth.createAudioNode(context, RENDER_BUFFER_SIZE).connect(this.master);
123
+ this.sfontIds[i] = await synth.loadSFont(soundfont);
124
+ this.sequencers[i] = await this.createSequencerFor(synth);
125
+ // The governor speaks for every instance, and it may already have spoken.
126
+ if (this.interpolation !== null)
127
+ synth.setInterpolation(this.interpolation);
128
+ this.synths[i] = synth;
129
+ }
130
+ }
131
+ async createSequencerFor(synth) {
132
+ if (!synth.createSequencer)
133
+ return null;
134
+ try {
135
+ const sequencer = await synth.createSequencer();
136
+ await sequencer.registerSynthesizer(synth);
137
+ sequencer.setTimeScale(1000);
138
+ return sequencer;
139
+ }
140
+ catch {
141
+ // Timed dispatch is an optimisation. If the worklet sequencer is not
142
+ // available, immediate MIDI calls still play correctly.
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Marks a channel as percussion.
148
+ *
149
+ * Channel 9 already is one in fluidsynth's GM mode and needs no call; any
150
+ * other channel does, which is what lets a second drum track share an
151
+ * instance rather than costing a whole synth for its own channel 9.
152
+ */
153
+ setChannelPercussion(instance, channel, kit = STANDARD_KIT) {
154
+ this.percussionChannels.add(`${instance}:${channel}`);
155
+ const synth = this.synths[instance];
156
+ if (!synth)
157
+ return;
158
+ // Channel 9 is a drum channel already in GM mode; any other has to be told.
159
+ if (channel !== 9)
160
+ synth.midiSetChannelType(channel, true);
161
+ // Switching the type is not enough on its own. It tells fluidsynth to read
162
+ // later program changes from the drum bank, but leaves the channel on the
163
+ // preset it already had — bank 0, program 0, a piano. A second drum track
164
+ // therefore played its congas and cowbells as piano notes at those pitches,
165
+ // which is exactly what it sounded like.
166
+ //
167
+ // Measured against a real synth: the same conga on channel 9 peaked 0.1229
168
+ // at 0.01187 RMS, this channel with only the type switch gave 0.1115 at
169
+ // 0.01437 — a different instrument — and with the select below it matched
170
+ // channel 9 to the digit.
171
+ // Standard first, then the kit the file asked for. A kit that the font does
172
+ // not have leaves fluidsynth's selection untouched, and "untouched" on a
173
+ // switched channel is the piano it started on — so the guaranteed kit goes
174
+ // on first and a failed switch falls back to drums rather than to a piano.
175
+ //
176
+ // Measured: on channel 9 this select is bit-identical to leaving it alone
177
+ // (peak 0.1883, rms 0.01815 either way), and preset 8 gives the Room kit
178
+ // (0.4027) — so honouring the kit costs nothing and ignoring it was simply
179
+ // wrong. The older rule, "never select a program on a percussion channel",
180
+ // was too broad: it is selecting from the *melodic* bank that breaks a drum
181
+ // channel, and that one is still refused in `programSelect`.
182
+ synth.midiProgramSelect(channel, this.sfontIds[instance], DRUM_BANK, STANDARD_KIT);
183
+ if (kit !== STANDARD_KIT) {
184
+ synth.midiProgramSelect(channel, this.sfontIds[instance], DRUM_BANK, kit);
185
+ }
186
+ }
187
+ /**
188
+ * Selects a GM program — **never on channel 9**.
189
+ *
190
+ * The spike measured this directly: selecting a melodic program on channel 9
191
+ * replaces fluidsynth's working default with a preset that is not at that
192
+ * address, and the channel goes silent. Every explicit selection route gave
193
+ * peak 0.0000; leaving it alone gave 0.3120. This guard is why drums sound.
194
+ *
195
+ * Any *other* channel that was made percussion is switched back rather than
196
+ * refused. Channel assignment is per score, so the channel a second drum
197
+ * track borrowed is handed to a pitched track by the next score that has one
198
+ * fewer kit — and refusing here left that track playing congas under a violin
199
+ * label, permanently, because nothing ever cleared the flag. Switching the
200
+ * type back before the select is exactly what the offline renderer already
201
+ * does for the same situation.
202
+ */
203
+ programSelect(instance, channel, program) {
204
+ if (channel === PERCUSSION_CHANNEL)
205
+ return;
206
+ if (this.percussionChannels.delete(`${instance}:${channel}`)) {
207
+ this.synths[instance]?.midiSetChannelType(channel, false);
208
+ }
209
+ this.synths[instance]?.midiProgramSelect(channel, this.sfontIds[instance], 0, program);
210
+ }
211
+ noteOn(instance, channel, midi, velocity) {
212
+ this.synths[instance]?.midiNoteOn(channel, midi, velocity);
213
+ }
214
+ /**
215
+ * Schedules a note and its release together, ahead of time.
216
+ *
217
+ * The sequencer's `note` event carries its own duration, so fluidsynth
218
+ * releases the note on the audio thread. Note-offs used to be fired from the
219
+ * main thread as the pump noticed them, which made every note's length track
220
+ * main-thread lateness — and a stall that held notes long added voices,
221
+ * loading the audio thread in turn.
222
+ *
223
+ * The time scale is milliseconds (`setTimeScale(1000)` in
224
+ * `createSequencerFor`). A negative delay clamps to now rather than being
225
+ * refused: a note whose moment passed during a stall should still sound, and
226
+ * the sequencer still holds its release.
227
+ */
228
+ noteAt(instance, channel, midi, velocity, delaySeconds, durationSeconds) {
229
+ const sequencer = this.sequencers[instance];
230
+ if (!sequencer) {
231
+ // No timed dispatch here; the note sounds immediately and holds until
232
+ // `allSoundOff`. Better than silence, and the real worklet always has one.
233
+ this.noteOn(instance, channel, midi, velocity);
234
+ return;
235
+ }
236
+ sequencer.sendEventAt({
237
+ type: 'note',
238
+ channel,
239
+ key: midi,
240
+ vel: velocity,
241
+ // Never zero: a note fluidsynth is told lasts no time at all may not
242
+ // sound, and a rest is expressed by there being no note, not by one of
243
+ // no length.
244
+ duration: Math.max(1, Math.round(durationSeconds * 1000)),
245
+ }, Math.max(0, Math.round(delaySeconds * 1000)), false);
246
+ }
247
+ noteOff(instance, channel, midi) {
248
+ this.synths[instance]?.midiNoteOff(channel, midi);
249
+ }
250
+ controlChange(instance, channel, control, value) {
251
+ this.synths[instance]?.midiControl(channel, control, value);
252
+ }
253
+ /** Silences everything immediately — stop, seek, and panic all go through here. */
254
+ allSoundOff() {
255
+ for (const sequencer of this.sequencers)
256
+ sequencer?.removeAllEvents();
257
+ for (const synth of this.synths)
258
+ synth.midiAllSoundsOff();
259
+ }
260
+ /** The governor's one confirmed knob; applies to every instance at once. */
261
+ setInterpolation(order) {
262
+ this.interpolation = order;
263
+ for (const synth of this.synths)
264
+ synth.setInterpolation(order);
265
+ }
266
+ setMasterVolume(volume) {
267
+ this.masterVolume = volume;
268
+ this.applyMasterGain();
269
+ }
270
+ /** How many channels are summing, which sizes the headroom trim. */
271
+ setTrackCount(count) {
272
+ this.trackCount = count;
273
+ this.applyMasterGain();
274
+ }
275
+ applyMasterGain() {
276
+ if (this.master)
277
+ this.master.gain.value = this.masterVolume * headroomTrimFor(this.trackCount);
278
+ }
279
+ dispose() {
280
+ for (const sequencer of this.sequencers)
281
+ sequencer?.close();
282
+ for (const synth of this.synths)
283
+ synth.close();
284
+ this.synths = [];
285
+ this.sequencers = [];
286
+ this.sfontIds = [];
287
+ this.percussionChannels.clear();
288
+ this.master = null;
289
+ this.context = null;
290
+ this.soundfont = null;
291
+ }
292
+ }
293
+ //# sourceMappingURL=synth-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth-host.js","sourceRoot":"","sources":["../../../src/web/playback/synth-host.ts"],"names":[],"mappings":"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"}