@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.
- 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 -1
- package/dist/samples/index.d.ts.map +1 -1
- package/dist/samples/index.js +1 -1
- 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 +15 -17
- 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/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
@@ -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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"}
|
package/dist/project/Project.js
CHANGED
@@ -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
|
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":"AAAA,OAAO,EAOH,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EAEN,YAAY,EAEf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAyB,KAAK,EAAc,YAAY,EAAc,MAAM,kBAAkB,CAAA;AACrG,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EACH,WAAW,EAEX,YAAY,EAMZ,YAAY,EACZ,sBAAsB,EACtB,aAAa,EAEb,QAAQ,EAGR,cAAc,EACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,UAAU,EACV,YAAY,EACZ,mBAAmB,EAEnB,iBAAiB,EACjB,UAAU,EACV,gCAAgC,EAEnC,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAA;AAGtC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;KAAE,CAAA;IAC7D,QAAQ,EAAE,IAAI,CAAA;IACd,QAAQ,EAAE,IAAI,CAAA;IACd,KAAK,EAAE,GAAG,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,MAAM,CAAC,EAAE,GAAG,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,IAAI,CAAA;IACd,QAAQ,EAAE,IAAI,CAAA;IACd,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB,YAAY,CAAC,EAAE,IAAI,CAAA;IACnB,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,eAAe,CAAC,EAAE,sBAAsB,CAAA;IACxC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAGD,qBAAa,UAAU;;gBAGP,OAAO,EAAE,OAAO;IAE5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY;IAIhE,6BAA6B,CAAC,QAAQ,EAAE,gCAAgC,CAAC,mBAAmB,CAAC,GAAG,YAAY;IAI5G,gBAAgB,CAAC,EAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,EAAE,iBAAiB,
|
1
|
+
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAOH,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EAEN,YAAY,EAEf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAyB,KAAK,EAAc,YAAY,EAAc,MAAM,kBAAkB,CAAA;AACrG,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EACH,WAAW,EAEX,YAAY,EAMZ,YAAY,EACZ,sBAAsB,EACtB,aAAa,EAEb,QAAQ,EAGR,cAAc,EACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,UAAU,EACV,YAAY,EACZ,mBAAmB,EAEnB,iBAAiB,EACjB,UAAU,EACV,gCAAgC,EAEnC,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAA;AAGtC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;KAAE,CAAA;IAC7D,QAAQ,EAAE,IAAI,CAAA;IACd,QAAQ,EAAE,IAAI,CAAA;IACd,KAAK,EAAE,GAAG,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,MAAM,CAAC,EAAE,GAAG,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,IAAI,CAAA;IACd,QAAQ,EAAE,IAAI,CAAA;IACd,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB,YAAY,CAAC,EAAE,IAAI,CAAA;IACnB,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,eAAe,CAAC,EAAE,sBAAsB,CAAA;IACxC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAGD,qBAAa,UAAU;;gBAGP,OAAO,EAAE,OAAO;IAE5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY;IAIhE,6BAA6B,CAAC,QAAQ,EAAE,gCAAgC,CAAC,mBAAmB,CAAC,GAAG,YAAY;IAI5G,gBAAgB,CAAC,CAAC,EAAE,EAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACnE,OAAO,GAAE,iBAAiB,CAAC,CAAC,CAAM,GAAG,iBAAiB;IAsB1E,cAAc,CAAC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,GAAG,WAAW;IAsB1C,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,GAAE,GAA6B,GAAG,SAAS;IAI5H,eAAe,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,GAAE,GAA6B,GAAG,QAAQ;IAIjG,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,GAAE,GAA6B,GAAG,QAAQ;IAIlG,qBAAqB,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,GAAE,GAA6B,GAAG,QAAQ;IAI3I,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,EAAC,IAAI,EAAE,GAAG,EAAC,GAAE,iBAAsB,GAAG,MAAM,CAAC,UAAU,CAAC;IAgCvG,gBAAgB,CAAC,EACI,QAAQ,EACR,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,YAAY,EACxB,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE,IAAI,EAAE,GAAG,EAClB,EAAE,gBAAgB,GAAG,aAAa;IAoBpD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,GAAG,EAAC,GAAE,iBAAsB;IAkCzG,eAAe,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAC,EAAE,eAAe,GAAG,YAAY;IAe1G,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAOjD,cAAc,CAAC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,EACvC,MAAM,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO;IA8DpF,SAAS,CAAC,GAAG,OAAO,EAAE,aAAa,CAAC;QAAE,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAyD1G"}
|
@@ -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 },
|
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;
|
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
|
20
|
-
|
21
|
-
const
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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.
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
.
|
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;
|
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
|
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;
|
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.
|
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
|
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.
|
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.
|
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;
|
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
|
-
|
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`,
|
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,
|
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}`,
|
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
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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,
|
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
|
-
|
2
|
-
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
25
|
-
const path = `${
|
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
|
-
|
29
|
-
const path = `${
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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);
|