@opendaw/studio-core 0.0.130 → 0.0.132
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/AssetService.d.ts.map +1 -1
- package/dist/AssetService.js +11 -2
- package/dist/AudioOfflineRenderer.js +1 -1
- 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 +19 -3
- package/dist/Engine.d.ts +1 -1
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +1 -1
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +2 -2
- package/dist/EngineWorklet.d.ts +1 -1
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +9 -46
- package/dist/MonitoringRouter.d.ts +10 -0
- package/dist/MonitoringRouter.d.ts.map +1 -0
- package/dist/MonitoringRouter.js +89 -0
- package/dist/capture/CaptureAudio.d.ts +10 -0
- package/dist/capture/CaptureAudio.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +105 -30
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +10 -2
- package/dist/capture/Recording.js +1 -1
- package/dist/processors.js +28 -28
- package/dist/processors.js.map +4 -4
- package/dist/project/AudioWavExport.d.ts +6 -0
- package/dist/project/AudioWavExport.d.ts.map +1 -0
- package/dist/project/AudioWavExport.js +15 -0
- package/dist/project/NoteMidiExport.d.ts +9 -0
- package/dist/project/NoteMidiExport.d.ts.map +1 -0
- package/dist/project/NoteMidiExport.js +27 -0
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +1 -2
- package/dist/project/ProjectApi.d.ts +3 -1
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +8 -0
- package/dist/project/ProjectStorage.d.ts.map +1 -1
- package/dist/project/ProjectStorage.js +1 -0
- package/dist/project/audio/AudioContentModifier.d.ts.map +1 -1
- package/dist/project/audio/AudioContentModifier.js +43 -3
- package/dist/project/index.d.ts +2 -0
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +2 -0
- package/dist/project/migration/MigrateValueEventCollection.test.js +3 -3
- package/dist/samples/OpenSampleAPI.d.ts +1 -0
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +1 -0
- package/dist/samples/SampleService.js +1 -1
- package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -1
- package/dist/soundfont/DefaultSoundfontLoader.js +3 -0
- package/dist/soundfont/OpenSoundfontAPI.d.ts +1 -0
- package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -1
- package/dist/soundfont/OpenSoundfontAPI.js +1 -0
- package/dist/soundfont/SoundfontService.js +1 -1
- package/dist/sync-log/SyncLogWriter.d.ts.map +1 -1
- package/dist/sync-log/SyncLogWriter.js +3 -2
- package/dist/ui/clipboard/ClipboardUtils.js +1 -1
- package/dist/ui/clipboard/types/DevicesClipboardHandler.d.ts.map +1 -1
- package/dist/ui/clipboard/types/DevicesClipboardHandler.js +22 -12
- package/dist/ui/clipboard/types/DevicesClipboardHandler.test.js +124 -4
- package/dist/ysync/YService.d.ts.map +1 -1
- package/dist/ysync/YService.js +0 -5
- package/dist/ysync/YSync.d.ts +1 -0
- package/dist/ysync/YSync.d.ts.map +1 -1
- package/dist/ysync/YSync.js +127 -84
- package/dist/ysync/YSync.test.d.ts +2 -0
- package/dist/ysync/YSync.test.d.ts.map +1 -0
- package/dist/ysync/YSync.test.js +259 -0
- package/package.json +16 -15
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Promises } from "@opendaw/lib-runtime";
|
|
2
|
+
import { AudioClipBoxAdapter, AudioRegionBoxAdapter } from "@opendaw/studio-adapters";
|
|
3
|
+
export declare namespace AudioWavExport {
|
|
4
|
+
const toFile: (owner: AudioRegionBoxAdapter | AudioClipBoxAdapter, suggestedName?: string) => Promise<Promises.RejectedResult | Promises.ResolveResult<string>>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=AudioWavExport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioWavExport.d.ts","sourceRoot":"","sources":["../../src/project/AudioWavExport.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAC,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,0BAA0B,CAAA;AAEnF,yBAAiB,cAAc,CAAC;IACrB,MAAM,MAAM,GAAU,OAAO,qBAAqB,GAAG,mBAAmB,EAClD,gBAAe,MAAoB,sEAQ/D,CAAA;CACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { WavFile } from "@opendaw/lib-dsp";
|
|
2
|
+
import { Promises } from "@opendaw/lib-runtime";
|
|
3
|
+
import { Files } from "@opendaw/lib-dom";
|
|
4
|
+
export var AudioWavExport;
|
|
5
|
+
(function (AudioWavExport) {
|
|
6
|
+
AudioWavExport.toFile = async (owner, suggestedName = "audio.wav") => {
|
|
7
|
+
const data = owner.file.data.unwrap("Audio data is not loaded");
|
|
8
|
+
return Promises.tryCatch(Files.save(WavFile.encodeFloats(data), {
|
|
9
|
+
types: [{
|
|
10
|
+
description: "Wav File",
|
|
11
|
+
accept: { "audio/wav": [".wav"] }
|
|
12
|
+
}], suggestedName
|
|
13
|
+
}));
|
|
14
|
+
};
|
|
15
|
+
})(AudioWavExport || (AudioWavExport = {}));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EventCollection, NoteEvent } from "@opendaw/lib-dsp";
|
|
2
|
+
import { MidiTrack } from "@opendaw/lib-midi";
|
|
3
|
+
import { Promises } from "@opendaw/lib-runtime";
|
|
4
|
+
import { NoteEventCollectionBoxAdapter } from "@opendaw/studio-adapters";
|
|
5
|
+
export declare namespace NoteMidiExport {
|
|
6
|
+
const fromCollection: <E extends NoteEvent>(collection: EventCollection<E>) => MidiTrack;
|
|
7
|
+
const toFile: (collection: NoteEventCollectionBoxAdapter, suggestedName?: string) => Promise<Promises.RejectedResult | Promises.ResolveResult<string>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=NoteMidiExport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoteMidiExport.d.ts","sourceRoot":"","sources":["../../src/project/NoteMidiExport.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAa,SAAS,EAAa,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAA+C,SAAS,EAAC,MAAM,mBAAmB,CAAA;AACzF,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAC,6BAA6B,EAAC,MAAM,0BAA0B,CAAA;AAEtE,yBAAiB,cAAc,CAAC;IACrB,MAAM,cAAc,GAAI,CAAC,SAAS,SAAS,EAAE,YAAY,eAAe,CAAC,CAAC,CAAC,KAAG,SAQpF,CAAA;IAEM,MAAM,MAAM,GAAU,YAAY,6BAA6B,EAAE,gBAAe,MAAoB,sEAS1G,CAAA;CACJ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ArrayMultimap } from "@opendaw/lib-std";
|
|
2
|
+
import { EventSpan, PPQN } from "@opendaw/lib-dsp";
|
|
3
|
+
import { ControlEvent, ControlType, MidiFile, MidiTrack } from "@opendaw/lib-midi";
|
|
4
|
+
import { Promises } from "@opendaw/lib-runtime";
|
|
5
|
+
import { Files } from "@opendaw/lib-dom";
|
|
6
|
+
export var NoteMidiExport;
|
|
7
|
+
(function (NoteMidiExport) {
|
|
8
|
+
NoteMidiExport.fromCollection = (collection) => {
|
|
9
|
+
const events = [];
|
|
10
|
+
const toTicks = (position, timeDivision = 96) => Math.floor(position / PPQN.Quarter * timeDivision);
|
|
11
|
+
for (const event of collection.asArray()) {
|
|
12
|
+
events.push(new ControlEvent(toTicks(event.position), ControlType.NOTE_ON, event.pitch, Math.round(event.velocity * 127)));
|
|
13
|
+
events.push(new ControlEvent(toTicks(EventSpan.complete(event)), ControlType.NOTE_OFF, event.pitch, 0));
|
|
14
|
+
}
|
|
15
|
+
return new MidiTrack(new ArrayMultimap([[0, events]], ControlEvent.Comparator), []);
|
|
16
|
+
};
|
|
17
|
+
NoteMidiExport.toFile = async (collection, suggestedName = "notes.mid") => {
|
|
18
|
+
const encoder = MidiFile.encoder();
|
|
19
|
+
encoder.addTrack(NoteMidiExport.fromCollection(collection.events));
|
|
20
|
+
return Promises.tryCatch(Files.save(encoder.encode().toArrayBuffer(), {
|
|
21
|
+
types: [{
|
|
22
|
+
description: "Midi File",
|
|
23
|
+
accept: { "application/octet-stream": [".mid", ".midi"] }
|
|
24
|
+
}], suggestedName
|
|
25
|
+
}));
|
|
26
|
+
};
|
|
27
|
+
})(NoteMidiExport || (NoteMidiExport = {}));
|
|
@@ -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
|
@@ -168,7 +168,7 @@ export class Project {
|
|
|
168
168
|
};
|
|
169
169
|
worklet.addEventListener("error", handler);
|
|
170
170
|
worklet.addEventListener("processorerror", handler);
|
|
171
|
-
worklet.connect(worklet.context.destination);
|
|
171
|
+
worklet.connect(worklet.context.destination, 0);
|
|
172
172
|
this.engine.setWorklet(worklet);
|
|
173
173
|
return worklet;
|
|
174
174
|
}
|
|
@@ -191,7 +191,6 @@ export class Project {
|
|
|
191
191
|
}
|
|
192
192
|
stopRecording() {
|
|
193
193
|
this.engine.stopRecording();
|
|
194
|
-
this.editing.mark();
|
|
195
194
|
}
|
|
196
195
|
isRecording() { return Recording.isRecording; }
|
|
197
196
|
follow(box) {
|
|
@@ -3,7 +3,7 @@ import { ppqn } from "@opendaw/lib-dsp";
|
|
|
3
3
|
import { Field, PointerField } from "@opendaw/lib-box";
|
|
4
4
|
import { Pointers } from "@opendaw/studio-enums";
|
|
5
5
|
import { AudioClipBox, AudioRegionBox, AudioUnitBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox } from "@opendaw/studio-boxes";
|
|
6
|
-
import { AnyRegionBox, AnyRegionBoxAdapter, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct } from "@opendaw/studio-adapters";
|
|
6
|
+
import { AnyRegionBox, AnyRegionBoxAdapter, AudioClipBoxAdapter, AudioRegionBoxAdapter, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct, NoteEventCollectionBoxAdapter } from "@opendaw/studio-adapters";
|
|
7
7
|
import { Project } from "./Project";
|
|
8
8
|
import { EffectFactory } from "../EffectFactory";
|
|
9
9
|
import { EffectBox } from "../EffectBox";
|
|
@@ -62,6 +62,8 @@ export declare class ProjectApi {
|
|
|
62
62
|
duplicateRegion<R extends AnyRegionBoxAdapter>(region: R, options?: {
|
|
63
63
|
findFreeSpace?: boolean;
|
|
64
64
|
}): Option<R>;
|
|
65
|
+
exportMIDI(collection: NoteEventCollectionBoxAdapter, suggestedName?: string): Promise<import("@opendaw/lib-runtime").Promises.RejectedResult | import("@opendaw/lib-runtime").Promises.ResolveResult<string>>;
|
|
66
|
+
exportAudio(owner: AudioRegionBoxAdapter | AudioClipBoxAdapter, suggestedName?: string): Promise<import("@opendaw/lib-runtime").Promises.RejectedResult | import("@opendaw/lib-runtime").Promises.ResolveResult<string>>;
|
|
65
67
|
quantiseNotes(collection: NoteEventCollectionBox, { positionQuantisation, durationQuantisation }: QuantiseNotesOptions): void;
|
|
66
68
|
createValueClip(trackBox: TrackBox, clipIndex: int, { name, hue }?: ClipRegionOptions): ValueClipBox;
|
|
67
69
|
createNoteRegion({ trackBox, position, duration, loopOffset, loopDuration, eventOffset, eventCollection, mute, name, hue }: NoteRegionParams): NoteRegionBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAGP,KAAK,EACL,GAAG,EAIH,QAAQ,EACR,MAAM,EAIN,YAAY,EAEf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAW,KAAK,EAAc,YAAY,EAAC,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EACH,YAAY,EACZ,cAAc,EACd,YAAY,EAGZ,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,QAAQ,EACR,YAAY,EAGf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EAInB,iBAAiB,EACjB,gCAAgC,EAChC,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import { AudioUnitType } from "@opendaw/studio-enums";
|
|
|
5
5
|
import { AudioUnitBox, CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
|
6
6
|
import { AudioUnitFactory, ColorCodes, ProjectQueries, TrackType } from "@opendaw/studio-adapters";
|
|
7
7
|
import { AudioContentFactory } from "./audio";
|
|
8
|
+
import { NoteMidiExport } from "./NoteMidiExport";
|
|
9
|
+
import { AudioWavExport } from "./AudioWavExport";
|
|
8
10
|
// noinspection JSUnusedGlobalSymbols
|
|
9
11
|
export class ProjectApi {
|
|
10
12
|
#project;
|
|
@@ -140,6 +142,12 @@ export class ProjectApi {
|
|
|
140
142
|
return Option.wrap(duplicate);
|
|
141
143
|
}
|
|
142
144
|
}
|
|
145
|
+
async exportMIDI(collection, suggestedName = "notes.mid") {
|
|
146
|
+
return NoteMidiExport.toFile(collection, suggestedName);
|
|
147
|
+
}
|
|
148
|
+
async exportAudio(owner, suggestedName = "audio.wav") {
|
|
149
|
+
return AudioWavExport.toFile(owner, suggestedName);
|
|
150
|
+
}
|
|
143
151
|
quantiseNotes(collection, { positionQuantisation, durationQuantisation }) {
|
|
144
152
|
if (isAbsent(positionQuantisation) && isAbsent(durationQuantisation)) {
|
|
145
153
|
console.warn("Nothing to quantise: both quantisation parameters are absent");
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CActG,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"}
|
|
@@ -31,6 +31,7 @@ export var ProjectStorage;
|
|
|
31
31
|
.then(array => Option.wrap(array.buffer), () => Option.None);
|
|
32
32
|
};
|
|
33
33
|
ProjectStorage.listUsedAssets = async (type) => {
|
|
34
|
+
console.debug("listUsedAssets", type.name);
|
|
34
35
|
const uuids = [];
|
|
35
36
|
const files = await Workers.Opfs.list(ProjectPaths.Folder);
|
|
36
37
|
for (const { name } of files.filter(file => file.kind === "directory")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioContentModifier.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,
|
|
1
|
+
{"version":3,"file":"AudioContentModifier.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,EAA4D,MAAM,kBAAkB,CAAA;AAS3G,OAAO,EAAC,sBAAsB,EAA8C,MAAM,0BAA0B,CAAA;AAK5G,yBAAiB,oBAAoB,CAAC;IAC3B,MAAM,cAAc,GAAU,UAAU,aAAa,CAAC,sBAAsB,CAAC,KAAG,OAAO,CAAC,IAAI,CAqBlG,CAAA;IAEM,MAAM,cAAc,GAAU,UAAU,aAAa,CAAC,sBAAsB,CAAC,KAAG,OAAO,CAAC,IAAI,CA6BlG,CAAA;IAEM,MAAM,aAAa,GAAU,UAAU,aAAa,CAAC,sBAAsB,CAAC,KAAG,OAAO,CAAC,IAAI,CA+CjG,CAAA;CAoDJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EmptyExec, isDefined, isInstanceOf, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
|
1
|
+
import { EmptyExec, isDefined, isInstanceOf, isNotNull, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { TimeBase } from "@opendaw/lib-dsp";
|
|
3
3
|
import { AudioPitchStretchBox, AudioTimeStretchBox, TransientMarkerBox, WarpMarkerBox } from "@opendaw/studio-boxes";
|
|
4
4
|
import { AudioRegionBoxAdapter } from "@opendaw/studio-adapters";
|
|
@@ -15,6 +15,12 @@ export var AudioContentModifier;
|
|
|
15
15
|
return () => audioAdapters.forEach((adapter) => {
|
|
16
16
|
const audibleDuration = adapter.optWarpMarkers
|
|
17
17
|
.mapOr(warpMarkers => warpMarkers.last()?.seconds ?? 0, 0);
|
|
18
|
+
const loopOffsetSeconds = isInstanceOf(adapter, AudioRegionBoxAdapter)
|
|
19
|
+
? adapter.optWarpMarkers.mapOr(warpMarkers => warpPositionToSeconds(warpMarkers, adapter.loopOffset), 0)
|
|
20
|
+
: 0;
|
|
21
|
+
if (loopOffsetSeconds !== 0) {
|
|
22
|
+
adapter.box.waveformOffset.setValue(adapter.waveformOffset.getValue() + loopOffsetSeconds);
|
|
23
|
+
}
|
|
18
24
|
adapter.box.playMode.defer();
|
|
19
25
|
adapter.asPlayModeTimeStretch.ifSome(({ box }) => {
|
|
20
26
|
if (box.pointerHub.filter(Pointers.AudioPlayMode).length === 0) {
|
|
@@ -57,7 +63,8 @@ export var AudioContentModifier;
|
|
|
57
63
|
}
|
|
58
64
|
}
|
|
59
65
|
else {
|
|
60
|
-
|
|
66
|
+
const { ppqn, seconds } = sampleExtent(adapter);
|
|
67
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, pitchStretch, ppqn, seconds);
|
|
61
68
|
}
|
|
62
69
|
switchTimeBaseToMusical(adapter);
|
|
63
70
|
});
|
|
@@ -101,7 +108,8 @@ export var AudioContentModifier;
|
|
|
101
108
|
}
|
|
102
109
|
}
|
|
103
110
|
else {
|
|
104
|
-
|
|
111
|
+
const { ppqn, seconds } = sampleExtent(adapter);
|
|
112
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, timeStretch, ppqn, seconds);
|
|
105
113
|
}
|
|
106
114
|
if (isDefined(transients) && adapter.file.transients.length() === 0) {
|
|
107
115
|
const markersField = adapter.file.box.transientMarkers;
|
|
@@ -113,6 +121,38 @@ export var AudioContentModifier;
|
|
|
113
121
|
switchTimeBaseToMusical(adapter);
|
|
114
122
|
});
|
|
115
123
|
};
|
|
124
|
+
const warpPositionToSeconds = (warpMarkers, position) => {
|
|
125
|
+
const length = warpMarkers.length();
|
|
126
|
+
if (length === 0) {
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
const first = warpMarkers.first();
|
|
130
|
+
const last = warpMarkers.last();
|
|
131
|
+
if (!isNotNull(first) || !isNotNull(last)) {
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
if (position <= first.position) {
|
|
135
|
+
return first.seconds;
|
|
136
|
+
}
|
|
137
|
+
if (position >= last.position) {
|
|
138
|
+
return last.seconds;
|
|
139
|
+
}
|
|
140
|
+
for (let i = 0; i < length - 1; i++) {
|
|
141
|
+
const left = warpMarkers.optAt(i);
|
|
142
|
+
const right = warpMarkers.optAt(i + 1);
|
|
143
|
+
if (isNotNull(left) && isNotNull(right) && position >= left.position && position < right.position) {
|
|
144
|
+
const alpha = (position - left.position) / (right.position - left.position);
|
|
145
|
+
return left.seconds + alpha * (right.seconds - left.seconds);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return last.seconds;
|
|
149
|
+
};
|
|
150
|
+
const sampleExtent = (adapter) => {
|
|
151
|
+
if (isInstanceOf(adapter, AudioRegionBoxAdapter)) {
|
|
152
|
+
return { ppqn: adapter.loopDuration, seconds: adapter.box.loopDuration.getValue() };
|
|
153
|
+
}
|
|
154
|
+
return { ppqn: adapter.duration, seconds: adapter.box.duration.getValue() };
|
|
155
|
+
};
|
|
116
156
|
const switchTimeBaseToSeconds = ({ box, timeBase }, audibleDuration) => {
|
|
117
157
|
if (timeBase === TimeBase.Seconds) {
|
|
118
158
|
return;
|
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,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,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,10 +1,10 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { BoxGraph } from "@opendaw/lib-box";
|
|
3
|
-
import { isDefined,
|
|
4
|
-
import {
|
|
3
|
+
import { isDefined, UUID } from "@opendaw/lib-std";
|
|
4
|
+
import { ValueEventBox, ValueEventCollectionBox } from "@opendaw/studio-boxes";
|
|
5
5
|
import { migrateValueEventCollection } from "./MigrateValueEventCollection";
|
|
6
6
|
const createTestSetup = () => {
|
|
7
|
-
const boxGraph = new BoxGraph(
|
|
7
|
+
const boxGraph = new BoxGraph();
|
|
8
8
|
boxGraph.beginTransaction();
|
|
9
9
|
const collection = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
10
10
|
boxGraph.endTransaction();
|
|
@@ -2,6 +2,7 @@ import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
|
|
|
2
2
|
import { Sample, SampleMetaData } from "@opendaw/studio-adapters";
|
|
3
3
|
import { SampleAPI } from "@opendaw/studio-core";
|
|
4
4
|
import { AudioData } from "@opendaw/lib-dsp";
|
|
5
|
+
/** @internal */
|
|
5
6
|
export declare class OpenSampleAPI implements SampleAPI {
|
|
6
7
|
static readonly ApiRoot = "https://api.opendaw.studio/samples";
|
|
7
8
|
static readonly FileRoot = "https://assets.opendaw.studio/samples";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAGnD,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,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,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,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAGnD,gBAAgB;AAChB,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,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
|
|
@@ -14,6 +14,7 @@ import { base64Credentials, OpenDAWHeaders } from "../OpenDAWHeaders";
|
|
|
14
14
|
import { z } from "zod";
|
|
15
15
|
import { WavFile } from "@opendaw/lib-dsp";
|
|
16
16
|
// Standard openDAW samples (considered to be non-removable)
|
|
17
|
+
/** @internal */
|
|
17
18
|
export class OpenSampleAPI {
|
|
18
19
|
static ApiRoot = "https://api.opendaw.studio/samples";
|
|
19
20
|
static FileRoot = "https://assets.opendaw.studio/samples";
|
|
@@ -63,7 +63,7 @@ export class SampleService extends AssetService {
|
|
|
63
63
|
console.debug("decoding with web-api-api (fallback)");
|
|
64
64
|
const { status, value: audioBuffer } = await Promises.tryCatch(this.audioContext.decodeAudioData(arrayBuffer));
|
|
65
65
|
if (status === "rejected") {
|
|
66
|
-
return Promise.reject();
|
|
66
|
+
return Promise.reject(new Error("Could not decode audio file"));
|
|
67
67
|
}
|
|
68
68
|
const audioData = AudioData.create(audioBuffer.sampleRate, audioBuffer.length, audioBuffer.numberOfChannels);
|
|
69
69
|
for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {
|
|
@@ -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,4BAA4B,EAAC,MAAM,gCAAgC,CAAA;AAE3E,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAG1C,qBAAa,sBAAuB,YAAW,eAAe;;gBAU9C,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQnE,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;
|
|
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,4BAA4B,EAAC,MAAM,gCAAgC,CAAA;AAE3E,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAG1C,qBAAa,sBAAuB,YAAW,eAAe;;gBAU9C,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQnE,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;CAqDrB"}
|
|
@@ -53,6 +53,9 @@ export class DefaultSoundfontLoader {
|
|
|
53
53
|
else {
|
|
54
54
|
return this.#fetch();
|
|
55
55
|
}
|
|
56
|
+
}).catch(error => {
|
|
57
|
+
console.warn("Failed to load soundfont:", error);
|
|
58
|
+
this.#setState({ type: "error", reason: error instanceof Error ? error.message : String(error) });
|
|
56
59
|
});
|
|
57
60
|
}
|
|
58
61
|
async #fetch() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { Soundfont, SoundfontMetaData } from "@opendaw/studio-adapters";
|
|
3
|
+
/** @internal */
|
|
3
4
|
export declare class OpenSoundfontAPI {
|
|
4
5
|
#private;
|
|
5
6
|
static readonly ApiRoot = "https://api.opendaw.studio/soundfonts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenSoundfontAPI.d.ts","sourceRoot":"","sources":["../../src/soundfont/OpenSoundfontAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAmB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAKrE,qBAAa,gBAAgB;;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,2CAA0C;IACjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA6C;IAGrE,MAAM,CAAC,GAAG,IAAI,gBAAgB;IAU9B,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;IAMzC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;CAyB1G"}
|
|
1
|
+
{"version":3,"file":"OpenSoundfontAPI.d.ts","sourceRoot":"","sources":["../../src/soundfont/OpenSoundfontAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAmB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAKrE,gBAAgB;AAChB,qBAAa,gBAAgB;;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,2CAA0C;IACjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA6C;IAGrE,MAAM,CAAC,GAAG,IAAI,gBAAgB;IAU9B,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;IAMzC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;CAyB1G"}
|
|
@@ -12,6 +12,7 @@ import { Soundfont } from "@opendaw/studio-adapters";
|
|
|
12
12
|
import { OpenDAWHeaders } from "../OpenDAWHeaders";
|
|
13
13
|
import { network, Promises } from "@opendaw/lib-runtime";
|
|
14
14
|
import { z } from "zod";
|
|
15
|
+
/** @internal */
|
|
15
16
|
export class OpenSoundfontAPI {
|
|
16
17
|
static ApiRoot = "https://api.opendaw.studio/soundfonts";
|
|
17
18
|
static FileRoot = "https://assets.opendaw.studio/soundfonts";
|
|
@@ -21,7 +21,7 @@ export class SoundfontService extends AssetService {
|
|
|
21
21
|
]).then(([local, remote]) => {
|
|
22
22
|
this.#local = Option.wrap(Arrays.subtract(local, remote, (a, b) => a.uuid === b.uuid));
|
|
23
23
|
this.#remote = Option.wrap(remote);
|
|
24
|
-
});
|
|
24
|
+
}, error => console.warn("Failed to load soundfont index:", error));
|
|
25
25
|
}
|
|
26
26
|
get local() { return this.#local; }
|
|
27
27
|
get remote() { return this.#remote; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncLogWriter.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAgB,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAEpF,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAE/B,qBAAa,aAAc,YAAW,UAAU;;IAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa;IAW/F,OAAO;IAWP,SAAS,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"SyncLogWriter.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAgB,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAEpF,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAE/B,qBAAa,aAAc,YAAW,UAAU;;IAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa;IAW/F,OAAO;IAWP,SAAS,IAAI,IAAI;CAgCpB"}
|
|
@@ -34,10 +34,11 @@ export class SyncLogWriter {
|
|
|
34
34
|
return boxGraph.subscribeTransaction({
|
|
35
35
|
onBeginTransaction: () => this.#transactionSubscription =
|
|
36
36
|
boxGraph.subscribeToAllUpdatesImmediate({ onUpdate: (update) => updates.push(update) }),
|
|
37
|
-
onEndTransaction: () => {
|
|
37
|
+
onEndTransaction: (rolledBack) => {
|
|
38
38
|
this.#transactionSubscription.terminate();
|
|
39
39
|
this.#transactionSubscription = Terminable.Empty;
|
|
40
|
-
if (updates.length === 0) {
|
|
40
|
+
if (rolledBack || updates.length === 0) {
|
|
41
|
+
updates = [];
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
const ref = updates;
|
|
@@ -40,7 +40,7 @@ export var ClipboardUtils;
|
|
|
40
40
|
const graphData = new Int8Array(graphDataLength);
|
|
41
41
|
input.readBytes(graphData);
|
|
42
42
|
const clipboardGraph = new BoxGraph(Option.wrap(BoxIO.create));
|
|
43
|
-
clipboardGraph.fromArrayBuffer(graphData.buffer);
|
|
43
|
+
clipboardGraph.fromArrayBuffer(graphData.buffer, false);
|
|
44
44
|
const skippedExternalUuids = UUID.newSet(uuid => uuid);
|
|
45
45
|
clipboardGraph.boxes().forEach(box => {
|
|
46
46
|
if (box.resource === "preserved" && targetGraph.findBox(box.address.uuid).nonEmpty()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevicesClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAKP,MAAM,EAEN,QAAQ,EAGX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAM,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAEH,WAAW,EACX,gBAAgB,EAEhB,UAAU,EAGV,iBAAiB,EAGpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAajD,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;QACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;KACjD,CAAA;IAyBM,MAAM,aAAa,GAAI,oEAOG,OAAO,KAAG,gBAAgB,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"DevicesClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAKP,MAAM,EAEN,QAAQ,EAGX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAM,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAEH,WAAW,EACX,gBAAgB,EAEhB,UAAU,EAGV,iBAAiB,EAGpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAajD,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;QACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;KACjD,CAAA;IAyBM,MAAM,aAAa,GAAI,oEAOG,OAAO,KAAG,gBAAgB,CAAC,gBAAgB,CA4N3E,CAAA;CACJ"}
|
|
@@ -71,9 +71,10 @@ export var DevicesClipboard;
|
|
|
71
71
|
.map(pointer => pointer.box);
|
|
72
72
|
const mandatoryDeps = Array.from(boxGraph.dependenciesOf(box, {
|
|
73
73
|
alwaysFollowMandatory: true,
|
|
74
|
+
stopAtResources: true,
|
|
74
75
|
excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
|
|
75
76
|
|| dep.name === RootBox.ClassName
|
|
76
|
-
}).boxes).filter(dep =>
|
|
77
|
+
}).boxes).filter(dep => dep.resource !== "preserved");
|
|
77
78
|
const preserved = [box, ...ownedChildren].flatMap(root => Array.from(boxGraph.dependenciesOf(root, {
|
|
78
79
|
alwaysFollowMandatory: true,
|
|
79
80
|
excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
|
|
@@ -94,6 +95,7 @@ export var DevicesClipboard;
|
|
|
94
95
|
trackContent.push(regionPointer.box);
|
|
95
96
|
const regionDeps = Array.from(boxGraph.dependenciesOf(regionPointer.box, {
|
|
96
97
|
alwaysFollowMandatory: true,
|
|
98
|
+
stopAtResources: true,
|
|
97
99
|
excludeBox: (dep) => dep.ephemeral
|
|
98
100
|
|| isInstanceOf(dep, TrackBox)
|
|
99
101
|
|| DeviceBoxUtils.isDeviceBox(dep)
|
|
@@ -212,7 +214,7 @@ export var DevicesClipboard;
|
|
|
212
214
|
if (pointer.pointerType === Pointers.AudioEffectHost) {
|
|
213
215
|
return Option.wrap(host.audioEffectsField.address);
|
|
214
216
|
}
|
|
215
|
-
if (pointer.pointerType === Pointers.TrackCollection
|
|
217
|
+
if (pointer.pointerType === Pointers.TrackCollection) {
|
|
216
218
|
return Option.wrap(host.audioUnitBoxAdapter().tracksField.address);
|
|
217
219
|
}
|
|
218
220
|
if (pointer.pointerType === Pointers.Automation && replaceInstrument) {
|
|
@@ -227,8 +229,18 @@ export var DevicesClipboard;
|
|
|
227
229
|
}
|
|
228
230
|
return Option.None;
|
|
229
231
|
},
|
|
230
|
-
excludeBox: box =>
|
|
231
|
-
|
|
232
|
+
excludeBox: box => {
|
|
233
|
+
if (replaceInstrument) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
if (DeviceBoxUtils.isInstrumentDeviceBox(box)) {
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
if (isInstanceOf(box, TrackBox)) {
|
|
240
|
+
return metadata.hasInstrument;
|
|
241
|
+
}
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
232
244
|
});
|
|
233
245
|
const deviceBoxes = boxes.filter(box => DeviceBoxUtils.isDeviceBox(box));
|
|
234
246
|
const newMidiEffects = deviceBoxes
|
|
@@ -239,14 +251,12 @@ export var DevicesClipboard;
|
|
|
239
251
|
.sort((a, b) => a.index.getValue() - b.index.getValue());
|
|
240
252
|
newMidiEffects.forEach((box, idx) => box.index.setValue(midiInsertIndex + idx));
|
|
241
253
|
newAudioEffects.forEach((box, idx) => box.index.setValue(audioInsertIndex + idx));
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
allTracks.forEach((track, idx) => track.index.setValue(idx));
|
|
249
|
-
}
|
|
254
|
+
const tracksField = host.audioUnitBoxAdapter().tracksField;
|
|
255
|
+
const allTracks = tracksField.pointerHub.filter(Pointers.TrackCollection)
|
|
256
|
+
.filter(pointer => isInstanceOf(pointer.box, TrackBox))
|
|
257
|
+
.map(pointer => pointer.box)
|
|
258
|
+
.sort((trackA, trackB) => trackA.index.getValue() - trackB.index.getValue());
|
|
259
|
+
allTracks.forEach((track, idx) => track.index.setValue(idx));
|
|
250
260
|
selection.select(...deviceBoxes.map(box => boxAdapters.adapterFor(box, Devices.isAny)));
|
|
251
261
|
});
|
|
252
262
|
}
|