@opendaw/studio-adapters 0.3.4 → 0.3.5

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 (73) hide show
  1. package/dist/BoxAdapters.d.ts.map +1 -1
  2. package/dist/BoxAdapters.js +8 -0
  3. package/dist/DeviceAdapter.d.ts +17 -1
  4. package/dist/DeviceAdapter.d.ts.map +1 -1
  5. package/dist/DeviceManualUrls.d.ts +3 -0
  6. package/dist/DeviceManualUrls.d.ts.map +1 -1
  7. package/dist/DeviceManualUrls.js +3 -0
  8. package/dist/Validator.d.ts.map +1 -1
  9. package/dist/Validator.js +4 -19
  10. package/dist/audio-unit/AudioUnitBoxAdapter.d.ts +2 -1
  11. package/dist/audio-unit/AudioUnitBoxAdapter.d.ts.map +1 -1
  12. package/dist/audio-unit/AudioUnitBoxAdapter.js +1 -0
  13. package/dist/audio-unit/AuxSendBoxAdapter.d.ts +1 -0
  14. package/dist/audio-unit/AuxSendBoxAdapter.d.ts.map +1 -1
  15. package/dist/audio-unit/AuxSendBoxAdapter.js +1 -0
  16. package/dist/devices/audio-effects/AudioEffectComposite/AudioCompositeAdapter.d.ts +2 -1
  17. package/dist/devices/audio-effects/AudioEffectComposite/AudioCompositeAdapter.d.ts.map +1 -1
  18. package/dist/devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter.d.ts +8 -5
  19. package/dist/devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter.d.ts.map +1 -1
  20. package/dist/devices/audio-effects/AudioEffectComposite/AudioEffectCompositeCellBoxAdapter.js +9 -3
  21. package/dist/devices/audio-effects/AudioEffectCompositeBoxAdapter.d.ts +2 -0
  22. package/dist/devices/audio-effects/AudioEffectCompositeBoxAdapter.d.ts.map +1 -1
  23. package/dist/devices/audio-effects/AudioEffectCompositeBoxAdapter.js +1 -0
  24. package/dist/devices/audio-effects/AudioSinkDeviceBoxAdapter.d.ts +33 -0
  25. package/dist/devices/audio-effects/AudioSinkDeviceBoxAdapter.d.ts.map +1 -0
  26. package/dist/devices/audio-effects/AudioSinkDeviceBoxAdapter.js +60 -0
  27. package/dist/devices/audio-effects/CrusherDeviceBoxAdapter.js +1 -1
  28. package/dist/devices/audio-effects/FrequencySplitBoxAdapter.d.ts +3 -0
  29. package/dist/devices/audio-effects/FrequencySplitBoxAdapter.d.ts.map +1 -1
  30. package/dist/devices/audio-effects/FrequencySplitBoxAdapter.js +8 -0
  31. package/dist/devices/audio-effects/StereoCompositeBoxAdapter.d.ts +2 -0
  32. package/dist/devices/audio-effects/StereoCompositeBoxAdapter.d.ts.map +1 -1
  33. package/dist/devices/audio-effects/StereoCompositeBoxAdapter.js +1 -0
  34. package/dist/devices/instruments/Cubed/CubedStep.js +1 -1
  35. package/dist/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.d.ts +49 -0
  36. package/dist/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.d.ts.map +1 -0
  37. package/dist/devices/instruments/InstrumentComposite/InstrumentCompositeCellBoxAdapter.js +88 -0
  38. package/dist/devices/instruments/InstrumentCompositeBoxAdapter.d.ts +33 -0
  39. package/dist/devices/instruments/InstrumentCompositeBoxAdapter.d.ts.map +1 -0
  40. package/dist/devices/instruments/InstrumentCompositeBoxAdapter.js +55 -0
  41. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts +2 -1
  42. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.d.ts.map +1 -1
  43. package/dist/devices/instruments/Playfield/PlayfieldSampleBoxAdapter.js +1 -0
  44. package/dist/devices/instruments/Tubular/Dx7Sysex.d.ts +23 -0
  45. package/dist/devices/instruments/Tubular/Dx7Sysex.d.ts.map +1 -0
  46. package/dist/devices/instruments/Tubular/Dx7Sysex.js +159 -0
  47. package/dist/devices/instruments/Tubular/TubularPreset.d.ts +6 -0
  48. package/dist/devices/instruments/Tubular/TubularPreset.d.ts.map +1 -0
  49. package/dist/devices/instruments/Tubular/TubularPreset.js +39 -0
  50. package/dist/devices/instruments/TubularDeviceBoxAdapter.d.ts +100 -0
  51. package/dist/devices/instruments/TubularDeviceBoxAdapter.d.ts.map +1 -0
  52. package/dist/devices/instruments/TubularDeviceBoxAdapter.js +177 -0
  53. package/dist/factories/InstrumentBox.d.ts +2 -2
  54. package/dist/factories/InstrumentBox.d.ts.map +1 -1
  55. package/dist/factories/InstrumentFactories.d.ts +9 -2
  56. package/dist/factories/InstrumentFactories.d.ts.map +1 -1
  57. package/dist/factories/InstrumentFactories.js +38 -2
  58. package/dist/index.d.ts +7 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +7 -0
  61. package/dist/preset/PresetDecoder.d.ts +3 -2
  62. package/dist/preset/PresetDecoder.d.ts.map +1 -1
  63. package/dist/preset/PresetDecoder.js +51 -6
  64. package/dist/preset/PresetEncoder.d.ts +1 -0
  65. package/dist/preset/PresetEncoder.d.ts.map +1 -1
  66. package/dist/preset/PresetEncoder.js +36 -0
  67. package/dist/timeline/RegionOverlap.d.ts +13 -0
  68. package/dist/timeline/RegionOverlap.d.ts.map +1 -0
  69. package/dist/timeline/RegionOverlap.js +32 -0
  70. package/dist/transfer/TransferUtils.d.ts +4 -1
  71. package/dist/transfer/TransferUtils.d.ts.map +1 -1
  72. package/dist/transfer/TransferUtils.js +18 -0
  73. package/package.json +11 -11
@@ -6,6 +6,7 @@ export declare namespace PresetEncoder {
6
6
  excludeEffect?: (box: Box) => boolean;
7
7
  includeTimeline?: boolean;
8
8
  }) => ArrayBufferLike;
9
+ const encodeLayerInstrument: (instrument: Box) => ArrayBufferLike;
9
10
  const encodeEffects: (effects: ReadonlyArray<Box>, kind: PresetHeader.ChainKind) => ArrayBufferLike;
10
11
  }
11
12
  //# sourceMappingURL=PresetEncoder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PresetEncoder.d.ts","sourceRoot":"","sources":["../../src/preset/PresetEncoder.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAA2B,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAC,YAAY,EAA4D,MAAM,uBAAuB,CAAA;AAI7G,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAE3C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAI,cAAc,YAAY,EAC1B,UAAS;QACL,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;QACtC,eAAe,CAAC,EAAE,OAAO,CAAA;KACvB,KAAG,eA+B/B,CAAA;IAEM,MAAM,aAAa,GACtB,SAAS,aAAa,CAAC,GAAG,CAAC,EAC3B,MAAM,YAAY,CAAC,SAAS,KAC7B,eAmFF,CAAA;CACJ"}
1
+ {"version":3,"file":"PresetEncoder.d.ts","sourceRoot":"","sources":["../../src/preset/PresetEncoder.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAA2B,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAC,YAAY,EAA4D,MAAM,uBAAuB,CAAA;AAI7G,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAE3C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAI,cAAc,YAAY,EAC1B,UAAS;QACL,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;QACtC,eAAe,CAAC,EAAE,OAAO,CAAA;KACvB,KAAG,eA+B/B,CAAA;IAGM,MAAM,qBAAqB,GAAI,YAAY,GAAG,KAAG,eAkCvD,CAAA;IAEM,MAAM,aAAa,GACtB,SAAS,aAAa,CAAC,GAAG,CAAC,EAC3B,MAAM,YAAY,CAAC,SAAS,KAC7B,eAmFF,CAAA;CACJ"}
@@ -36,6 +36,42 @@ export var PresetEncoder;
36
36
  boxGraph.endTransaction();
37
37
  return Arrays.concatArrayBuffers(header.toArrayBuffer(), boxGraph.toArrayBuffer());
38
38
  };
39
+ // saved as an ordinary instrument preset, in a wrapper unit of its own
40
+ PresetEncoder.encodeLayerInstrument = (instrument) => {
41
+ const header = ByteArrayOutput.create();
42
+ header.writeInt(PresetHeader.MAGIC_HEADER_OPEN);
43
+ header.writeInt(PresetHeader.FORMAT_VERSION);
44
+ const preset = ProjectSkeleton.empty({ createOutputMaximizer: false, createDefaultUser: false });
45
+ const { boxGraph, mandatoryBoxes: { rootBox, primaryAudioBusBox } } = preset;
46
+ boxGraph.beginTransaction();
47
+ const captureBox = CaptureMidiBox.create(boxGraph, UUID.generate());
48
+ const wrapperAudioUnit = AudioUnitBox.create(boxGraph, UUID.generate(), box => {
49
+ box.collection.refer(rootBox.audioUnits);
50
+ box.output.refer(primaryAudioBusBox.input);
51
+ box.index.setValue(0);
52
+ box.type.setValue(AudioUnitType.Instrument);
53
+ box.capture.refer(captureBox);
54
+ });
55
+ const dependencies = TransferUtils.deviceDependencies(instrument);
56
+ const uuidMap = TransferUtils.mapUuids([instrument, ...dependencies]);
57
+ PointerField.decodeWith({
58
+ map: (pointer, address) => {
59
+ const internal = address.flatMap(addr => uuidMap.opt(addr.uuid).map(({ target }) => addr.moveTo(target)));
60
+ if (internal.nonEmpty()) {
61
+ return internal;
62
+ }
63
+ if (pointer.pointerType === Pointers.InstrumentHost) {
64
+ return Option.wrap(wrapperAudioUnit.input.address);
65
+ }
66
+ if (pointer.pointerType === Pointers.ModulatorCollection) {
67
+ return Option.wrap(rootBox.modulators.address);
68
+ }
69
+ return address.flatMap(addr => boxGraph.findBox(addr.uuid).nonEmpty() ? Option.wrap(addr) : Option.None);
70
+ }
71
+ }, () => TransferUtils.cloneBoxes([instrument, ...dependencies], uuidMap, boxGraph));
72
+ boxGraph.endTransaction();
73
+ return Arrays.concatArrayBuffers(header.toArrayBuffer(), boxGraph.toArrayBuffer());
74
+ };
39
75
  PresetEncoder.encodeEffects = (effects, kind) => {
40
76
  const header = ByteArrayOutput.create();
41
77
  header.writeInt(PresetHeader.MAGIC_HEADER_OPEN);
@@ -0,0 +1,13 @@
1
+ import { int, Option } from "@opendaw/lib-std";
2
+ import { ppqn } from "@opendaw/lib-dsp";
3
+ import { TrackBox } from "@opendaw/studio-boxes";
4
+ import { AnyRegionBox } from "../unions";
5
+ import { BoxAdapters } from "../BoxAdapters";
6
+ export declare namespace RegionOverlap {
7
+ const boundaryTolerance: (value: ppqn) => ppqn;
8
+ const endsAtSuccessor: (box: AnyRegionBox) => boolean;
9
+ const sortedRegions: (trackBox: TrackBox) => Array<AnyRegionBox>;
10
+ const find: (sorted: ReadonlyArray<AnyRegionBox>) => Option<int>;
11
+ const hasSpace: (boxAdapters: BoxAdapters, trackBox: TrackBox, position: ppqn, complete: ppqn) => boolean;
12
+ }
13
+ //# sourceMappingURL=RegionOverlap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegionOverlap.d.ts","sourceRoot":"","sources":["../../src/timeline/RegionOverlap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,MAAM,EAAC,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAC,IAAI,EAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAiB,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAC,YAAY,EAAgB,MAAM,WAAW,CAAA;AACrD,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAA;AAG1C,yBAAiB,aAAa,CAAC;IAGpB,MAAM,iBAAiB,GAAI,OAAO,IAAI,KAAG,IAAuD,CAAA;IAGhG,MAAM,eAAe,GAAI,KAAK,YAAY,KAAG,OAC6B,CAAA;IAE1E,MAAM,aAAa,GAAI,UAAU,QAAQ,KAAG,KAAK,CAAC,YAAY,CAEW,CAAA;IAEzE,MAAM,IAAI,GAAI,QAAQ,aAAa,CAAC,YAAY,CAAC,KAAG,MAAM,CAAC,GAAG,CAUpE,CAAA;IAEM,MAAM,QAAQ,GAAI,aAAa,WAAW,EAAE,UAAU,QAAQ,EAAE,UAAU,IAAI,EAAE,UAAU,IAAI,KAAG,OAIlG,CAAA;CACT"}
@@ -0,0 +1,32 @@
1
+ import { Option } from "@opendaw/lib-std";
2
+ import { TimeBase } from "@opendaw/lib-dsp";
3
+ import { AudioRegionBox } from "@opendaw/studio-boxes";
4
+ import { UnionBoxTypes } from "../unions";
5
+ import { RegionAdapters } from "./RegionBoxAdapter";
6
+ export var RegionOverlap;
7
+ (function (RegionOverlap) {
8
+ const Float32RelativeEpsilon = 2 ** -23; // float32 has 23 mantissa bits
9
+ RegionOverlap.boundaryTolerance = (value) => Math.abs(value) * Float32RelativeEpsilon + 1e-3;
10
+ // The end of a seconds region moves with the tempo. It ends where the next region starts, never an error.
11
+ RegionOverlap.endsAtSuccessor = (box) => box instanceof AudioRegionBox && box.timeBase.getValue() !== TimeBase.Musical;
12
+ RegionOverlap.sortedRegions = (trackBox) => trackBox.regions.pointerHub.incoming()
13
+ .map(({ box }) => UnionBoxTypes.asRegionBox(box))
14
+ .sort((left, right) => left.position.getValue() - right.position.getValue());
15
+ RegionOverlap.find = (sorted) => {
16
+ for (let index = 1; index < sorted.length; index++) {
17
+ const prev = sorted[index - 1];
18
+ if (RegionOverlap.endsAtSuccessor(prev)) {
19
+ continue;
20
+ }
21
+ const position = sorted[index].position.getValue();
22
+ if (prev.position.getValue() + prev.duration.getValue() > position + RegionOverlap.boundaryTolerance(position)) {
23
+ return Option.wrap(index);
24
+ }
25
+ }
26
+ return Option.None;
27
+ };
28
+ RegionOverlap.hasSpace = (boxAdapters, trackBox, position, complete) => trackBox.regions.pointerHub.incoming().every(({ box }) => {
29
+ const region = RegionAdapters.for(boxAdapters, box);
30
+ return region.resolveComplete(region.position) <= position || region.position >= complete;
31
+ });
32
+ })(RegionOverlap || (RegionOverlap = {}));
@@ -1,5 +1,5 @@
1
1
  import { ppqn } from "@opendaw/lib-dsp";
2
- import { int, Option, SortedSet, UUID } from "@opendaw/lib-std";
2
+ import { int, Option, Predicate, SortedSet, UUID } from "@opendaw/lib-std";
3
3
  import { AudioUnitBox, RootBox } from "@opendaw/studio-boxes";
4
4
  import { Address, Box, BoxGraph, PointerField } from "@opendaw/lib-box";
5
5
  import { ProjectSkeleton } from "../project/ProjectSkeleton";
@@ -13,6 +13,9 @@ export declare namespace TransferUtils {
13
13
  const shouldExclude: (box: Box) => boolean;
14
14
  const keepsIdentity: (box: Box) => boolean;
15
15
  const withModulators: (boxes: ReadonlyArray<Box>) => ReadonlyArray<Box>;
16
+ const deviceDependencies: (root: Box, exclude?: Predicate<Box>) => ReadonlyArray<Box>;
17
+ const mapUuids: (boxes: ReadonlyArray<Box>) => SortedSet<UUID.Bytes, UUIDMapper>;
18
+ const cloneBoxes: (sources: ReadonlyArray<Box>, uuidMap: SortedSet<UUID.Bytes, UUIDMapper>, targetGraph: BoxGraph) => void;
16
19
  const mapModulatorCollection: (pointer: PointerField, targetGraph: BoxGraph) => Option<Address>;
17
20
  const generateMap: (audioUnitBoxes: ReadonlyArray<AudioUnitBox>, dependencies: ReadonlyArray<Box>, rootBoxUUID: UUID.Bytes, masterBusBoxUUID: UUID.Bytes) => SortedSet<UUID.Bytes, UUIDMapper>;
18
21
  const copyBoxes: (uuidMap: SortedSet<UUID.Bytes, UUIDMapper>, targetBoxGraph: BoxGraph, audioUnitBoxes: ReadonlyArray<AudioUnitBox>, dependencies: ReadonlyArray<Box>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"TransferUtils.d.ts","sourceRoot":"","sources":["../../src/transfer/TransferUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAMH,GAAG,EAGH,MAAM,EAGN,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,YAAY,EAAgD,OAAO,EAAW,MAAM,uBAAuB,CAAA;AAEnH,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAc,YAAY,EAAC,MAAM,kBAAkB,CAAA;AACjF,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAC,YAAY,EAAgB,MAAM,WAAW,CAAA;AAIrD,yBAAiB,aAAa,CAAC;IAC3B,KAAY,UAAU,GAAG;QAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAA;KAAE,CAAA;IAI5D,MAAM,wBAAwB,GAAI,KAAK,GAAG,KAAG,OACqB,CAAA;IAClE,MAAM,aAAa,GAAI,KAAK,GAAG,KAAG,OAA6D,CAAA;IAC/F,MAAM,aAAa,GAAI,KAAK,GAAG,KAAG,OAA8D,CAAA;IAGhG,MAAM,cAAc,GAAI,OAAO,aAAa,CAAC,GAAG,CAAC,KAAG,aAAa,CAAC,GAAG,CAa3E,CAAA;IAEM,MAAM,sBAAsB,GAAI,SAAS,YAAY,EAAE,aAAa,QAAQ,KAAG,MAAM,CAAC,OAAO,CAI/E,CAAA;IAEd,MAAM,WAAW,GAAI,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,cAAc,aAAa,CAAC,GAAG,CAAC,EAChC,aAAa,IAAI,CAAC,KAAK,EACvB,kBAAkB,IAAI,CAAC,KAAK,KAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CA0B1F,CAAA;IAEM,MAAM,SAAS,GAAI,SAAS,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,gBAAgB,QAAQ,EACxB,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,cAAc,aAAa,CAAC,GAAG,CAAC,KAAG,IAqC5D,CAAA;IAEM,MAAM,iBAAiB,GAAI,SAAS,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,SAAS,OAAO,EAChB,cAAc,GAAG,KAAG,IA2BrD,CAAA;IAEM,MAAM,cAAc,GAAI,aAAa,aAAa,CAAC,YAAY,CAAC,EACxC,+DAA2D,eAAe,EAC1E,iBAAgB,IAAU,KAAG,IA8C3D,CAAA;CACJ"}
1
+ {"version":3,"file":"TransferUtils.d.ts","sourceRoot":"","sources":["../../src/transfer/TransferUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAMH,GAAG,EAGH,MAAM,EACN,SAAS,EAET,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,YAAY,EAAgD,OAAO,EAAW,MAAM,uBAAuB,CAAA;AAEnH,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAc,YAAY,EAAC,MAAM,kBAAkB,CAAA;AACjF,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAC,YAAY,EAAgB,MAAM,WAAW,CAAA;AAIrD,yBAAiB,aAAa,CAAC;IAC3B,KAAY,UAAU,GAAG;QAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAA;KAAE,CAAA;IAI5D,MAAM,wBAAwB,GAAI,KAAK,GAAG,KAAG,OACqB,CAAA;IAClE,MAAM,aAAa,GAAI,KAAK,GAAG,KAAG,OAA6D,CAAA;IAC/F,MAAM,aAAa,GAAI,KAAK,GAAG,KAAG,OAA8D,CAAA;IAGhG,MAAM,cAAc,GAAI,OAAO,aAAa,CAAC,GAAG,CAAC,KAAG,aAAa,CAAC,GAAG,CAa3E,CAAA;IAEM,MAAM,kBAAkB,GAAI,MAAM,GAAG,EAAE,UAAS,SAAS,CAAC,GAAG,CAAe,KAAG,aAAa,CAAC,GAAG,CAK7D,CAAA;IAEnC,MAAM,QAAQ,GAAI,OAAO,aAAa,CAAC,GAAG,CAAC,KAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAOpF,CAAA;IAEM,MAAM,UAAU,GAAI,SAAS,aAAa,CAAC,GAAG,CAAC,EAC3B,SAAS,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,aAAa,QAAQ,KAAG,IAK7C,CAAA;IAEC,MAAM,sBAAsB,GAAI,SAAS,YAAY,EAAE,aAAa,QAAQ,KAAG,MAAM,CAAC,OAAO,CAI/E,CAAA;IAEd,MAAM,WAAW,GAAI,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,cAAc,aAAa,CAAC,GAAG,CAAC,EAChC,aAAa,IAAI,CAAC,KAAK,EACvB,kBAAkB,IAAI,CAAC,KAAK,KAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CA0B1F,CAAA;IAEM,MAAM,SAAS,GAAI,SAAS,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,gBAAgB,QAAQ,EACxB,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,cAAc,aAAa,CAAC,GAAG,CAAC,KAAG,IAqC5D,CAAA;IAEM,MAAM,iBAAiB,GAAI,SAAS,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,gBAAgB,aAAa,CAAC,YAAY,CAAC,EAC3C,SAAS,OAAO,EAChB,cAAc,GAAG,KAAG,IA2BrD,CAAA;IAEM,MAAM,cAAc,GAAI,aAAa,aAAa,CAAC,YAAY,CAAC,EACxC,+DAA2D,eAAe,EAC1E,iBAAgB,IAAU,KAAG,IA8C3D,CAAA;CACJ"}
@@ -31,6 +31,24 @@ export var TransferUtils;
31
31
  });
32
32
  return [...boxes, ...modulators];
33
33
  };
34
+ TransferUtils.deviceDependencies = (root, exclude = () => false) => TransferUtils.withModulators(Array.from(root.graph.dependenciesOf([root], {
35
+ alwaysFollowMandatory: true,
36
+ stopAtResources: true,
37
+ excludeBox: box => exclude(box) || TransferUtils.shouldExclude(box) || TransferUtils.excludeTimelinePredicate(box) || box instanceof AudioUnitBox
38
+ }).boxes).filter(box => box !== root));
39
+ TransferUtils.mapUuids = (boxes) => {
40
+ const uuidMap = UUID.newSet(({ source }) => source);
41
+ uuidMap.addMany(boxes.map(box => ({
42
+ source: box.address.uuid,
43
+ target: TransferUtils.keepsIdentity(box) ? box.address.uuid : UUID.generate()
44
+ })));
45
+ return uuidMap;
46
+ };
47
+ TransferUtils.cloneBoxes = (sources, uuidMap, targetGraph) => sources.forEach(source => {
48
+ const input = new ByteArrayInput(source.toArrayBuffer());
49
+ const uuid = uuidMap.get(source.address.uuid, "uuid mapping").target;
50
+ targetGraph.createBox(source.name, uuid, box => box.read(input));
51
+ });
34
52
  TransferUtils.mapModulatorCollection = (pointer, targetGraph) => pointer.pointerType === Pointers.ModulatorCollection
35
53
  ? Option.wrap(targetGraph.boxes().find(box => isInstanceOf(box, RootBox)))
36
54
  .map(rootBox => rootBox.modulators.address)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendaw/studio-adapters",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "license": "AGPL-3.0-or-later",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -20,24 +20,24 @@
20
20
  "generate-exports": "node generate-exports.mjs",
21
21
  "build": "npm run generate-exports && tsc",
22
22
  "lint": "eslint \"**/*.ts\"",
23
- "test": "echo \"No tests to run\"",
23
+ "test": "vitest run",
24
24
  "generate-all-boxes": "npx tsx scripts/generate-all-boxes.ts",
25
25
  "pregenerate-all-boxes": "npm run build -w @opendaw/studio-forge-boxes && npm run build -w @opendaw/studio-boxes"
26
26
  },
27
27
  "dependencies": {
28
- "@opendaw/lib-box": "^0.0.94",
29
- "@opendaw/lib-dsp": "^0.0.93",
30
- "@opendaw/lib-fusion": "^0.0.103",
31
- "@opendaw/lib-midi": "^0.0.74",
32
- "@opendaw/lib-runtime": "^0.0.86",
33
- "@opendaw/lib-std": "^0.0.85",
34
- "@opendaw/studio-boxes": "^0.0.110",
35
- "@opendaw/studio-enums": "^0.1.3",
28
+ "@opendaw/lib-box": "^0.0.95",
29
+ "@opendaw/lib-dsp": "^0.0.94",
30
+ "@opendaw/lib-fusion": "^0.0.104",
31
+ "@opendaw/lib-midi": "^0.0.75",
32
+ "@opendaw/lib-runtime": "^0.0.87",
33
+ "@opendaw/lib-std": "^0.0.86",
34
+ "@opendaw/studio-boxes": "^0.0.111",
35
+ "@opendaw/studio-enums": "^0.1.4",
36
36
  "soundfont2": "^0.5.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@opendaw/eslint-config": "^0.0.28",
40
40
  "@opendaw/typescript-config": "^0.0.32"
41
41
  },
42
- "gitHead": "b540a9cb4d3934297e8bb2acf8557781eb9580f0"
42
+ "gitHead": "88113f892cea2fa9495289a9c166b6fe0f93ce69"
43
43
  }