@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.
Files changed (158) hide show
  1. package/dist/EngineWorklet.d.ts.map +1 -1
  2. package/dist/EngineWorklet.js +18 -1
  3. package/dist/FilePickerAcceptTypes.d.ts +1 -0
  4. package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
  5. package/dist/FilePickerAcceptTypes.js +6 -0
  6. package/dist/InstrumentBox.d.ts +2 -2
  7. package/dist/InstrumentBox.d.ts.map +1 -1
  8. package/dist/InstrumentFactories.d.ts +13 -4
  9. package/dist/InstrumentFactories.d.ts.map +1 -1
  10. package/dist/InstrumentFactories.js +38 -18
  11. package/dist/InstrumentFactory.d.ts +3 -2
  12. package/dist/InstrumentFactory.d.ts.map +1 -1
  13. package/dist/InstrumentOptions.d.ts +2 -1
  14. package/dist/InstrumentOptions.d.ts.map +1 -1
  15. package/dist/OpenDAWHeaders.d.ts +3 -0
  16. package/dist/OpenDAWHeaders.d.ts.map +1 -0
  17. package/dist/OpenDAWHeaders.js +8 -0
  18. package/dist/RecordingWorklet.js +1 -1
  19. package/dist/Storage.d.ts +14 -0
  20. package/dist/Storage.d.ts.map +1 -0
  21. package/dist/Storage.js +32 -0
  22. package/dist/capture/index.d.ts +6 -0
  23. package/dist/capture/index.d.ts.map +1 -0
  24. package/dist/capture/index.js +5 -0
  25. package/dist/cloud/CloudAuthManager.d.ts.map +1 -0
  26. package/dist/{clouds → cloud}/CloudBackup.d.ts +1 -1
  27. package/dist/cloud/CloudBackup.d.ts.map +1 -0
  28. package/dist/{clouds → cloud}/CloudBackup.js +6 -4
  29. package/dist/cloud/CloudBackupProjects.d.ts.map +1 -0
  30. package/dist/cloud/CloudBackupSamples.d.ts.map +1 -0
  31. package/dist/{clouds → cloud}/CloudBackupSamples.js +5 -6
  32. package/dist/cloud/CloudBackupSoundfont.d.ts +13 -0
  33. package/dist/cloud/CloudBackupSoundfont.d.ts.map +1 -0
  34. package/dist/cloud/CloudBackupSoundfont.js +120 -0
  35. package/dist/cloud/CloudHandler.d.ts.map +1 -0
  36. package/dist/cloud/CloudService.d.ts.map +1 -0
  37. package/dist/cloud/DropboxHandler.d.ts.map +1 -0
  38. package/dist/cloud/GoogleDriveHandler.d.ts.map +1 -0
  39. package/dist/cloud/index.d.ts +4 -0
  40. package/dist/cloud/index.d.ts.map +1 -0
  41. package/dist/cloud/index.js +3 -0
  42. package/dist/dawproject/DawProjectExporter.test.js +2 -1
  43. package/dist/dawproject/DawProjectService.d.ts +11 -0
  44. package/dist/dawproject/DawProjectService.d.ts.map +1 -0
  45. package/dist/dawproject/DawProjectService.js +63 -0
  46. package/dist/dawproject/index.d.ts +5 -0
  47. package/dist/dawproject/index.d.ts.map +1 -0
  48. package/dist/dawproject/index.js +4 -0
  49. package/dist/index.d.ts +11 -32
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +11 -32
  52. package/dist/midi/index.d.ts +3 -0
  53. package/dist/midi/index.d.ts.map +1 -0
  54. package/dist/midi/index.js +2 -0
  55. package/dist/processors.js +3 -3
  56. package/dist/processors.js.map +4 -4
  57. package/dist/project/Project.d.ts +2 -1
  58. package/dist/project/Project.d.ts.map +1 -1
  59. package/dist/project/Project.js +1 -0
  60. package/dist/project/ProjectApi.d.ts +1 -1
  61. package/dist/project/ProjectApi.d.ts.map +1 -1
  62. package/dist/project/ProjectApi.js +3 -2
  63. package/dist/project/ProjectBundle.d.ts.map +1 -1
  64. package/dist/project/ProjectBundle.js +67 -18
  65. package/dist/project/ProjectEnv.d.ts +2 -1
  66. package/dist/project/ProjectEnv.d.ts.map +1 -1
  67. package/dist/project/ProjectStorage.d.ts +3 -2
  68. package/dist/project/ProjectStorage.d.ts.map +1 -1
  69. package/dist/project/ProjectStorage.js +2 -3
  70. package/dist/project/index.d.ts +10 -0
  71. package/dist/project/index.d.ts.map +1 -0
  72. package/dist/project/index.js +9 -0
  73. package/dist/samples/DefaultSampleLoader.js +2 -2
  74. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  75. package/dist/samples/OpenSampleAPI.js +4 -11
  76. package/dist/samples/SampleService.d.ts +18 -0
  77. package/dist/samples/SampleService.d.ts.map +1 -0
  78. package/dist/samples/SampleService.js +82 -0
  79. package/dist/samples/SampleStorage.d.ts +11 -10
  80. package/dist/samples/SampleStorage.d.ts.map +1 -1
  81. package/dist/samples/SampleStorage.js +32 -39
  82. package/dist/samples/index.d.ts +1 -2
  83. package/dist/samples/index.d.ts.map +1 -1
  84. package/dist/samples/index.js +1 -2
  85. package/dist/soundfont/DefaultSoundfontLoader.d.ts +15 -0
  86. package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -0
  87. package/dist/soundfont/DefaultSoundfontLoader.js +69 -0
  88. package/dist/soundfont/DefaultSoundfontLoaderManager.d.ts +11 -0
  89. package/dist/soundfont/DefaultSoundfontLoaderManager.d.ts.map +1 -0
  90. package/dist/soundfont/DefaultSoundfontLoaderManager.js +17 -0
  91. package/dist/soundfont/OpenSoundfontAPI.d.ts +13 -0
  92. package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -0
  93. package/dist/soundfont/OpenSoundfontAPI.js +63 -0
  94. package/dist/soundfont/SoundfontProvider.d.ts +6 -0
  95. package/dist/soundfont/SoundfontProvider.d.ts.map +1 -0
  96. package/dist/soundfont/SoundfontService.d.ts +20 -0
  97. package/dist/soundfont/SoundfontService.d.ts.map +1 -0
  98. package/dist/soundfont/SoundfontService.js +98 -0
  99. package/dist/soundfont/SoundfontStorage.d.ts +21 -0
  100. package/dist/soundfont/SoundfontStorage.d.ts.map +1 -0
  101. package/dist/soundfont/SoundfontStorage.js +40 -0
  102. package/dist/soundfont/index.d.ts +7 -0
  103. package/dist/soundfont/index.d.ts.map +1 -0
  104. package/dist/soundfont/index.js +6 -0
  105. package/dist/sync-log/index.d.ts +4 -0
  106. package/dist/sync-log/index.d.ts.map +1 -0
  107. package/dist/sync-log/index.js +3 -0
  108. package/dist/ui/index.d.ts +2 -0
  109. package/dist/ui/index.d.ts.map +1 -0
  110. package/dist/ui/index.js +1 -0
  111. package/dist/utils/index.d.ts +2 -0
  112. package/dist/utils/index.d.ts.map +1 -0
  113. package/dist/utils/index.js +1 -0
  114. package/dist/workers-main.js +2 -2
  115. package/dist/workers-main.js.map +3 -3
  116. package/dist/ysync/YMapper.d.ts.map +1 -0
  117. package/dist/{yjs → ysync}/YService.d.ts +1 -2
  118. package/dist/ysync/YService.d.ts.map +1 -0
  119. package/dist/{yjs → ysync}/YService.js +1 -1
  120. package/dist/ysync/YSync.d.ts.map +1 -0
  121. package/dist/{yjs → ysync}/YSync.js +1 -1
  122. package/dist/ysync/index.d.ts +4 -0
  123. package/dist/ysync/index.d.ts.map +1 -0
  124. package/dist/ysync/index.js +3 -0
  125. package/package.json +16 -18
  126. package/dist/clouds/CloudAuthManager.d.ts.map +0 -1
  127. package/dist/clouds/CloudBackup.d.ts.map +0 -1
  128. package/dist/clouds/CloudBackupProjects.d.ts.map +0 -1
  129. package/dist/clouds/CloudBackupSamples.d.ts.map +0 -1
  130. package/dist/clouds/CloudHandler.d.ts.map +0 -1
  131. package/dist/clouds/CloudService.d.ts.map +0 -1
  132. package/dist/clouds/DropboxHandler.d.ts.map +0 -1
  133. package/dist/clouds/GoogleDriveHandler.d.ts.map +0 -1
  134. package/dist/samples/P2PSampleProvider.d.ts +0 -13
  135. package/dist/samples/P2PSampleProvider.d.ts.map +0 -1
  136. package/dist/samples/P2PSampleProvider.js +0 -350
  137. package/dist/samples/SampleImporter.d.ts +0 -11
  138. package/dist/samples/SampleImporter.d.ts.map +0 -1
  139. package/dist/yjs/YMapper.d.ts.map +0 -1
  140. package/dist/yjs/YService.d.ts.map +0 -1
  141. package/dist/yjs/YSync.d.ts.map +0 -1
  142. /package/dist/{clouds → cloud}/CloudAuthManager.d.ts +0 -0
  143. /package/dist/{clouds → cloud}/CloudAuthManager.js +0 -0
  144. /package/dist/{clouds → cloud}/CloudBackupProjects.d.ts +0 -0
  145. /package/dist/{clouds → cloud}/CloudBackupProjects.js +0 -0
  146. /package/dist/{clouds → cloud}/CloudBackupSamples.d.ts +0 -0
  147. /package/dist/{clouds → cloud}/CloudHandler.d.ts +0 -0
  148. /package/dist/{clouds → cloud}/CloudHandler.js +0 -0
  149. /package/dist/{clouds → cloud}/CloudService.d.ts +0 -0
  150. /package/dist/{clouds → cloud}/CloudService.js +0 -0
  151. /package/dist/{clouds → cloud}/DropboxHandler.d.ts +0 -0
  152. /package/dist/{clouds → cloud}/DropboxHandler.js +0 -0
  153. /package/dist/{clouds → cloud}/GoogleDriveHandler.d.ts +0 -0
  154. /package/dist/{clouds → cloud}/GoogleDriveHandler.js +0 -0
  155. /package/dist/{samples/SampleImporter.js → soundfont/SoundfontProvider.js} +0 -0
  156. /package/dist/{yjs → ysync}/YMapper.d.ts +0 -0
  157. /package/dist/{yjs → ysync}/YMapper.js +0 -0
  158. /package/dist/{yjs → ysync}/YSync.d.ts +0 -0
@@ -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,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA"}
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"}
@@ -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,6 @@
1
+ export * from "./DefaultSoundfontLoader";
2
+ export * from "./DefaultSoundfontLoaderManager";
3
+ export * from "./OpenSoundfontAPI";
4
+ export * from "./SoundfontProvider";
5
+ export * from "./SoundfontService";
6
+ export * from "./SoundfontStorage";
@@ -0,0 +1,4 @@
1
+ export * from "./Commit";
2
+ export * from "./SyncLogReader";
3
+ export * from "./SyncLogWriter";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from "./Commit";
2
+ export * from "./SyncLogReader";
3
+ export * from "./SyncLogWriter";
@@ -0,0 +1,2 @@
1
+ export * from "./TimelineRange";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1 @@
1
+ export * from "./TimelineRange";
@@ -0,0 +1,2 @@
1
+ export * from "./AutofitUtils";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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";