@opendaw/studio-core 0.0.56 → 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.
- package/dist/AudioOfflineRenderer.d.ts.map +1 -1
- package/dist/AudioOfflineRenderer.js +30 -17
- package/dist/EffectBox.d.ts +2 -2
- package/dist/EffectBox.d.ts.map +1 -1
- package/dist/EffectFactories.d.ts +3 -0
- package/dist/EffectFactories.d.ts.map +1 -1
- package/dist/EffectFactories.js +40 -27
- package/dist/EffectFactory.d.ts +3 -2
- package/dist/EffectFactory.d.ts.map +1 -1
- package/dist/Engine.d.ts +2 -0
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +2 -0
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +2 -0
- package/dist/EngineWorklet.d.ts +2 -0
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +13 -1
- package/dist/ExternalLib.d.ts +6 -0
- package/dist/ExternalLib.d.ts.map +1 -0
- package/dist/ExternalLib.js +11 -0
- package/dist/FilePickerAcceptTypes.d.ts +1 -0
- package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
- package/dist/FilePickerAcceptTypes.js +4 -0
- package/dist/Preferences.d.ts +2 -0
- package/dist/Preferences.d.ts.map +1 -1
- package/dist/Preferences.js +2 -1
- package/dist/capture/RecordAudio.d.ts +1 -1
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +4 -5
- package/dist/capture/RecordMidi.d.ts +1 -1
- package/dist/capture/RecordMidi.d.ts.map +1 -1
- package/dist/capture/RecordMidi.js +1 -2
- package/dist/capture/Recording.js +2 -2
- package/dist/dawproject/AudioUnitExportLayout.d.ts.map +1 -1
- package/dist/dawproject/AudioUnitExportLayout.js +1 -1
- package/dist/dawproject/BuiltinDevices.d.ts +3 -3
- package/dist/dawproject/BuiltinDevices.d.ts.map +1 -1
- package/dist/dawproject/BuiltinDevices.js +1 -1
- package/dist/dawproject/DawProject.d.ts +3 -3
- package/dist/dawproject/DawProject.d.ts.map +1 -1
- package/dist/dawproject/DawProject.js +6 -5
- package/dist/dawproject/DawProjectExporter.d.ts +2 -2
- package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
- package/dist/dawproject/DawProjectExporter.js +5 -6
- package/dist/dawproject/DawProjectExporter.test.js +24 -28
- package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
- package/dist/dawproject/DawProjectImporter.js +3 -6
- package/dist/dawproject/DawProjectService.d.ts.map +1 -1
- package/dist/dawproject/DawProjectService.js +11 -1
- package/dist/dawproject/DeviceIO.d.ts +1 -1
- package/dist/dawproject/DeviceIO.d.ts.map +1 -1
- package/dist/dawproject/DeviceIO.js +2 -2
- package/dist/index.d.ts +1 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -9
- package/dist/processors.js +19 -17
- package/dist/processors.js.map +4 -4
- package/dist/project/Project.d.ts +2 -2
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +18 -64
- package/dist/project/ProjectApi.d.ts +5 -8
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +8 -59
- package/dist/project/ProjectBundle.d.ts.map +1 -1
- package/dist/project/ProjectBundle.js +3 -2
- package/dist/project/ProjectMigration.d.ts.map +1 -1
- package/dist/project/ProjectMigration.js +64 -3
- package/dist/project/ProjectStorage.js +2 -2
- package/dist/project/index.d.ts +0 -1
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +0 -1
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +6 -0
- package/dist/samples/SampleService.js +1 -1
- package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -1
- package/dist/soundfont/DefaultSoundfontLoader.js +3 -2
- package/dist/soundfont/SoundfontService.d.ts.map +1 -1
- package/dist/soundfont/SoundfontService.js +2 -2
- package/dist/ui/RegionClipResolver.d.ts +37 -0
- package/dist/ui/RegionClipResolver.d.ts.map +1 -0
- package/dist/ui/RegionClipResolver.js +179 -0
- package/dist/ui/RegionClipResolver.test.d.ts +2 -0
- package/dist/ui/RegionClipResolver.test.d.ts.map +1 -0
- package/dist/ui/RegionClipResolver.test.js +166 -0
- package/dist/ui/RegionModifyStrategies.d.ts +25 -0
- package/dist/ui/RegionModifyStrategies.d.ts.map +1 -0
- package/dist/ui/RegionModifyStrategies.js +25 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +2 -0
- package/dist/workers-main.js +4 -2
- package/dist/workers-main.js.map +3 -3
- package/dist/ysync/YService.js +2 -2
- package/package.json +15 -15
- package/dist/AudioUnitOrdering.d.ts +0 -3
- package/dist/AudioUnitOrdering.d.ts.map +0 -1
- package/dist/AudioUnitOrdering.js +0 -7
- package/dist/ColorCodes.d.ts +0 -7
- package/dist/ColorCodes.d.ts.map +0 -1
- package/dist/ColorCodes.js +0 -32
- package/dist/Colors.d.ts +0 -15
- package/dist/Colors.d.ts.map +0 -1
- package/dist/Colors.js +0 -23
- package/dist/InstrumentBox.d.ts +0 -3
- package/dist/InstrumentBox.d.ts.map +0 -1
- package/dist/InstrumentBox.js +0 -1
- package/dist/InstrumentFactories.d.ts +0 -33
- package/dist/InstrumentFactories.d.ts.map +0 -1
- package/dist/InstrumentFactories.js +0 -122
- package/dist/InstrumentFactory.d.ts +0 -13
- package/dist/InstrumentFactory.d.ts.map +0 -1
- package/dist/InstrumentFactory.js +0 -1
- package/dist/InstrumentOptions.d.ts +0 -9
- package/dist/InstrumentOptions.d.ts.map +0 -1
- package/dist/InstrumentOptions.js +0 -1
- package/dist/InstrumentProduct.d.ts +0 -8
- package/dist/InstrumentProduct.d.ts.map +0 -1
- package/dist/InstrumentProduct.js +0 -1
- package/dist/project/ProjectUtils.d.ts +0 -12
- package/dist/project/ProjectUtils.d.ts.map +0 -1
- package/dist/project/ProjectUtils.js +0 -153
- package/dist/utils/AutofitUtils.d.ts +0 -7
- package/dist/utils/AutofitUtils.d.ts.map +0 -1
- package/dist/utils/AutofitUtils.js +0 -78
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.d.ts.map +0 -1
- 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":"AAAA,OAAO,
|
|
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
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Arrays,
|
|
2
|
-
import { BoxEditing
|
|
3
|
-
import {
|
|
4
|
-
import { BoxAdapters,
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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,
|
|
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
|
-
|
|
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 {
|
|
5
|
-
import {
|
|
6
|
-
import { AnyClipBox, AudioUnitBoxAdapter, EffectPointerType,
|
|
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<
|
|
47
|
-
|
|
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":"AAAA,OAAO,
|
|
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 {
|
|
1
|
+
import { assert, clamp, Option, Strings, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { PPQN } from "@opendaw/lib-dsp";
|
|
3
|
-
import { IndexedBox
|
|
3
|
+
import { IndexedBox } from "@opendaw/lib-box";
|
|
4
4
|
import { AudioUnitType } from "@opendaw/studio-enums";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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 =
|
|
30
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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;
|
|
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
|
|
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
|
|
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":"
|
|
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, MIDIOutputBox, 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,35 @@ 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
|
+
},
|
|
32
65
|
visitMIDIOutputDeviceBox: (deviceBox) => {
|
|
33
66
|
const id = deviceBox.deprecatedDevice.id.getValue();
|
|
34
67
|
const label = deviceBox.deprecatedDevice.label.getValue();
|
|
@@ -109,6 +142,34 @@ export class ProjectMigration {
|
|
|
109
142
|
box.lowPass.order.setValue(clamp(box.lowPass.order.getValue(), 0, 3));
|
|
110
143
|
box.highPass.order.setValue(clamp(box.highPass.order.getValue(), 0, 3));
|
|
111
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
|
+
}
|
|
112
173
|
}
|
|
113
174
|
}));
|
|
114
175
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Option, safeExecute, tryCatch, UUID } from "@opendaw/lib-std";
|
|
2
|
-
import {
|
|
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 } =
|
|
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)));
|
package/dist/project/index.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/project/index.js
CHANGED
|
@@ -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;
|
|
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
|
|
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;
|
|
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(() =>
|
|
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
|
|
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;
|
|
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
|
|
76
|
+
const SoundFont2 = await ExternalLib.SoundFont2();
|
|
77
77
|
return new SoundFont2(new Uint8Array(buffer));
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Exec, int } from "@opendaw/lib-std";
|
|
2
|
+
import { Event, ppqn } from "@opendaw/lib-dsp";
|
|
3
|
+
import { AnyRegionBoxAdapter, TrackBoxAdapter } from "@opendaw/studio-adapters";
|
|
4
|
+
import { RegionModifyStrategies } from "./RegionModifyStrategies";
|
|
5
|
+
export type ClipTask = {
|
|
6
|
+
type: "delete";
|
|
7
|
+
region: AnyRegionBoxAdapter;
|
|
8
|
+
} | {
|
|
9
|
+
type: "separate";
|
|
10
|
+
region: AnyRegionBoxAdapter;
|
|
11
|
+
begin: ppqn;
|
|
12
|
+
end: ppqn;
|
|
13
|
+
} | {
|
|
14
|
+
type: "start";
|
|
15
|
+
region: AnyRegionBoxAdapter;
|
|
16
|
+
position: ppqn;
|
|
17
|
+
} | {
|
|
18
|
+
type: "complete";
|
|
19
|
+
region: AnyRegionBoxAdapter;
|
|
20
|
+
position: ppqn;
|
|
21
|
+
};
|
|
22
|
+
interface Mask extends Event {
|
|
23
|
+
complete: ppqn;
|
|
24
|
+
}
|
|
25
|
+
export declare class RegionClipResolver {
|
|
26
|
+
#private;
|
|
27
|
+
static fromSelection(tracks: ReadonlyArray<TrackBoxAdapter>, adapters: ReadonlyArray<AnyRegionBoxAdapter>, strategy: RegionModifyStrategies, deltaIndex?: int): Exec;
|
|
28
|
+
static fromRange(track: TrackBoxAdapter, position: ppqn, complete: ppqn): Exec;
|
|
29
|
+
static validateTracks(tracks: ReadonlyArray<TrackBoxAdapter>): void;
|
|
30
|
+
static validateTrack(track: TrackBoxAdapter): void;
|
|
31
|
+
static sortAndJoinMasks(masks: ReadonlyArray<Mask>): ReadonlyArray<Mask>;
|
|
32
|
+
constructor(strategy: RegionModifyStrategies, ground: TrackBoxAdapter);
|
|
33
|
+
addMask(region: AnyRegionBoxAdapter): void;
|
|
34
|
+
addMaskRange(position: ppqn, complete: ppqn): void;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=RegionClipResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegionClipResolver.d.ts","sourceRoot":"","sources":["../../src/ui/RegionClipResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,IAAI,EAAE,GAAG,EAAa,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAC,KAAK,EAAmB,IAAI,EAAW,MAAM,kBAAkB,CAAA;AACvE,OAAO,EACH,mBAAmB,EAGnB,eAAe,EAGlB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAA;AAE/D,MAAM,MAAM,QAAQ,GAAG;IACnB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,mBAAmB,CAAA;CAC9B,GAAG;IACA,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,KAAK,EAAE,IAAI,CAAA;IACX,GAAG,EAAE,IAAI,CAAA;CACZ,GAAG;IACA,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,mBAAmB,CAAA;IAC3B,QAAQ,EAAE,IAAI,CAAA;CACjB,GAAG;IACA,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,QAAQ,EAAE,IAAI,CAAA;CACjB,CAAA;AAED,UAAU,IAAK,SAAQ,KAAK;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAC;AAO7C,qBAAa,kBAAkB;;IAC3B,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EACtC,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC5C,QAAQ,EAAE,sBAAsB,EAChC,UAAU,GAAE,GAAO,GAAG,IAAI;IAY/C,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI;IAO9E,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,IAAI;IAInE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAuBlD,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC;gBAuC5D,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,eAAe;IAMrE,OAAO,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAK1C,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI;CAyErD"}
|