@opendaw/studio-core 0.0.40 → 0.0.42
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.
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +18 -1
- package/dist/FilePickerAcceptTypes.d.ts +1 -0
- package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
- package/dist/FilePickerAcceptTypes.js +6 -0
- package/dist/InstrumentBox.d.ts +2 -2
- package/dist/InstrumentBox.d.ts.map +1 -1
- package/dist/InstrumentFactories.d.ts +13 -4
- package/dist/InstrumentFactories.d.ts.map +1 -1
- package/dist/InstrumentFactories.js +38 -18
- package/dist/InstrumentFactory.d.ts +3 -2
- package/dist/InstrumentFactory.d.ts.map +1 -1
- package/dist/InstrumentOptions.d.ts +2 -1
- package/dist/InstrumentOptions.d.ts.map +1 -1
- package/dist/OpenDAWHeaders.d.ts +3 -0
- package/dist/OpenDAWHeaders.d.ts.map +1 -0
- package/dist/OpenDAWHeaders.js +8 -0
- package/dist/RecordingWorklet.js +1 -1
- package/dist/Storage.d.ts +14 -0
- package/dist/Storage.d.ts.map +1 -0
- package/dist/Storage.js +32 -0
- package/dist/capture/index.d.ts +6 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +5 -0
- package/dist/cloud/CloudAuthManager.d.ts.map +1 -0
- package/dist/{clouds → cloud}/CloudBackup.d.ts +1 -1
- package/dist/cloud/CloudBackup.d.ts.map +1 -0
- package/dist/{clouds → cloud}/CloudBackup.js +6 -4
- package/dist/cloud/CloudBackupProjects.d.ts.map +1 -0
- package/dist/cloud/CloudBackupSamples.d.ts.map +1 -0
- package/dist/{clouds → cloud}/CloudBackupSamples.js +5 -6
- package/dist/cloud/CloudBackupSoundfont.d.ts +13 -0
- package/dist/cloud/CloudBackupSoundfont.d.ts.map +1 -0
- package/dist/cloud/CloudBackupSoundfont.js +120 -0
- package/dist/cloud/CloudHandler.d.ts.map +1 -0
- package/dist/cloud/CloudService.d.ts.map +1 -0
- package/dist/cloud/DropboxHandler.d.ts.map +1 -0
- package/dist/cloud/GoogleDriveHandler.d.ts.map +1 -0
- package/dist/cloud/index.d.ts +4 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +3 -0
- package/dist/dawproject/DawProjectExporter.test.js +2 -1
- package/dist/dawproject/DawProjectService.d.ts +11 -0
- package/dist/dawproject/DawProjectService.d.ts.map +1 -0
- package/dist/dawproject/DawProjectService.js +63 -0
- package/dist/dawproject/index.d.ts +5 -0
- package/dist/dawproject/index.d.ts.map +1 -0
- package/dist/dawproject/index.js +4 -0
- package/dist/index.d.ts +11 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -32
- package/dist/midi/index.d.ts +3 -0
- package/dist/midi/index.d.ts.map +1 -0
- package/dist/midi/index.js +2 -0
- package/dist/processors.js +3 -3
- package/dist/processors.js.map +4 -4
- package/dist/project/Project.d.ts +2 -1
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +1 -0
- package/dist/project/ProjectApi.d.ts +1 -1
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +3 -2
- package/dist/project/ProjectBundle.d.ts.map +1 -1
- package/dist/project/ProjectBundle.js +67 -18
- package/dist/project/ProjectEnv.d.ts +2 -1
- package/dist/project/ProjectEnv.d.ts.map +1 -1
- package/dist/project/ProjectStorage.d.ts +3 -2
- package/dist/project/ProjectStorage.d.ts.map +1 -1
- package/dist/project/ProjectStorage.js +2 -3
- package/dist/project/index.d.ts +10 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/samples/DefaultSampleLoader.js +2 -2
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +4 -11
- package/dist/samples/SampleService.d.ts +18 -0
- package/dist/samples/SampleService.d.ts.map +1 -0
- package/dist/samples/SampleService.js +82 -0
- package/dist/samples/SampleStorage.d.ts +11 -10
- package/dist/samples/SampleStorage.d.ts.map +1 -1
- package/dist/samples/SampleStorage.js +32 -39
- package/dist/samples/index.d.ts +1 -2
- package/dist/samples/index.d.ts.map +1 -1
- package/dist/samples/index.js +1 -2
- package/dist/soundfont/DefaultSoundfontLoader.d.ts +15 -0
- package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -0
- package/dist/soundfont/DefaultSoundfontLoader.js +69 -0
- package/dist/soundfont/DefaultSoundfontLoaderManager.d.ts +11 -0
- package/dist/soundfont/DefaultSoundfontLoaderManager.d.ts.map +1 -0
- package/dist/soundfont/DefaultSoundfontLoaderManager.js +17 -0
- package/dist/soundfont/OpenSoundfontAPI.d.ts +13 -0
- package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -0
- package/dist/soundfont/OpenSoundfontAPI.js +63 -0
- package/dist/soundfont/SoundfontProvider.d.ts +6 -0
- package/dist/soundfont/SoundfontProvider.d.ts.map +1 -0
- package/dist/soundfont/SoundfontService.d.ts +20 -0
- package/dist/soundfont/SoundfontService.d.ts.map +1 -0
- package/dist/soundfont/SoundfontService.js +98 -0
- package/dist/soundfont/SoundfontStorage.d.ts +21 -0
- package/dist/soundfont/SoundfontStorage.d.ts.map +1 -0
- package/dist/soundfont/SoundfontStorage.js +40 -0
- package/dist/soundfont/index.d.ts +7 -0
- package/dist/soundfont/index.d.ts.map +1 -0
- package/dist/soundfont/index.js +6 -0
- package/dist/sync-log/index.d.ts +4 -0
- package/dist/sync-log/index.d.ts.map +1 -0
- package/dist/sync-log/index.js +3 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/workers-main.js +2 -2
- package/dist/workers-main.js.map +3 -3
- package/dist/ysync/YMapper.d.ts.map +1 -0
- package/dist/{yjs → ysync}/YService.d.ts +1 -2
- package/dist/ysync/YService.d.ts.map +1 -0
- package/dist/{yjs → ysync}/YService.js +1 -1
- package/dist/ysync/YSync.d.ts.map +1 -0
- package/dist/{yjs → ysync}/YSync.js +1 -1
- package/dist/ysync/index.d.ts +4 -0
- package/dist/ysync/index.d.ts.map +1 -0
- package/dist/ysync/index.js +3 -0
- package/package.json +16 -18
- package/dist/clouds/CloudAuthManager.d.ts.map +0 -1
- package/dist/clouds/CloudBackup.d.ts.map +0 -1
- package/dist/clouds/CloudBackupProjects.d.ts.map +0 -1
- package/dist/clouds/CloudBackupSamples.d.ts.map +0 -1
- package/dist/clouds/CloudHandler.d.ts.map +0 -1
- package/dist/clouds/CloudService.d.ts.map +0 -1
- package/dist/clouds/DropboxHandler.d.ts.map +0 -1
- package/dist/clouds/GoogleDriveHandler.d.ts.map +0 -1
- package/dist/samples/P2PSampleProvider.d.ts +0 -13
- package/dist/samples/P2PSampleProvider.d.ts.map +0 -1
- package/dist/samples/P2PSampleProvider.js +0 -350
- package/dist/samples/SampleImporter.d.ts +0 -11
- package/dist/samples/SampleImporter.d.ts.map +0 -1
- package/dist/yjs/YMapper.d.ts.map +0 -1
- package/dist/yjs/YService.d.ts.map +0 -1
- package/dist/yjs/YSync.d.ts.map +0 -1
- /package/dist/{clouds → cloud}/CloudAuthManager.d.ts +0 -0
- /package/dist/{clouds → cloud}/CloudAuthManager.js +0 -0
- /package/dist/{clouds → cloud}/CloudBackupProjects.d.ts +0 -0
- /package/dist/{clouds → cloud}/CloudBackupProjects.js +0 -0
- /package/dist/{clouds → cloud}/CloudBackupSamples.d.ts +0 -0
- /package/dist/{clouds → cloud}/CloudHandler.d.ts +0 -0
- /package/dist/{clouds → cloud}/CloudHandler.js +0 -0
- /package/dist/{clouds → cloud}/CloudService.d.ts +0 -0
- /package/dist/{clouds → cloud}/CloudService.js +0 -0
- /package/dist/{clouds → cloud}/DropboxHandler.d.ts +0 -0
- /package/dist/{clouds → cloud}/DropboxHandler.js +0 -0
- /package/dist/{clouds → cloud}/GoogleDriveHandler.d.ts +0 -0
- /package/dist/{clouds → cloud}/GoogleDriveHandler.js +0 -0
- /package/dist/{samples/SampleImporter.js → soundfont/SoundfontProvider.js} +0 -0
- /package/dist/{yjs → ysync}/YMapper.d.ts +0 -0
- /package/dist/{yjs → ysync}/YMapper.js +0 -0
- /package/dist/{yjs → ysync}/YSync.d.ts +0 -0
package/dist/samples/index.d.ts
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
export * from "./DefaultSampleLoader";
|
2
2
|
export * from "./DefaultSampleLoaderManager";
|
3
3
|
export * from "./OpenSampleAPI";
|
4
|
-
export * from "./P2PSampleProvider";
|
5
4
|
export * from "./SampleAPI";
|
6
|
-
export * from "./SampleImporter";
|
7
5
|
export * from "./SampleProvider";
|
6
|
+
export * from "./SampleService";
|
8
7
|
export * from "./SampleStorage";
|
9
8
|
//# sourceMappingURL=index.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/samples/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/samples/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA"}
|
package/dist/samples/index.js
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
export * from "./DefaultSampleLoader";
|
2
2
|
export * from "./DefaultSampleLoaderManager";
|
3
3
|
export * from "./OpenSampleAPI";
|
4
|
-
export * from "./P2PSampleProvider";
|
5
4
|
export * from "./SampleAPI";
|
6
|
-
export * from "./SampleImporter";
|
7
5
|
export * from "./SampleProvider";
|
6
|
+
export * from "./SampleService";
|
8
7
|
export * from "./SampleStorage";
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { Observer, Option, Subscription, UUID } from "@opendaw/lib-std";
|
2
|
+
import { SoundfontLoader, SoundfontLoaderState, SoundfontMetaData } from "@opendaw/studio-adapters";
|
3
|
+
import { DefaultSoundfontLoaderManager } from "./DefaultSoundfontLoaderManager";
|
4
|
+
import { SoundFont2 } from "soundfont2";
|
5
|
+
export declare class DefaultSoundfontLoader implements SoundfontLoader {
|
6
|
+
#private;
|
7
|
+
constructor(manager: DefaultSoundfontLoaderManager, uuid: UUID.Bytes);
|
8
|
+
subscribe(observer: Observer<SoundfontLoaderState>): Subscription;
|
9
|
+
get uuid(): UUID.Bytes;
|
10
|
+
get soundfont(): Option<SoundFont2>;
|
11
|
+
get meta(): Option<SoundfontMetaData>;
|
12
|
+
get state(): SoundfontLoaderState;
|
13
|
+
toString(): string;
|
14
|
+
}
|
15
|
+
//# sourceMappingURL=DefaultSoundfontLoader.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DefaultSoundfontLoader.d.ts","sourceRoot":"","sources":["../../src/soundfont/DefaultSoundfontLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,EAAY,YAAY,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAErG,OAAO,EAAC,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AACjG,OAAO,EAAC,6BAA6B,EAAC,MAAM,iCAAiC,CAAA;AAE7E,OAAO,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAErC,qBAAa,sBAAuB,YAAW,eAAe;;gBAU9C,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQpE,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,YAAY;IAQjE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAoB;IAC1C,IAAI,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,CAAyB;IAC5D,IAAI,IAAI,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAoB;IACzD,IAAI,KAAK,IAAI,oBAAoB,CAAqB;IAEtD,QAAQ,IAAI,MAAM;CA0CrB"}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
import { Notifier, Option, Terminable, UUID } from "@opendaw/lib-std";
|
2
|
+
import { Promises } from "@opendaw/lib-runtime";
|
3
|
+
import { SoundfontStorage } from "./SoundfontStorage";
|
4
|
+
import { SoundFont2 } from "soundfont2";
|
5
|
+
export class DefaultSoundfontLoader {
|
6
|
+
#manager;
|
7
|
+
#uuid;
|
8
|
+
#notifier;
|
9
|
+
#meta = Option.None;
|
10
|
+
#soundfont = Option.None;
|
11
|
+
#state = { type: "progress", progress: 0.0 };
|
12
|
+
constructor(manager, uuid) {
|
13
|
+
this.#manager = manager;
|
14
|
+
this.#uuid = uuid;
|
15
|
+
this.#notifier = new Notifier();
|
16
|
+
this.#get();
|
17
|
+
}
|
18
|
+
subscribe(observer) {
|
19
|
+
if (this.#state.type === "loaded") {
|
20
|
+
observer(this.#state);
|
21
|
+
return Terminable.Empty;
|
22
|
+
}
|
23
|
+
return this.#notifier.subscribe(observer);
|
24
|
+
}
|
25
|
+
get uuid() { return this.#uuid; }
|
26
|
+
get soundfont() { return this.#soundfont; }
|
27
|
+
get meta() { return this.#meta; }
|
28
|
+
get state() { return this.#state; }
|
29
|
+
toString() { return `{MainThreadSoundfontLoader}`; }
|
30
|
+
#setState(value) {
|
31
|
+
this.#state = value;
|
32
|
+
this.#notifier.notify(this.#state);
|
33
|
+
}
|
34
|
+
#get() {
|
35
|
+
SoundfontStorage.get().load(this.#uuid).then(([file, meta]) => {
|
36
|
+
this.#soundfont = Option.wrap(new SoundFont2(new Uint8Array(file)));
|
37
|
+
this.#meta = Option.wrap(meta);
|
38
|
+
this.#setState({ type: "loaded" });
|
39
|
+
}, (error) => {
|
40
|
+
if (error instanceof Error && error.message.startsWith("timeoout")) {
|
41
|
+
this.#setState({ type: "error", reason: error.message });
|
42
|
+
return console.warn(`Soundfont ${UUID.toString(this.#uuid)} timed out.`);
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
return this.#fetch();
|
46
|
+
}
|
47
|
+
});
|
48
|
+
}
|
49
|
+
async #fetch() {
|
50
|
+
const fetchProgress = progress => this.#setState({ type: "progress", progress });
|
51
|
+
const fetchResult = await Promises.tryCatch(this.#manager.fetch(this.#uuid, fetchProgress));
|
52
|
+
if (fetchResult.status === "rejected") {
|
53
|
+
console.warn(fetchResult.error);
|
54
|
+
this.#setState({ type: "error", reason: "Error: N/A" });
|
55
|
+
return;
|
56
|
+
}
|
57
|
+
const [file, meta] = fetchResult.value;
|
58
|
+
const storeResult = await Promises.tryCatch(SoundfontStorage.get().save({ uuid: this.#uuid, file, meta }));
|
59
|
+
if (storeResult.status === "resolved") {
|
60
|
+
this.#soundfont = Option.wrap(new SoundFont2(new Uint8Array(file)));
|
61
|
+
this.#meta = Option.wrap(meta);
|
62
|
+
this.#setState({ type: "loaded" });
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
console.warn(storeResult.error);
|
66
|
+
this.#setState({ type: "error", reason: "N/A" });
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Progress, UUID } from "@opendaw/lib-std";
|
2
|
+
import { SoundfontProvider } from "./SoundfontProvider";
|
3
|
+
import { SoundfontLoader, SoundfontLoaderManager, SoundfontMetaData } from "@opendaw/studio-adapters";
|
4
|
+
export declare class DefaultSoundfontLoaderManager implements SoundfontLoaderManager, SoundfontProvider {
|
5
|
+
#private;
|
6
|
+
constructor(provider: SoundfontProvider);
|
7
|
+
fetch(uuid: UUID.Bytes, progress: Progress.Handler): Promise<[ArrayBuffer, SoundfontMetaData]>;
|
8
|
+
remove(uuid: UUID.Bytes): void;
|
9
|
+
getOrCreate(uuid: UUID.Bytes): SoundfontLoader;
|
10
|
+
}
|
11
|
+
//# sourceMappingURL=DefaultSoundfontLoaderManager.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DefaultSoundfontLoaderManager.d.ts","sourceRoot":"","sources":["../../src/soundfont/DefaultSoundfontLoaderManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAa,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAE1D,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAC,eAAe,EAAE,sBAAsB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAGnG,qBAAa,6BAA8B,YAAW,sBAAsB,EAAE,iBAAiB;;gBAI/E,QAAQ,EAAE,iBAAiB;IAKvC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAI9F,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK;IAEvB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,eAAe;CAGjD"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { UUID } from "@opendaw/lib-std";
|
2
|
+
import { DefaultSoundfontLoader } from "./DefaultSoundfontLoader";
|
3
|
+
export class DefaultSoundfontLoaderManager {
|
4
|
+
#provider;
|
5
|
+
#loaders;
|
6
|
+
constructor(provider) {
|
7
|
+
this.#provider = provider;
|
8
|
+
this.#loaders = UUID.newSet(loader => loader.uuid);
|
9
|
+
}
|
10
|
+
fetch(uuid, progress) {
|
11
|
+
return this.#provider.fetch(uuid, progress);
|
12
|
+
}
|
13
|
+
remove(uuid) { this.#loaders.removeByKey(uuid); }
|
14
|
+
getOrCreate(uuid) {
|
15
|
+
return this.#loaders.getOrCreate(uuid, uuid => new DefaultSoundfontLoader(this, uuid));
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
|
2
|
+
import { Soundfont, SoundfontMetaData } from "@opendaw/studio-adapters";
|
3
|
+
export declare class OpenSoundfontAPI {
|
4
|
+
#private;
|
5
|
+
static readonly ApiRoot = "https://api.opendaw.studio/soundfonts";
|
6
|
+
static readonly FileRoot = "https://assets.opendaw.studio/soundfonts";
|
7
|
+
static get(): OpenSoundfontAPI;
|
8
|
+
private constructor();
|
9
|
+
all(): Promise<ReadonlyArray<Soundfont>>;
|
10
|
+
get(uuid: UUID.Bytes): Promise<Soundfont>;
|
11
|
+
load(uuid: UUID.Bytes, progress: Procedure<unitValue>): Promise<[ArrayBuffer, SoundfontMetaData]>;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=OpenSoundfontAPI.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"OpenSoundfontAPI.d.ts","sourceRoot":"","sources":["../../src/soundfont/OpenSoundfontAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAmB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAIrE,qBAAa,gBAAgB;;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,2CAA0C;IACjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA6C;IAGrE,MAAM,CAAC,GAAG,IAAI,gBAAgB;IAU9B,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;IAMzC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;CA0B1G"}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
+
};
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
|
+
};
|
10
|
+
import { asDefined, Lazy, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
11
|
+
import { OpenDAWHeaders } from "../OpenDAWHeaders";
|
12
|
+
import { Promises } from "@opendaw/lib-runtime";
|
13
|
+
export class OpenSoundfontAPI {
|
14
|
+
static ApiRoot = "https://api.opendaw.studio/soundfonts";
|
15
|
+
static FileRoot = "https://assets.opendaw.studio/soundfonts";
|
16
|
+
static get() { return new OpenSoundfontAPI(); }
|
17
|
+
#memoized = Promises.memoizeAsync(() => Promises.retry(() => fetch(`${OpenSoundfontAPI.ApiRoot}/list.json`, OpenDAWHeaders)
|
18
|
+
.then(x => x.json())
|
19
|
+
.catch(reason => RuntimeNotifier.info({
|
20
|
+
headline: "OpenSoundfont API",
|
21
|
+
message: `Could not connect to OpenSoundfont API\nReason: '${reason}'`
|
22
|
+
}).then(() => []))));
|
23
|
+
constructor() { }
|
24
|
+
async all() { return this.#memoized(); }
|
25
|
+
async get(uuid) {
|
26
|
+
const uuidAsString = UUID.toString(uuid);
|
27
|
+
return this.all().then(list => asDefined(list
|
28
|
+
.find(({ uuid }) => uuid === uuidAsString), "Could not find Soundfont"));
|
29
|
+
}
|
30
|
+
async load(uuid, progress) {
|
31
|
+
return this.get(uuid).then(async (soundfont) => {
|
32
|
+
const url = `${OpenSoundfontAPI.FileRoot}/${soundfont.uuid}`;
|
33
|
+
return fetch(url, OpenDAWHeaders)
|
34
|
+
.then(response => {
|
35
|
+
const total = parseInt(response.headers.get("Content-Length") ?? "0");
|
36
|
+
let loaded = 0;
|
37
|
+
return new Promise((resolve, reject) => {
|
38
|
+
const reader = asDefined(response.body, "No body in response").getReader();
|
39
|
+
const chunks = [];
|
40
|
+
const nextChunk = ({ done, value }) => {
|
41
|
+
if (done) {
|
42
|
+
resolve(new Blob(chunks).arrayBuffer());
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
chunks.push(value);
|
46
|
+
loaded += value.length;
|
47
|
+
progress(loaded / total);
|
48
|
+
reader.read().then(nextChunk, reject);
|
49
|
+
}
|
50
|
+
};
|
51
|
+
reader.read().then(nextChunk, reject);
|
52
|
+
});
|
53
|
+
})
|
54
|
+
.then(buffer => [buffer, soundfont]);
|
55
|
+
});
|
56
|
+
}
|
57
|
+
}
|
58
|
+
__decorate([
|
59
|
+
Lazy,
|
60
|
+
__metadata("design:type", Function),
|
61
|
+
__metadata("design:paramtypes", []),
|
62
|
+
__metadata("design:returntype", OpenSoundfontAPI)
|
63
|
+
], OpenSoundfontAPI, "get", null);
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { Progress, UUID } from "@opendaw/lib-std";
|
2
|
+
import { SoundfontMetaData } from "@opendaw/studio-adapters";
|
3
|
+
export interface SoundfontProvider {
|
4
|
+
fetch(uuid: UUID.Bytes, progress: Progress.Handler): Promise<[ArrayBuffer, SoundfontMetaData]>;
|
5
|
+
}
|
6
|
+
//# sourceMappingURL=SoundfontProvider.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SoundfontProvider.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAE1D,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAA;CACjG"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { Option, Procedure, Progress, UUID } from "@opendaw/lib-std";
|
2
|
+
import { Soundfont } from "@opendaw/studio-adapters";
|
3
|
+
export declare namespace SoundfontService {
|
4
|
+
type ImportArgs = {
|
5
|
+
uuid?: UUID.Bytes;
|
6
|
+
arrayBuffer: ArrayBuffer;
|
7
|
+
progressHandler?: Progress.Handler;
|
8
|
+
};
|
9
|
+
}
|
10
|
+
export declare class SoundfontService {
|
11
|
+
#private;
|
12
|
+
readonly onUpdate: Procedure<Soundfont>;
|
13
|
+
constructor(onUpdate: Procedure<Soundfont>);
|
14
|
+
get local(): Option<ReadonlyArray<Soundfont>>;
|
15
|
+
get remote(): Option<ReadonlyArray<Soundfont>>;
|
16
|
+
browseForSoundfont(multiple?: boolean): Promise<ReadonlyArray<Soundfont>>;
|
17
|
+
importSoundfont({ uuid, arrayBuffer }: SoundfontService.ImportArgs): Promise<Soundfont>;
|
18
|
+
deleteSoundfont(uuid: UUID.Bytes): Promise<void>;
|
19
|
+
}
|
20
|
+
//# sourceMappingURL=SoundfontService.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SoundfontService.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontService.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,MAAM,EAEN,SAAS,EACT,QAAQ,EAER,IAAI,EACP,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,SAAS,EAAoB,MAAM,0BAA0B,CAAA;AAMrE,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,UAAU,GAAG;QACrB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACrC,CAAA;CACJ;AAED,qBAAa,gBAAgB;;IAIb,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC;gBAA9B,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC;IAUnD,IAAI,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAqB;IAClE,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAsB;IAE9D,kBAAkB,CAAC,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IA+BhF,eAAe,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,EAAE,gBAAgB,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAiCrF,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import { Arrays, DefaultObservableValue, Errors, Option, panic, Progress, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
2
|
+
import { Files } from "@opendaw/lib-dom";
|
3
|
+
import { Promises } from "@opendaw/lib-runtime";
|
4
|
+
import { SoundFont2 } from "soundfont2";
|
5
|
+
import { SoundfontStorage } from "./SoundfontStorage";
|
6
|
+
import { FilePickerAcceptTypes } from "../FilePickerAcceptTypes";
|
7
|
+
import { OpenSoundfontAPI } from "./OpenSoundfontAPI";
|
8
|
+
export class SoundfontService {
|
9
|
+
onUpdate;
|
10
|
+
#local = Option.None;
|
11
|
+
#remote = Option.None;
|
12
|
+
constructor(onUpdate) {
|
13
|
+
this.onUpdate = onUpdate;
|
14
|
+
Promise.all([
|
15
|
+
SoundfontStorage.get().list(),
|
16
|
+
OpenSoundfontAPI.get().all()
|
17
|
+
]).then(([local, remote]) => {
|
18
|
+
this.#local = Option.wrap(Arrays.subtract(local, remote, (a, b) => a.uuid === b.uuid));
|
19
|
+
this.#remote = Option.wrap(remote);
|
20
|
+
});
|
21
|
+
}
|
22
|
+
get local() { return this.#local; }
|
23
|
+
get remote() { return this.#remote; }
|
24
|
+
async browseForSoundfont(multiple = false) {
|
25
|
+
const { error, status, value: files } = await Promises.tryCatch(Files.open({ ...FilePickerAcceptTypes.SoundfontFiles, multiple }));
|
26
|
+
if (status === "rejected") {
|
27
|
+
if (Errors.isAbort(error)) {
|
28
|
+
return [];
|
29
|
+
}
|
30
|
+
else {
|
31
|
+
return panic(String(error));
|
32
|
+
}
|
33
|
+
}
|
34
|
+
const progress = new DefaultObservableValue(0.0);
|
35
|
+
const dialog = RuntimeNotifier.progress({
|
36
|
+
headline: `Importing ${files.length === 1 ? "Soundfont" : "Soundfonts"}...`, progress
|
37
|
+
});
|
38
|
+
const progressHandler = Progress.split(value => progress.setValue(value), files.length);
|
39
|
+
const soundfonts = [];
|
40
|
+
const rejected = [];
|
41
|
+
for (const [index, file] of files.entries()) {
|
42
|
+
const arrayBuffer = await file.arrayBuffer();
|
43
|
+
const { status, value, error } = await Promises.tryCatch(this.importSoundfont({
|
44
|
+
arrayBuffer,
|
45
|
+
progressHandler: progressHandler[index]
|
46
|
+
}));
|
47
|
+
if (status === "rejected") {
|
48
|
+
rejected.push(String(error));
|
49
|
+
}
|
50
|
+
else {
|
51
|
+
soundfonts.push(value);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
dialog.terminate();
|
55
|
+
if (rejected.length > 0) {
|
56
|
+
await RuntimeNotifier.info({
|
57
|
+
headline: "Soundfont Import Issues",
|
58
|
+
message: `${rejected.join(", ")} could not be imported.`
|
59
|
+
});
|
60
|
+
}
|
61
|
+
return soundfonts;
|
62
|
+
}
|
63
|
+
async importSoundfont({ uuid, arrayBuffer }) {
|
64
|
+
if (this.#local.isEmpty()) {
|
65
|
+
return panic("Local soundfont storage has not been read.");
|
66
|
+
}
|
67
|
+
if (arrayBuffer.byteLength > (1 << 24)) {
|
68
|
+
await RuntimeNotifier.approve({
|
69
|
+
headline: "Soundfont Import",
|
70
|
+
message: `The soundfont you are trying to import is ${(arrayBuffer.byteLength >> 20)}mb. This may cause memory issues. Do you want to continue?`,
|
71
|
+
approveText: "Import",
|
72
|
+
cancelText: "Cancel"
|
73
|
+
});
|
74
|
+
}
|
75
|
+
console.debug(`importSoundfont (${arrayBuffer.byteLength >> 10}kb)`);
|
76
|
+
console.time("UUID.sha256");
|
77
|
+
uuid ??= await UUID.sha256(arrayBuffer);
|
78
|
+
console.timeEnd("UUID.sha256");
|
79
|
+
const soundFont2 = new SoundFont2(new Uint8Array(arrayBuffer));
|
80
|
+
const meta = {
|
81
|
+
name: soundFont2.metaData.name,
|
82
|
+
url: "unknown",
|
83
|
+
license: soundFont2.metaData.copyright ?? "No license provided",
|
84
|
+
origin: "import"
|
85
|
+
};
|
86
|
+
await SoundfontStorage.get().save({ uuid, file: arrayBuffer, meta });
|
87
|
+
const soundfont = { uuid: UUID.toString(uuid), ...meta };
|
88
|
+
this.onUpdate(soundfont);
|
89
|
+
const list = this.#local.unwrap();
|
90
|
+
if (!list.some(other => other.uuid === soundfont.uuid)) {
|
91
|
+
list.push(soundfont);
|
92
|
+
}
|
93
|
+
return soundfont;
|
94
|
+
}
|
95
|
+
async deleteSoundfont(uuid) {
|
96
|
+
return SoundfontStorage.get().deleteItem(uuid);
|
97
|
+
}
|
98
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { UUID } from "@opendaw/lib-std";
|
2
|
+
import { Soundfont, SoundfontMetaData } from "@opendaw/studio-adapters";
|
3
|
+
import { Storage } from "../Storage";
|
4
|
+
export declare namespace SoundfontStorage {
|
5
|
+
type NewSoundfont = {
|
6
|
+
uuid: UUID.Bytes;
|
7
|
+
file: ArrayBuffer;
|
8
|
+
meta: SoundfontMetaData;
|
9
|
+
};
|
10
|
+
}
|
11
|
+
export declare class SoundfontStorage extends Storage<Soundfont, SoundfontMetaData, SoundfontStorage.NewSoundfont, [
|
12
|
+
ArrayBuffer,
|
13
|
+
SoundfontMetaData
|
14
|
+
]> {
|
15
|
+
static readonly Folder = "soundfont";
|
16
|
+
static get(): SoundfontStorage;
|
17
|
+
private constructor();
|
18
|
+
save({ uuid, file, meta }: SoundfontStorage.NewSoundfont): Promise<void>;
|
19
|
+
load(uuid: UUID.Bytes): Promise<[ArrayBuffer, SoundfontMetaData]>;
|
20
|
+
}
|
21
|
+
//# sourceMappingURL=SoundfontStorage.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SoundfontStorage.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAErE,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAElC,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,YAAY,GAAG;QACvB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,EAAE,WAAW,CAAC;QAClB,IAAI,EAAE,iBAAiB,CAAA;KAC1B,CAAA;CACJ;AAED,qBAAa,gBAAiB,SAAQ,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,YAAY,EACrG;IAAC,WAAW;IAAE,iBAAiB;CAAC,CAAC;IACjC,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAc;IAGpC,MAAM,CAAC,GAAG,IAAI,gBAAgB;IAE9B,OAAO;IAED,IAAI,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,EAAE,gBAAgB,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;CAS1E"}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
+
};
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
9
|
+
};
|
10
|
+
import { EmptyExec, Lazy, UUID } from "@opendaw/lib-std";
|
11
|
+
import { Workers } from "../Workers";
|
12
|
+
import { Storage } from "../Storage";
|
13
|
+
export class SoundfontStorage extends Storage {
|
14
|
+
static Folder = "soundfont";
|
15
|
+
static get() { return new SoundfontStorage(); }
|
16
|
+
constructor() { super(SoundfontStorage.Folder); }
|
17
|
+
async save({ uuid, file, meta }) {
|
18
|
+
const path = `${this.folder}/${UUID.toString(uuid)}`;
|
19
|
+
console.debug(`save soundfont '${path}'`);
|
20
|
+
return Promise.all([
|
21
|
+
Workers.Opfs.write(`${path}/soundfont.sf2`, new Uint8Array(file)),
|
22
|
+
Workers.Opfs.write(`${path}/meta.json`, new TextEncoder().encode(JSON.stringify(meta)))
|
23
|
+
]).then(EmptyExec);
|
24
|
+
}
|
25
|
+
async load(uuid) {
|
26
|
+
const path = `${this.folder}/${UUID.toString(uuid)}`;
|
27
|
+
return Promise.all([
|
28
|
+
Workers.Opfs.read(`${path}/soundfont.sf2`)
|
29
|
+
.then(bytes => bytes.buffer),
|
30
|
+
Workers.Opfs.read(`${path}/meta.json`)
|
31
|
+
.then(bytes => JSON.parse(new TextDecoder().decode(bytes)))
|
32
|
+
]);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
__decorate([
|
36
|
+
Lazy,
|
37
|
+
__metadata("design:type", Function),
|
38
|
+
__metadata("design:paramtypes", []),
|
39
|
+
__metadata("design:returntype", SoundfontStorage)
|
40
|
+
], SoundfontStorage, "get", null);
|
@@ -0,0 +1,7 @@
|
|
1
|
+
export * from "./DefaultSoundfontLoader";
|
2
|
+
export * from "./DefaultSoundfontLoaderManager";
|
3
|
+
export * from "./OpenSoundfontAPI";
|
4
|
+
export * from "./SoundfontProvider";
|
5
|
+
export * from "./SoundfontService";
|
6
|
+
export * from "./SoundfontStorage";
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/soundfont/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync-log/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
package/dist/ui/index.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export * from "./TimelineRange";
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from "./AutofitUtils";
|