@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.
Files changed (148) hide show
  1. package/dist/AutomatableParameterFieldAdapter.d.ts.map +1 -1
  2. package/dist/AutomatableParameterFieldAdapter.js +5 -3
  3. package/dist/BoxAdapters.d.ts.map +1 -1
  4. package/dist/BoxAdapters.js +2 -0
  5. package/dist/BoxAdaptersContext.d.ts +1 -2
  6. package/dist/BoxAdaptersContext.d.ts.map +1 -1
  7. package/dist/ClipSequencing.d.ts +1 -1
  8. package/dist/ClipSequencing.d.ts.map +1 -1
  9. package/dist/DeviceAdapter.d.ts +7 -6
  10. package/dist/DeviceAdapter.d.ts.map +1 -1
  11. package/dist/DeviceAdapter.js +1 -1
  12. package/dist/DeviceBox.d.ts +1 -1
  13. package/dist/DeviceBox.js +1 -1
  14. package/dist/EngineStateSchema.d.ts +1 -0
  15. package/dist/EngineStateSchema.d.ts.map +1 -1
  16. package/dist/EngineStateSchema.js +1 -0
  17. package/dist/LabeledAudioOutputsOwner.d.ts +11 -0
  18. package/dist/LabeledAudioOutputsOwner.d.ts.map +1 -0
  19. package/dist/LabeledAudioOutputsOwner.js +1 -0
  20. package/dist/NoteSignal.d.ts +11 -1
  21. package/dist/NoteSignal.d.ts.map +1 -1
  22. package/dist/NoteSignal.js +2 -0
  23. package/dist/RootBoxAdapter.d.ts +3 -1
  24. package/dist/RootBoxAdapter.d.ts.map +1 -1
  25. package/dist/RootBoxAdapter.js +10 -1
  26. package/dist/TempoRange.d.ts +5 -0
  27. package/dist/TempoRange.d.ts.map +1 -0
  28. package/dist/TempoRange.js +1 -0
  29. package/dist/Validator.d.ts +0 -2
  30. package/dist/Validator.d.ts.map +1 -1
  31. package/dist/Validator.js +4 -3
  32. package/dist/VaryingTempoMap.d.ts +18 -0
  33. package/dist/VaryingTempoMap.d.ts.map +1 -0
  34. package/dist/VaryingTempoMap.js +105 -0
  35. package/dist/audio/AudioFileBoxAdapter.js +1 -1
  36. package/dist/audio-unit/AudioBusBoxAdapter.d.ts +3 -1
  37. package/dist/audio-unit/AudioBusBoxAdapter.d.ts.map +1 -1
  38. package/dist/audio-unit/AudioBusBoxAdapter.js +4 -0
  39. package/dist/audio-unit/AudioUnitBoxAdapter.d.ts +4 -2
  40. package/dist/audio-unit/AudioUnitBoxAdapter.d.ts.map +1 -1
  41. package/dist/audio-unit/AudioUnitBoxAdapter.js +16 -2
  42. package/dist/devices/audio-effects/CompressorDeviceBoxAdapter.d.ts +3 -0
  43. package/dist/devices/audio-effects/CompressorDeviceBoxAdapter.d.ts.map +1 -1
  44. package/dist/devices/audio-effects/CompressorDeviceBoxAdapter.js +8 -2
  45. package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.d.ts +2 -0
  46. package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.d.ts.map +1 -1
  47. package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.js +7 -2
  48. package/dist/devices/audio-effects/DattorroReverbDeviceBoxAdapter.d.ts +2 -0
  49. package/dist/devices/audio-effects/DattorroReverbDeviceBoxAdapter.d.ts.map +1 -1
  50. package/dist/devices/audio-effects/DattorroReverbDeviceBoxAdapter.js +7 -2
  51. package/dist/devices/audio-effects/DelayDeviceBoxAdapter.d.ts +2 -0
  52. package/dist/devices/audio-effects/DelayDeviceBoxAdapter.d.ts.map +1 -1
  53. package/dist/devices/audio-effects/DelayDeviceBoxAdapter.js +7 -2
  54. package/dist/devices/audio-effects/FoldDeviceBoxAdapter.d.ts +2 -0
  55. package/dist/devices/audio-effects/FoldDeviceBoxAdapter.d.ts.map +1 -1
  56. package/dist/devices/audio-effects/FoldDeviceBoxAdapter.js +7 -2
  57. package/dist/devices/audio-effects/ModularDeviceBoxAdapter.d.ts +2 -0
  58. package/dist/devices/audio-effects/ModularDeviceBoxAdapter.d.ts.map +1 -1
  59. package/dist/devices/audio-effects/ModularDeviceBoxAdapter.js +4 -1
  60. package/dist/devices/audio-effects/RevampDeviceBoxAdapter.d.ts +2 -0
  61. package/dist/devices/audio-effects/RevampDeviceBoxAdapter.d.ts.map +1 -1
  62. package/dist/devices/audio-effects/RevampDeviceBoxAdapter.js +7 -2
  63. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts +2 -0
  64. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.d.ts.map +1 -1
  65. package/dist/devices/audio-effects/ReverbDeviceBoxAdapter.js +7 -2
  66. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts +2 -0
  67. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.d.ts.map +1 -1
  68. package/dist/devices/audio-effects/StereoToolDeviceBoxAdapter.js +7 -2
  69. package/dist/devices/audio-effects/TidalDeviceBoxAdapter.d.ts +2 -0
  70. package/dist/devices/audio-effects/TidalDeviceBoxAdapter.d.ts.map +1 -1
  71. package/dist/devices/audio-effects/TidalDeviceBoxAdapter.js +7 -2
  72. package/dist/devices/audio-effects/UnknownAudioEffectDeviceBoxAdapter.d.ts +2 -0
  73. package/dist/devices/audio-effects/UnknownAudioEffectDeviceBoxAdapter.d.ts.map +1 -1
  74. package/dist/devices/audio-effects/UnknownAudioEffectDeviceBoxAdapter.js +4 -0
  75. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts +2 -0
  76. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.d.ts.map +1 -1
  77. package/dist/devices/instruments/MIDIOutputDeviceBoxAdapter.js +4 -1
  78. package/dist/devices/instruments/NanoDeviceBoxAdapter.d.ts +2 -0
  79. package/dist/devices/instruments/NanoDeviceBoxAdapter.d.ts.map +1 -1
  80. package/dist/devices/instruments/NanoDeviceBoxAdapter.js +7 -2
  81. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts +5 -2
  82. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts.map +1 -1
  83. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.js +12 -1
  84. package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts +3 -1
  85. package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.d.ts.map +1 -1
  86. package/dist/devices/instruments/PlayfieldDeviceBoxAdapter.js +18 -1
  87. package/dist/devices/instruments/SoundfontDeviceBoxAdapter.d.ts +2 -0
  88. package/dist/devices/instruments/SoundfontDeviceBoxAdapter.d.ts.map +1 -1
  89. package/dist/devices/instruments/SoundfontDeviceBoxAdapter.js +4 -1
  90. package/dist/devices/instruments/TapeDeviceBoxAdapter.d.ts +2 -0
  91. package/dist/devices/instruments/TapeDeviceBoxAdapter.d.ts.map +1 -1
  92. package/dist/devices/instruments/TapeDeviceBoxAdapter.js +7 -2
  93. package/dist/devices/instruments/VaporisateurDeviceBoxAdapter.d.ts +2 -0
  94. package/dist/devices/instruments/VaporisateurDeviceBoxAdapter.d.ts.map +1 -1
  95. package/dist/devices/instruments/VaporisateurDeviceBoxAdapter.js +7 -2
  96. package/dist/devices/midi-effects/ArpeggioDeviceBoxAdapter.d.ts +1 -1
  97. package/dist/devices/midi-effects/PitchDeviceBoxAdapter.d.ts +1 -1
  98. package/dist/devices/midi-effects/UnknownMidiEffectDeviceBoxAdapter.d.ts +1 -1
  99. package/dist/devices/midi-effects/VelocityDeviceBoxAdapter.d.ts +1 -1
  100. package/dist/devices/midi-effects/ZeitgeistDeviceBoxAdapter.d.ts +1 -1
  101. package/dist/editing/UserEditing.js +1 -1
  102. package/dist/index.d.ts +5 -0
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +5 -0
  105. package/dist/preset/PresetDecoder.d.ts.map +1 -1
  106. package/dist/preset/PresetDecoder.js +20 -9
  107. package/dist/project/ProjectSkeleton.d.ts.map +1 -1
  108. package/dist/project/ProjectSkeleton.js +5 -4
  109. package/dist/project/ProjectUtils.d.ts.map +1 -1
  110. package/dist/project/ProjectUtils.js +40 -10
  111. package/dist/selection/FilteredSelection.js +2 -2
  112. package/dist/selection/VertexSelection.d.ts +2 -1
  113. package/dist/selection/VertexSelection.d.ts.map +1 -1
  114. package/dist/selection/VertexSelection.js +1 -1
  115. package/dist/timeline/RegionBoxAdapter.d.ts +8 -0
  116. package/dist/timeline/RegionBoxAdapter.d.ts.map +1 -1
  117. package/dist/timeline/SignatureEventBoxAdapter.d.ts +24 -0
  118. package/dist/timeline/SignatureEventBoxAdapter.d.ts.map +1 -0
  119. package/dist/timeline/SignatureEventBoxAdapter.js +42 -0
  120. package/dist/timeline/SignatureTrackAdapter.d.ts +41 -0
  121. package/dist/timeline/SignatureTrackAdapter.d.ts.map +1 -0
  122. package/dist/timeline/SignatureTrackAdapter.js +279 -0
  123. package/dist/timeline/TimelineBoxAdapter.d.ts +7 -2
  124. package/dist/timeline/TimelineBoxAdapter.d.ts.map +1 -1
  125. package/dist/timeline/TimelineBoxAdapter.js +52 -7
  126. package/dist/timeline/TrackBoxAdapter.d.ts +1 -0
  127. package/dist/timeline/TrackBoxAdapter.d.ts.map +1 -1
  128. package/dist/timeline/TrackBoxAdapter.js +1 -0
  129. package/dist/timeline/clip/AudioClipBoxAdapter.d.ts +1 -2
  130. package/dist/timeline/clip/AudioClipBoxAdapter.d.ts.map +1 -1
  131. package/dist/timeline/clip/AudioClipBoxAdapter.js +3 -4
  132. package/dist/timeline/collection/NoteEventCollectionBoxAdapter.d.ts.map +1 -1
  133. package/dist/timeline/collection/NoteEventCollectionBoxAdapter.js +10 -8
  134. package/dist/timeline/collection/ValueEventCollectionBoxAdapter.d.ts +2 -2
  135. package/dist/timeline/collection/ValueEventCollectionBoxAdapter.d.ts.map +1 -1
  136. package/dist/timeline/collection/ValueEventCollectionBoxAdapter.js +15 -8
  137. package/dist/timeline/event/ValueEventBoxAdapter.d.ts +1 -1
  138. package/dist/timeline/event/ValueEventBoxAdapter.d.ts.map +1 -1
  139. package/dist/timeline/region/AudioRegionBoxAdapter.d.ts +4 -0
  140. package/dist/timeline/region/AudioRegionBoxAdapter.d.ts.map +1 -1
  141. package/dist/timeline/region/AudioRegionBoxAdapter.js +17 -17
  142. package/dist/timeline/region/NoteRegionBoxAdapter.d.ts +5 -1
  143. package/dist/timeline/region/NoteRegionBoxAdapter.d.ts.map +1 -1
  144. package/dist/timeline/region/NoteRegionBoxAdapter.js +4 -0
  145. package/dist/timeline/region/ValueRegionBoxAdapter.d.ts +4 -0
  146. package/dist/timeline/region/ValueRegionBoxAdapter.d.ts.map +1 -1
  147. package/dist/timeline/region/ValueRegionBoxAdapter.js +4 -0
  148. 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 = asDefined(skeleton.mandatoryBoxes.rootBox.audioUnits.pointerHub.incoming()
78
+ const sourceAudioUnitBox = skeleton.mandatoryBoxes.rootBox.audioUnits.pointerHub.incoming()
79
79
  .map(({ box }) => asInstanceOf(box, AudioUnitBox))
80
- .find((box) => box.type.getValue() !== AudioUnitType.Output), "Source has no audioUnitBox");
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, we can just read them.
144
- if (targetBoxGraph.findBox(source.address.uuid).nonEmpty()) {
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,EAOR,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,eAqDH,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
+ {"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(/*Colors.blue*/ "hsl(189, 100%, 65%)"); // TODO
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,EAQf,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,CAgB/B,CAAA;IAEM,MAAM,cAAc,GAAI,aAAa,aAAa,CAAC,YAAY,CAAC,EACxC,4DAAwD,eAAe,EACvE,iBAAgB,IAAU,KAAG,IA8C3D,CAAA;CAqFJ"}
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
- const dependencies = audioUnitBoxes
19
- .flatMap(box => Array.from(box.graph.dependenciesOf(box, { alwaysFollowMandatory: true, excludeBox }).boxes))
20
- .filter(box => box.name !== SelectionBox.ClassName && box.name !== AuxSendBox.ClassName);
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, we can just read them.
122
- if (boxGraph.findBox(source.address.uuid).nonEmpty()) {
123
- source.read(input);
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(addressable => addressable.address), "f");
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, _FilteredSelection_filter, "f").call(this, element)) {
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, BoxGraph, BoxEditing, Field } from "@opendaw/lib-box";
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,QAAQ,EAAE,UAAU,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;IAUf,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;IAElB,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"}
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;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,UAAU,CAAC,mBAAmB,CAAqC,CAAA;AAElG,eAAO,MAAM,cAAc;uBACJ,WAAW,OAAO,GAAG,KAAG,mBAAmB;CAKjE,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"}