@opendaw/studio-core 0.0.110 → 0.0.112
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 +15 -4
- package/dist/FilePickerAcceptTypes.d.ts +1 -0
- package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
- package/dist/FilePickerAcceptTypes.js +4 -0
- package/dist/processors.js +7 -7
- package/dist/processors.js.map +3 -3
- package/dist/project/ProjectApi.d.ts +3 -3
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +3 -0
- package/dist/project/audio/AudioContentHelpers.d.ts +2 -2
- package/dist/project/audio/AudioContentHelpers.d.ts.map +1 -1
- package/dist/project/audio/AudioContentHelpers.js +1 -1
- package/dist/project/audio/AudioContentModifier.d.ts.map +1 -1
- package/dist/project/audio/AudioContentModifier.js +8 -7
- package/dist/samples/SampleService.d.ts +1 -0
- package/dist/samples/SampleService.d.ts.map +1 -1
- package/dist/samples/SampleService.js +24 -19
- package/dist/ui/timeline/RegionClipResolver.d.ts.map +1 -1
- package/dist/ui/timeline/RegionClipResolver.js +19 -23
- package/package.json +15 -15
|
@@ -2,8 +2,8 @@ import { Attempt, float, int, Observer, Option, Subscription } from "@opendaw/li
|
|
|
2
2
|
import { ppqn } from "@opendaw/lib-dsp";
|
|
3
3
|
import { Field, PointerField } from "@opendaw/lib-box";
|
|
4
4
|
import { Pointers } from "@opendaw/studio-enums";
|
|
5
|
-
import { AudioClipBox, AudioRegionBox, AudioUnitBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox
|
|
6
|
-
import { AnyRegionBoxAdapter, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct } from "@opendaw/studio-adapters";
|
|
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";
|
|
7
7
|
import { Project } from "./Project";
|
|
8
8
|
import { EffectFactory } from "../EffectFactory";
|
|
9
9
|
import { EffectBox } from "../EffectBox";
|
|
@@ -65,7 +65,7 @@ export declare class ProjectApi {
|
|
|
65
65
|
quantiseNotes(collection: NoteEventCollectionBox, { positionQuantisation, durationQuantisation }: QuantiseNotesOptions): void;
|
|
66
66
|
createValueClip(trackBox: TrackBox, clipIndex: int, { name, hue }?: ClipRegionOptions): ValueClipBox;
|
|
67
67
|
createNoteRegion({ trackBox, position, duration, loopOffset, loopDuration, eventOffset, eventCollection, mute, name, hue }: NoteRegionParams): NoteRegionBox;
|
|
68
|
-
createTrackRegion(trackBox: TrackBox, position: ppqn, duration: ppqn, { name, hue }?: ClipRegionOptions): Option<
|
|
68
|
+
createTrackRegion(trackBox: TrackBox, position: ppqn, duration: ppqn, { name, hue }?: ClipRegionOptions): Option<AnyRegionBox>;
|
|
69
69
|
createNoteEvent({ owner, position, duration, velocity, pitch, chance, cent }: NoteEventParams): NoteEventBox;
|
|
70
70
|
deleteAudioUnit(audioUnitBox: AudioUnitBox): void;
|
|
71
71
|
}
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -196,6 +196,9 @@ export class ProjectApi {
|
|
|
196
196
|
});
|
|
197
197
|
}
|
|
198
198
|
createTrackRegion(trackBox, position, duration, { name, hue } = {}) {
|
|
199
|
+
if (duration <= 0.0) {
|
|
200
|
+
return Option.None;
|
|
201
|
+
}
|
|
199
202
|
const { boxGraph } = this.#project;
|
|
200
203
|
const type = trackBox.type.getValue();
|
|
201
204
|
switch (type) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BoxGraph } from "@opendaw/lib-box";
|
|
2
2
|
import { AudioPitchStretchBox, AudioTimeStretchBox } from "@opendaw/studio-boxes";
|
|
3
|
-
import { ppqn } from "@opendaw/lib-dsp";
|
|
3
|
+
import { ppqn, seconds } from "@opendaw/lib-dsp";
|
|
4
4
|
import { WarpMarkerTemplate } from "./WarpMarkerTemplate";
|
|
5
5
|
export declare namespace AudioContentHelpers {
|
|
6
|
-
const addDefaultWarpMarkers: (boxGraph: BoxGraph, playMode: AudioPitchStretchBox | AudioTimeStretchBox, durationInPPQN: ppqn, durationInSeconds:
|
|
6
|
+
const addDefaultWarpMarkers: (boxGraph: BoxGraph, playMode: AudioPitchStretchBox | AudioTimeStretchBox, durationInPPQN: ppqn, durationInSeconds: seconds) => void;
|
|
7
7
|
const addWarpMarkers: (boxGraph: BoxGraph, playMode: AudioPitchStretchBox | AudioTimeStretchBox, templates: ReadonlyArray<WarpMarkerTemplate>) => void;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=AudioContentHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioContentHelpers.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,oBAAoB,EAAE,mBAAmB,EAAgB,MAAM,uBAAuB,CAAA;AAC9F,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"AudioContentHelpers.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,oBAAoB,EAAE,mBAAmB,EAAgB,MAAM,uBAAuB,CAAA;AAC9F,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAEvD,yBAAiB,mBAAmB,CAAC;IAC1B,MAAM,qBAAqB,GAAI,UAAU,QAAQ,EAClB,UAAU,oBAAoB,GAAG,mBAAmB,EACpD,gBAAgB,IAAI,EACpB,mBAAmB,OAAO,SAW/D,CAAA;IAEM,MAAM,cAAc,GAAI,UAAU,QAAQ,EAClB,UAAU,oBAAoB,GAAG,mBAAmB,EACpD,WAAW,aAAa,CAAC,kBAAkB,CAAC,SAM1E,CAAA;CACJ"}
|
|
@@ -6,7 +6,7 @@ export var AudioContentHelpers;
|
|
|
6
6
|
WarpMarkerBox.create(boxGraph, UUID.generate(), box => {
|
|
7
7
|
box.owner.refer(playMode.warpMarkers);
|
|
8
8
|
box.position.setValue(0);
|
|
9
|
-
box.seconds.setValue(0);
|
|
9
|
+
box.seconds.setValue(0.0);
|
|
10
10
|
});
|
|
11
11
|
WarpMarkerBox.create(boxGraph, UUID.generate(), box => {
|
|
12
12
|
box.owner.refer(playMode.warpMarkers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioContentModifier.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,EAAiD,MAAM,kBAAkB,CAAA;AAShG,OAAO,EAAC,sBAAsB,EAAwB,MAAM,0BAA0B,CAAA;AAKtF,yBAAiB,oBAAoB,CAAC;IAC3B,MAAM,cAAc,GAAU,UAAU,aAAa,CAAC,sBAAsB,CAAC,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"AudioContentModifier.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,EAAiD,MAAM,kBAAkB,CAAA;AAShG,OAAO,EAAC,sBAAsB,EAAwB,MAAM,0BAA0B,CAAA;AAKtF,yBAAiB,oBAAoB,CAAC;IAC3B,MAAM,cAAc,GAAU,UAAU,aAAa,CAAC,sBAAsB,CAAC,KAAG,OAAO,CAAC,IAAI,CAelG,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;CA0BJ"}
|
|
@@ -13,6 +13,8 @@ export var AudioContentModifier;
|
|
|
13
13
|
return EmptyExec;
|
|
14
14
|
}
|
|
15
15
|
return () => audioAdapters.forEach((adapter) => {
|
|
16
|
+
const audibleDuration = adapter.optWarpMarkers
|
|
17
|
+
.mapOr(warpMarkers => warpMarkers.last()?.seconds ?? 0, 0);
|
|
16
18
|
adapter.box.playMode.defer();
|
|
17
19
|
adapter.asPlayModeTimeStretch.ifSome(({ box }) => {
|
|
18
20
|
if (box.pointerHub.filter(Pointers.AudioPlayMode).length === 0) {
|
|
@@ -24,7 +26,7 @@ export var AudioContentModifier;
|
|
|
24
26
|
box.delete();
|
|
25
27
|
}
|
|
26
28
|
});
|
|
27
|
-
switchTimeBaseToSeconds(adapter);
|
|
29
|
+
switchTimeBaseToSeconds(adapter, audibleDuration);
|
|
28
30
|
});
|
|
29
31
|
};
|
|
30
32
|
AudioContentModifier.toPitchStretch = async (adapters) => {
|
|
@@ -55,7 +57,7 @@ export var AudioContentModifier;
|
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
else {
|
|
58
|
-
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, pitchStretch, adapter.duration, adapter.
|
|
60
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, pitchStretch, adapter.duration, adapter.box.duration.getValue());
|
|
59
61
|
}
|
|
60
62
|
switchTimeBaseToMusical(adapter);
|
|
61
63
|
});
|
|
@@ -99,7 +101,7 @@ export var AudioContentModifier;
|
|
|
99
101
|
}
|
|
100
102
|
}
|
|
101
103
|
else {
|
|
102
|
-
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, timeStretch, adapter.duration, adapter.
|
|
104
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, timeStretch, adapter.duration, adapter.box.duration.getValue());
|
|
103
105
|
}
|
|
104
106
|
if (isDefined(transients) && adapter.file.transients.length() === 0) {
|
|
105
107
|
const markersField = adapter.file.box.transientMarkers;
|
|
@@ -111,17 +113,16 @@ export var AudioContentModifier;
|
|
|
111
113
|
switchTimeBaseToMusical(adapter);
|
|
112
114
|
});
|
|
113
115
|
};
|
|
114
|
-
const switchTimeBaseToSeconds = ({ box,
|
|
116
|
+
const switchTimeBaseToSeconds = ({ box, timeBase }, audibleDuration) => {
|
|
115
117
|
if (timeBase === TimeBase.Seconds) {
|
|
116
118
|
return;
|
|
117
119
|
}
|
|
118
|
-
// Reset to 100% playback speed (original file speed)
|
|
119
120
|
box.timeBase.setValue(TimeBase.Seconds);
|
|
120
|
-
box.duration.setValue(
|
|
121
|
+
box.duration.setValue(audibleDuration);
|
|
121
122
|
box.accept({
|
|
122
123
|
visitAudioRegionBox: (box) => {
|
|
123
124
|
box.loopOffset.setValue(0);
|
|
124
|
-
box.loopDuration.setValue(
|
|
125
|
+
box.loopDuration.setValue(audibleDuration);
|
|
125
126
|
}
|
|
126
127
|
});
|
|
127
128
|
};
|
|
@@ -3,6 +3,7 @@ import { Box } from "@opendaw/lib-box";
|
|
|
3
3
|
import { Sample } from "@opendaw/studio-adapters";
|
|
4
4
|
import { AssetService } from "../AssetService";
|
|
5
5
|
export declare class SampleService extends AssetService<Sample> {
|
|
6
|
+
#private;
|
|
6
7
|
readonly audioContext: AudioContext;
|
|
7
8
|
protected readonly namePlural: string;
|
|
8
9
|
protected readonly nameSingular: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SampleService.d.ts","sourceRoot":"","sources":["../../src/samples/SampleService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAe,SAAS,
|
|
1
|
+
{"version":3,"file":"SampleService.d.ts","sourceRoot":"","sources":["../../src/samples/SampleService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAe,SAAS,EAA2B,MAAM,kBAAkB,CAAA;AAChG,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAKpC,OAAO,EAAC,MAAM,EAAiB,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAO5C,qBAAa,aAAc,SAAQ,YAAY,CAAC,MAAM,CAAC;;IAMvC,QAAQ,CAAC,YAAY,EAAE,YAAY;IAL/C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAY;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAW;IAClD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAe;IACrD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAiC;gBAEnE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC;IAItE,UAAU,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,eAAgC,EAAC,EACzD,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;cAyB5C,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;CAkBpE"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Arrays, isUndefined, Progress, UUID } from "@opendaw/lib-std";
|
|
1
|
+
import { Arrays, isUndefined, Progress, tryCatch, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { AudioData, estimateBpm } from "@opendaw/lib-dsp";
|
|
3
3
|
import { Promises } from "@opendaw/lib-runtime";
|
|
4
4
|
import { SamplePeaks } from "@opendaw/lib-fusion";
|
|
5
5
|
import { AudioFileBox } from "@opendaw/studio-boxes";
|
|
6
6
|
import { AssetService } from "../AssetService";
|
|
7
7
|
import { FilePickerAcceptTypes } from "../FilePickerAcceptTypes";
|
|
8
|
+
import { WavFile } from "../WavFile";
|
|
8
9
|
import { Workers } from "../Workers";
|
|
9
10
|
import { SampleStorage } from "./SampleStorage";
|
|
10
11
|
import { OpenSampleAPI } from "./OpenSampleAPI";
|
|
@@ -20,28 +21,16 @@ export class SampleService extends AssetService {
|
|
|
20
21
|
}
|
|
21
22
|
async importFile({ uuid, name, arrayBuffer, progressHandler = Progress.Empty }) {
|
|
22
23
|
console.debug(`importSample '${name}' (${arrayBuffer.byteLength >> 10}kb)`);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
console.time("decodeAudioData");
|
|
27
|
-
const audioResult = await Promises.tryCatch(this.audioContext.decodeAudioData(arrayBuffer));
|
|
28
|
-
console.timeEnd("decodeAudioData");
|
|
29
|
-
if (audioResult.status === "rejected") {
|
|
30
|
-
return Promise.reject(name);
|
|
31
|
-
}
|
|
32
|
-
const { value: audioBuffer } = audioResult;
|
|
33
|
-
console.debug(`Imported ${audioBuffer.duration.toFixed(1)} seconds`);
|
|
34
|
-
const audioData = AudioData.create(audioBuffer.sampleRate, audioBuffer.length, audioBuffer.numberOfChannels);
|
|
35
|
-
for (let i = 0; i < audioBuffer.numberOfChannels; i++) {
|
|
36
|
-
audioData.frames[i].set(audioBuffer.getChannelData(i));
|
|
37
|
-
}
|
|
24
|
+
uuid ??= await UUID.sha256(arrayBuffer);
|
|
25
|
+
const audioData = await this.#decodeAudio(arrayBuffer);
|
|
26
|
+
const duration = audioData.numberOfFrames / audioData.sampleRate;
|
|
38
27
|
const shifts = SamplePeaks.findBestFit(audioData.numberOfFrames);
|
|
39
28
|
const peaks = await Workers.Peak.generateAsync(progressHandler, shifts, audioData.frames, audioData.numberOfFrames, audioData.numberOfChannels);
|
|
40
29
|
const meta = {
|
|
41
|
-
bpm: estimateBpm(
|
|
30
|
+
bpm: estimateBpm(duration),
|
|
42
31
|
name: isUndefined(name) ? "Unnnamed" : name,
|
|
43
|
-
duration
|
|
44
|
-
sample_rate:
|
|
32
|
+
duration,
|
|
33
|
+
sample_rate: audioData.sampleRate,
|
|
45
34
|
origin: "import"
|
|
46
35
|
};
|
|
47
36
|
await SampleStorage.get().save({ uuid, audio: audioData, peaks, meta });
|
|
@@ -54,4 +43,20 @@ export class SampleService extends AssetService {
|
|
|
54
43
|
const local = await SampleStorage.get().list();
|
|
55
44
|
return Arrays.merge(stock, local, (sample, { uuid }) => sample.uuid === uuid);
|
|
56
45
|
}
|
|
46
|
+
async #decodeAudio(arrayBuffer) {
|
|
47
|
+
const wavResult = tryCatch(() => WavFile.decodeFloats(arrayBuffer));
|
|
48
|
+
if (wavResult.status === "success") {
|
|
49
|
+
return wavResult.value;
|
|
50
|
+
}
|
|
51
|
+
console.debug("decoding with web-api-api (fallback)");
|
|
52
|
+
const { status, value: audioBuffer } = await Promises.tryCatch(this.audioContext.decodeAudioData(arrayBuffer));
|
|
53
|
+
if (status === "rejected") {
|
|
54
|
+
return Promise.reject();
|
|
55
|
+
}
|
|
56
|
+
const audioData = AudioData.create(audioBuffer.sampleRate, audioBuffer.length, audioBuffer.numberOfChannels);
|
|
57
|
+
for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {
|
|
58
|
+
audioData.frames[channel].set(audioBuffer.getChannelData(channel));
|
|
59
|
+
}
|
|
60
|
+
return audioData;
|
|
61
|
+
}
|
|
57
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionClipResolver.d.ts","sourceRoot":"","sources":["../../../src/ui/timeline/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;AAC/D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAE7C,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,MAAM,WAAW,IAAK,SAAQ,KAAK;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAC;AAOpD,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;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,aAAa,EAAE,aAAa,CAAA;KAAE;IAoB9F,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;
|
|
1
|
+
{"version":3,"file":"RegionClipResolver.d.ts","sourceRoot":"","sources":["../../../src/ui/timeline/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;AAC/D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAE7C,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,MAAM,WAAW,IAAK,SAAQ,KAAK;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAC;AAOpD,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;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,aAAa,EAAE,aAAa,CAAA;KAAE;IAoB9F,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;IA0BlD,MAAM,CAAC,oBAAoB,CAAC,cAAc,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAC7C,WAAW,EAAE,IAAI,EACjB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAC1B,UAAU,EAAE,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC;IA2BzE,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC;gBA+B5D,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;CA+ErD"}
|
|
@@ -41,30 +41,26 @@ export class RegionClipResolver {
|
|
|
41
41
|
if (array.length === 0) {
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
let prev = array[0];
|
|
45
|
+
assert(prev.duration > 0, `duration(${prev.duration}) must be positive`);
|
|
46
|
+
for (let i = 1; i < array.length; i++) {
|
|
47
|
+
const next = array[i];
|
|
48
|
+
assert(next.duration > 0, `duration(${next.duration}) must be positive`);
|
|
49
|
+
if (!allowOverlap(prev) && prev.complete > next.position) {
|
|
50
|
+
console.error("[validateTrack] OVERLAP", JSON.stringify({
|
|
51
|
+
track: TrackType[track.type],
|
|
52
|
+
regions: array.map(region => ({
|
|
53
|
+
p: region.position,
|
|
54
|
+
d: region.duration,
|
|
55
|
+
c: region.complete,
|
|
56
|
+
sel: region.isSelected,
|
|
57
|
+
type: region.toString()
|
|
58
|
+
})),
|
|
59
|
+
stack: new Error().stack
|
|
60
|
+
}));
|
|
61
|
+
return;
|
|
54
62
|
}
|
|
55
|
-
|
|
56
|
-
catch (error) {
|
|
57
|
-
console.error("[validateTrack] OVERLAP", JSON.stringify({
|
|
58
|
-
track: TrackType[track.type],
|
|
59
|
-
regions: array.map(region => ({
|
|
60
|
-
p: region.position,
|
|
61
|
-
d: region.duration,
|
|
62
|
-
c: region.complete,
|
|
63
|
-
sel: region.isSelected,
|
|
64
|
-
type: region.toString()
|
|
65
|
-
}))
|
|
66
|
-
}));
|
|
67
|
-
throw error;
|
|
63
|
+
prev = next;
|
|
68
64
|
}
|
|
69
65
|
}
|
|
70
66
|
static createTasksFromMasks(regionIterator, maxComplete, masks, showOrigin) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendaw/studio-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.112",
|
|
4
4
|
"license": "LGPL-3.0-or-later",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"test": "vitest run --config vitest.config.ts"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@opendaw/lib-box": "^0.0.
|
|
37
|
-
"@opendaw/lib-dawproject": "^0.0.
|
|
38
|
-
"@opendaw/lib-dom": "^0.0.
|
|
39
|
-
"@opendaw/lib-dsp": "^0.0.
|
|
40
|
-
"@opendaw/lib-fusion": "^0.0.
|
|
41
|
-
"@opendaw/lib-runtime": "^0.0.
|
|
42
|
-
"@opendaw/lib-std": "^0.0.
|
|
36
|
+
"@opendaw/lib-box": "^0.0.75",
|
|
37
|
+
"@opendaw/lib-dawproject": "^0.0.59",
|
|
38
|
+
"@opendaw/lib-dom": "^0.0.75",
|
|
39
|
+
"@opendaw/lib-dsp": "^0.0.73",
|
|
40
|
+
"@opendaw/lib-fusion": "^0.0.80",
|
|
41
|
+
"@opendaw/lib-runtime": "^0.0.71",
|
|
42
|
+
"@opendaw/lib-std": "^0.0.70",
|
|
43
43
|
"@opendaw/nam-wasm": "^1.0.3",
|
|
44
|
-
"@opendaw/studio-adapters": "^0.0.
|
|
45
|
-
"@opendaw/studio-boxes": "^0.0.
|
|
46
|
-
"@opendaw/studio-enums": "^0.0.
|
|
44
|
+
"@opendaw/studio-adapters": "^0.0.90",
|
|
45
|
+
"@opendaw/studio-boxes": "^0.0.77",
|
|
46
|
+
"@opendaw/studio-enums": "^0.0.65",
|
|
47
47
|
"dropbox": "^10.34.0",
|
|
48
48
|
"y-websocket": "^1.4.5",
|
|
49
49
|
"yjs": "^13.6.27",
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
"@ffmpeg/ffmpeg": "^0.12.15",
|
|
58
58
|
"@ffmpeg/util": "^0.12.2",
|
|
59
59
|
"@opendaw/eslint-config": "^0.0.27",
|
|
60
|
-
"@opendaw/studio-core-processors": "^0.0.
|
|
61
|
-
"@opendaw/studio-core-workers": "^0.0.
|
|
62
|
-
"@opendaw/studio-forge-boxes": "^0.0.
|
|
60
|
+
"@opendaw/studio-core-processors": "^0.0.93",
|
|
61
|
+
"@opendaw/studio-core-workers": "^0.0.85",
|
|
62
|
+
"@opendaw/studio-forge-boxes": "^0.0.77",
|
|
63
63
|
"@opendaw/typescript-config": "^0.0.29"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "731fdb7389fd85b216ec7d7d343baa92cc9eeeee"
|
|
66
66
|
}
|