@opendaw/studio-core 0.0.24 → 0.0.25

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 (39) hide show
  1. package/dist/AudioOfflineRenderer.d.ts +8 -0
  2. package/dist/AudioOfflineRenderer.d.ts.map +1 -0
  3. package/dist/AudioOfflineRenderer.js +88 -0
  4. package/dist/AudioWorklets.d.ts +1 -1
  5. package/dist/AudioWorklets.d.ts.map +1 -1
  6. package/dist/AudioWorklets.js +3 -2
  7. package/dist/FilePickerAcceptTypes.d.ts +8 -0
  8. package/dist/FilePickerAcceptTypes.d.ts.map +1 -0
  9. package/dist/FilePickerAcceptTypes.js +27 -0
  10. package/dist/MidiDevices.d.ts +2 -1
  11. package/dist/MidiDevices.d.ts.map +1 -1
  12. package/dist/MidiDevices.js +12 -1
  13. package/dist/WorkerAgents.d.ts +1 -1
  14. package/dist/WorkerAgents.d.ts.map +1 -1
  15. package/dist/WorkerAgents.js +3 -3
  16. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  17. package/dist/capture/CaptureAudio.js +7 -2
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +6 -0
  21. package/dist/processors.js +2 -2
  22. package/dist/processors.js.map +4 -4
  23. package/dist/project/Project.d.ts +1 -1
  24. package/dist/project/Project.d.ts.map +1 -1
  25. package/dist/project/Project.js +3 -3
  26. package/dist/project/ProjectEnv.d.ts +0 -7
  27. package/dist/project/ProjectEnv.d.ts.map +1 -1
  28. package/dist/samples/OpenSampleAPI.d.ts +14 -0
  29. package/dist/samples/OpenSampleAPI.d.ts.map +1 -0
  30. package/dist/samples/OpenSampleAPI.js +109 -0
  31. package/dist/samples/SampleAPI.d.ts +10 -0
  32. package/dist/samples/SampleAPI.d.ts.map +1 -0
  33. package/dist/samples/SampleAPI.js +1 -0
  34. package/dist/samples/SampleImporter.d.ts +11 -0
  35. package/dist/samples/SampleImporter.d.ts.map +1 -0
  36. package/dist/samples/SampleImporter.js +1 -0
  37. package/dist/workers.js +2 -2
  38. package/dist/workers.js.map +4 -4
  39. package/package.json +14 -14
@@ -36,7 +36,7 @@ export declare class Project implements BoxAdaptersContext, Terminable, Terminab
36
36
  readonly mixer: Mixer;
37
37
  readonly engine: EngineFacade;
38
38
  private constructor();
39
- startAudioWorklet(worklets: AudioWorklets, restart: RestartWorklet): EngineWorklet;
39
+ startAudioWorklet(worklets: AudioWorklets, restart?: RestartWorklet): EngineWorklet;
40
40
  startRecording(countIn?: boolean): void;
41
41
  own<T extends Terminable>(terminable: T): T;
42
42
  ownAll<T extends Terminable>(...terminables: Array<T>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ByteArrayOutput, Option, panic, Terminator, UUID } from "@opendaw/lib-std";
1
+ import { ByteArrayOutput, Option, panic, safeExecute, Terminator, UUID } from "@opendaw/lib-std";
2
2
  import { BoxGraph, Editing } from "@opendaw/lib-box";
3
3
  import { AudioBusBox, AudioUnitBox, BoxIO, GrooveShuffleBox, RootBox, TimelineBox, UserInterfaceBox } from "@opendaw/studio-boxes";
4
4
  import { BoxAdapters, IconSymbol, ParameterFieldAdapters, ProjectDecoder, RootBoxAdapter, TimelineBoxAdapter, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
@@ -107,9 +107,9 @@ export class Project {
107
107
  // we will only accept the first error
108
108
  engine.removeEventListener("error", handler);
109
109
  engine.removeEventListener("processorerror", handler);
110
- restart.unload(event);
110
+ safeExecute(restart?.unload, event);
111
111
  lifecycle.terminate();
112
- restart.load(this.startAudioWorklet(worklets, restart));
112
+ safeExecute(restart?.load, this.startAudioWorklet(worklets, restart));
113
113
  };
114
114
  engine.addEventListener("error", handler);
115
115
  engine.addEventListener("processorerror", handler);
@@ -1,15 +1,8 @@
1
1
  import { SampleManager } from "@opendaw/studio-adapters";
2
2
  import { AudioWorklets } from "../AudioWorklets";
3
3
  export interface ProjectEnv {
4
- dialogs?: ProjectEnv.Dialogs;
5
4
  audioContext: AudioContext;
6
5
  audioWorklets: AudioWorklets;
7
6
  sampleManager: SampleManager;
8
7
  }
9
- export declare namespace ProjectEnv {
10
- interface Dialogs {
11
- info(headline: string, message: string, okText: string): Promise<void>;
12
- approve(headline: string, message: string, approveText: string, cancelText: string): Promise<boolean>;
13
- }
14
- }
15
8
  //# sourceMappingURL=ProjectEnv.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectEnv.d.ts","sourceRoot":"","sources":["../../src/project/ProjectEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,UAAU;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;CAC/B;AAED,yBAAiB,UAAU,CAAC;IACxB,UAAiB,OAAO;QACpB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACtE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACxG;CACJ"}
1
+ {"version":3,"file":"ProjectEnv.d.ts","sourceRoot":"","sources":["../../src/project/ProjectEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,UAAU;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;CAC/B"}
@@ -0,0 +1,14 @@
1
+ import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
2
+ import { AudioData, Sample, SampleMetaData } from "@opendaw/studio-adapters";
3
+ import { SampleAPI } from "@opendaw/studio-core";
4
+ export declare class OpenSampleAPI implements SampleAPI {
5
+ static readonly ApiRoot = "https://api.opendaw.studio/samples";
6
+ static readonly FileRoot = "https://assets.opendaw.studio/samples";
7
+ static fromAudioBuffer(buffer: AudioBuffer): AudioData;
8
+ all(): Promise<ReadonlyArray<Sample>>;
9
+ get(uuid: UUID.Format): Promise<Sample>;
10
+ load(context: AudioContext, uuid: UUID.Format, progress: Procedure<unitValue>): Promise<[AudioData, Sample]>;
11
+ upload(arrayBuffer: ArrayBuffer, metaData: SampleMetaData): Promise<void>;
12
+ allowsUpload(): boolean;
13
+ }
14
+ //# sourceMappingURL=OpenSampleAPI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC1E,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAY9C,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAElE,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS;IAShD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAkC5G,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC/E,YAAY,IAAI,OAAO;CAC1B"}
@@ -0,0 +1,109 @@
1
+ import { Arrays, asDefined, DefaultObservableValue, panic, RuntimeNotifier, tryCatch, UUID } from "@opendaw/lib-std";
2
+ import { network, Promises } from "@opendaw/lib-runtime";
3
+ const username = "openDAW";
4
+ const password = "prototype";
5
+ const base64Credentials = btoa(`${username}:${password}`);
6
+ const headers = {
7
+ method: "GET",
8
+ headers: { "Authorization": `Basic ${base64Credentials}` },
9
+ credentials: "include"
10
+ };
11
+ // Standard openDAW samples
12
+ export class OpenSampleAPI {
13
+ static ApiRoot = "https://api.opendaw.studio/samples";
14
+ static FileRoot = "https://assets.opendaw.studio/samples";
15
+ static fromAudioBuffer(buffer) {
16
+ return {
17
+ frames: Arrays.create(channel => buffer.getChannelData(channel), buffer.numberOfChannels),
18
+ sampleRate: buffer.sampleRate,
19
+ numberOfFrames: buffer.length,
20
+ numberOfChannels: buffer.numberOfChannels
21
+ };
22
+ }
23
+ async all() {
24
+ return Promises.retry(() => fetch(`${OpenSampleAPI.ApiRoot}/list.php`, headers)
25
+ .then(x => x.json(), () => []));
26
+ }
27
+ async get(uuid) {
28
+ const url = `${OpenSampleAPI.ApiRoot}/get.php?uuid=${UUID.toString(uuid)}`;
29
+ const sample = await Promises.retry(() => network.limitFetch(url, headers)
30
+ .then(x => x.json()))
31
+ .then(x => { if ("error" in x) {
32
+ return panic(x.error);
33
+ }
34
+ else {
35
+ return x;
36
+ } });
37
+ return Object.freeze({ ...sample, cloud: "cloud:openDAW" });
38
+ }
39
+ async load(context, uuid, progress) {
40
+ console.debug(`load ${UUID.toString(uuid)}`);
41
+ return this.get(uuid)
42
+ .then(({ uuid, name, bpm }) => Promises.retry(() => network
43
+ .limitFetch(`${OpenSampleAPI.FileRoot}/${uuid}`, headers))
44
+ .then(response => {
45
+ const total = parseInt(response.headers.get("Content-Length") ?? "0");
46
+ let loaded = 0;
47
+ return new Promise((resolve, reject) => {
48
+ const reader = asDefined(response.body, "No body in response").getReader();
49
+ const chunks = [];
50
+ const nextChunk = ({ done, value }) => {
51
+ if (done) {
52
+ resolve(new Blob(chunks).arrayBuffer());
53
+ }
54
+ else {
55
+ chunks.push(value);
56
+ loaded += value.length;
57
+ progress(loaded / total);
58
+ reader.read().then(nextChunk, reject);
59
+ }
60
+ };
61
+ reader.read().then(nextChunk, reject);
62
+ });
63
+ })
64
+ .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
65
+ .then(audioBuffer => ([OpenSampleAPI.fromAudioBuffer(audioBuffer), {
66
+ uuid,
67
+ bpm,
68
+ name,
69
+ duration: audioBuffer.duration,
70
+ sample_rate: audioBuffer.sampleRate
71
+ }])));
72
+ }
73
+ async upload(arrayBuffer, metaData) {
74
+ const progress = new DefaultObservableValue(0.0);
75
+ const dialog = RuntimeNotifier.progress({ headline: "Uploading", progress });
76
+ const formData = new FormData();
77
+ Object.entries(metaData).forEach(([key, value]) => formData.set(key, String(value)));
78
+ const params = new URLSearchParams(location.search);
79
+ const accessKey = asDefined(params.get("access-key"), "Cannot upload without access-key.");
80
+ formData.set("key", accessKey);
81
+ formData.append("file", new Blob([arrayBuffer]));
82
+ console.log("upload data", Array.from(formData.entries()), arrayBuffer.byteLength);
83
+ const xhr = new XMLHttpRequest();
84
+ xhr.upload.addEventListener("progress", (event) => {
85
+ if (event.lengthComputable) {
86
+ progress.setValue(event.loaded / event.total);
87
+ }
88
+ });
89
+ xhr.onreadystatechange = () => {
90
+ if (xhr.readyState === 4) {
91
+ dialog.terminate();
92
+ if (xhr.status === 200) {
93
+ RuntimeNotifier.info({ message: xhr.responseText });
94
+ }
95
+ else {
96
+ const { status, value } = tryCatch(() => JSON.parse(xhr.responseText).message ?? "Unknown error message");
97
+ RuntimeNotifier.info({
98
+ headline: "Upload Failure",
99
+ message: status === "success" ? value : "Unknown error"
100
+ });
101
+ }
102
+ }
103
+ };
104
+ xhr.open("POST", `${OpenSampleAPI.ApiRoot}/upload.php`, true);
105
+ xhr.setRequestHeader("Authorization", `Basic ${base64Credentials}`);
106
+ xhr.send(formData);
107
+ }
108
+ allowsUpload() { return false; }
109
+ }
@@ -0,0 +1,10 @@
1
+ import { AudioData, Sample, SampleMetaData } from "@opendaw/studio-adapters";
2
+ import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
3
+ export interface SampleAPI {
4
+ all(): Promise<ReadonlyArray<Sample>>;
5
+ get(uuid: UUID.Format): Promise<Sample>;
6
+ load(context: AudioContext, uuid: UUID.Format, progress: Procedure<unitValue>): Promise<[AudioData, Sample]>;
7
+ upload(arrayBuffer: ArrayBuffer, metaData: SampleMetaData): Promise<void>;
8
+ allowsUpload(): boolean;
9
+ }
10
+ //# sourceMappingURL=SampleAPI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/SampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC1E,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAE3D,MAAM,WAAW,SAAS;IACtB,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IACrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAC5G,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzE,YAAY,IAAI,OAAO,CAAA;CAC1B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { Progress, UUID } from "@opendaw/lib-std";
2
+ import { Sample } from "@opendaw/studio-adapters";
3
+ export type SampleImporter = {
4
+ importSample(sample: {
5
+ uuid: UUID.Format;
6
+ name: string;
7
+ arrayBuffer: ArrayBuffer;
8
+ progressHandler?: Progress.Handler;
9
+ }): Promise<Sample>;
10
+ };
11
+ //# sourceMappingURL=SampleImporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleImporter.d.ts","sourceRoot":"","sources":["../../src/samples/SampleImporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAA;AAE/C,MAAM,MAAM,cAAc,GAAG;IACzB,YAAY,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,WAAW,CAAC;QACzB,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACrC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACtB,CAAA"}
@@ -0,0 +1 @@
1
+ export {};