@opendaw/studio-core 0.0.41 → 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 (155) 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 -1
  83. package/dist/samples/index.d.ts.map +1 -1
  84. package/dist/samples/index.js +1 -1
  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 +15 -17
  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/SampleImporter.d.ts +0 -11
  135. package/dist/samples/SampleImporter.d.ts.map +0 -1
  136. package/dist/yjs/YMapper.d.ts.map +0 -1
  137. package/dist/yjs/YService.d.ts.map +0 -1
  138. package/dist/yjs/YSync.d.ts.map +0 -1
  139. /package/dist/{clouds → cloud}/CloudAuthManager.d.ts +0 -0
  140. /package/dist/{clouds → cloud}/CloudAuthManager.js +0 -0
  141. /package/dist/{clouds → cloud}/CloudBackupProjects.d.ts +0 -0
  142. /package/dist/{clouds → cloud}/CloudBackupProjects.js +0 -0
  143. /package/dist/{clouds → cloud}/CloudBackupSamples.d.ts +0 -0
  144. /package/dist/{clouds → cloud}/CloudHandler.d.ts +0 -0
  145. /package/dist/{clouds → cloud}/CloudHandler.js +0 -0
  146. /package/dist/{clouds → cloud}/CloudService.d.ts +0 -0
  147. /package/dist/{clouds → cloud}/CloudService.js +0 -0
  148. /package/dist/{clouds → cloud}/DropboxHandler.d.ts +0 -0
  149. /package/dist/{clouds → cloud}/DropboxHandler.js +0 -0
  150. /package/dist/{clouds → cloud}/GoogleDriveHandler.d.ts +0 -0
  151. /package/dist/{clouds → cloud}/GoogleDriveHandler.js +0 -0
  152. /package/dist/{samples/SampleImporter.js → soundfont/SoundfontProvider.js} +0 -0
  153. /package/dist/{yjs → ysync}/YMapper.d.ts +0 -0
  154. /package/dist/{yjs → ysync}/YMapper.js +0 -0
  155. /package/dist/{yjs → ysync}/YSync.d.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  import { Procedure, Terminable, TerminableOwner, Terminator } from "@opendaw/lib-std";
2
2
  import { BoxGraph, Editing } from "@opendaw/lib-box";
3
3
  import { AudioBusBox, AudioUnitBox, BoxIO, RootBox, TimelineBox, UserInterfaceBox } from "@opendaw/studio-boxes";
4
- import { BoxAdapters, BoxAdaptersContext, ClipSequencing, ParameterFieldAdapters, ProcessorOptions, ProjectSkeleton, RootBoxAdapter, SampleLoaderManager, TimelineBoxAdapter, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
4
+ import { BoxAdapters, BoxAdaptersContext, ClipSequencing, ParameterFieldAdapters, ProcessorOptions, ProjectSkeleton, RootBoxAdapter, SampleLoaderManager, SoundfontLoaderManager, TimelineBoxAdapter, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
5
5
  import { LiveStreamBroadcaster, LiveStreamReceiver } from "@opendaw/lib-fusion";
6
6
  import { ProjectEnv } from "./ProjectEnv";
7
7
  import { Mixer } from "../Mixer";
@@ -47,6 +47,7 @@ export declare class Project implements BoxAdaptersContext, Terminable, Terminab
47
47
  get rootBoxAdapter(): RootBoxAdapter;
48
48
  get timelineBoxAdapter(): TimelineBoxAdapter;
49
49
  get sampleManager(): SampleLoaderManager;
50
+ get soundfontManager(): SoundfontLoaderManager;
50
51
  get clipSequencing(): ClipSequencing;
51
52
  get isAudioContext(): boolean;
52
53
  get isMainThread(): boolean;
@@ -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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"}
@@ -135,6 +135,7 @@ export class Project {
135
135
  get rootBoxAdapter() { return this.boxAdapters.adapterFor(this.rootBox, RootBoxAdapter); }
136
136
  get timelineBoxAdapter() { return this.boxAdapters.adapterFor(this.timelineBox, TimelineBoxAdapter); }
137
137
  get sampleManager() { return this.#env.sampleManager; }
138
+ get soundfontManager() { return this.#env.soundfontManager; }
138
139
  get clipSequencing() { return panic("Only available in audio context"); }
139
140
  get isAudioContext() { return false; }
140
141
  get isMainThread() { return true; }
@@ -43,7 +43,7 @@ export declare class ProjectApi {
43
43
  setBpm(value: number): void;
44
44
  catchupAndSubscribeBpm(observer: Observer<number>): Subscription;
45
45
  catchupAndSubscribeAudioUnits(listener: IndexedAdapterCollectionListener<AudioUnitBoxAdapter>): Subscription;
46
- createInstrument({ create, defaultIcon, defaultName, trackType }: InstrumentFactory, { name, icon, index }?: InstrumentOptions): InstrumentProduct;
46
+ createInstrument<T>({ create, defaultIcon, defaultName, trackType }: InstrumentFactory<T>, options?: InstrumentOptions<T>): InstrumentProduct;
47
47
  createAudioBus(name: string, icon: IconSymbol, type: AudioUnitType, color: string): AudioBusBox;
48
48
  insertEffect(field: Field<EffectPointerType>, factory: EffectFactory, insertIndex?: int): EffectBox;
49
49
  createNoteTrack(audioUnitBox: AudioUnitBox, insertIndex?: int): TrackBox;
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,8 @@ export class ProjectApi {
23
23
  catchupAndSubscribeAudioUnits(listener) {
24
24
  return this.#project.rootBoxAdapter.audioUnits.catchupAndSubscribe(listener);
25
25
  }
26
- createInstrument({ create, defaultIcon, defaultName, trackType }, { name, icon, index } = {}) {
26
+ createInstrument({ create, defaultIcon, defaultName, trackType }, options = {}) {
27
+ const { name, icon, index } = options;
27
28
  const { boxGraph, rootBox, userEditingManager } = this.#project;
28
29
  assert(rootBox.isAttached(), "rootBox not attached");
29
30
  const existingNames = rootBox.audioUnits.pointerHub.incoming().map(({ box }) => {
@@ -33,7 +34,7 @@ export class ProjectApi {
33
34
  const audioUnitBox = this.#createAudioUnit(AudioUnitType.Instrument, this.#trackTypeToCapture(boxGraph, trackType), index);
34
35
  const uniqueName = Strings.getUniqueName(existingNames, name ?? defaultName);
35
36
  const iconSymbol = icon ?? defaultIcon;
36
- const instrumentBox = create(boxGraph, audioUnitBox.input, uniqueName, iconSymbol);
37
+ const instrumentBox = create(boxGraph, audioUnitBox.input, uniqueName, iconSymbol, options.attachment);
37
38
  const trackBox = TrackBox.create(boxGraph, UUID.generate(), box => {
38
39
  box.index.setValue(0);
39
40
  box.type.setValue(trackType);
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectBundle.d.ts","sourceRoot":"","sources":["../../src/project/ProjectBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,sBAAsB,EAAiB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAInH,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAK/C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAU,gCAA8B,cAAc,EAC5C,UAAU,sBAAsB,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,WAAW,CAuB7F,CAAA;IAEM,MAAM,MAAM,GAAU,KAAK,UAAU,EACf,aAAa,WAAW,EACxB,kBAAkB,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,cAAc,CA0BjF,CAAA;CAyBJ"}
1
+ {"version":3,"file":"ProjectBundle.d.ts","sourceRoot":"","sources":["../../src/project/ProjectBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,sBAAsB,EAAiB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAInH,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAM/C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAU,gCAA8B,cAAc,EAC5C,UAAU,sBAAsB,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,WAAW,CAoC7F,CAAA;IAEM,MAAM,MAAM,GAAU,KAAK,UAAU,EACf,aAAa,WAAW,EACxB,kBAAkB,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,cAAc,CAqCjF,CAAA;CAgDJ"}
@@ -1,10 +1,11 @@
1
1
  import { asDefined, isDefined, Option, panic, UUID } from "@opendaw/lib-std";
2
- import { AudioFileBox } from "@opendaw/studio-boxes";
2
+ import { AudioFileBox, SoundfontFileBox } from "@opendaw/studio-boxes";
3
3
  import { Project } from "./Project";
4
4
  import { ProjectPaths } from "./ProjectPaths";
5
5
  import { ProjectProfile } from "./ProjectProfile";
6
6
  import { Workers } from "../Workers";
7
7
  import { SampleStorage } from "../samples";
8
+ import { SoundfontStorage } from "../soundfont";
8
9
  export var ProjectBundle;
9
10
  (function (ProjectBundle) {
10
11
  ProjectBundle.encode = async ({ uuid, project, meta, cover }, progress) => {
@@ -16,14 +17,25 @@ export var ProjectBundle;
16
17
  zip.file(ProjectPaths.ProjectMetaFile, JSON.stringify(meta, null, 2));
17
18
  cover.ifSome(buffer => zip.file(ProjectPaths.ProjectCoverFile, buffer, { binary: true }));
18
19
  const samples = asDefined(zip.folder("samples"), "Could not create folder samples");
19
- const boxes = project.boxGraph.boxes().filter(box => box instanceof AudioFileBox);
20
- let boxIndex = 0;
21
- const blob = await Promise.all(boxes
22
- .map(async ({ address: { uuid } }) => {
23
- const handler = project.sampleManager.getOrCreate(uuid);
24
- const folder = asDefined(samples.folder(UUID.toString(uuid)), "Could not create folder for sample");
25
- return pipeSampleLoaderInto(handler, folder).then(() => progress.setValue(++boxIndex / boxes.length * 0.75));
26
- })).then(() => zip.generateAsync({
20
+ const soundfonts = asDefined(zip.folder("soundfonts"), "Could not create folder soundfonts");
21
+ const audioFileBoxes = project.boxGraph.boxes().filter(box => box instanceof AudioFileBox);
22
+ const soundfontFileBoxes = project.boxGraph.boxes().filter(box => box instanceof SoundfontFileBox);
23
+ const blob = await Promise.all([
24
+ ...audioFileBoxes
25
+ .map(async ({ address: { uuid } }, index) => {
26
+ const loader = project.sampleManager.getOrCreate(uuid);
27
+ const folder = asDefined(samples.folder(UUID.toString(uuid)), "Could not create folder for sample");
28
+ return pipeSampleLoaderInto(loader, folder)
29
+ .then(() => progress.setValue(index / audioFileBoxes.length * 0.75));
30
+ }),
31
+ ...soundfontFileBoxes
32
+ .map(async ({ address: { uuid } }, index) => {
33
+ const loader = project.soundfontManager.getOrCreate(uuid);
34
+ const folder = asDefined(soundfonts.folder(UUID.toString(uuid)), "Could not create folder for soundfont");
35
+ return pipeSoundfontLoaderInto(loader, folder)
36
+ .then(() => progress.setValue(index / soundfontFileBoxes.length * 0.75));
37
+ })
38
+ ]).then(() => zip.generateAsync({
27
39
  type: "blob",
28
40
  compression: "DEFLATE",
29
41
  compressionOptions: { level: 6 }
@@ -43,16 +55,29 @@ export var ProjectBundle;
43
55
  return panic("Project is already open");
44
56
  }
45
57
  console.debug("loading samples...");
46
- const samples = asDefined(zip.folder("samples"), "Could not find samples");
47
58
  const promises = [];
48
- samples.forEach((path, file) => {
49
- if (file.dir) {
50
- return;
51
- }
52
- promises.push(file.async("arraybuffer")
53
- .then(arrayBuffer => Workers.Opfs
54
- .write(`${SampleStorage.Folder}/${path}`, new Uint8Array(arrayBuffer))));
55
- });
59
+ const samples = zip.folder("samples");
60
+ if (isDefined(samples)) {
61
+ samples.forEach((path, file) => {
62
+ if (file.dir) {
63
+ return;
64
+ }
65
+ promises.push(file.async("arraybuffer")
66
+ .then(arrayBuffer => Workers.Opfs
67
+ .write(`${SampleStorage.Folder}/${path}`, new Uint8Array(arrayBuffer))));
68
+ });
69
+ }
70
+ const soundfonts = zip.folder("soundfonts");
71
+ if (isDefined(soundfonts)) {
72
+ soundfonts.forEach((path, file) => {
73
+ if (file.dir) {
74
+ return;
75
+ }
76
+ promises.push(file.async("arraybuffer")
77
+ .then(arrayBuffer => Workers.Opfs
78
+ .write(`${SoundfontStorage.Folder}/${path}`, new Uint8Array(arrayBuffer))));
79
+ });
80
+ }
56
81
  await Promise.all(promises);
57
82
  const project = Project.load(env, await asDefined(zip.file(ProjectPaths.ProjectFile)).async("arraybuffer"));
58
83
  const meta = JSON.parse(await asDefined(zip.file(ProjectPaths.ProjectMetaFile)).async("text"));
@@ -85,4 +110,28 @@ export var ProjectBundle;
85
110
  }).then(() => exec());
86
111
  }
87
112
  };
113
+ const pipeSoundfontLoaderInto = async (loader, zip) => {
114
+ const exec = async () => {
115
+ const path = `${SoundfontStorage.Folder}/${UUID.toString(loader.uuid)}`;
116
+ zip.file("soundfont.sf2", await Workers.Opfs.read(`${path}/soundfont.sf2`), { binary: true });
117
+ zip.file("meta.json", await Workers.Opfs.read(`${path}/meta.json`));
118
+ };
119
+ if (loader.state.type === "loaded") {
120
+ return exec();
121
+ }
122
+ else {
123
+ return new Promise((resolve, reject) => {
124
+ const subscription = loader.subscribe(state => {
125
+ if (state.type === "loaded") {
126
+ resolve();
127
+ subscription.terminate();
128
+ }
129
+ else if (state.type === "error") {
130
+ reject(state.reason);
131
+ subscription.terminate();
132
+ }
133
+ });
134
+ }).then(() => exec());
135
+ }
136
+ };
88
137
  })(ProjectBundle || (ProjectBundle = {}));
@@ -1,8 +1,9 @@
1
- import { SampleLoaderManager } from "@opendaw/studio-adapters";
1
+ import { SampleLoaderManager, SoundfontLoaderManager } from "@opendaw/studio-adapters";
2
2
  import { AudioWorklets } from "../AudioWorklets";
3
3
  export interface ProjectEnv {
4
4
  audioContext: AudioContext;
5
5
  audioWorklets: AudioWorklets;
6
6
  sampleManager: SampleLoaderManager;
7
+ soundfontManager: SoundfontLoaderManager;
7
8
  }
8
9
  //# 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,mBAAmB,EAAC,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,UAAU;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,mBAAmB,CAAA;CACrC"}
1
+ {"version":3,"file":"ProjectEnv.d.ts","sourceRoot":"","sources":["../../src/project/ProjectEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAE,sBAAsB,EAAC,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,UAAU;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,mBAAmB,CAAA;IAClC,gBAAgB,EAAE,sBAAsB,CAAA;CAC3C"}
@@ -1,4 +1,5 @@
1
- import { Option, Progress, UUID } from "@opendaw/lib-std";
1
+ import { Class, Option, Progress, UUID } from "@opendaw/lib-std";
2
+ import { AudioFileBox, SoundfontFileBox } from "@opendaw/studio-boxes";
2
3
  import { ProjectMeta } from "./ProjectMeta";
3
4
  export declare namespace ProjectStorage {
4
5
  type ListEntry = {
@@ -16,7 +17,7 @@ export declare namespace ProjectStorage {
16
17
  const loadProject: (uuid: UUID.Bytes) => Promise<ArrayBuffer>;
17
18
  const loadMeta: (uuid: UUID.Bytes) => Promise<ArrayBuffer>;
18
19
  const loadCover: (uuid: UUID.Bytes) => Promise<Option<ArrayBuffer>>;
19
- const listUsedSamples: () => Promise<Set<string>>;
20
+ const listUsedAssets: (type: Class<AudioFileBox | SoundfontFileBox>) => Promise<Set<string>>;
20
21
  const deleteProject: (uuid: UUID.Bytes) => Promise<void>;
21
22
  const loadTrashedIds: () => Promise<Array<UUID.String>>;
22
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectStorage.d.ts","sourceRoot":"","sources":["../../src/project/ProjectStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAyB,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAI9E,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AAIzC,yBAAiB,cAAc,CAAC;IAC5B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,EAAE,WAAW,CAAA;QACjB,KAAK,CAAC,EAAE,WAAW,CAAA;QACnB,OAAO,CAAC,EAAE,WAAW,CAAA;KACxB,CAAA;IAED,KAAY,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAU,6CAA0C;QACzE,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACzB,KAAG,OAAO,CAAC,IAAI,CAcpB,CAAA;IAEM,MAAM,WAAW,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEvE,CAAA;IAEM,MAAM,QAAQ,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEpE,CAAA;IAEM,MAAM,SAAS,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAG7E,CAAA;IAEM,MAAM,eAAe,QAAa,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAa3D,CAAA;IAEM,MAAM,aAAa,GAAU,MAAM,IAAI,CAAC,KAAK,kBAMnD,CAAA;IAEM,MAAM,cAAc,QAAa,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAGjE,CAAA;CACJ"}
1
+ {"version":3,"file":"ProjectStorage.d.ts","sourceRoot":"","sources":["../../src/project/ProjectStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAyB,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrF,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AAGpE,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AAIzC,yBAAiB,cAAc,CAAC;IAC5B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,EAAE,WAAW,CAAA;QACjB,KAAK,CAAC,EAAE,WAAW,CAAA;QACnB,OAAO,CAAC,EAAE,WAAW,CAAA;KACxB,CAAA;IAED,KAAY,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAU,6CAA0C;QACzE,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACzB,KAAG,OAAO,CAAC,IAAI,CAcpB,CAAA;IAEM,MAAM,WAAW,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEvE,CAAA;IAEM,MAAM,QAAQ,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEpE,CAAA;IAEM,MAAM,SAAS,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAG7E,CAAA;IAEM,MAAM,cAAc,GAAU,MAAM,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,KAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAatG,CAAA;IAEM,MAAM,aAAa,GAAU,MAAM,IAAI,CAAC,KAAK,kBAMnD,CAAA;IAEM,MAAM,cAAc,QAAa,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAGjE,CAAA;CACJ"}
@@ -1,5 +1,4 @@
1
1
  import { Option, safeExecute, tryCatch, UUID } from "@opendaw/lib-std";
2
- import { AudioFileBox } from "@opendaw/studio-boxes";
3
2
  import { ProjectDecoder } from "@opendaw/studio-adapters";
4
3
  import { Promises } from "@opendaw/lib-runtime";
5
4
  import { Workers } from "../Workers";
@@ -31,7 +30,7 @@ export var ProjectStorage;
31
30
  return Workers.Opfs.read(ProjectPaths.projectCover(uuid))
32
31
  .then(array => Option.wrap(array.buffer), () => Option.None);
33
32
  };
34
- ProjectStorage.listUsedSamples = async () => {
33
+ ProjectStorage.listUsedAssets = async (type) => {
35
34
  const uuids = [];
36
35
  const files = await Workers.Opfs.list(ProjectPaths.Folder);
37
36
  for (const { name } of files.filter(file => file.kind === "directory")) {
@@ -39,7 +38,7 @@ export var ProjectStorage;
39
38
  tryCatch(() => {
40
39
  const { boxGraph } = ProjectDecoder.decode(result.buffer);
41
40
  uuids.push(...boxGraph.boxes()
42
- .filter(box => box instanceof AudioFileBox)
41
+ .filter(box => box instanceof type)
43
42
  .map((box) => UUID.toString(box.address.uuid)));
44
43
  });
45
44
  }
@@ -0,0 +1,10 @@
1
+ export * from "./Project";
2
+ export * from "./ProjectApi";
3
+ export * from "./ProjectBundle";
4
+ export * from "./ProjectEnv";
5
+ export * from "./ProjectMeta";
6
+ export * from "./ProjectPaths";
7
+ export * from "./ProjectProfile";
8
+ export * from "./ProjectSignals";
9
+ export * from "./ProjectStorage";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
@@ -0,0 +1,9 @@
1
+ export * from "./Project";
2
+ export * from "./ProjectApi";
3
+ export * from "./ProjectBundle";
4
+ export * from "./ProjectEnv";
5
+ export * from "./ProjectMeta";
6
+ export * from "./ProjectPaths";
7
+ export * from "./ProjectProfile";
8
+ export * from "./ProjectSignals";
9
+ export * from "./ProjectStorage";
@@ -45,7 +45,7 @@ export class DefaultSampleLoader {
45
45
  }
46
46
  #get() {
47
47
  let version = this.#version;
48
- SampleStorage.loadSample(this.#uuid).then(([data, peaks, meta]) => {
48
+ SampleStorage.get().load(this.#uuid).then(([data, peaks, meta]) => {
49
49
  if (this.#version !== version) {
50
50
  console.warn(`Ignore obsolete version: ${this.#version} / ${version}`);
51
51
  return;
@@ -82,7 +82,7 @@ export class DefaultSampleLoader {
82
82
  const [audio, meta] = fetchResult.value;
83
83
  const shifts = SamplePeaks.findBestFit(audio.numberOfFrames);
84
84
  const peaks = await Workers.Peak.generateAsync(peakProgress, shifts, audio.frames, audio.numberOfFrames, audio.numberOfChannels);
85
- const storeResult = await Promises.tryCatch(SampleStorage.saveSample({
85
+ const storeResult = await Promises.tryCatch(SampleStorage.get().save({
86
86
  uuid: this.#uuid,
87
87
  audio: audio,
88
88
  peaks: peaks,
@@ -1 +1 @@
1
- {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,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;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS;IAStD,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAmC3G,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC/E,YAAY,IAAI,OAAO;CAC1B"}
1
+ {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,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;AAI9C,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS;IAStD,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAmC3G,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC/E,YAAY,IAAI,OAAO;CAC1B"}
@@ -9,14 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  import { Arrays, asDefined, DefaultObservableValue, Lazy, panic, RuntimeNotifier, tryCatch, UUID } from "@opendaw/lib-std";
11
11
  import { network, Promises } from "@opendaw/lib-runtime";
12
- const username = "openDAW";
13
- const password = "prototype";
14
- const base64Credentials = btoa(`${username}:${password}`);
15
- const headers = {
16
- method: "GET",
17
- headers: { "Authorization": `Basic ${base64Credentials}` },
18
- credentials: "include"
19
- };
12
+ import { base64Credentials, OpenDAWHeaders } from "../OpenDAWHeaders";
20
13
  // Standard openDAW samples (considered to be non-removable)
21
14
  export class OpenSampleAPI {
22
15
  static ApiRoot = "https://api.opendaw.studio/samples";
@@ -32,12 +25,12 @@ export class OpenSampleAPI {
32
25
  }
33
26
  constructor() { }
34
27
  async all() {
35
- return Promises.retry(() => fetch(`${OpenSampleAPI.ApiRoot}/list.php`, headers)
28
+ return Promises.retry(() => fetch(`${OpenSampleAPI.ApiRoot}/list.php`, OpenDAWHeaders)
36
29
  .then(x => x.json(), () => []));
37
30
  }
38
31
  async get(uuid) {
39
32
  const url = `${OpenSampleAPI.ApiRoot}/get.php?uuid=${UUID.toString(uuid)}`;
40
- const sample = await Promises.retry(() => network.limitFetch(url, headers)
33
+ const sample = await Promises.retry(() => network.limitFetch(url, OpenDAWHeaders)
41
34
  .then(x => x.json()))
42
35
  .then(x => { if ("error" in x) {
43
36
  return panic(x.error);
@@ -51,7 +44,7 @@ export class OpenSampleAPI {
51
44
  console.debug(`load ${UUID.toString(uuid)}`);
52
45
  return this.get(uuid)
53
46
  .then(({ uuid, name, bpm }) => Promises.retry(() => network
54
- .limitFetch(`${OpenSampleAPI.FileRoot}/${uuid}`, headers))
47
+ .limitFetch(`${OpenSampleAPI.FileRoot}/${uuid}`, OpenDAWHeaders))
55
48
  .then(response => {
56
49
  const total = parseInt(response.headers.get("Content-Length") ?? "0");
57
50
  let loaded = 0;
@@ -0,0 +1,18 @@
1
+ import { Procedure, Progress, UUID } from "@opendaw/lib-std";
2
+ import { Sample } from "@opendaw/studio-adapters";
3
+ export declare namespace SampleService {
4
+ type ImportArgs = {
5
+ uuid?: UUID.Bytes;
6
+ name: string;
7
+ arrayBuffer: ArrayBuffer;
8
+ progressHandler?: Progress.Handler;
9
+ };
10
+ }
11
+ export declare class SampleService {
12
+ readonly audioContext: AudioContext;
13
+ readonly onUpdate: Procedure<Sample>;
14
+ constructor(audioContext: AudioContext, onUpdate: Procedure<Sample>);
15
+ browseForSamples(multiple: boolean): Promise<void>;
16
+ importSample({ uuid, name, arrayBuffer, progressHandler }: SampleService.ImportArgs): Promise<Sample>;
17
+ }
18
+ //# sourceMappingURL=SampleService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleService.d.ts","sourceRoot":"","sources":["../../src/samples/SampleService.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EACT,QAAQ,EAER,IAAI,EACP,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAY,MAAM,EAAiB,MAAM,0BAA0B,CAAA;AAG1E,yBAAiB,aAAa,CAAC;IAC3B,KAAY,UAAU,GAAG;QACrB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,WAAW,CAAC;QACzB,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACrC,CAAA;CACJ;AAED,qBAAa,aAAa;IACV,QAAQ,CAAC,YAAY,EAAE,YAAY;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC;gBAAhE,YAAY,EAAE,YAAY,EAAW,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC;IAE/E,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiClD,YAAY,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,eAAgC,EAAC,EACzD,aAAa,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAoClE"}
@@ -0,0 +1,82 @@
1
+ import { Arrays, DefaultObservableValue, Errors, panic, Progress, RuntimeNotifier, UUID } from "@opendaw/lib-std";
2
+ import { estimateBpm } from "@opendaw/lib-dsp";
3
+ import { Files } from "@opendaw/lib-dom";
4
+ import { Promises } from "@opendaw/lib-runtime";
5
+ import { SamplePeaks } from "@opendaw/lib-fusion";
6
+ import { FilePickerAcceptTypes, SampleStorage, Workers } from "../index";
7
+ export class SampleService {
8
+ audioContext;
9
+ onUpdate;
10
+ constructor(audioContext, onUpdate) {
11
+ this.audioContext = audioContext;
12
+ this.onUpdate = onUpdate;
13
+ }
14
+ async browseForSamples(multiple) {
15
+ const { error, status, value: files } = await Promises.tryCatch(Files.open({ ...FilePickerAcceptTypes.WavFiles, multiple }));
16
+ if (status === "rejected") {
17
+ if (Errors.isAbort(error)) {
18
+ return;
19
+ }
20
+ else {
21
+ return panic(String(error));
22
+ }
23
+ }
24
+ const progress = new DefaultObservableValue(0.0);
25
+ const dialog = RuntimeNotifier.progress({
26
+ headline: `Importing ${files.length === 1 ? "Sample" : "Samples"}...`, progress
27
+ });
28
+ const progressHandler = Progress.split(value => progress.setValue(value), files.length);
29
+ const rejected = [];
30
+ for (const [index, file] of files.entries()) {
31
+ const arrayBuffer = await file.arrayBuffer();
32
+ const { status, error } = await Promises.tryCatch(this.importSample({
33
+ name: file.name,
34
+ arrayBuffer: arrayBuffer,
35
+ progressHandler: progressHandler[index]
36
+ }));
37
+ if (status === "rejected") {
38
+ rejected.push(String(error));
39
+ }
40
+ }
41
+ dialog.terminate();
42
+ if (rejected.length > 0) {
43
+ await RuntimeNotifier.info({
44
+ headline: "Sample Import Issues",
45
+ message: `${rejected.join(", ")} could not be imported.`
46
+ });
47
+ }
48
+ }
49
+ async importSample({ uuid, name, arrayBuffer, progressHandler = Progress.Empty }) {
50
+ console.debug(`importSample '${name}' (${arrayBuffer.byteLength >> 10}kb)`);
51
+ console.time("UUID.sha256");
52
+ uuid ??= await UUID.sha256(arrayBuffer); // Must run before decodeAudioData laster, because it will detach the ArrayBuffer
53
+ console.timeEnd("UUID.sha256");
54
+ console.time("decodeAudioData");
55
+ const audioResult = await Promises.tryCatch(this.audioContext.decodeAudioData(arrayBuffer));
56
+ console.timeEnd("decodeAudioData");
57
+ if (audioResult.status === "rejected") {
58
+ return Promise.reject(name);
59
+ }
60
+ const { value: audioBuffer } = audioResult;
61
+ console.debug(`Imported ${audioBuffer.duration.toFixed(1)} seconds`);
62
+ const audioData = {
63
+ sampleRate: audioBuffer.sampleRate,
64
+ numberOfFrames: audioBuffer.length,
65
+ numberOfChannels: audioBuffer.numberOfChannels,
66
+ frames: Arrays.create(index => audioBuffer.getChannelData(index), audioBuffer.numberOfChannels)
67
+ };
68
+ const shifts = SamplePeaks.findBestFit(audioData.numberOfFrames);
69
+ const peaks = await Workers.Peak.generateAsync(progressHandler, shifts, audioData.frames, audioData.numberOfFrames, audioData.numberOfChannels);
70
+ const meta = {
71
+ bpm: estimateBpm(audioBuffer.duration),
72
+ name: name.substring(0, name.lastIndexOf(".")),
73
+ duration: audioBuffer.duration,
74
+ sample_rate: audioBuffer.sampleRate,
75
+ origin: "import"
76
+ };
77
+ await SampleStorage.get().save({ uuid, audio: audioData, peaks, meta });
78
+ const sample = { uuid: UUID.toString(uuid), ...meta };
79
+ this.onUpdate(sample);
80
+ return sample;
81
+ }
82
+ }
@@ -1,21 +1,22 @@
1
1
  import { UUID } from "@opendaw/lib-std";
2
2
  import { Peaks } from "@opendaw/lib-fusion";
3
3
  import { AudioData, Sample, SampleMetaData } from "@opendaw/studio-adapters";
4
+ import { Storage } from "../Storage";
4
5
  export declare namespace SampleStorage {
5
- const clean: () => Promise<void>;
6
- const Folder = "samples/v2";
7
- type New = {
6
+ type NewSample = {
8
7
  uuid: UUID.Bytes;
9
8
  audio: AudioData;
10
9
  peaks: ArrayBuffer;
11
10
  meta: SampleMetaData;
12
11
  };
13
- const saveSample: ({ uuid, audio, peaks, meta }: New) => Promise<void>;
14
- const updateSampleMeta: (uuid: UUID.Bytes, meta: SampleMetaData) => Promise<void>;
15
- const loadSample: (uuid: UUID.Bytes) => Promise<[AudioData, Peaks, SampleMetaData]>;
16
- const deleteSample: (uuid: UUID.Bytes) => Promise<void>;
17
- const loadTrashedIds: () => Promise<Array<UUID.String>>;
18
- const saveTrashedIds: (ids: ReadonlyArray<UUID.String>) => Promise<void>;
19
- const listSamples: () => Promise<ReadonlyArray<Sample>>;
12
+ }
13
+ export declare class SampleStorage extends Storage<Sample, SampleMetaData, SampleStorage.NewSample, [AudioData, Peaks, SampleMetaData]> {
14
+ static readonly Folder = "samples/v2";
15
+ static get(): SampleStorage;
16
+ static clean(): Promise<void>;
17
+ private constructor();
18
+ save({ uuid, audio, peaks, meta }: SampleStorage.NewSample): Promise<void>;
19
+ updateSampleMeta(uuid: UUID.Bytes, meta: SampleMetaData): Promise<void>;
20
+ load(uuid: UUID.Bytes): Promise<[AudioData, Peaks, SampleMetaData]>;
20
21
  }
21
22
  //# sourceMappingURL=SampleStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SampleStorage.d.ts","sourceRoot":"","sources":["../../src/samples/SampleStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAEhE,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAI1E,yBAAiB,aAAa,CAAC;IACpB,MAAM,KAAK,qBAA2D,CAAA;IAEtE,MAAM,MAAM,eAAe,CAAA;IAElC,KAAY,GAAG,GAAG;QACd,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,WAAW,CAAC;QACnB,IAAI,EAAE,cAAc,CAAA;KACvB,CAAA;IAEM,MAAM,UAAU,GAAU,8BAA4B,GAAG,KAAG,OAAO,CAAC,IAAI,CAa9E,CAAA;IAEM,MAAM,gBAAgB,GAAU,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,cAAc,KAAG,OAAO,CAAC,IAAI,CAG3F,CAAA;IAEM,MAAM,UAAU,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAe7F,CAAA;IAEM,MAAM,YAAY,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,IAAI,CAMjE,CAAA;IAEM,MAAM,cAAc,QAAa,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAGjE,CAAA;IAEM,MAAM,cAAc,GAAU,KAAK,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAG,OAAO,CAAC,IAAI,CAGlF,CAAA;IAEM,MAAM,WAAW,QAAa,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAOjE,CAAA;CACJ"}
1
+ {"version":3,"file":"SampleStorage.d.ts","sourceRoot":"","sources":["../../src/samples/SampleStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAG1E,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAElC,yBAAiB,aAAa,CAAC;IAC3B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,WAAW,CAAC;QACnB,IAAI,EAAE,cAAc,CAAA;KACvB,CAAA;CACJ;AAED,qBAAa,aAAc,SAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC3H,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAe;IAGrC,MAAM,CAAC,GAAG,IAAI,aAAa;WAEd,KAAK;IAElB,OAAO;IAED,IAAI,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,EAAE,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAexE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;CAgB5E"}
@@ -1,14 +1,24 @@
1
- import { ByteArrayInput, EmptyExec, UUID } from "@opendaw/lib-std";
2
- import { Promises } from "@opendaw/lib-runtime";
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 { ByteArrayInput, EmptyExec, Lazy, UUID } from "@opendaw/lib-std";
3
11
  import { SamplePeaks } from "@opendaw/lib-fusion";
4
12
  import { Workers } from "../Workers";
5
13
  import { WavFile } from "../WavFile";
6
- export var SampleStorage;
7
- (function (SampleStorage) {
8
- SampleStorage.clean = () => Workers.Opfs.delete("samples/v1").catch(EmptyExec);
9
- SampleStorage.Folder = "samples/v2";
10
- SampleStorage.saveSample = async ({ uuid, audio, peaks, meta }) => {
11
- const path = `${SampleStorage.Folder}/${UUID.toString(uuid)}`;
14
+ import { Storage } from "../Storage";
15
+ export class SampleStorage extends Storage {
16
+ static Folder = "samples/v2";
17
+ static get() { return new SampleStorage(); }
18
+ static async clean() { Workers.Opfs.delete("samples/v1").catch(EmptyExec); }
19
+ constructor() { super(SampleStorage.Folder); }
20
+ async save({ uuid, audio, peaks, meta }) {
21
+ const path = `${this.folder}/${UUID.toString(uuid)}`;
12
22
  const data = new Uint8Array(WavFile.encodeFloats({
13
23
  channels: audio.frames.slice(),
14
24
  numFrames: audio.numberOfFrames,
@@ -20,13 +30,13 @@ export var SampleStorage;
20
30
  Workers.Opfs.write(`${path}/peaks.bin`, new Uint8Array(peaks)),
21
31
  Workers.Opfs.write(`${path}/meta.json`, new TextEncoder().encode(JSON.stringify(meta)))
22
32
  ]).then(EmptyExec);
23
- };
24
- SampleStorage.updateSampleMeta = async (uuid, meta) => {
25
- const path = `${SampleStorage.Folder}/${UUID.toString(uuid)}`;
33
+ }
34
+ async updateSampleMeta(uuid, meta) {
35
+ const path = `${this.folder}/${UUID.toString(uuid)}`;
26
36
  return Workers.Opfs.write(`${path}/meta.json`, new TextEncoder().encode(JSON.stringify(meta)));
27
- };
28
- SampleStorage.loadSample = async (uuid) => {
29
- const path = `${SampleStorage.Folder}/${UUID.toString(uuid)}`;
37
+ }
38
+ async load(uuid) {
39
+ const path = `${this.folder}/${UUID.toString(uuid)}`;
30
40
  return Promise.all([
31
41
  Workers.Opfs.read(`${path}/audio.wav`)
32
42
  .then(bytes => WavFile.decodeFloats(bytes.buffer)),
@@ -40,28 +50,11 @@ export var SampleStorage;
40
50
  numberOfChannels: buffer.channels.length,
41
51
  frames: buffer.channels
42
52
  }, peaks, meta]);
43
- };
44
- SampleStorage.deleteSample = async (uuid) => {
45
- const path = `${SampleStorage.Folder}/${UUID.toString(uuid)}`;
46
- const uuids = await SampleStorage.loadTrashedIds();
47
- uuids.push(UUID.toString(uuid));
48
- await SampleStorage.saveTrashedIds(uuids);
49
- await Workers.Opfs.delete(`${path}`);
50
- };
51
- SampleStorage.loadTrashedIds = async () => {
52
- const { status, value } = await Promises.tryCatch(Workers.Opfs.read(`${SampleStorage.Folder}/trash.json`));
53
- return status === "rejected" ? [] : JSON.parse(new TextDecoder().decode(value));
54
- };
55
- SampleStorage.saveTrashedIds = async (ids) => {
56
- const trash = new TextEncoder().encode(JSON.stringify(ids));
57
- await Workers.Opfs.write(`${SampleStorage.Folder}/trash.json`, trash);
58
- };
59
- SampleStorage.listSamples = async () => {
60
- return Workers.Opfs.list(SampleStorage.Folder)
61
- .then(files => Promise.all(files.filter(file => file.kind === "directory")
62
- .map(async ({ name }) => {
63
- const array = await Workers.Opfs.read(`${SampleStorage.Folder}/${name}/meta.json`);
64
- return ({ uuid: name, ...JSON.parse(new TextDecoder().decode(array)) });
65
- })), () => []);
66
- };
67
- })(SampleStorage || (SampleStorage = {}));
53
+ }
54
+ }
55
+ __decorate([
56
+ Lazy,
57
+ __metadata("design:type", Function),
58
+ __metadata("design:paramtypes", []),
59
+ __metadata("design:returntype", SampleStorage)
60
+ ], SampleStorage, "get", null);