@opendaw/studio-adapters 0.0.69 → 0.0.71
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/AutomatableParameterFieldAdapter.d.ts.map +1 -1
- package/dist/AutomatableParameterFieldAdapter.js +5 -3
- package/dist/BoxAdapters.d.ts.map +1 -1
- package/dist/BoxAdapters.js +2 -0
- package/dist/BoxAdaptersContext.d.ts +1 -2
- package/dist/BoxAdaptersContext.d.ts.map +1 -1
- package/dist/ClipSequencing.d.ts +1 -1
- package/dist/ClipSequencing.d.ts.map +1 -1
- package/dist/DeviceAdapter.d.ts +7 -6
- package/dist/DeviceAdapter.d.ts.map +1 -1
- package/dist/DeviceAdapter.js +1 -1
- package/dist/DeviceBox.d.ts +1 -1
- package/dist/DeviceBox.js +1 -1
- package/dist/EngineStateSchema.d.ts +1 -0
- package/dist/EngineStateSchema.d.ts.map +1 -1
- package/dist/EngineStateSchema.js +1 -0
- package/dist/LabeledAudioOutputsOwner.d.ts +11 -0
- package/dist/LabeledAudioOutputsOwner.d.ts.map +1 -0
- package/dist/LabeledAudioOutputsOwner.js +1 -0
- package/dist/NoteSignal.d.ts +11 -1
- package/dist/NoteSignal.d.ts.map +1 -1
- package/dist/NoteSignal.js +2 -0
- package/dist/RootBoxAdapter.d.ts +3 -1
- package/dist/RootBoxAdapter.d.ts.map +1 -1
- package/dist/RootBoxAdapter.js +10 -1
- package/dist/TempoRange.d.ts +5 -0
- package/dist/TempoRange.d.ts.map +1 -0
- package/dist/TempoRange.js +1 -0
- package/dist/Validator.d.ts +0 -2
- package/dist/Validator.d.ts.map +1 -1
- package/dist/Validator.js +4 -3
- package/dist/VaryingTempoMap.d.ts +18 -0
- package/dist/VaryingTempoMap.d.ts.map +1 -0
- package/dist/VaryingTempoMap.js +105 -0
- package/dist/audio/AudioFileBoxAdapter.js +1 -1
- package/dist/audio-unit/AudioBusBoxAdapter.d.ts +3 -1
- package/dist/audio-unit/AudioBusBoxAdapter.d.ts.map +1 -1
- package/dist/audio-unit/AudioBusBoxAdapter.js +4 -0
- package/dist/audio-unit/AudioUnitBoxAdapter.d.ts +4 -2
- package/dist/audio-unit/AudioUnitBoxAdapter.d.ts.map +1 -1
- package/dist/audio-unit/AudioUnitBoxAdapter.js +16 -2
- package/dist/devices/audio-effects/CompressorDeviceBoxAdapter.d.ts +3 -0
- package/dist/devices/audio-effects/CompressorDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/CompressorDeviceBoxAdapter.js +8 -2
- package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/DattorroReverbDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/DattorroReverbDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/DattorroReverbDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/DelayDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/DelayDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/DelayDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/FoldDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/FoldDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/FoldDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/ModularDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/ModularDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/ModularDeviceBoxAdapter.js +4 -1
- package/dist/devices/audio-effects/RevampDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/RevampDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/RevampDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/TidalDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/TidalDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/TidalDeviceBoxAdapter.js +7 -2
- package/dist/devices/audio-effects/UnknownAudioEffectDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/audio-effects/UnknownAudioEffectDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/audio-effects/UnknownAudioEffectDeviceBoxAdapter.js +4 -0
- package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.js +4 -1
- package/dist/devices/instruments/NanoDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/instruments/NanoDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/NanoDeviceBoxAdapter.js +7 -2
- package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts +5 -2
- package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.js +12 -1
- package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts +3 -1
- package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.js +18 -1
- package/dist/devices/instruments/SoundfontDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/instruments/SoundfontDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/SoundfontDeviceBoxAdapter.js +4 -1
- package/dist/devices/instruments/TapeDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/instruments/TapeDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/TapeDeviceBoxAdapter.js +7 -2
- package/dist/devices/instruments/VaporisateurDeviceBoxAdapter.d.ts +2 -0
- package/dist/devices/instruments/VaporisateurDeviceBoxAdapter.d.ts.map +1 -1
- package/dist/devices/instruments/VaporisateurDeviceBoxAdapter.js +7 -2
- package/dist/devices/midi-effects/ArpeggioDeviceBoxAdapter.d.ts +1 -1
- package/dist/devices/midi-effects/PitchDeviceBoxAdapter.d.ts +1 -1
- package/dist/devices/midi-effects/UnknownMidiEffectDeviceBoxAdapter.d.ts +1 -1
- package/dist/devices/midi-effects/VelocityDeviceBoxAdapter.d.ts +1 -1
- package/dist/devices/midi-effects/ZeitgeistDeviceBoxAdapter.d.ts +1 -1
- package/dist/editing/UserEditing.js +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/preset/PresetDecoder.d.ts.map +1 -1
- package/dist/preset/PresetDecoder.js +20 -9
- package/dist/project/ProjectSkeleton.d.ts.map +1 -1
- package/dist/project/ProjectSkeleton.js +5 -4
- package/dist/project/ProjectUtils.d.ts.map +1 -1
- package/dist/project/ProjectUtils.js +40 -10
- package/dist/selection/FilteredSelection.js +2 -2
- package/dist/selection/VertexSelection.d.ts +2 -1
- package/dist/selection/VertexSelection.d.ts.map +1 -1
- package/dist/selection/VertexSelection.js +1 -1
- package/dist/timeline/RegionBoxAdapter.d.ts +8 -0
- package/dist/timeline/RegionBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/SignatureEventBoxAdapter.d.ts +24 -0
- package/dist/timeline/SignatureEventBoxAdapter.d.ts.map +1 -0
- package/dist/timeline/SignatureEventBoxAdapter.js +42 -0
- package/dist/timeline/SignatureTrackAdapter.d.ts +41 -0
- package/dist/timeline/SignatureTrackAdapter.d.ts.map +1 -0
- package/dist/timeline/SignatureTrackAdapter.js +279 -0
- package/dist/timeline/TimelineBoxAdapter.d.ts +7 -2
- package/dist/timeline/TimelineBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/TimelineBoxAdapter.js +52 -7
- package/dist/timeline/TrackBoxAdapter.d.ts +1 -0
- package/dist/timeline/TrackBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/TrackBoxAdapter.js +1 -0
- package/dist/timeline/clip/AudioClipBoxAdapter.d.ts +1 -2
- package/dist/timeline/clip/AudioClipBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/clip/AudioClipBoxAdapter.js +3 -4
- package/dist/timeline/collection/NoteEventCollectionBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/collection/NoteEventCollectionBoxAdapter.js +10 -8
- package/dist/timeline/collection/ValueEventCollectionBoxAdapter.d.ts +2 -2
- package/dist/timeline/collection/ValueEventCollectionBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/collection/ValueEventCollectionBoxAdapter.js +15 -8
- package/dist/timeline/event/ValueEventBoxAdapter.d.ts +1 -1
- package/dist/timeline/event/ValueEventBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/region/AudioRegionBoxAdapter.d.ts +4 -0
- package/dist/timeline/region/AudioRegionBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/region/AudioRegionBoxAdapter.js +17 -17
- package/dist/timeline/region/NoteRegionBoxAdapter.d.ts +5 -1
- package/dist/timeline/region/NoteRegionBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/region/NoteRegionBoxAdapter.js +4 -0
- package/dist/timeline/region/ValueRegionBoxAdapter.d.ts +4 -0
- package/dist/timeline/region/ValueRegionBoxAdapter.d.ts.map +1 -1
- package/dist/timeline/region/ValueRegionBoxAdapter.js +4 -0
- package/package.json +9 -9
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { asDefined, asInstanceOf, Attempts, ByteArrayInput, isDefined, isInstanceOf, Option, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
|
1
|
+
import { asDefined, asInstanceOf, Attempts, ByteArrayInput, isAbsent, isDefined, isInstanceOf, Option, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { BoxGraph, PointerField } from "@opendaw/lib-box";
|
|
3
3
|
import { AudioUnitType } from "@opendaw/studio-enums";
|
|
4
4
|
import { AudioFileBox, AudioUnitBox, BoxIO, CaptureAudioBox, CaptureMidiBox, SoundfontFileBox, TrackBox } from "@opendaw/studio-boxes";
|
|
@@ -75,9 +75,12 @@ export var PresetDecoder;
|
|
|
75
75
|
sourceBoxGraph.beginTransaction();
|
|
76
76
|
PresetDecoder.decode(arrayBuffer, skeleton);
|
|
77
77
|
sourceBoxGraph.endTransaction();
|
|
78
|
-
const sourceAudioUnitBox =
|
|
78
|
+
const sourceAudioUnitBox = skeleton.mandatoryBoxes.rootBox.audioUnits.pointerHub.incoming()
|
|
79
79
|
.map(({ box }) => asInstanceOf(box, AudioUnitBox))
|
|
80
|
-
.find((box) => box.type.getValue() !== AudioUnitType.Output)
|
|
80
|
+
.find((box) => box.type.getValue() !== AudioUnitType.Output);
|
|
81
|
+
if (isAbsent(sourceAudioUnitBox)) {
|
|
82
|
+
return Attempts.err("Preset contains no valid audio unit. Please send the file to the developers.");
|
|
83
|
+
}
|
|
81
84
|
const sourceCaptureBox = sourceAudioUnitBox.capture.targetVertex.mapOr(({ box }) => box.name, "");
|
|
82
85
|
const targetCaptureBox = targetAudioUnitBox.capture.targetVertex.mapOr(({ box }) => box.name, "");
|
|
83
86
|
if (sourceCaptureBox !== targetCaptureBox) {
|
|
@@ -128,6 +131,15 @@ export var PresetDecoder;
|
|
|
128
131
|
: UUID.generate()
|
|
129
132
|
}))
|
|
130
133
|
]);
|
|
134
|
+
// First, identify which file boxes already exist and should be skipped
|
|
135
|
+
const existingFileBoxUUIDs = UUID.newSet(uuid => uuid);
|
|
136
|
+
dependencies.forEach((source) => {
|
|
137
|
+
if (source instanceof AudioFileBox || source instanceof SoundfontFileBox) {
|
|
138
|
+
if (targetBoxGraph.findBox(source.address.uuid).nonEmpty()) {
|
|
139
|
+
existingFileBoxUUIDs.add(source.address.uuid);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
131
143
|
PointerField.decodeWith({
|
|
132
144
|
map: (_pointer, newAddress) => newAddress.map(address => uuidMap.opt(address.uuid).match({
|
|
133
145
|
none: () => address,
|
|
@@ -136,16 +148,15 @@ export var PresetDecoder;
|
|
|
136
148
|
}, () => {
|
|
137
149
|
dependencies
|
|
138
150
|
.forEach((source) => {
|
|
139
|
-
const input = new ByteArrayInput(source.toArrayBuffer());
|
|
140
|
-
const key = source.name;
|
|
141
|
-
const uuid = uuidMap.get(source.address.uuid).target;
|
|
142
151
|
if (source instanceof AudioFileBox || source instanceof SoundfontFileBox) {
|
|
143
|
-
// Those boxes keep their UUID. So if they are already in the graph,
|
|
144
|
-
if (
|
|
145
|
-
source.read(input);
|
|
152
|
+
// Those boxes keep their UUID. So if they are already in the graph, skip them.
|
|
153
|
+
if (existingFileBoxUUIDs.opt(source.address.uuid).nonEmpty()) {
|
|
146
154
|
return;
|
|
147
155
|
}
|
|
148
156
|
}
|
|
157
|
+
const input = new ByteArrayInput(source.toArrayBuffer());
|
|
158
|
+
const key = source.name;
|
|
159
|
+
const uuid = uuidMap.get(source.address.uuid).target;
|
|
149
160
|
targetBoxGraph.createBox(key, uuid, box => box.read(input));
|
|
150
161
|
});
|
|
151
162
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectSkeleton.d.ts","sourceRoot":"","sources":["../../src/project/ProjectSkeleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAGH,KAAK,
|
|
1
|
+
{"version":3,"file":"ProjectSkeleton.d.ts","sourceRoot":"","sources":["../../src/project/ProjectSkeleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAGH,KAAK,EAQR,MAAM,uBAAuB,CAAA;AAa9B,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAA;AAE7D,MAAM,MAAM,eAAe,GAAG;IAC1B,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,cAAc,EAAE,qBAAqB,CAAA;CACxC,CAAA;AAED,yBAAiB,eAAe,CAAC;IAItB,MAAM,KAAK,GAAI,SAAS;QAC3B,sBAAsB,EAAE,OAAO,CAAC;QAChC,iBAAiB,EAAE,OAAO,CAAA;KAC7B,KAAG,eAuDH,CAAA;IAEM,MAAM,MAAM,GAAI,UAAU,QAAQ,oBAQxC,CAAA;IAEM,MAAM,MAAM,GAAI,aAAa,eAAe,KAAG,eAYrD,CAAA;IAEM,MAAM,kBAAkB,GAAI,UAAU,QAAQ,KAAG,qBAiBvD,CAAA;CACJ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BoxGraph } from "@opendaw/lib-box";
|
|
2
|
-
import { AudioBusBox, AudioUnitBox, BoxIO, CompressorDeviceBox, GrooveShuffleBox, RootBox, TimelineBox, UserInterfaceBox } from "@opendaw/studio-boxes";
|
|
2
|
+
import { AudioBusBox, AudioUnitBox, BoxIO, CompressorDeviceBox, GrooveShuffleBox, RootBox, TimelineBox, UserInterfaceBox, ValueEventCollectionBox } from "@opendaw/studio-boxes";
|
|
3
3
|
import { asInstanceOf, assert, ByteArrayInput, ByteArrayOutput, isDefined, Option, panic, UUID } from "@opendaw/lib-std";
|
|
4
|
-
import { AudioUnitType, IconSymbol } from "@opendaw/studio-enums";
|
|
4
|
+
import { AudioUnitType, Colors, IconSymbol } from "@opendaw/studio-enums";
|
|
5
5
|
export var ProjectSkeleton;
|
|
6
6
|
(function (ProjectSkeleton) {
|
|
7
7
|
const MAGIC_HEADER_OPEN = 0x4F50454E;
|
|
@@ -22,7 +22,7 @@ export var ProjectSkeleton;
|
|
|
22
22
|
box.collection.refer(rootBox.audioBusses);
|
|
23
23
|
box.label.setValue("Output");
|
|
24
24
|
box.icon.setValue(IconSymbol.toName(IconSymbol.SpeakerHeadphone));
|
|
25
|
-
box.color.setValue(
|
|
25
|
+
box.color.setValue(Colors.blue.toString());
|
|
26
26
|
});
|
|
27
27
|
const primaryAudioOutputUnit = AudioUnitBox.create(boxGraph, UUID.generate(), box => {
|
|
28
28
|
box.type.setValue(AudioUnitType.Output);
|
|
@@ -32,7 +32,7 @@ export var ProjectSkeleton;
|
|
|
32
32
|
});
|
|
33
33
|
if (options.createOutputCompressor) {
|
|
34
34
|
CompressorDeviceBox.create(boxGraph, UUID.generate(), box => {
|
|
35
|
-
box.label.setValue("Compressor");
|
|
35
|
+
box.label.setValue("Master Compressor");
|
|
36
36
|
box.index.setValue(0);
|
|
37
37
|
box.host.refer(primaryAudioOutputUnit.audioEffects);
|
|
38
38
|
box.threshold.setValue(0);
|
|
@@ -40,6 +40,7 @@ export var ProjectSkeleton;
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
const timelineBox = TimelineBox.create(boxGraph, UUID.generate());
|
|
43
|
+
ValueEventCollectionBox.create(boxGraph, UUID.generate(), box => timelineBox.tempoTrack.events.refer(box.owners));
|
|
43
44
|
rootBox.timeline.refer(timelineBox.root);
|
|
44
45
|
primaryAudioBus.output.refer(primaryAudioOutputUnit.input);
|
|
45
46
|
const userInterfaceBoxes = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectUtils.d.ts","sourceRoot":"","sources":["../../src/project/ProjectUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAcrC,OAAO,EAEH,YAAY,
|
|
1
|
+
{"version":3,"file":"ProjectUtils.d.ts","sourceRoot":"","sources":["../../src/project/ProjectUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAcrC,OAAO,EAEH,YAAY,EASf,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAC,YAAY,EAAgB,MAAM,WAAW,CAAA;AAGrD,yBAAiB,YAAY,CAAC;IASnB,MAAM,iBAAiB,GAAI,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,4DAAwD,eAAe,EACvE,UAAS;QACL,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,eAAe,CAAC,EAAE,OAAO,CAAC;KACxB,KAClC,aAAa,CAAC,YAAY,CA6B/B,CAAA;IAEM,MAAM,cAAc,GAAI,aAAa,aAAa,CAAC,YAAY,CAAC,EACxC,4DAAwD,eAAe,EACvE,iBAAgB,IAAU,KAAG,IA8C3D,CAAA;CAoGJ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Arrays, asInstanceOf, assert, ByteArrayInput, isInstanceOf, Predicates, SetMultimap, UUID } from "@opendaw/lib-std";
|
|
2
|
-
import { AudioFileBox, AudioUnitBox, AuxSendBox, SelectionBox, SoundfontFileBox, TrackBox } from "@opendaw/studio-boxes";
|
|
2
|
+
import { AudioFileBox, AudioUnitBox, AuxSendBox, SelectionBox, SoundfontFileBox, TrackBox, TransientMarkerBox } from "@opendaw/studio-boxes";
|
|
3
3
|
import { IndexedBox, PointerField } from "@opendaw/lib-box";
|
|
4
4
|
import { UnionBoxTypes } from "../unions";
|
|
5
5
|
import { AudioUnitOrdering } from "../factories/AudioUnitOrdering";
|
|
@@ -15,9 +15,24 @@ export var ProjectUtils;
|
|
|
15
15
|
// TODO Implement include options.
|
|
16
16
|
assert(!options.includeAux && !options.includeBus, "Options are not yet implemented");
|
|
17
17
|
const excludeBox = options?.excludeTimeline === true ? excludeTimelinePredicate : Predicates.alwaysFalse;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
// Get dependencies using outgoing pointers only (no mandatory incoming following)
|
|
19
|
+
// This avoids pulling in boxes from previous copies that point to shared AudioFileBox
|
|
20
|
+
const baseDeps = audioUnitBoxes
|
|
21
|
+
.flatMap(box => Array.from(box.graph.dependenciesOf(box, { alwaysFollowMandatory: false, excludeBox }).boxes));
|
|
22
|
+
// Explicitly add instruments (they have mandatory incoming pointer to AudioUnitBox.input)
|
|
23
|
+
const instruments = audioUnitBoxes
|
|
24
|
+
.flatMap(audioUnitBox => audioUnitBox.input.pointerHub.incoming().map(({ box }) => box));
|
|
25
|
+
// Deduplicate by UUID
|
|
26
|
+
const seen = UUID.newSet(uuid => uuid);
|
|
27
|
+
const dependencies = [...baseDeps, ...instruments]
|
|
28
|
+
.filter(box => box.name !== SelectionBox.ClassName && box.name !== AuxSendBox.ClassName)
|
|
29
|
+
.filter(box => {
|
|
30
|
+
if (seen.opt(box.address.uuid).nonEmpty()) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
seen.add(box.address.uuid);
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
21
36
|
const uuidMap = generateTransferMap(audioUnitBoxes, dependencies, rootBox.audioUnits.address.uuid, primaryAudioBus.address.uuid);
|
|
22
37
|
copy(uuidMap, boxGraph, audioUnitBoxes, dependencies);
|
|
23
38
|
reorderAudioUnits(uuidMap, audioUnitBoxes, rootBox);
|
|
@@ -99,6 +114,15 @@ export var ProjectUtils;
|
|
|
99
114
|
return uuidMap;
|
|
100
115
|
};
|
|
101
116
|
const copy = (uuidMap, boxGraph, audioUnitBoxes, dependencies) => {
|
|
117
|
+
// First, identify which file boxes already exist and should be skipped
|
|
118
|
+
const existingFileBoxUUIDs = UUID.newSet(uuid => uuid);
|
|
119
|
+
dependencies.forEach((source) => {
|
|
120
|
+
if (source instanceof AudioFileBox || source instanceof SoundfontFileBox) {
|
|
121
|
+
if (boxGraph.findBox(source.address.uuid).nonEmpty()) {
|
|
122
|
+
existingFileBoxUUIDs.add(source.address.uuid);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
102
126
|
PointerField.decodeWith({
|
|
103
127
|
map: (_pointer, newAddress) => newAddress.map(address => uuidMap.opt(address.uuid).match({
|
|
104
128
|
none: () => address,
|
|
@@ -114,16 +138,22 @@ export var ProjectUtils;
|
|
|
114
138
|
});
|
|
115
139
|
dependencies
|
|
116
140
|
.forEach((source) => {
|
|
117
|
-
const input = new ByteArrayInput(source.toArrayBuffer());
|
|
118
|
-
const key = source.name;
|
|
119
|
-
const uuid = uuidMap.get(source.address.uuid).target;
|
|
120
141
|
if (source instanceof AudioFileBox || source instanceof SoundfontFileBox) {
|
|
121
|
-
// Those boxes keep their UUID. So if they are already in the graph,
|
|
122
|
-
if (
|
|
123
|
-
|
|
142
|
+
// Those boxes keep their UUID. So if they are already in the graph, skip them.
|
|
143
|
+
if (existingFileBoxUUIDs.opt(source.address.uuid).nonEmpty()) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Skip TransientMarkerBox if its owner AudioFileBox already exists
|
|
148
|
+
if (source instanceof TransientMarkerBox) {
|
|
149
|
+
const ownerUUID = source.owner.targetAddress.unwrap().uuid;
|
|
150
|
+
if (existingFileBoxUUIDs.opt(ownerUUID).nonEmpty()) {
|
|
124
151
|
return;
|
|
125
152
|
}
|
|
126
153
|
}
|
|
154
|
+
const input = new ByteArrayInput(source.toArrayBuffer());
|
|
155
|
+
const key = source.name;
|
|
156
|
+
const uuid = uuidMap.get(source.address.uuid).target;
|
|
127
157
|
boxGraph.createBox(key, uuid, box => box.read(input));
|
|
128
158
|
});
|
|
129
159
|
});
|
|
@@ -23,7 +23,7 @@ export class FilteredSelection {
|
|
|
23
23
|
__classPrivateFieldSet(this, _FilteredSelection_selection, selection, "f");
|
|
24
24
|
__classPrivateFieldSet(this, _FilteredSelection_filter, filter, "f");
|
|
25
25
|
__classPrivateFieldSet(this, _FilteredSelection_mapping, mapping, "f");
|
|
26
|
-
__classPrivateFieldSet(this, _FilteredSelection_set, Address.newSet(
|
|
26
|
+
__classPrivateFieldSet(this, _FilteredSelection_set, Address.newSet(({ address }) => address), "f");
|
|
27
27
|
__classPrivateFieldSet(this, _FilteredSelection_listeners, new Listeners(), "f");
|
|
28
28
|
__classPrivateFieldGet(this, _FilteredSelection_selection, "f").selected()
|
|
29
29
|
.filter(element => __classPrivateFieldGet(this, _FilteredSelection_filter, "f").call(this, element))
|
|
@@ -37,7 +37,7 @@ export class FilteredSelection {
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
onDeselected: (element) => {
|
|
40
|
-
if (__classPrivateFieldGet(this,
|
|
40
|
+
if (__classPrivateFieldGet(this, _FilteredSelection_set, "f").hasKey(element.address)) {
|
|
41
41
|
__classPrivateFieldGet(this, _FilteredSelection_listeners, "f").proxy.onDeselected(__classPrivateFieldGet(this, _FilteredSelection_set, "f").removeByKey(element.address));
|
|
42
42
|
}
|
|
43
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Bijective, int, Predicate, Selection, SelectionListener, Subscription } from "@opendaw/lib-std";
|
|
2
|
-
import { Addressable,
|
|
2
|
+
import { Addressable, BoxEditing, BoxGraph, Field } from "@opendaw/lib-box";
|
|
3
3
|
import { Pointers } from "@opendaw/studio-enums";
|
|
4
4
|
import { SelectableVertex } from "./SelectableVertex";
|
|
5
5
|
import { FilteredSelection } from "./FilteredSelection";
|
|
@@ -20,6 +20,7 @@ export declare class VertexSelection implements Selection<SelectableVertex> {
|
|
|
20
20
|
deselectAll(): void;
|
|
21
21
|
distance(inventory: Iterable<SelectableVertex>): ReadonlyArray<SelectableVertex>;
|
|
22
22
|
isEmpty(): boolean;
|
|
23
|
+
nonEmpty(): boolean;
|
|
23
24
|
count(): int;
|
|
24
25
|
isSelected(selectable: SelectableVertex): boolean;
|
|
25
26
|
selected(): ReadonlyArray<SelectableVertex>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VertexSelection.d.ts","sourceRoot":"","sources":["../../src/selection/VertexSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,SAAS,EACT,GAAG,EAGH,SAAS,EACT,SAAS,EACT,iBAAiB,EAEjB,YAAY,EAGf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAU,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"VertexSelection.d.ts","sourceRoot":"","sources":["../../src/selection/VertexSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,SAAS,EACT,GAAG,EAGH,SAAS,EACT,SAAS,EACT,iBAAiB,EAEjB,YAAY,EAGf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAU,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAe,MAAM,kBAAkB,CAAA;AAChG,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAEnD,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAA;AAErD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS,CAAC,gBAAgB,CAAC;;IAQnD,QAAQ,CAAC,OAAO,EAAE,UAAU;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ;gBAAhD,OAAO,EAAE,UAAU,EAAW,QAAQ,EAAE,QAAQ;IAOrE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI;IAQ/C,OAAO,IAAI,IAAI;IASf,uBAAuB,CAAC,CAAC,SAAS,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,gBAAgB,CAAC,EACtC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAIzG,MAAM,CAAC,GAAG,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAmB7D,QAAQ,CAAC,GAAG,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAU/D,WAAW,IAAI,IAAI;IAInB,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAC,gBAAgB,CAAC;IAQhF,OAAO,IAAI,OAAO;IAClB,QAAQ,IAAI,OAAO;IAEnB,KAAK,IAAI,GAAG;IAEZ,UAAU,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO;IAEjD,QAAQ,IAAI,aAAa,CAAC,gBAAgB,CAAC;IAE3C,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,YAAY;IAEtE,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,YAAY;CA4BnF"}
|
|
@@ -51,7 +51,6 @@ export class VertexSelection {
|
|
|
51
51
|
__classPrivateFieldGet(this, _VertexSelection_selectableMap, "f").clear();
|
|
52
52
|
__classPrivateFieldGet(this, _VertexSelection_entityMap, "f").clear();
|
|
53
53
|
}
|
|
54
|
-
// TODO Make selection local
|
|
55
54
|
createFilteredSelection(affiliate, map) {
|
|
56
55
|
return new FilteredSelection(this, affiliate, map);
|
|
57
56
|
}
|
|
@@ -99,6 +98,7 @@ export class VertexSelection {
|
|
|
99
98
|
return excludes;
|
|
100
99
|
}
|
|
101
100
|
isEmpty() { return __classPrivateFieldGet(this, _VertexSelection_selectableMap, "f").size() === 0; }
|
|
101
|
+
nonEmpty() { return __classPrivateFieldGet(this, _VertexSelection_selectableMap, "f").size() > 0; }
|
|
102
102
|
count() { return __classPrivateFieldGet(this, _VertexSelection_selectableMap, "f").size(); }
|
|
103
103
|
isSelected(selectable) { return __classPrivateFieldGet(this, _VertexSelection_selectableMap, "f").hasKey(selectable.address); }
|
|
104
104
|
selected() { return __classPrivateFieldGet(this, _VertexSelection_selectableMap, "f").values().map(entry => entry.selectable); }
|
|
@@ -27,6 +27,10 @@ export interface RegionBoxAdapter<CONTENT> extends BoxAdapter, Region, Selectabl
|
|
|
27
27
|
get trackBoxAdapter(): Option<TrackBoxAdapter>;
|
|
28
28
|
get hasCollection(): boolean;
|
|
29
29
|
get optCollection(): Option<CONTENT>;
|
|
30
|
+
/** Resolve duration at a given position (for preview during drag operations) */
|
|
31
|
+
resolveDuration(position: ppqn): ppqn;
|
|
32
|
+
/** Resolve complete (position + duration) at a given position (for preview during drag operations) */
|
|
33
|
+
resolveComplete(position: ppqn): ppqn;
|
|
30
34
|
subscribeChange(observer: Observer<void>): Subscription;
|
|
31
35
|
copyTo(target?: {
|
|
32
36
|
track?: Field<Pointers.RegionCollection>;
|
|
@@ -41,6 +45,10 @@ export interface LoopableRegionBoxAdapter<CONTENT> extends RegionBoxAdapter<CONT
|
|
|
41
45
|
get offset(): ppqn;
|
|
42
46
|
get loopOffset(): ppqn;
|
|
43
47
|
get loopDuration(): ppqn;
|
|
48
|
+
/** Resolve loopOffset at a given position (for preview during drag operations) */
|
|
49
|
+
resolveLoopOffset(position: ppqn): ppqn;
|
|
50
|
+
/** Resolve loopDuration at a given position (for preview during drag operations) */
|
|
51
|
+
resolveLoopDuration(position: ppqn): ppqn;
|
|
44
52
|
}
|
|
45
53
|
export declare const RegionComparator: Comparator<AnyRegionBoxAdapter>;
|
|
46
54
|
export declare const RegionAdapters: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/timeline/RegionBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAC,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAY,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,kBAAkB,CAAA;AAE9G,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAE,KAAK,EAAC,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAC,oBAAoB,EAAC,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAC,YAAY,EAAC,MAAM,WAAW,CAAA;AACtC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AACxC,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAA;AAE1C,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACtC,yBAAyB,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,CAAC,CAAA;IAC5D,0BAA0B,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,CAAC,CAAA;IAC9D,0BAA0B,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,CAAC,CAAA;CACjE;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO,CAAE,SAAQ,UAAU,EAAE,MAAM,EAAE,UAAU;IAC7E,IAAI,GAAG,IAAI,YAAY,CAAA;IACvB,IAAI,UAAU,IAAI,OAAO,CAAA;IACzB,IAAI,GAAG,IAAI,GAAG,CAAA;IACd,IAAI,IAAI,IAAI,OAAO,CAAA;IACnB,IAAI,KAAK,IAAI,MAAM,CAAA;IACnB,IAAI,UAAU,IAAI,OAAO,CAAA;IACzB,IAAI,SAAS,IAAI,OAAO,CAAA;IACxB,IAAI,SAAS,IAAI,OAAO,CAAA;IACxB,IAAI,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,CAAA;IAC9C,IAAI,aAAa,IAAI,OAAO,CAAA;IAC5B,IAAI,aAAa,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IAEpC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAA;IACvD,MAAM,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,mBAAmB,CAAA;IACnG,WAAW,IAAI,IAAI,CAAA;IACnB,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAA;IAChE,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAA;IACtE,MAAM,CAAC,OAAO,SAAS,uBAAuB,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,GAC/D,OAAO,SAAS,uBAAuB,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAC3E;AAED,MAAM,WAAW,wBAAwB,CAAC,OAAO,CAAE,SAAQ,gBAAgB,CAAC,OAAO,CAAC,EAAE,cAAc;IAChG,IAAI,MAAM,IAAI,IAAI,CAAA;IAClB,IAAI,UAAU,IAAI,IAAI,CAAA;IACtB,IAAI,YAAY,IAAI,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"RegionBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/timeline/RegionBoxAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Comparator, int, Option, UUID } from "@opendaw/lib-std";
|
|
2
|
+
import { Address, Int32Field } from "@opendaw/lib-box";
|
|
3
|
+
import { SignatureEventBox } from "@opendaw/studio-boxes";
|
|
4
|
+
import { BoxAdaptersContext } from "../BoxAdaptersContext";
|
|
5
|
+
import { SignatureTrackAdapter } from "./SignatureTrackAdapter";
|
|
6
|
+
import { IndexedBoxAdapter } from "../IndexedBoxAdapterCollection";
|
|
7
|
+
export declare class SignatureEventBoxAdapter implements IndexedBoxAdapter {
|
|
8
|
+
#private;
|
|
9
|
+
static readonly Comparator: Comparator<SignatureEventBoxAdapter>;
|
|
10
|
+
readonly type = "signature-event";
|
|
11
|
+
constructor(context: BoxAdaptersContext, box: SignatureEventBox);
|
|
12
|
+
get box(): SignatureEventBox;
|
|
13
|
+
get uuid(): UUID.Bytes;
|
|
14
|
+
get address(): Address;
|
|
15
|
+
get index(): int;
|
|
16
|
+
get indexField(): Int32Field;
|
|
17
|
+
get relativePosition(): int;
|
|
18
|
+
get nominator(): int;
|
|
19
|
+
get denominator(): int;
|
|
20
|
+
get trackAdapter(): Option<SignatureTrackAdapter>;
|
|
21
|
+
terminate(): void;
|
|
22
|
+
toString(): string;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=SignatureEventBoxAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignatureEventBoxAdapter.d.ts","sourceRoot":"","sources":["../../src/timeline/SignatureEventBoxAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAC,OAAO,EAAE,UAAU,EAAsB,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAA;AAE7D,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAA;AAEhE,qBAAa,wBAAyB,YAAW,iBAAiB;;IAC9D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,wBAAwB,CAAC,CAA8B;IAE9F,QAAQ,CAAC,IAAI,qBAAoB;gBAOrB,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,iBAAiB;IAQ/D,IAAI,GAAG,IAAI,iBAAiB,CAAmB;IAC/C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAgC;IACtD,IAAI,OAAO,IAAI,OAAO,CAA2B;IACjD,IAAI,KAAK,IAAI,GAAG,CAAoC;IACpD,IAAI,UAAU,IAAI,UAAU,CAAyB;IACrD,IAAI,gBAAgB,IAAI,GAAG,CAA+C;IAC1E,IAAI,SAAS,IAAI,GAAG,CAAwC;IAC5D,IAAI,WAAW,IAAI,GAAG,CAA0C;IAChE,IAAI,YAAY,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAGhD;IAED,SAAS;IACT,QAAQ,IAAI,MAAM;CACrB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _SignatureEventBoxAdapter_terminator, _SignatureEventBoxAdapter_context, _SignatureEventBoxAdapter_box;
|
|
13
|
+
import { Terminator } from "@opendaw/lib-std";
|
|
14
|
+
import { Propagation } from "@opendaw/lib-box";
|
|
15
|
+
import { TimelineBoxAdapter } from "./TimelineBoxAdapter";
|
|
16
|
+
export class SignatureEventBoxAdapter {
|
|
17
|
+
constructor(context, box) {
|
|
18
|
+
this.type = "signature-event";
|
|
19
|
+
_SignatureEventBoxAdapter_terminator.set(this, new Terminator());
|
|
20
|
+
_SignatureEventBoxAdapter_context.set(this, void 0);
|
|
21
|
+
_SignatureEventBoxAdapter_box.set(this, void 0);
|
|
22
|
+
__classPrivateFieldSet(this, _SignatureEventBoxAdapter_context, context, "f");
|
|
23
|
+
__classPrivateFieldSet(this, _SignatureEventBoxAdapter_box, box, "f");
|
|
24
|
+
__classPrivateFieldGet(this, _SignatureEventBoxAdapter_terminator, "f").own(__classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").subscribe(Propagation.Children, (_update) => this.trackAdapter.ifSome(adapter => adapter.dispatchChange())));
|
|
25
|
+
}
|
|
26
|
+
get box() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f"); }
|
|
27
|
+
get uuid() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").address.uuid; }
|
|
28
|
+
get address() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").address; }
|
|
29
|
+
get index() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").index.getValue(); }
|
|
30
|
+
get indexField() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").index; }
|
|
31
|
+
get relativePosition() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").relativePosition.getValue(); }
|
|
32
|
+
get nominator() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").nominator.getValue(); }
|
|
33
|
+
get denominator() { return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").denominator.getValue(); }
|
|
34
|
+
get trackAdapter() {
|
|
35
|
+
return __classPrivateFieldGet(this, _SignatureEventBoxAdapter_box, "f").events.targetVertex
|
|
36
|
+
.map(vertex => __classPrivateFieldGet(this, _SignatureEventBoxAdapter_context, "f").boxAdapters.adapterFor(vertex.box, TimelineBoxAdapter).signatureTrack);
|
|
37
|
+
}
|
|
38
|
+
terminate() { __classPrivateFieldGet(this, _SignatureEventBoxAdapter_terminator, "f").terminate(); }
|
|
39
|
+
toString() { return `{SignatureEventBoxAdapter ${this.nominator}/${this.denominator}}`; }
|
|
40
|
+
}
|
|
41
|
+
_SignatureEventBoxAdapter_terminator = new WeakMap(), _SignatureEventBoxAdapter_context = new WeakMap(), _SignatureEventBoxAdapter_box = new WeakMap();
|
|
42
|
+
SignatureEventBoxAdapter.Comparator = (a, b) => a.index - b.index;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { int, Notifier, Observer, Option, Subscription, Terminable } from "@opendaw/lib-std";
|
|
2
|
+
import { BoxAdaptersContext } from "../BoxAdaptersContext";
|
|
3
|
+
import { ppqn } from "@opendaw/lib-dsp";
|
|
4
|
+
import { SignatureEventBoxAdapter } from "./SignatureEventBoxAdapter";
|
|
5
|
+
import { Signature, SignatureTrack, TimelineBox } from "@opendaw/studio-boxes";
|
|
6
|
+
export type SignatureEvent = Readonly<{
|
|
7
|
+
index: int;
|
|
8
|
+
accumulatedPpqn: ppqn;
|
|
9
|
+
accumulatedBars: int;
|
|
10
|
+
nominator: int;
|
|
11
|
+
denominator: int;
|
|
12
|
+
}>;
|
|
13
|
+
export declare class SignatureTrackAdapter implements Terminable {
|
|
14
|
+
#private;
|
|
15
|
+
readonly changeNotifier: Notifier<void>;
|
|
16
|
+
constructor(context: BoxAdaptersContext, signature: Signature, signatureTrack: SignatureTrack);
|
|
17
|
+
subscribe(observer: Observer<void>): Subscription;
|
|
18
|
+
get context(): BoxAdaptersContext;
|
|
19
|
+
get enabled(): boolean;
|
|
20
|
+
get object(): TimelineBox["signatureTrack"];
|
|
21
|
+
get size(): int;
|
|
22
|
+
get storageSignature(): Readonly<[int, int]>;
|
|
23
|
+
dispatchChange(): void;
|
|
24
|
+
signatureAt(position: ppqn): Readonly<[int, int]>;
|
|
25
|
+
iterateAll(): IterableIterator<SignatureEvent>;
|
|
26
|
+
changeSignature(nominator: int, denominator: int): void;
|
|
27
|
+
deleteAdapter(adapter: SignatureEventBoxAdapter): void;
|
|
28
|
+
createEvent(position: ppqn, nominator: int, denominator: int): void;
|
|
29
|
+
adapterAt(index: int): Option<SignatureEventBoxAdapter>;
|
|
30
|
+
moveEvent(adapter: SignatureEventBoxAdapter, targetPpqn: ppqn): void;
|
|
31
|
+
floorToBar(position: ppqn): ppqn;
|
|
32
|
+
ceilToBar(position: ppqn): ppqn;
|
|
33
|
+
roundToBar(position: ppqn): ppqn;
|
|
34
|
+
barLengthAt(position: ppqn): ppqn;
|
|
35
|
+
getBarInterval(position: ppqn): {
|
|
36
|
+
position: ppqn;
|
|
37
|
+
complete: ppqn;
|
|
38
|
+
};
|
|
39
|
+
terminate(): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=SignatureTrackAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignatureTrackAdapter.d.ts","sourceRoot":"","sources":["../../src/timeline/SignatureTrackAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,GAAG,EAEH,QAAQ,EAER,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,UAAU,EAGb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAC,IAAI,EAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAC,wBAAwB,EAAC,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAC,SAAS,EAAqB,cAAc,EAAE,WAAW,EAAC,MAAM,uBAAuB,CAAA;AAI/F,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IAClC,KAAK,EAAE,GAAG,CAAC;IACX,eAAe,EAAE,IAAI,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC;IACrB,SAAS,EAAE,GAAG,CAAC;IACf,WAAW,EAAE,GAAG,CAAA;CACnB,CAAC,CAAA;AAEF,qBAAa,qBAAsB,YAAW,UAAU;;IAOpD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAG3B,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc;IAoB7F,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY;IAEjD,IAAI,OAAO,IAAI,kBAAkB,CAAuB;IACxD,IAAI,OAAO,IAAI,OAAO,CAAiD;IACvE,IAAI,MAAM,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAA8B;IACzE,IAAI,IAAI,IAAI,GAAG,CAA+B;IAC9C,IAAI,gBAAgB,IAAI,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAG3C;IAED,cAAc,IAAI,IAAI;IAEtB,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAU/C,UAAU,IAAI,gBAAgB,CAAC,cAAc,CAAC;IAehD,eAAe,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,IAAI;IA8BvD,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IA+BtD,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,IAAI;IAqCnE,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAEvD,SAAS,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI;IAkEpE,UAAU,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAMhC,SAAS,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAM/B,UAAU,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAMhC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAKjC,cAAc,CAAC,QAAQ,EAAE,IAAI,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;IAOlE,SAAS,IAAI,IAAI;CACpB"}
|