@opendaw/studio-core 0.0.55 → 0.0.57

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 (127) hide show
  1. package/dist/AudioOfflineRenderer.d.ts.map +1 -1
  2. package/dist/AudioOfflineRenderer.js +30 -17
  3. package/dist/EffectBox.d.ts +2 -2
  4. package/dist/EffectBox.d.ts.map +1 -1
  5. package/dist/EffectFactories.d.ts +3 -0
  6. package/dist/EffectFactories.d.ts.map +1 -1
  7. package/dist/EffectFactories.js +40 -27
  8. package/dist/EffectFactory.d.ts +3 -2
  9. package/dist/EffectFactory.d.ts.map +1 -1
  10. package/dist/Engine.d.ts +2 -0
  11. package/dist/Engine.d.ts.map +1 -1
  12. package/dist/EngineFacade.d.ts +2 -0
  13. package/dist/EngineFacade.d.ts.map +1 -1
  14. package/dist/EngineFacade.js +2 -0
  15. package/dist/EngineWorklet.d.ts +2 -0
  16. package/dist/EngineWorklet.d.ts.map +1 -1
  17. package/dist/EngineWorklet.js +13 -1
  18. package/dist/ExternalLib.d.ts +6 -0
  19. package/dist/ExternalLib.d.ts.map +1 -0
  20. package/dist/ExternalLib.js +11 -0
  21. package/dist/FilePickerAcceptTypes.d.ts +1 -0
  22. package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
  23. package/dist/FilePickerAcceptTypes.js +4 -0
  24. package/dist/Preferences.d.ts +2 -0
  25. package/dist/Preferences.d.ts.map +1 -1
  26. package/dist/Preferences.js +2 -1
  27. package/dist/capture/RecordAudio.d.ts +1 -1
  28. package/dist/capture/RecordAudio.d.ts.map +1 -1
  29. package/dist/capture/RecordAudio.js +4 -5
  30. package/dist/capture/RecordMidi.d.ts +1 -1
  31. package/dist/capture/RecordMidi.d.ts.map +1 -1
  32. package/dist/capture/RecordMidi.js +1 -2
  33. package/dist/capture/Recording.js +2 -2
  34. package/dist/dawproject/AudioUnitExportLayout.d.ts.map +1 -1
  35. package/dist/dawproject/AudioUnitExportLayout.js +1 -1
  36. package/dist/dawproject/BuiltinDevices.d.ts +3 -3
  37. package/dist/dawproject/BuiltinDevices.d.ts.map +1 -1
  38. package/dist/dawproject/BuiltinDevices.js +1 -1
  39. package/dist/dawproject/DawProject.d.ts +3 -3
  40. package/dist/dawproject/DawProject.d.ts.map +1 -1
  41. package/dist/dawproject/DawProject.js +6 -5
  42. package/dist/dawproject/DawProjectExporter.d.ts +2 -2
  43. package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
  44. package/dist/dawproject/DawProjectExporter.js +5 -6
  45. package/dist/dawproject/DawProjectExporter.test.js +24 -28
  46. package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
  47. package/dist/dawproject/DawProjectImporter.js +3 -6
  48. package/dist/dawproject/DawProjectService.d.ts.map +1 -1
  49. package/dist/dawproject/DawProjectService.js +11 -1
  50. package/dist/dawproject/DeviceIO.d.ts +1 -1
  51. package/dist/dawproject/DeviceIO.d.ts.map +1 -1
  52. package/dist/dawproject/DeviceIO.js +2 -2
  53. package/dist/index.d.ts +1 -9
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -9
  56. package/dist/processors.js +19 -17
  57. package/dist/processors.js.map +4 -4
  58. package/dist/project/Project.d.ts +2 -2
  59. package/dist/project/Project.d.ts.map +1 -1
  60. package/dist/project/Project.js +18 -64
  61. package/dist/project/ProjectApi.d.ts +5 -8
  62. package/dist/project/ProjectApi.d.ts.map +1 -1
  63. package/dist/project/ProjectApi.js +8 -59
  64. package/dist/project/ProjectBundle.d.ts.map +1 -1
  65. package/dist/project/ProjectBundle.js +3 -2
  66. package/dist/project/ProjectMigration.d.ts.map +1 -1
  67. package/dist/project/ProjectMigration.js +83 -3
  68. package/dist/project/ProjectStorage.js +2 -2
  69. package/dist/project/index.d.ts +0 -1
  70. package/dist/project/index.d.ts.map +1 -1
  71. package/dist/project/index.js +0 -1
  72. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  73. package/dist/samples/OpenSampleAPI.js +6 -0
  74. package/dist/samples/SampleService.js +1 -1
  75. package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -1
  76. package/dist/soundfont/DefaultSoundfontLoader.js +3 -2
  77. package/dist/soundfont/SoundfontService.d.ts.map +1 -1
  78. package/dist/soundfont/SoundfontService.js +2 -2
  79. package/dist/ui/RegionClipResolver.d.ts +37 -0
  80. package/dist/ui/RegionClipResolver.d.ts.map +1 -0
  81. package/dist/ui/RegionClipResolver.js +179 -0
  82. package/dist/ui/RegionClipResolver.test.d.ts +2 -0
  83. package/dist/ui/RegionClipResolver.test.d.ts.map +1 -0
  84. package/dist/ui/RegionClipResolver.test.js +166 -0
  85. package/dist/ui/RegionModifyStrategies.d.ts +25 -0
  86. package/dist/ui/RegionModifyStrategies.d.ts.map +1 -0
  87. package/dist/ui/RegionModifyStrategies.js +25 -0
  88. package/dist/ui/index.d.ts +2 -0
  89. package/dist/ui/index.d.ts.map +1 -1
  90. package/dist/ui/index.js +2 -0
  91. package/dist/workers-main.js +4 -2
  92. package/dist/workers-main.js.map +3 -3
  93. package/dist/ysync/YService.js +2 -2
  94. package/package.json +15 -15
  95. package/dist/AudioUnitOrdering.d.ts +0 -3
  96. package/dist/AudioUnitOrdering.d.ts.map +0 -1
  97. package/dist/AudioUnitOrdering.js +0 -7
  98. package/dist/ColorCodes.d.ts +0 -7
  99. package/dist/ColorCodes.d.ts.map +0 -1
  100. package/dist/ColorCodes.js +0 -32
  101. package/dist/Colors.d.ts +0 -15
  102. package/dist/Colors.d.ts.map +0 -1
  103. package/dist/Colors.js +0 -23
  104. package/dist/InstrumentBox.d.ts +0 -3
  105. package/dist/InstrumentBox.d.ts.map +0 -1
  106. package/dist/InstrumentBox.js +0 -1
  107. package/dist/InstrumentFactories.d.ts +0 -26
  108. package/dist/InstrumentFactories.d.ts.map +0 -1
  109. package/dist/InstrumentFactories.js +0 -131
  110. package/dist/InstrumentFactory.d.ts +0 -13
  111. package/dist/InstrumentFactory.d.ts.map +0 -1
  112. package/dist/InstrumentFactory.js +0 -1
  113. package/dist/InstrumentOptions.d.ts +0 -9
  114. package/dist/InstrumentOptions.d.ts.map +0 -1
  115. package/dist/InstrumentOptions.js +0 -1
  116. package/dist/InstrumentProduct.d.ts +0 -8
  117. package/dist/InstrumentProduct.d.ts.map +0 -1
  118. package/dist/InstrumentProduct.js +0 -1
  119. package/dist/project/ProjectUtils.d.ts +0 -12
  120. package/dist/project/ProjectUtils.d.ts.map +0 -1
  121. package/dist/project/ProjectUtils.js +0 -153
  122. package/dist/utils/AutofitUtils.d.ts +0 -7
  123. package/dist/utils/AutofitUtils.d.ts.map +0 -1
  124. package/dist/utils/AutofitUtils.js +0 -78
  125. package/dist/utils/index.d.ts +0 -2
  126. package/dist/utils/index.d.ts.map +0 -1
  127. package/dist/utils/index.js +0 -1
@@ -10,7 +10,7 @@ import { CaptureDevices } from "../capture";
10
10
  import { EngineFacade } from "../EngineFacade";
11
11
  import { EngineWorklet } from "../EngineWorklet";
12
12
  import { MIDILearning } from "../midi";
13
- import { ppqn } from "@opendaw/lib-dsp";
13
+ import { ppqn, TempoMap } from "@opendaw/lib-dsp";
14
14
  export type RestartWorklet = {
15
15
  unload: Func<unknown, Promise<unknown>>;
16
16
  load: Procedure<EngineWorklet>;
@@ -39,6 +39,7 @@ export declare class Project implements BoxAdaptersContext, Terminable, Terminab
39
39
  readonly liveStreamReceiver: LiveStreamReceiver;
40
40
  readonly midiLearning: MIDILearning;
41
41
  readonly mixer: Mixer;
42
+ readonly tempoMap: TempoMap;
42
43
  readonly engine: EngineFacade;
43
44
  private constructor();
44
45
  startAudioWorklet(restart?: RestartWorklet, options?: ProcessorOptions): EngineWorklet;
@@ -48,7 +49,6 @@ export declare class Project implements BoxAdaptersContext, Terminable, Terminab
48
49
  ownAll<T extends Terminable>(...terminables: Array<T>): void;
49
50
  spawn(): Terminator;
50
51
  get env(): ProjectEnv;
51
- get bpm(): number;
52
52
  get rootBoxAdapter(): RootBoxAdapter;
53
53
  get timelineBoxAdapter(): TimelineBoxAdapter;
54
54
  get sampleManager(): SampleLoaderManager;
@@ -1 +1 @@
1
- {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,8 @@
1
- import { Arrays, ByteArrayOutput, Option, panic, safeExecute, Terminator, UUID } from "@opendaw/lib-std";
2
- import { BoxEditing, BoxGraph } from "@opendaw/lib-box";
3
- import { AudioBusBox, AudioUnitBox, BoxIO, CompressorDeviceBox, GrooveShuffleBox, RootBox, TimelineBox, UserInterfaceBox } from "@opendaw/studio-boxes";
4
- import { BoxAdapters, IconSymbol, ParameterFieldAdapters, ProjectDecoder, RootBoxAdapter, TimelineBoxAdapter, UnionBoxTypes, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
1
+ import { Arrays, panic, safeExecute, Terminator } from "@opendaw/lib-std";
2
+ import { BoxEditing } from "@opendaw/lib-box";
3
+ import { AudioRegionBox } from "@opendaw/studio-boxes";
4
+ import { BoxAdapters, ParameterFieldAdapters, ProjectSkeleton, RootBoxAdapter, TimelineBoxAdapter, UnionBoxTypes, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
5
5
  import { LiveStreamReceiver } from "@opendaw/lib-fusion";
6
- import { AudioUnitType } from "@opendaw/studio-enums";
7
6
  import { Mixer } from "../Mixer";
8
7
  import { ProjectApi } from "./ProjectApi";
9
8
  import { ProjectMigration } from "./ProjectMigration";
@@ -12,67 +11,24 @@ import { EngineFacade } from "../EngineFacade";
12
11
  import { MidiDevices, MIDILearning } from "../midi";
13
12
  import { ProjectValidation } from "./ProjectValidation";
14
13
  import { Preferences } from "../Preferences";
15
- import { PPQN } from "@opendaw/lib-dsp";
14
+ import { ConstantTempoMap, PPQN, TimeBase } from "@opendaw/lib-dsp";
16
15
  // Main Entry Point for a Project
17
16
  export class Project {
18
17
  static new(env, options) {
19
- const boxGraph = new BoxGraph(Option.wrap(BoxIO.create));
20
- const isoString = new Date().toISOString();
21
- console.debug(`New Project created on ${isoString}`);
22
- boxGraph.beginTransaction();
23
- const grooveShuffleBox = GrooveShuffleBox.create(boxGraph, UUID.generate(), box => {
24
- box.label.setValue("Groove Shuffle");
25
- });
26
- const rootBox = RootBox.create(boxGraph, UUID.generate(), box => {
27
- box.groove.refer(grooveShuffleBox);
28
- box.created.setValue(isoString);
29
- });
30
- const primaryAudioBus = AudioBusBox.create(boxGraph, UUID.generate(), box => {
31
- box.collection.refer(rootBox.audioBusses);
32
- box.label.setValue("Output");
33
- box.icon.setValue(IconSymbol.toName(IconSymbol.SpeakerHeadphone));
34
- box.color.setValue(/*Colors.blue*/ "hsl(189, 100%, 65%)"); // TODO
35
- });
36
- const primaryAudioOutputUnit = AudioUnitBox.create(boxGraph, UUID.generate(), box => {
37
- box.type.setValue(AudioUnitType.Output);
38
- box.collection.refer(rootBox.audioUnits);
39
- box.output.refer(rootBox.outputDevice);
40
- box.index.setValue(0);
41
- });
42
- if (Preferences.values["auto-create-output-compressor"]) {
43
- CompressorDeviceBox.create(boxGraph, UUID.generate(), box => {
44
- box.label.setValue("Compressor");
45
- box.index.setValue(0);
46
- box.host.refer(primaryAudioOutputUnit.audioEffects);
47
- box.threshold.setValue(0);
48
- box.ratio.setValue(24);
49
- });
50
- }
51
- const timelineBox = TimelineBox.create(boxGraph, UUID.generate());
52
- rootBox.timeline.refer(timelineBox.root);
53
- primaryAudioBus.output.refer(primaryAudioOutputUnit.input);
54
- const userInterfaceBoxes = [];
55
18
  const createDefaultUser = options?.noDefaultUser !== true;
56
- if (createDefaultUser) {
57
- const userInterfaceBox = UserInterfaceBox.create(boxGraph, UUID.generate());
58
- userInterfaceBox.root.refer(rootBox.users);
59
- userInterfaceBoxes.push(userInterfaceBox);
60
- }
61
- boxGraph.endTransaction();
62
- const project = new Project(env, boxGraph, {
63
- rootBox,
64
- primaryAudioBus,
65
- primaryAudioOutputUnit,
66
- userInterfaceBoxes,
67
- timelineBox
19
+ const createOutputCompressor = Preferences.values["auto-create-output-compressor"];
20
+ const { boxGraph, mandatoryBoxes } = ProjectSkeleton.empty({
21
+ createOutputCompressor,
22
+ createDefaultUser
68
23
  });
24
+ const project = new Project(env, boxGraph, mandatoryBoxes);
69
25
  if (createDefaultUser) {
70
- project.follow(userInterfaceBoxes[0]);
26
+ project.follow(mandatoryBoxes.userInterfaceBoxes[0]);
71
27
  }
72
28
  return project;
73
29
  }
74
30
  static load(env, arrayBuffer) {
75
- return this.skeleton(env, ProjectDecoder.decode(arrayBuffer));
31
+ return this.skeleton(env, ProjectSkeleton.decode(arrayBuffer));
76
32
  }
77
33
  static skeleton(env, skeleton, followFirstUser = true) {
78
34
  ProjectMigration.migrate(skeleton);
@@ -101,6 +57,7 @@ export class Project {
101
57
  liveStreamReceiver;
102
58
  midiLearning;
103
59
  mixer;
60
+ tempoMap;
104
61
  engine = new EngineFacade();
105
62
  constructor(env, boxGraph, { rootBox, userInterfaceBoxes, primaryAudioBus, primaryAudioOutputUnit, timelineBox }) {
106
63
  this.#env = env;
@@ -114,6 +71,7 @@ export class Project {
114
71
  this.editing = new BoxEditing(this.boxGraph);
115
72
  this.selection = new VertexSelection(this.editing, this.boxGraph);
116
73
  this.parameterFieldAdapters = new ParameterFieldAdapters();
74
+ this.tempoMap = new ConstantTempoMap(this.timelineBox.bpm);
117
75
  this.boxAdapters = this.#terminator.own(new BoxAdapters(this));
118
76
  this.userEditingManager = new UserEditingManager(this.editing);
119
77
  this.liveStreamReceiver = this.#terminator.own(new LiveStreamReceiver());
@@ -160,7 +118,6 @@ export class Project {
160
118
  ownAll(...terminables) { return this.#terminator.ownAll(...terminables); }
161
119
  spawn() { return this.#terminator.spawn(); }
162
120
  get env() { return this.#env; }
163
- get bpm() { return this.timelineBox.bpm.getValue(); }
164
121
  get rootBoxAdapter() { return this.boxAdapters.adapterFor(this.rootBox, RootBoxAdapter); }
165
122
  get timelineBoxAdapter() { return this.boxAdapters.adapterFor(this.timelineBox, TimelineBoxAdapter); }
166
123
  get sampleManager() { return this.#env.sampleManager; }
@@ -195,13 +152,7 @@ export class Project {
195
152
  .map(box => box.address.uuid);
196
153
  }
197
154
  toArrayBuffer() {
198
- const output = ByteArrayOutput.create();
199
- output.writeInt(ProjectDecoder.MAGIC_HEADER_OPEN);
200
- output.writeInt(ProjectDecoder.FORMAT_VERSION);
201
- const boxGraphChunk = this.boxGraph.toArrayBuffer();
202
- output.writeInt(boxGraphChunk.byteLength);
203
- output.writeBytes(new Int8Array(boxGraphChunk));
204
- return output.toArrayBuffer();
155
+ return ProjectSkeleton.encode(this.boxGraph);
205
156
  }
206
157
  copy(env) {
207
158
  return Project.load({ ...this.#env, ...env }, this.toArrayBuffer());
@@ -213,6 +164,9 @@ export class Project {
213
164
  for (const [current, next] of Arrays.iterateAdjacent(box.regions.pointerHub.incoming()
214
165
  .map(({ box }) => UnionBoxTypes.asRegionBox(box))
215
166
  .sort(({ position: a }, { position: b }) => a.getValue() - b.getValue()))) {
167
+ if (current instanceof AudioRegionBox && current.timeBase.getValue() === TimeBase.Seconds) {
168
+ return false;
169
+ }
216
170
  if (current.position.getValue() + current.duration.getValue() > next.position.getValue()) {
217
171
  return true;
218
172
  }
@@ -1,13 +1,10 @@
1
1
  import { float, int, Observer, Option, Subscription } from "@opendaw/lib-std";
2
2
  import { ppqn } from "@opendaw/lib-dsp";
3
3
  import { Field, PointerField } from "@opendaw/lib-box";
4
- import { AudioUnitType, Pointers } from "@opendaw/studio-enums";
5
- import { AudioBusBox, AudioUnitBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueRegionBox } from "@opendaw/studio-boxes";
6
- import { AnyClipBox, AudioUnitBoxAdapter, EffectPointerType, IconSymbol, IndexedAdapterCollectionListener } from "@opendaw/studio-adapters";
4
+ import { Pointers } from "@opendaw/studio-enums";
5
+ import { AudioUnitBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueRegionBox } from "@opendaw/studio-boxes";
6
+ import { AnyClipBox, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct } from "@opendaw/studio-adapters";
7
7
  import { Project } from "./Project";
8
- import { InstrumentFactory } from "../InstrumentFactory";
9
- import { InstrumentProduct } from "../InstrumentProduct";
10
- import { InstrumentOptions } from "../InstrumentOptions";
11
8
  import { EffectFactory } from "../EffectFactory";
12
9
  import { EffectBox } from "../EffectBox";
13
10
  export type ClipRegionOptions = {
@@ -43,8 +40,8 @@ export declare class ProjectApi {
43
40
  setBpm(value: number): void;
44
41
  catchupAndSubscribeBpm(observer: Observer<number>): Subscription;
45
42
  catchupAndSubscribeAudioUnits(listener: IndexedAdapterCollectionListener<AudioUnitBoxAdapter>): Subscription;
46
- createInstrument<T>({ create, defaultIcon, defaultName, trackType }: InstrumentFactory<T>, options?: InstrumentOptions<T>): InstrumentProduct;
47
- createAudioBus(name: string, icon: IconSymbol, type: AudioUnitType, color: string): AudioBusBox;
43
+ createInstrument<A, INST extends InstrumentBox>({ create, defaultIcon, defaultName, trackType }: InstrumentFactory<A, INST>, options?: InstrumentOptions<A>): InstrumentProduct<INST>;
44
+ createAnyInstrument(factory: InstrumentFactory<any, any>): InstrumentProduct<InstrumentBox>;
48
45
  insertEffect(field: Field<EffectPointerType>, factory: EffectFactory, insertIndex?: int): EffectBox;
49
46
  createNoteTrack(audioUnitBox: AudioUnitBox, insertIndex?: int): TrackBox;
50
47
  createAudioTrack(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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"}
@@ -1,11 +1,9 @@
1
- import { asDefined, asInstanceOf, assert, clamp, Option, Strings, UUID } from "@opendaw/lib-std";
1
+ import { assert, clamp, Option, Strings, UUID } from "@opendaw/lib-std";
2
2
  import { PPQN } from "@opendaw/lib-dsp";
3
- import { IndexedBox, StringField } from "@opendaw/lib-box";
3
+ import { IndexedBox } from "@opendaw/lib-box";
4
4
  import { AudioUnitType } from "@opendaw/studio-enums";
5
- import { AudioBusBox, AudioUnitBox, CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
6
- import { IconSymbol, TrackType } from "@opendaw/studio-adapters";
7
- import { ColorCodes } from "../ColorCodes";
8
- import { AudioUnitOrdering } from "../AudioUnitOrdering";
5
+ import { CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
6
+ import { AudioUnitFactory, ColorCodes, ProjectQueries, TrackType } from "@opendaw/studio-adapters";
9
7
  // noinspection JSUnusedGlobalSymbols
10
8
  export class ProjectApi {
11
9
  #project;
@@ -26,11 +24,8 @@ export class ProjectApi {
26
24
  const { name, icon, index } = options;
27
25
  const { boxGraph, rootBox, userEditingManager } = this.#project;
28
26
  assert(rootBox.isAttached(), "rootBox not attached");
29
- const existingNames = rootBox.audioUnits.pointerHub.incoming().map(({ box }) => {
30
- const inputBox = asDefined(asInstanceOf(box, AudioUnitBox).input.pointerHub.incoming().at(0)).box;
31
- return "label" in inputBox && inputBox.label instanceof StringField ? inputBox.label.getValue() : "N/A";
32
- });
33
- const audioUnitBox = this.#createAudioUnit(AudioUnitType.Instrument, this.#trackTypeToCapture(boxGraph, trackType), index);
27
+ const existingNames = ProjectQueries.existingInstrumentNames(rootBox);
28
+ const audioUnitBox = AudioUnitFactory.create(this.#project.skeleton, AudioUnitType.Instrument, this.#trackTypeToCapture(boxGraph, trackType), index);
34
29
  const uniqueName = Strings.getUniqueName(existingNames, name ?? defaultName);
35
30
  const iconSymbol = icon ?? defaultIcon;
36
31
  const instrumentBox = create(boxGraph, audioUnitBox.input, uniqueName, iconSymbol, options.attachment);
@@ -43,26 +38,8 @@ export class ProjectApi {
43
38
  userEditingManager.audioUnit.edit(audioUnitBox.editing);
44
39
  return { audioUnitBox, instrumentBox, trackBox };
45
40
  }
46
- createAudioBus(name, icon, type, color) {
47
- console.debug(`createAudioBus '${name}', type: ${type}, color: ${color}`);
48
- const { rootBox, boxGraph } = this.#project;
49
- assert(rootBox.isAttached(), "rootBox not attached");
50
- const uuid = UUID.generate();
51
- const audioBusBox = AudioBusBox.create(boxGraph, uuid, box => {
52
- box.collection.refer(rootBox.audioBusses);
53
- box.label.setValue(name);
54
- box.icon.setValue(IconSymbol.toName(icon));
55
- box.color.setValue(color);
56
- });
57
- const audioUnitBox = this.#createAudioUnit(type, Option.None);
58
- TrackBox.create(boxGraph, UUID.generate(), box => {
59
- box.tracks.refer(audioUnitBox.tracks);
60
- box.target.refer(audioUnitBox);
61
- box.index.setValue(0);
62
- box.type.setValue(TrackType.Undefined);
63
- });
64
- audioBusBox.output.refer(audioUnitBox.input);
65
- return audioBusBox;
41
+ createAnyInstrument(factory) {
42
+ return this.createInstrument(factory);
66
43
  }
67
44
  insertEffect(field, factory, insertIndex = Number.MAX_SAFE_INTEGER) {
68
45
  return factory.create(this.#project, field, IndexedBox.insertOrder(field, insertIndex));
@@ -178,18 +155,6 @@ export class ProjectApi {
178
155
  IndexedBox.removeOrder(rootBox.audioUnits, audioUnitBox.index.getValue());
179
156
  audioUnitBox.delete();
180
157
  }
181
- #createAudioUnit(type, capture, index) {
182
- const { boxGraph, rootBox, masterBusBox } = this.#project;
183
- const insertIndex = index ?? this.#sortAudioUnitOrdering(type);
184
- console.debug(`createAudioUnit type: ${type}, insertIndex: ${insertIndex}`);
185
- return AudioUnitBox.create(boxGraph, UUID.generate(), box => {
186
- box.collection.refer(rootBox.audioUnits);
187
- box.output.refer(masterBusBox.input);
188
- box.index.setValue(insertIndex);
189
- box.type.setValue(type);
190
- capture.ifSome(capture => box.capture.refer(capture));
191
- });
192
- }
193
158
  #createTrack({ field, target, trackType, insertIndex }) {
194
159
  const index = IndexedBox.insertOrder(field, insertIndex);
195
160
  return TrackBox.create(this.#project.boxGraph, UUID.generate(), box => {
@@ -199,22 +164,6 @@ export class ProjectApi {
199
164
  box.target.refer(target ?? field.box);
200
165
  });
201
166
  }
202
- #sortAudioUnitOrdering(type) {
203
- const { rootBox } = this.#project;
204
- const boxes = IndexedBox.collectIndexedBoxes(rootBox.audioUnits, AudioUnitBox);
205
- const order = AudioUnitOrdering[type];
206
- let index = 0 | 0;
207
- for (; index < boxes.length; index++) {
208
- if (AudioUnitOrdering[boxes[index].type.getValue()] > order) {
209
- break;
210
- }
211
- }
212
- const insertIndex = index;
213
- while (index < boxes.length) {
214
- boxes[index].index.setValue(++index);
215
- }
216
- return insertIndex;
217
- }
218
167
  #trackTypeToCapture(boxGraph, trackType) {
219
168
  switch (trackType) {
220
169
  case TrackType.Audio:
@@ -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;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
+ {"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;AAO/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"}
@@ -6,10 +6,11 @@ import { ProjectProfile } from "./ProjectProfile";
6
6
  import { Workers } from "../Workers";
7
7
  import { SampleStorage } from "../samples";
8
8
  import { SoundfontStorage } from "../soundfont";
9
+ import { ExternalLib } from "../ExternalLib";
9
10
  export var ProjectBundle;
10
11
  (function (ProjectBundle) {
11
12
  ProjectBundle.encode = async ({ uuid, project, meta, cover }, progress) => {
12
- const { default: JSZip } = await import("jszip");
13
+ const JSZip = await ExternalLib.JSZip();
13
14
  const zip = new JSZip();
14
15
  zip.file("version", "1");
15
16
  zip.file("uuid", uuid, { binary: true });
@@ -44,7 +45,7 @@ export var ProjectBundle;
44
45
  return blob.arrayBuffer();
45
46
  };
46
47
  ProjectBundle.decode = async (env, arrayBuffer, openProfileUUID) => {
47
- const { default: JSZip } = await import("jszip");
48
+ const JSZip = await ExternalLib.JSZip();
48
49
  const zip = await JSZip.loadAsync(arrayBuffer);
49
50
  if (await asDefined(zip.file("version")).async("text") !== "1") {
50
51
  return panic("Unknown bundle version");
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectMigration.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMigration.ts"],"names":[],"mappings":"AAcA,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAA;AAKxD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,cAAc,EAAC,EAAE,eAAe,GAAG,IAAI;CAsFpE"}
1
+ {"version":3,"file":"ProjectMigration.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMigration.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAA;AAWxD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,cAAc,EAAC,EAAE,eAAe,GAAG,IAAI;CAoKpE"}
@@ -1,10 +1,14 @@
1
- import { CaptureAudioBox, CaptureMidiBox, GrooveShuffleBox, ValueEventCurveBox } from "@opendaw/studio-boxes";
1
+ import { AudioFileBox, CaptureAudioBox, CaptureMidiBox, GrooveShuffleBox, MIDIOutputBox, ValueEventCurveBox } from "@opendaw/studio-boxes";
2
2
  import { asDefined, asInstanceOf, clamp, Float, UUID } from "@opendaw/lib-std";
3
- import { AudioUnitType } from "@opendaw/studio-enums";
3
+ import { AudioPlayback, AudioUnitType } from "@opendaw/studio-enums";
4
+ import { PPQN, TimeBase } from "@opendaw/lib-dsp";
4
5
  const isIntEncodedAsFloat = (v) => v > 0 && v < 1e-6 && Number.isFinite(v) && (v / 1.401298464324817e-45) % 1 === 0;
6
+ const toSeconds = (property, bpm) => {
7
+ return PPQN.pulsesToSeconds(property.getValue(), bpm);
8
+ };
5
9
  export class ProjectMigration {
6
10
  static migrate({ boxGraph, mandatoryBoxes }) {
7
- const { rootBox } = mandatoryBoxes;
11
+ const { rootBox, timelineBox: { bpm } } = mandatoryBoxes;
8
12
  if (rootBox.groove.targetAddress.isEmpty()) {
9
13
  console.debug("Migrate to global GrooveShuffleBox");
10
14
  boxGraph.beginTransaction();
@@ -29,6 +33,54 @@ export class ProjectMigration {
29
33
  boxGraph.endTransaction();
30
34
  }
31
35
  },
36
+ visitAudioRegionBox: (box) => {
37
+ const { duration, loopOffset, loopDuration, playback } = box;
38
+ if (isIntEncodedAsFloat(duration.getValue())
39
+ || isIntEncodedAsFloat(loopOffset.getValue())
40
+ || isIntEncodedAsFloat(loopDuration.getValue())) {
41
+ console.debug("Migrate 'AudioRegionBox' to float");
42
+ boxGraph.beginTransaction();
43
+ duration.setValue(Float.floatToIntBits(duration.getValue()));
44
+ loopOffset.setValue(Float.floatToIntBits(loopOffset.getValue()));
45
+ loopDuration.setValue(Float.floatToIntBits(loopDuration.getValue()));
46
+ boxGraph.endTransaction();
47
+ }
48
+ if (playback.getValue() === AudioPlayback.AudioFit) {
49
+ console.debug("Migrate 'AudioRegionBox' to AudioPlayback.NoSync");
50
+ boxGraph.beginTransaction();
51
+ const file = asInstanceOf(box.file.targetVertex.unwrap(), AudioFileBox);
52
+ const fileDuration = file.endInSeconds.getValue() - file.startInSeconds.getValue();
53
+ const currentLoopDurationSeconds = toSeconds(box.loopDuration, bpm.getValue());
54
+ const scale = fileDuration / currentLoopDurationSeconds;
55
+ const currentDurationSeconds = toSeconds(box.duration, bpm.getValue());
56
+ const currentLoopOffsetSeconds = toSeconds(box.loopOffset, bpm.getValue());
57
+ box.playback.setValue(AudioPlayback.NoSync);
58
+ box.timeBase.setValue(TimeBase.Seconds);
59
+ box.duration.setValue(currentDurationSeconds * scale);
60
+ box.loopDuration.setValue(fileDuration);
61
+ box.loopOffset.setValue(currentLoopOffsetSeconds * scale);
62
+ boxGraph.endTransaction();
63
+ }
64
+ },
65
+ visitMIDIOutputDeviceBox: (deviceBox) => {
66
+ const id = deviceBox.deprecatedDevice.id.getValue();
67
+ const label = deviceBox.deprecatedDevice.label.getValue();
68
+ const delay = deviceBox.deprecatedDelay.getValue();
69
+ if (id !== "") {
70
+ console.debug("Migrate 'MIDIOutputDeviceBox' to MIDIOutputBox");
71
+ boxGraph.beginTransaction();
72
+ deviceBox.device.refer(MIDIOutputBox.create(boxGraph, UUID.generate(), box => {
73
+ box.id.setValue(id);
74
+ box.label.setValue(label);
75
+ box.delayInMs.setValue(delay);
76
+ box.root.refer(rootBox.outputMidiDevices);
77
+ }).device);
78
+ // clear all data
79
+ deviceBox.deprecatedDevice.id.setValue("");
80
+ deviceBox.deprecatedDevice.label.setValue("");
81
+ boxGraph.endTransaction();
82
+ }
83
+ },
32
84
  visitZeitgeistDeviceBox: (box) => {
33
85
  if (box.groove.targetAddress.isEmpty()) {
34
86
  console.debug("Migrate 'ZeitgeistDeviceBox' to GrooveShuffleBox");
@@ -90,6 +142,34 @@ export class ProjectMigration {
90
142
  box.lowPass.order.setValue(clamp(box.lowPass.order.getValue(), 0, 3));
91
143
  box.highPass.order.setValue(clamp(box.highPass.order.getValue(), 0, 3));
92
144
  boxGraph.endTransaction();
145
+ },
146
+ visitVaporisateurDeviceBox: (box) => {
147
+ if (box.version.getValue() === 0) {
148
+ console.debug("Migrate 'VaporisateurDeviceBox to zero db");
149
+ boxGraph.beginTransaction();
150
+ box.volume.setValue(box.volume.getValue() - 15.0);
151
+ box.version.setValue(1);
152
+ boxGraph.endTransaction();
153
+ }
154
+ if (box.version.getValue() === 1) {
155
+ console.debug("Migrate 'VaporisateurDeviceBox to extended osc");
156
+ boxGraph.beginTransaction();
157
+ const [oscA, oscB] = box.oscillators.fields();
158
+ const movePointers = (oldTarget, newTarget) => {
159
+ oldTarget.pointerHub.incoming().forEach((pointer) => pointer.refer(newTarget));
160
+ };
161
+ movePointers(box.waveform, oscA.waveform);
162
+ movePointers(box.octave, oscA.octave);
163
+ movePointers(box.tune, oscA.tune);
164
+ movePointers(box.volume, oscA.volume);
165
+ oscA.waveform.setValue(box.waveform.getValue());
166
+ oscA.octave.setValue(box.octave.getValue());
167
+ oscA.tune.setValue(box.tune.getValue());
168
+ oscA.volume.setValue(box.volume.getValue());
169
+ oscB.volume.setValue(Number.NEGATIVE_INFINITY);
170
+ box.version.setValue(2);
171
+ boxGraph.endTransaction();
172
+ }
93
173
  }
94
174
  }));
95
175
  }
@@ -1,5 +1,5 @@
1
1
  import { Option, safeExecute, tryCatch, UUID } from "@opendaw/lib-std";
2
- import { ProjectDecoder } from "@opendaw/studio-adapters";
2
+ import { ProjectSkeleton } from "@opendaw/studio-adapters";
3
3
  import { Promises } from "@opendaw/lib-runtime";
4
4
  import { Workers } from "../Workers";
5
5
  import { ProjectPaths } from "./ProjectPaths";
@@ -36,7 +36,7 @@ export var ProjectStorage;
36
36
  for (const { name } of files.filter(file => file.kind === "directory")) {
37
37
  const result = await Workers.Opfs.read(ProjectPaths.projectFile(UUID.parse(name)));
38
38
  tryCatch(() => {
39
- const { boxGraph } = ProjectDecoder.decode(result.buffer);
39
+ const { boxGraph } = ProjectSkeleton.decode(result.buffer);
40
40
  uuids.push(...boxGraph.boxes()
41
41
  .filter(box => box instanceof type)
42
42
  .map((box) => UUID.toString(box.address.uuid)));
@@ -7,6 +7,5 @@ export * from "./ProjectPaths";
7
7
  export * from "./ProjectProfile";
8
8
  export * from "./ProjectSignals";
9
9
  export * from "./ProjectStorage";
10
- export * from "./ProjectUtils";
11
10
  export * from "./Recovery";
12
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
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;AAChC,cAAc,YAAY,CAAA"}
@@ -7,5 +7,4 @@ export * from "./ProjectPaths";
7
7
  export * from "./ProjectProfile";
8
8
  export * from "./ProjectSignals";
9
9
  export * from "./ProjectStorage";
10
- export * from "./ProjectUtils";
11
10
  export * from "./Recovery";
@@ -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;AAK9C,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;IAoC/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;AAK9C,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;IAGD,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;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
@@ -114,6 +114,12 @@ export class OpenSampleAPI {
114
114
  }
115
115
  allowsUpload() { return false; }
116
116
  }
117
+ __decorate([
118
+ Lazy,
119
+ __metadata("design:type", Function),
120
+ __metadata("design:paramtypes", []),
121
+ __metadata("design:returntype", Promise)
122
+ ], OpenSampleAPI.prototype, "all", null);
117
123
  __decorate([
118
124
  Lazy,
119
125
  __metadata("design:type", Function),
@@ -41,7 +41,7 @@ export class SampleService extends AssetService {
41
41
  const peaks = await Workers.Peak.generateAsync(progressHandler, shifts, audioData.frames, audioData.numberOfFrames, audioData.numberOfChannels);
42
42
  const meta = {
43
43
  bpm: estimateBpm(audioBuffer.duration),
44
- name: isUndefined(name) ? "Unnnamed" : name.substring(0, name.lastIndexOf(".")),
44
+ name: isUndefined(name) ? "Unnnamed" : name,
45
45
  duration: audioBuffer.duration,
46
46
  sample_rate: audioBuffer.sampleRate,
47
47
  origin: "import"
@@ -1 +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,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAE1C,qBAAa,sBAAuB,YAAW,eAAe;;gBAY9C,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQpE,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,YAAY;IAQjE,UAAU,IAAI,IAAI;IAOlB,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;CA+CrB"}
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,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAG1C,qBAAa,sBAAuB,YAAW,eAAe;;gBAY9C,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQpE,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,YAAY;IAQjE,UAAU,IAAI,IAAI;IAOlB,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;CA+CrB"}
@@ -1,11 +1,12 @@
1
1
  import { Notifier, Option, Terminable, UUID } from "@opendaw/lib-std";
2
2
  import { Promises } from "@opendaw/lib-runtime";
3
3
  import { SoundfontStorage } from "./SoundfontStorage";
4
+ import { ExternalLib } from "../ExternalLib";
4
5
  export class DefaultSoundfontLoader {
5
6
  #manager;
6
7
  #uuid;
7
8
  #notifier;
8
- #soundFont2 = Promises.memoizeAsync(() => import("soundfont2"));
9
+ #soundFont2 = Promises.memoizeAsync(() => ExternalLib.SoundFont2());
9
10
  #meta = Option.None;
10
11
  #soundfont = Option.None;
11
12
  #state = { type: "progress", progress: 0.0 };
@@ -73,7 +74,7 @@ export class DefaultSoundfontLoader {
73
74
  }
74
75
  }
75
76
  async #createSoundFont2(buffer) {
76
- const { SoundFont2 } = await this.#soundFont2();
77
+ const SoundFont2 = await this.#soundFont2();
77
78
  return new SoundFont2(new Uint8Array(buffer));
78
79
  }
79
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SoundfontService.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAE,MAAM,EAAS,SAAS,EAAwB,MAAM,kBAAkB,CAAA;AAC/F,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAGpC,OAAO,EAAC,SAAS,EAAoB,MAAM,0BAA0B,CAAA;AAIrE,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAG5C,qBAAa,gBAAiB,SAAQ,YAAY,CAAC,SAAS,CAAC;;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAe;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAc;IACrD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAmB;IACzD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAuC;gBAOlF,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC;IAY1C,IAAI,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAqB;IAClE,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAsB;IAE9D,UAAU,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;cA2ClE,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;CAUvE"}
1
+ {"version":3,"file":"SoundfontService.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAE,MAAM,EAAS,SAAS,EAAwB,MAAM,kBAAkB,CAAA;AAC/F,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAGpC,OAAO,EAAC,SAAS,EAAoB,MAAM,0BAA0B,CAAA;AAIrE,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAI5C,qBAAa,gBAAiB,SAAQ,YAAY,CAAC,SAAS,CAAC;;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAe;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAc;IACrD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAmB;IACzD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAuC;gBAKlF,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC;IAY1C,IAAI,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAqB;IAClE,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAsB;IAE9D,UAAU,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;cA2ClE,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;CAUvE"}
@@ -5,12 +5,12 @@ import { SoundfontStorage } from "./SoundfontStorage";
5
5
  import { FilePickerAcceptTypes } from "../FilePickerAcceptTypes";
6
6
  import { OpenSoundfontAPI } from "./OpenSoundfontAPI";
7
7
  import { AssetService } from "../AssetService";
8
+ import { ExternalLib } from "../ExternalLib";
8
9
  export class SoundfontService extends AssetService {
9
10
  namePlural = "Soundfonts";
10
11
  nameSingular = "Soundfont";
11
12
  boxType = SoundfontFileBox;
12
13
  filePickerOptions = FilePickerAcceptTypes.SoundfontFiles;
13
- #soundFont2 = Promises.memoizeAsync(() => import("soundfont2"));
14
14
  #local = Option.None;
15
15
  #remote = Option.None;
16
16
  constructor(onUpdate) {
@@ -73,7 +73,7 @@ export class SoundfontService extends AssetService {
73
73
  return Arrays.merge(stock, local, (a, b) => a.uuid === b.uuid);
74
74
  }
75
75
  async #createSoundFont2(buffer) {
76
- const { SoundFont2 } = await this.#soundFont2();
76
+ const SoundFont2 = await ExternalLib.SoundFont2();
77
77
  return new SoundFont2(new Uint8Array(buffer));
78
78
  }
79
79
  }