@algo-wasm/algo-wasm 1.0.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 (55) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +661 -0
  3. package/NOTICE +15 -0
  4. package/README.md +36 -0
  5. package/dist/AlgoWasmError.d.ts +8 -0
  6. package/dist/AlgoWasmError.d.ts.map +1 -0
  7. package/dist/AlgoWasmError.js +9 -0
  8. package/dist/AlgoWasmError.js.map +1 -0
  9. package/dist/AlgoWasmPlayer.d.ts +48 -0
  10. package/dist/AlgoWasmPlayer.d.ts.map +1 -0
  11. package/dist/AlgoWasmPlayer.js +375 -0
  12. package/dist/AlgoWasmPlayer.js.map +1 -0
  13. package/dist/algo_wasm.wasm +0 -0
  14. package/dist/events.d.ts +9 -0
  15. package/dist/events.d.ts.map +1 -0
  16. package/dist/events.js +25 -0
  17. package/dist/events.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +6 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/integrations/phaser.d.ts +11 -0
  23. package/dist/integrations/phaser.d.ts.map +1 -0
  24. package/dist/integrations/phaser.js +16 -0
  25. package/dist/integrations/phaser.js.map +1 -0
  26. package/dist/integrations/react.d.ts +8 -0
  27. package/dist/integrations/react.d.ts.map +1 -0
  28. package/dist/integrations/react.js +28 -0
  29. package/dist/integrations/react.js.map +1 -0
  30. package/dist/integrations/svelte.d.ts +7 -0
  31. package/dist/integrations/svelte.d.ts.map +1 -0
  32. package/dist/integrations/svelte.js +17 -0
  33. package/dist/integrations/svelte.js.map +1 -0
  34. package/dist/integrations/vue.d.ts +8 -0
  35. package/dist/integrations/vue.d.ts.map +1 -0
  36. package/dist/integrations/vue.js +16 -0
  37. package/dist/integrations/vue.js.map +1 -0
  38. package/dist/loadWasm.d.ts +47 -0
  39. package/dist/loadWasm.d.ts.map +1 -0
  40. package/dist/loadWasm.js +229 -0
  41. package/dist/loadWasm.js.map +1 -0
  42. package/dist/profile-schema.json +464 -0
  43. package/dist/profile.d.ts +15 -0
  44. package/dist/profile.d.ts.map +1 -0
  45. package/dist/profile.js +525 -0
  46. package/dist/profile.js.map +1 -0
  47. package/dist/types.d.ts +189 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/worklet/algo-worklet.d.ts +83 -0
  52. package/dist/worklet/algo-worklet.d.ts.map +1 -0
  53. package/dist/worklet/algo-worklet.js +471 -0
  54. package/dist/worklet/algo-worklet.js.map +1 -0
  55. package/package.json +56 -0
@@ -0,0 +1,8 @@
1
+ import type { AlgoWasmPlayer } from '../AlgoWasmPlayer.js';
2
+ import type { AlgoWasmSnapshot } from '../types.js';
3
+ export interface AlgoWasmExternalStore {
4
+ getSnapshot(): AlgoWasmSnapshot;
5
+ subscribe(listener: () => void): () => void;
6
+ }
7
+ export declare function createAlgoWasmExternalStore(player: AlgoWasmPlayer): AlgoWasmExternalStore;
8
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/integrations/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,WAAW,IAAI,gBAAgB,CAAC;IAChC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CA6BzF"}
@@ -0,0 +1,28 @@
1
+ export function createAlgoWasmExternalStore(player) {
2
+ const listeners = new Set();
3
+ const notify = () => {
4
+ for (const listener of listeners) {
5
+ listener();
6
+ }
7
+ };
8
+ const offBar = player.on('bar', notify);
9
+ const offStarted = player.on('started', notify);
10
+ const offStopped = player.on('stopped', notify);
11
+ return {
12
+ getSnapshot() {
13
+ return player.getSnapshot();
14
+ },
15
+ subscribe(listener) {
16
+ listeners.add(listener);
17
+ return () => {
18
+ listeners.delete(listener);
19
+ if (listeners.size === 0) {
20
+ offBar();
21
+ offStarted();
22
+ offStopped();
23
+ }
24
+ };
25
+ }
26
+ };
27
+ }
28
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/integrations/react.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,2BAA2B,CAAC,MAAsB;IAChE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEhD,OAAO;QACL,WAAW;YACT,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC;QACD,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAE3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,EAAE,CAAC;oBACT,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AlgoWasmPlayer } from '../AlgoWasmPlayer.js';
2
+ import type { AlgoWasmSnapshot } from '../types.js';
3
+ export interface AlgoWasmReadableStore {
4
+ subscribe(run: (snapshot: AlgoWasmSnapshot) => void): () => void;
5
+ }
6
+ export declare function readableAlgoWasmPlayer(player: AlgoWasmPlayer): AlgoWasmReadableStore;
7
+ //# sourceMappingURL=svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.d.ts","sourceRoot":"","sources":["../../src/integrations/svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAClE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAgBpF"}
@@ -0,0 +1,17 @@
1
+ export function readableAlgoWasmPlayer(player) {
2
+ return {
3
+ subscribe(run) {
4
+ run(player.getSnapshot());
5
+ const update = () => run(player.getSnapshot());
6
+ const offBar = player.on('bar', update);
7
+ const offStarted = player.on('started', update);
8
+ const offStopped = player.on('stopped', update);
9
+ return () => {
10
+ offBar();
11
+ offStarted();
12
+ offStopped();
13
+ };
14
+ }
15
+ };
16
+ }
17
+ //# sourceMappingURL=svelte.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.js","sourceRoot":"","sources":["../../src/integrations/svelte.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,sBAAsB,CAAC,MAAsB;IAC3D,OAAO;QACL,SAAS,CAAC,GAAG;YACX,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAEhD,OAAO,GAAG,EAAE;gBACV,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;YACf,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AlgoWasmPlayer } from '../AlgoWasmPlayer.js';
2
+ import type { AlgoWasmSnapshot } from '../types.js';
3
+ export interface AlgoWasmVueBridge {
4
+ snapshot: AlgoWasmSnapshot;
5
+ dispose(): void;
6
+ }
7
+ export declare function createAlgoWasmVueBridge(player: AlgoWasmPlayer, assign: (snapshot: AlgoWasmSnapshot) => void): AlgoWasmVueBridge;
8
+ //# sourceMappingURL=vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../src/integrations/vue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAC3C,iBAAiB,CAgBnB"}
@@ -0,0 +1,16 @@
1
+ export function createAlgoWasmVueBridge(player, assign) {
2
+ const update = () => assign(player.getSnapshot());
3
+ const offBar = player.on('bar', update);
4
+ const offStarted = player.on('started', update);
5
+ const offStopped = player.on('stopped', update);
6
+ update();
7
+ return {
8
+ snapshot: player.getSnapshot(),
9
+ dispose() {
10
+ offBar();
11
+ offStarted();
12
+ offStopped();
13
+ }
14
+ };
15
+ }
16
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.js","sourceRoot":"","sources":["../../src/integrations/vue.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,uBAAuB,CACrC,MAAsB,EACtB,MAA4C;IAE5C,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,EAAE,CAAC;IAET,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE;QAC9B,OAAO;YACL,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { AlgoWasmGeneratedEvent, AlgoWasmProfile, AlgoWasmSnapshot } from './types.js';
2
+ export interface AlgoWasmInstantiation {
3
+ instance: WebAssembly.Instance;
4
+ module: WebAssembly.Module;
5
+ }
6
+ export declare function instantiateAlgoWasm(wasmUrl: string | URL): Promise<AlgoWasmInstantiation>;
7
+ export declare class AlgoWasmEngineBinding {
8
+ private readonly exports;
9
+ private readonly encoder;
10
+ private readonly decoder;
11
+ private enginePtr;
12
+ private renderPtr;
13
+ private renderLength;
14
+ private renderView?;
15
+ constructor(instance: WebAssembly.Instance);
16
+ create(sampleRate: number, seed: bigint, profile: AlgoWasmProfile): void;
17
+ start(): void;
18
+ pause(): void;
19
+ resume(): void;
20
+ stop(): void;
21
+ setSeed(seed: bigint): void;
22
+ setProfile(profile: AlgoWasmProfile): void;
23
+ setVolume(value: number): void;
24
+ setEnergy(value: number): void;
25
+ setIntensity(value: number): void;
26
+ setMood(value: string): void;
27
+ setTempoRange(minBpm: number, maxBpm: number): void;
28
+ setMuted(trackId: string, muted: boolean): void;
29
+ setSolo(trackId: string, solo: boolean): void;
30
+ renderTo(output: Float32Array): void;
31
+ snapshot(): AlgoWasmSnapshot;
32
+ events(): AlgoWasmGeneratedEvent[];
33
+ exportMidi(): Uint8Array;
34
+ destroy(): void;
35
+ private ensureRenderBuffer;
36
+ private get memory();
37
+ private requireMemory;
38
+ private requireExport;
39
+ private call;
40
+ private callEngine;
41
+ private assertCode;
42
+ private ensureEngine;
43
+ private withString;
44
+ private readJson;
45
+ private readLastError;
46
+ }
47
+ //# sourceMappingURL=loadWasm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadWasm.d.ts","sourceRoot":"","sources":["../src/loadWasm.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;CAC5B;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA8C/F;AAKD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAC,CAAe;gBAEtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;IAO1C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAkBxE,KAAK,IAAI,IAAI;IAIb,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAQ1C,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO5B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAInD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAO/C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAO7C,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAapC,QAAQ,IAAI,gBAAgB;IAM5B,MAAM,IAAI,sBAAsB,EAAE;IAMlC,UAAU,IAAI,UAAU;IAQxB,OAAO,IAAI,IAAI;IAcf,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,aAAa;CAWtB"}
@@ -0,0 +1,229 @@
1
+ import { AlgoWasmError } from './AlgoWasmError.js';
2
+ import { splitSeed } from './profile.js';
3
+ export async function instantiateAlgoWasm(wasmUrl) {
4
+ const url = wasmUrl.toString();
5
+ const imports = {};
6
+ const response = await fetch(url);
7
+ if (!response.ok) {
8
+ throw new AlgoWasmError('wasm_load_failed', `Could not load AlgoWASM from ${url}. The server returned ${response.status}.`);
9
+ }
10
+ if (WebAssembly.instantiateStreaming) {
11
+ try {
12
+ const result = await WebAssembly.instantiateStreaming(response, imports);
13
+ return {
14
+ instance: result.instance,
15
+ module: result.module
16
+ };
17
+ }
18
+ catch (error) {
19
+ if (response.headers.get('content-type') === 'application/wasm') {
20
+ throw new AlgoWasmError('wasm_load_failed', 'WASM streaming compilation failed even though the server served application/wasm.', { cause: error });
21
+ }
22
+ }
23
+ }
24
+ const fallbackResponse = await fetch(url);
25
+ if (!fallbackResponse.ok) {
26
+ throw new AlgoWasmError('wasm_load_failed', `Could not load AlgoWASM fallback bytes from ${url}. The server returned ${fallbackResponse.status}.`);
27
+ }
28
+ const bytes = await fallbackResponse.arrayBuffer();
29
+ const result = await WebAssembly.instantiate(bytes, imports);
30
+ return {
31
+ instance: result.instance,
32
+ module: result.module
33
+ };
34
+ }
35
+ export class AlgoWasmEngineBinding {
36
+ exports;
37
+ encoder = new TextEncoder();
38
+ decoder = new TextDecoder();
39
+ enginePtr = 0;
40
+ renderPtr = 0;
41
+ renderLength = 0;
42
+ renderView;
43
+ constructor(instance) {
44
+ this.exports = instance.exports;
45
+ this.requireMemory();
46
+ this.requireExport('algo_wasm_alloc');
47
+ this.requireExport('algo_wasm_dealloc');
48
+ }
49
+ create(sampleRate, seed, profile) {
50
+ if (this.enginePtr !== 0) {
51
+ this.destroy();
52
+ }
53
+ const { high, low } = splitSeed(seed);
54
+ const profileJson = JSON.stringify(profile);
55
+ const result = this.withString(profileJson, (pointer, length) => this.call('algo_wasm_engine_create', sampleRate, high, low, pointer, length));
56
+ if (result === 0) {
57
+ throw new AlgoWasmError('engine_failed', this.readLastError('AlgoWASM engine creation failed.'));
58
+ }
59
+ this.enginePtr = result;
60
+ }
61
+ start() {
62
+ this.callEngine('algo_wasm_engine_start');
63
+ }
64
+ pause() {
65
+ this.callEngine('algo_wasm_engine_pause');
66
+ }
67
+ resume() {
68
+ this.callEngine('algo_wasm_engine_resume');
69
+ }
70
+ stop() {
71
+ this.callEngine('algo_wasm_engine_stop');
72
+ }
73
+ setSeed(seed) {
74
+ const { high, low } = splitSeed(seed);
75
+ this.callEngine('algo_wasm_engine_set_seed', high, low);
76
+ }
77
+ setProfile(profile) {
78
+ const profileJson = JSON.stringify(profile);
79
+ const result = this.withString(profileJson, (pointer, length) => this.call('algo_wasm_engine_set_profile', this.enginePtr, pointer, length));
80
+ this.assertCode(result, 'Profile update failed.');
81
+ }
82
+ setVolume(value) {
83
+ this.callEngine('algo_wasm_engine_set_volume', value);
84
+ }
85
+ setEnergy(value) {
86
+ this.callEngine('algo_wasm_engine_set_energy', value);
87
+ }
88
+ setIntensity(value) {
89
+ this.callEngine('algo_wasm_engine_set_intensity', value);
90
+ }
91
+ setMood(value) {
92
+ const result = this.withString(value, (pointer, length) => this.call('algo_wasm_engine_set_mood', this.enginePtr, pointer, length));
93
+ this.assertCode(result, 'Mood update failed.');
94
+ }
95
+ setTempoRange(minBpm, maxBpm) {
96
+ this.callEngine('algo_wasm_engine_set_tempo_range', minBpm, maxBpm);
97
+ }
98
+ setMuted(trackId, muted) {
99
+ const result = this.withString(trackId, (pointer, length) => this.call('algo_wasm_engine_set_muted', this.enginePtr, pointer, length, muted ? 1 : 0));
100
+ this.assertCode(result, 'Mute update failed.');
101
+ }
102
+ setSolo(trackId, solo) {
103
+ const result = this.withString(trackId, (pointer, length) => this.call('algo_wasm_engine_set_solo', this.enginePtr, pointer, length, solo ? 1 : 0));
104
+ this.assertCode(result, 'Solo update failed.');
105
+ }
106
+ renderTo(output) {
107
+ this.ensureEngine();
108
+ this.ensureRenderBuffer(output.length);
109
+ const result = this.call('algo_wasm_engine_render', this.enginePtr, this.renderPtr, output.length);
110
+ this.assertCode(result, 'Render failed.');
111
+ if (!this.renderView || this.renderView.length !== output.length) {
112
+ this.renderView = new Float32Array(this.memory.buffer, this.renderPtr, output.length);
113
+ }
114
+ output.set(this.renderView);
115
+ }
116
+ snapshot() {
117
+ this.ensureEngine();
118
+ const length = this.call('algo_wasm_engine_snapshot_json', this.enginePtr);
119
+ return this.readJson(length);
120
+ }
121
+ events() {
122
+ this.ensureEngine();
123
+ const length = this.call('algo_wasm_engine_events_json', this.enginePtr);
124
+ return this.readJson(length);
125
+ }
126
+ exportMidi() {
127
+ this.ensureEngine();
128
+ const length = this.call('algo_wasm_engine_export_midi', this.enginePtr);
129
+ const pointer = this.call('algo_wasm_bytes_ptr');
130
+ return new Uint8Array(this.memory.buffer, pointer, length).slice();
131
+ }
132
+ destroy() {
133
+ if (this.renderPtr !== 0) {
134
+ this.call('algo_wasm_dealloc', this.renderPtr, this.renderLength * 4);
135
+ this.renderPtr = 0;
136
+ this.renderLength = 0;
137
+ this.renderView = undefined;
138
+ }
139
+ if (this.enginePtr !== 0) {
140
+ this.call('algo_wasm_engine_destroy', this.enginePtr);
141
+ this.enginePtr = 0;
142
+ }
143
+ }
144
+ ensureRenderBuffer(length) {
145
+ if (this.renderPtr !== 0 && this.renderLength >= length) {
146
+ if (this.renderView?.buffer !== this.memory.buffer) {
147
+ this.renderView = new Float32Array(this.memory.buffer, this.renderPtr, this.renderLength);
148
+ }
149
+ return;
150
+ }
151
+ if (this.renderPtr !== 0) {
152
+ this.call('algo_wasm_dealloc', this.renderPtr, this.renderLength * 4);
153
+ }
154
+ this.renderLength = length;
155
+ this.renderPtr = this.call('algo_wasm_alloc', length * 4);
156
+ if (this.renderPtr === 0) {
157
+ throw new AlgoWasmError('render_failed', 'Could not allocate the WASM render buffer.');
158
+ }
159
+ this.renderView = new Float32Array(this.memory.buffer, this.renderPtr, length);
160
+ }
161
+ get memory() {
162
+ return this.requireMemory();
163
+ }
164
+ requireMemory() {
165
+ const memory = this.exports.memory;
166
+ if (!(memory instanceof WebAssembly.Memory)) {
167
+ throw new AlgoWasmError('wasm_load_failed', 'AlgoWASM did not export a WebAssembly memory.');
168
+ }
169
+ return memory;
170
+ }
171
+ requireExport(name) {
172
+ const fn = this.exports[name];
173
+ if (typeof fn !== 'function') {
174
+ throw new AlgoWasmError('wasm_load_failed', `AlgoWASM is missing the ${name} export.`);
175
+ }
176
+ return fn;
177
+ }
178
+ call(name, ...args) {
179
+ return this.requireExport(name)(...args);
180
+ }
181
+ callEngine(name, ...args) {
182
+ this.ensureEngine();
183
+ const result = this.call(name, this.enginePtr, ...args);
184
+ this.assertCode(result, `${String(name)} failed.`);
185
+ }
186
+ assertCode(result, fallback) {
187
+ if (result !== 0) {
188
+ throw new AlgoWasmError('engine_failed', this.readLastError(fallback));
189
+ }
190
+ }
191
+ ensureEngine() {
192
+ if (this.enginePtr === 0) {
193
+ throw new AlgoWasmError('engine_failed', 'AlgoWASM engine has not been created.');
194
+ }
195
+ }
196
+ withString(value, callback) {
197
+ const bytes = this.encoder.encode(value);
198
+ const pointer = this.call('algo_wasm_alloc', bytes.length);
199
+ if (pointer === 0) {
200
+ throw new AlgoWasmError('engine_failed', 'Could not allocate a WASM string buffer.');
201
+ }
202
+ new Uint8Array(this.memory.buffer, pointer, bytes.length).set(bytes);
203
+ try {
204
+ return callback(pointer, bytes.length);
205
+ }
206
+ finally {
207
+ this.call('algo_wasm_dealloc', pointer, bytes.length);
208
+ }
209
+ }
210
+ readJson(length) {
211
+ if (length === 0) {
212
+ const error = this.readLastError('AlgoWASM returned an empty JSON buffer.');
213
+ throw new AlgoWasmError('engine_failed', error);
214
+ }
215
+ const pointer = this.call('algo_wasm_json_ptr');
216
+ const bytes = new Uint8Array(this.memory.buffer, pointer, length);
217
+ return JSON.parse(this.decoder.decode(bytes));
218
+ }
219
+ readLastError(fallback) {
220
+ const length = this.call('algo_wasm_last_error_len');
221
+ if (length === 0) {
222
+ return fallback;
223
+ }
224
+ const pointer = this.call('algo_wasm_last_error_ptr');
225
+ const bytes = new Uint8Array(this.memory.buffer, pointer, length);
226
+ return this.decoder.decode(bytes);
227
+ }
228
+ }
229
+ //# sourceMappingURL=loadWasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadWasm.js","sourceRoot":"","sources":["../src/loadWasm.ts"],"names":[],"mappings":"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"}