@opendaw/studio-core 0.0.126 → 0.0.128

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 (82) hide show
  1. package/dist/AssetService.d.ts.map +1 -1
  2. package/dist/AssetService.js +7 -7
  3. package/dist/AudioConsolidation.d.ts.map +1 -1
  4. package/dist/AudioConsolidation.js +2 -2
  5. package/dist/EffectBox.d.ts +2 -2
  6. package/dist/EffectBox.d.ts.map +1 -1
  7. package/dist/EffectFactories.d.ts +20 -14
  8. package/dist/EffectFactories.d.ts.map +1 -1
  9. package/dist/EffectFactories.js +88 -20
  10. package/dist/EffectFactory.d.ts +1 -0
  11. package/dist/EffectFactory.d.ts.map +1 -1
  12. package/dist/Engine.d.ts +2 -1
  13. package/dist/Engine.d.ts.map +1 -1
  14. package/dist/EngineFacade.d.ts +2 -1
  15. package/dist/EngineFacade.d.ts.map +1 -1
  16. package/dist/EngineFacade.js +3 -0
  17. package/dist/EngineWorklet.d.ts +2 -1
  18. package/dist/EngineWorklet.d.ts.map +1 -1
  19. package/dist/EngineWorklet.js +11 -1
  20. package/dist/Mixer.d.ts.map +1 -1
  21. package/dist/Mixer.js +3 -2
  22. package/dist/OfflineEngineRenderer.d.ts.map +1 -1
  23. package/dist/OfflineEngineRenderer.js +41 -3
  24. package/dist/StudioPreferences.d.ts +1 -1
  25. package/dist/StudioSettings.d.ts +1 -1
  26. package/dist/StudioSettings.js +2 -2
  27. package/dist/capture/RecordAudio.d.ts.map +1 -1
  28. package/dist/capture/RecordAudio.js +48 -18
  29. package/dist/capture/RecordAutomation.d.ts.map +1 -1
  30. package/dist/capture/RecordAutomation.js +219 -198
  31. package/dist/capture/RecordMidi.d.ts.map +1 -1
  32. package/dist/capture/RecordMidi.js +1 -1
  33. package/dist/cloud/CloudBackupSamples.js +1 -1
  34. package/dist/dawproject/DawProjectExporter.js +1 -1
  35. package/dist/dawproject/DawProjectService.d.ts.map +1 -1
  36. package/dist/dawproject/DawProjectService.js +3 -16
  37. package/dist/index.d.ts +0 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +0 -1
  40. package/dist/midi/MidiDevices.d.ts.map +1 -1
  41. package/dist/midi/MidiDevices.js +8 -2
  42. package/dist/offline-engine.js +1 -1
  43. package/dist/offline-engine.js.map +3 -3
  44. package/dist/processors.js +37 -25
  45. package/dist/processors.js.map +4 -4
  46. package/dist/project/Project.d.ts.map +1 -1
  47. package/dist/project/Project.js +30 -5
  48. package/dist/project/Recovery.js +1 -1
  49. package/dist/project/migration/MigrateAudioClipBox.d.ts.map +1 -1
  50. package/dist/project/migration/MigrateAudioClipBox.js +7 -0
  51. package/dist/project/migration/MigrateAudioRegionBox.d.ts.map +1 -1
  52. package/dist/project/migration/MigrateAudioRegionBox.js +7 -0
  53. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  54. package/dist/samples/OpenSampleAPI.js +1 -1
  55. package/dist/samples/SampleService.js +1 -1
  56. package/dist/samples/SampleStorage.d.ts.map +1 -1
  57. package/dist/samples/SampleStorage.js +1 -1
  58. package/dist/ui/clipboard/ClipboardManager.d.ts.map +1 -1
  59. package/dist/ui/clipboard/ClipboardManager.js +18 -4
  60. package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.d.ts.map +1 -1
  61. package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.js +8 -2
  62. package/dist/ui/clipboard/types/DevicesClipboardHandler.d.ts.map +1 -1
  63. package/dist/ui/clipboard/types/DevicesClipboardHandler.js +77 -10
  64. package/dist/ui/clipboard/types/DevicesClipboardHandler.test.d.ts +2 -0
  65. package/dist/ui/clipboard/types/DevicesClipboardHandler.test.d.ts.map +1 -0
  66. package/dist/ui/clipboard/types/DevicesClipboardHandler.test.js +1154 -0
  67. package/dist/ui/timeline/RegionClipResolver.d.ts.map +1 -1
  68. package/dist/ui/timeline/RegionClipResolver.js +21 -29
  69. package/dist/ui/timeline/TimeGrid.d.ts +2 -0
  70. package/dist/ui/timeline/TimeGrid.d.ts.map +1 -1
  71. package/dist/ui/timeline/TimeGrid.js +13 -1
  72. package/dist/workers-main.js +1 -1
  73. package/dist/workers-main.js.map +3 -3
  74. package/dist/ysync/YService.d.ts +6 -1
  75. package/dist/ysync/YService.d.ts.map +1 -1
  76. package/dist/ysync/YService.js +2 -2
  77. package/dist/ysync/YSync.d.ts.map +1 -1
  78. package/dist/ysync/YSync.js +1 -0
  79. package/package.json +15 -15
  80. package/dist/WavFile.d.ts +0 -7
  81. package/dist/WavFile.d.ts.map +0 -1
  82. package/dist/WavFile.js +0 -120
@@ -1 +1 @@
1
- {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { Arrays, isDefined, panic, RuntimeNotifier, safeExecute, Terminator, UUID } from "@opendaw/lib-std";
2
2
  import { BoxEditing, DeleteUpdate, NewUpdate } from "@opendaw/lib-box";
3
- import { AudioFileBox, AudioRegionBox } from "@opendaw/studio-boxes";
4
- import { AudioUnitBoxAdapter, BoxAdapters, DeviceBoxUtils, Devices, isVertexOfBox, ParameterFieldAdapters, ProjectSkeleton, RegionAdapters, RootBoxAdapter, TimelineBoxAdapter, UnionBoxTypes, UserEditingManager, VaryingTempoMap, VertexSelection } from "@opendaw/studio-adapters";
3
+ import { ApparatDeviceBox, AudioFileBox, AudioRegionBox, SpielwerkDeviceBox, WerkstattDeviceBox } from "@opendaw/studio-boxes";
4
+ import { AudioUnitBoxAdapter, BoxAdapters, DeviceBoxUtils, Devices, isVertexOfBox, ParameterFieldAdapters, ProjectSkeleton, RegionAdapters, RootBoxAdapter, ScriptCompiler, TimelineBoxAdapter, UnionBoxTypes, UserEditingManager, VaryingTempoMap, VertexSelection } from "@opendaw/studio-adapters";
5
5
  import { LiveStreamReceiver } from "@opendaw/lib-fusion";
6
6
  import { Mixer } from "../Mixer";
7
7
  import { ProjectApi } from "./ProjectApi";
@@ -20,9 +20,9 @@ import { AudioUnitFreeze } from "../AudioUnitFreeze";
20
20
  export class Project {
21
21
  static new(env, options) {
22
22
  const createDefaultUser = options?.noDefaultUser !== true;
23
- const createOutputCompressor = StudioPreferences.settings.engine["auto-create-output-compressor"];
23
+ const createOutputMaximizer = StudioPreferences.settings.engine["auto-create-output-maximizer"];
24
24
  const { boxGraph, mandatoryBoxes } = ProjectSkeleton.empty({
25
- createOutputCompressor,
25
+ createOutputMaximizer,
26
26
  createDefaultUser
27
27
  });
28
28
  const project = new Project(env, boxGraph, mandatoryBoxes);
@@ -123,13 +123,38 @@ export class Project {
123
123
  }
124
124
  else if (update instanceof DeleteUpdate && update.name === AudioFileBox.ClassName) {
125
125
  this.#unregisterSample(update.uuid);
126
- this.#deleteUserCreatedSample(update.uuid);
126
+ this.#deleteUserCreatedSample(update.uuid).finally();
127
127
  }
128
128
  }
129
129
  }));
130
130
  }
131
131
  startAudioWorklet(restart, options) {
132
132
  console.debug(`start AudioWorklet`);
133
+ const audioContext = this.#env.audioWorklets.context;
134
+ const loadScript = (config, deviceBox) => ScriptCompiler.create(config).load(audioContext, deviceBox).catch(reason => console.warn(`Failed to load script device ${UUID.toString(deviceBox.address.uuid)}:`, reason));
135
+ for (const box of this.boxGraph.boxes()) {
136
+ if (box instanceof ApparatDeviceBox) {
137
+ loadScript({
138
+ headerTag: "apparat",
139
+ registryName: "apparatProcessors",
140
+ functionName: "apparat"
141
+ }, box).finally();
142
+ }
143
+ else if (box instanceof WerkstattDeviceBox) {
144
+ loadScript({
145
+ headerTag: "werkstatt",
146
+ registryName: "werkstattProcessors",
147
+ functionName: "werkstatt"
148
+ }, box).finally();
149
+ }
150
+ else if (box instanceof SpielwerkDeviceBox) {
151
+ loadScript({
152
+ headerTag: "spielwerk",
153
+ registryName: "spielwerkProcessors",
154
+ functionName: "spielwerk"
155
+ }, box).finally();
156
+ }
157
+ }
133
158
  const lifecycle = this.#terminator.spawn();
134
159
  const worklet = lifecycle.own(this.#env.audioWorklets.createEngine({ project: this, options }));
135
160
  const handler = async (event) => {
@@ -18,7 +18,7 @@ export class Recovery {
18
18
  Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/uuid`)
19
19
  .then(x => UUID.validateBytes(x)),
20
20
  Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/project.od`)
21
- .then(x => Project.load(this.#env, x.buffer)),
21
+ .then(x => Project.loadAnyVersion(this.#env, x.buffer)),
22
22
  Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/meta.json`)
23
23
  .then(x => JSON.parse(new TextDecoder().decode(x.buffer))),
24
24
  Workers.Opfs.read(`${Recovery.#RESTORE_FILE_PATH}/saved`)
@@ -1 +1 @@
1
- {"version":3,"file":"MigrateAudioClipBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioClipBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAC,YAAY,EAAsC,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAQtH,eAAO,MAAM,mBAAmB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,YAAY,KAAG,IAyB1F,CAAA"}
1
+ {"version":3,"file":"MigrateAudioClipBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioClipBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAC,YAAY,EAAsC,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAQtH,eAAO,MAAM,mBAAmB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,YAAY,KAAG,IAgC1F,CAAA"}
@@ -5,6 +5,13 @@ import { TimeBase } from "@opendaw/lib-dsp";
5
5
  import { AudioContentHelpers } from "../audio/AudioContentHelpers";
6
6
  const isIntEncodedAsFloat = (v) => v > 0 && v < 1e-6 && Number.isFinite(v) && (v / 1.401298464324817e-45) % 1 === 0;
7
7
  export const migrateAudioClipBox = (boxGraph, box) => {
8
+ if (box.file.targetVertex.isEmpty()) {
9
+ console.debug("Migrate 'AudioClipBox' remove clip without AudioFileBox");
10
+ boxGraph.beginTransaction();
11
+ box.delete();
12
+ boxGraph.endTransaction();
13
+ return;
14
+ }
8
15
  if (box.events.isEmpty()) {
9
16
  console.debug("Migrate 'AudioClipBox' to have a ValueEventCollectionBox");
10
17
  boxGraph.beginTransaction();
@@ -1 +1 @@
1
- {"version":3,"file":"MigrateAudioRegionBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioRegionBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAqC,cAAc,EAAE,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAWxH,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,KAAG,IA6C3G,CAAA"}
1
+ {"version":3,"file":"MigrateAudioRegionBox.d.ts","sourceRoot":"","sources":["../../../src/project/migration/MigrateAudioRegionBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAqC,cAAc,EAAE,KAAK,EAA0B,MAAM,uBAAuB,CAAA;AAWxH,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,KAAG,IAoD3G,CAAA"}
@@ -6,6 +6,13 @@ import { AudioContentHelpers } from "../audio/AudioContentHelpers";
6
6
  const isIntEncodedAsFloat = (v) => v > 0 && v < 1e-6 && Number.isFinite(v) && (v / 1.401298464324817e-45) % 1 === 0;
7
7
  const toSeconds = (property, bpm) => PPQN.pulsesToSeconds(property.getValue(), bpm);
8
8
  export const migrateAudioRegionBox = (boxGraph, box, bpm) => {
9
+ if (box.file.targetVertex.isEmpty()) {
10
+ console.debug("Migrate 'AudioRegionBox' remove region without AudioFileBox");
11
+ boxGraph.beginTransaction();
12
+ box.delete();
13
+ boxGraph.endTransaction();
14
+ return;
15
+ }
9
16
  const { duration, loopOffset, loopDuration, playback } = box;
10
17
  if (isIntEncodedAsFloat(duration.getValue())
11
18
  || isIntEncodedAsFloat(loopOffset.getValue())
@@ -1 +1 @@
1
- {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAI1C,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
1
+ {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAGnD,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
@@ -12,7 +12,7 @@ import { network, Promises } from "@opendaw/lib-runtime";
12
12
  import { Sample } from "@opendaw/studio-adapters";
13
13
  import { base64Credentials, OpenDAWHeaders } from "../OpenDAWHeaders";
14
14
  import { z } from "zod";
15
- import { WavFile } from "../WavFile";
15
+ import { WavFile } from "@opendaw/lib-dsp";
16
16
  // Standard openDAW samples (considered to be non-removable)
17
17
  export class OpenSampleAPI {
18
18
  static ApiRoot = "https://api.opendaw.studio/samples";
@@ -5,7 +5,7 @@ import { SamplePeaks } from "@opendaw/lib-fusion";
5
5
  import { AudioFileBox } from "@opendaw/studio-boxes";
6
6
  import { AssetService } from "../AssetService";
7
7
  import { FilePickerAcceptTypes } from "../FilePickerAcceptTypes";
8
- import { WavFile } from "../WavFile";
8
+ import { WavFile } from "@opendaw/lib-dsp";
9
9
  import { Workers } from "../Workers";
10
10
  import { SampleStorage } from "./SampleStorage";
11
11
  import { OpenSampleAPI } from "./OpenSampleAPI";
@@ -1 +1 @@
1
- {"version":3,"file":"SampleStorage.d.ts","sourceRoot":"","sources":["../../src/samples/SampleStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAG/D,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAE1C,yBAAiB,aAAa,CAAC;IAC3B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,WAAW,CAAC;QACnB,IAAI,EAAE,cAAc,CAAA;KACvB,CAAA;CACJ;AAED,qBAAa,aAAc,SAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC3H,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAe;IAGrC,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAED,IAAI,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,EAAE,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;CAgB5E"}
1
+ {"version":3,"file":"SampleStorage.d.ts","sourceRoot":"","sources":["../../src/samples/SampleStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAE/D,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAEnD,yBAAiB,aAAa,CAAC;IAC3B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,KAAK,EAAE,SAAS,CAAC;QACjB,KAAK,EAAE,WAAW,CAAC;QACnB,IAAI,EAAE,cAAc,CAAA;KACvB,CAAA;CACJ;AAED,qBAAa,aAAc,SAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC3H,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAe;IAGrC,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAED,IAAI,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,EAAE,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;CAgB5E"}
@@ -10,8 +10,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { ByteArrayInput, EmptyExec, Lazy, UUID } from "@opendaw/lib-std";
11
11
  import { SamplePeaks } from "@opendaw/lib-fusion";
12
12
  import { Workers } from "../Workers";
13
- import { WavFile } from "../WavFile";
14
13
  import { Storage } from "../Storage";
14
+ import { WavFile } from "@opendaw/lib-dsp";
15
15
  export class SampleStorage extends Storage {
16
16
  static Folder = "samples/v2";
17
17
  static get() { return new SampleStorage(); }
@@ -1 +1 @@
1
- {"version":3,"file":"ClipboardManager.d.ts","sourceRoot":"","sources":["../../../src/ui/clipboard/ClipboardManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAA;AASzE,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACpD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CACjC,CAAA;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,cAAc;IACtD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACxD,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IACjB,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IAChB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CACrC;AAED,yBAAiB,gBAAgB,CAAC;IAC9B,KAAK,QAAQ,GAAG,cAAc,CAAA;IA0B9B,MAAM,CAAC,MAAM,OAAO,GAAI,CAAC,SAAS,QAAQ,EAAE,SAAS,WAAW,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAAG,YAsHhG,CAAA;;CACJ"}
1
+ {"version":3,"file":"ClipboardManager.d.ts","sourceRoot":"","sources":["../../../src/ui/clipboard/ClipboardManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAA;AASzE,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACpD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CACjC,CAAA;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,cAAc;IACtD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACxD,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IACjB,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;IAChB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CACrC;AAED,yBAAiB,gBAAgB,CAAC;IAC9B,KAAK,QAAQ,GAAG,cAAc,CAAA;IA0B9B,MAAM,CAAC,MAAM,OAAO,GAAI,CAAC,SAAS,QAAQ,EAAE,SAAS,WAAW,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAAG,YA4HhG,CAAA;;CACJ"}
@@ -1,5 +1,5 @@
1
1
  import { Option, Terminable } from "@opendaw/lib-std";
2
- import { Events, ReservedShortcuts } from "@opendaw/lib-dom";
2
+ import { Clipboard, Events, ReservedShortcuts } from "@opendaw/lib-dom";
3
3
  import { ContextMenu } from "./ContextMenu";
4
4
  import { MenuItem } from "../menu/MenuItems";
5
5
  import { StudioPreferences } from "../../StudioPreferences";
@@ -40,7 +40,7 @@ export var ClipboardManager;
40
40
  const noClient = { clientX: 0, clientY: 0 };
41
41
  const writeEntry = (entry) => {
42
42
  fallbackEntry = Option.wrap(entry);
43
- navigator.clipboard?.writeText(encode(entry)).catch(() => { });
43
+ Clipboard.writeText(encode(entry));
44
44
  };
45
45
  const performCopy = () => {
46
46
  if (!handler.canCopy(noClient)) {
@@ -60,7 +60,7 @@ export var ClipboardManager;
60
60
  };
61
61
  const performPaste = async () => {
62
62
  try {
63
- const rawText = await navigator.clipboard.readText();
63
+ const rawText = await Clipboard.readText();
64
64
  const text = Option.wrap(rawText);
65
65
  const entry = text.flatMap(decode);
66
66
  if (entry.nonEmpty()) {
@@ -88,6 +88,9 @@ export var ClipboardManager;
88
88
  }
89
89
  };
90
90
  return Terminable.many(Events.subscribe(element, "copy", (event) => {
91
+ if (Events.isTextInput(document.activeElement)) {
92
+ return;
93
+ }
91
94
  if (!handler.canCopy(noClient)) {
92
95
  return;
93
96
  }
@@ -99,6 +102,9 @@ export var ClipboardManager;
99
102
  event.clipboardData?.setData("text/plain", encoded);
100
103
  });
101
104
  }), Events.subscribe(element, "cut", (event) => {
105
+ if (Events.isTextInput(document.activeElement)) {
106
+ return;
107
+ }
102
108
  if (!handler.canCut(noClient)) {
103
109
  return;
104
110
  }
@@ -110,6 +116,9 @@ export var ClipboardManager;
110
116
  event.clipboardData?.setData("text/plain", encoded);
111
117
  });
112
118
  }), Events.subscribe(document, "paste", (event) => {
119
+ if (Events.isTextInput(document.activeElement)) {
120
+ return;
121
+ }
113
122
  if (!element.contains(document.activeElement) && document.activeElement !== document.body) {
114
123
  return;
115
124
  }
@@ -120,6 +129,7 @@ export var ClipboardManager;
120
129
  return;
121
130
  }
122
131
  event.preventDefault();
132
+ event.stopImmediatePropagation();
123
133
  handler.paste(entry.unwrap());
124
134
  }
125
135
  else {
@@ -128,10 +138,14 @@ export var ClipboardManager;
128
138
  return;
129
139
  }
130
140
  event.preventDefault();
141
+ event.stopImmediatePropagation();
131
142
  handler.paste(entry);
132
143
  });
133
144
  }
134
145
  }), Events.subscribe(document, "keydown", (event) => {
146
+ if (Events.isTextInput(document.activeElement)) {
147
+ return;
148
+ }
135
149
  if (!element.contains(document.activeElement) && document.activeElement !== document.body) {
136
150
  return;
137
151
  }
@@ -156,7 +170,7 @@ export var ClipboardManager;
156
170
  return;
157
171
  }
158
172
  const { client } = collector;
159
- const text = await Option.async(navigator.clipboard.readText());
173
+ const text = await Option.async(Clipboard.readText());
160
174
  const entry = text.flatMap(decode);
161
175
  const canPaste = entry.map(entry => handler.canPaste(entry, client))
162
176
  .unwrapOrElse(() => fallbackEntry
@@ -1 +1 @@
1
- {"version":3,"file":"AudioUnitsClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/AudioUnitsClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,OAAO,EAAO,MAAM,EAAY,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAM,QAAQ,EAAa,MAAM,kBAAkB,CAAA;AAW1D,OAAO,EAAC,mBAAmB,EAAqB,cAAc,EAAE,WAAW,EAAC,MAAM,0BAA0B,CAAA;AAC5G,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,mBAAmB,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAMxD,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;QACvC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAA;QACtC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;KACrE,CAAA;IAaM,MAAM,aAAa,GAAI,yFAOG,OAAO,KAAG,gBAAgB,CAAC,mBAAmB,CAsE9E,CAAA;CA6GJ"}
1
+ {"version":3,"file":"AudioUnitsClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/AudioUnitsClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,OAAO,EAAO,MAAM,EAAY,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAM,QAAQ,EAAa,MAAM,kBAAkB,CAAA;AAW1D,OAAO,EAAC,mBAAmB,EAAqB,cAAc,EAAE,WAAW,EAAC,MAAM,0BAA0B,CAAA;AAC5G,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,mBAAmB,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAMxD,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;QACvC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAA;QACtC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;KACrE,CAAA;IAaM,MAAM,aAAa,GAAI,yFAOG,OAAO,KAAG,gBAAgB,CAAC,mBAAmB,CAsE9E,CAAA;CA+GJ"}
@@ -99,8 +99,8 @@ export var AudioUnitsClipboard;
99
99
  if (isOutputPaste) {
100
100
  // Split into two transactions to ensure deletion notifications fire
101
101
  // before new boxes are created (avoids "already has input" conflict)
102
- editing.modify(() => clearOutputContent(rootBoxAdapter), false);
103
- editing.modify(() => pasteOutputContent(entry.data, boxGraph, rootBoxAdapter));
102
+ editing.modify(() => clearOutputContent(rootBoxAdapter));
103
+ editing.append(() => pasteOutputContent(entry.data, boxGraph, rootBoxAdapter));
104
104
  }
105
105
  else {
106
106
  editing.modify(() => {
@@ -138,6 +138,9 @@ export var AudioUnitsClipboard;
138
138
  }
139
139
  ClipboardUtils.deserializeBoxes(data, boxGraph, {
140
140
  mapPointer: (pointer, address) => {
141
+ if (address.isEmpty()) {
142
+ return Option.None;
143
+ }
141
144
  if (pointer.pointerType === Pointers.TrackCollection) {
142
145
  return Option.wrap(outputBox.tracks.address);
143
146
  }
@@ -169,6 +172,9 @@ export var AudioUnitsClipboard;
169
172
  }
170
173
  const boxes = ClipboardUtils.deserializeBoxes(data, boxGraph, {
171
174
  mapPointer: (pointer, address) => {
175
+ if (address.isEmpty()) {
176
+ return Option.None;
177
+ }
172
178
  if (pointer.pointerType === Pointers.AudioUnits) {
173
179
  return Option.wrap(rootBox.audioUnits.address);
174
180
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DevicesClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,OAAO,EAAkB,MAAM,EAAY,QAAQ,EAAkB,MAAM,kBAAkB,CAAA;AACtI,OAAO,EAAM,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAEH,WAAW,EACX,gBAAgB,EAEhB,UAAU,EAGV,iBAAiB,EAGpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAajD,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;QACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;KACjD,CAAA;IAyBM,MAAM,aAAa,GAAI,oEAOG,OAAO,KAAG,gBAAgB,CAAC,gBAAgB,CA0J3E,CAAA;CACJ"}
1
+ {"version":3,"file":"DevicesClipboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,OAAO,EAKP,MAAM,EAEN,QAAQ,EAGX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAM,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAEH,WAAW,EACX,gBAAgB,EAEhB,UAAU,EAGV,iBAAiB,EAGpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAGpE,KAAK,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAajD,yBAAiB,gBAAgB,CAAC;IAC9B,KAAY,OAAO,GAAG;QAClB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;QAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;QACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;KACjD,CAAA;IAyBM,MAAM,aAAa,GAAI,oEAOG,OAAO,KAAG,gBAAgB,CAAC,gBAAgB,CAwN3E,CAAA;CACJ"}
@@ -1,5 +1,6 @@
1
- import { ByteArrayInput, ByteArrayOutput, isDefined, Option, RuntimeNotifier } from "@opendaw/lib-std";
1
+ import { ByteArrayInput, ByteArrayOutput, isDefined, isInstanceOf, isNotNull, Option, RuntimeNotifier } from "@opendaw/lib-std";
2
2
  import { Pointers } from "@opendaw/studio-enums";
3
+ import { RootBox, TrackBox } from "@opendaw/studio-boxes";
3
4
  import { DeviceBoxUtils, Devices } from "@opendaw/studio-adapters";
4
5
  import { ClipboardUtils } from "../ClipboardUtils";
5
6
  export var DevicesClipboard;
@@ -63,16 +64,51 @@ export var DevicesClipboard;
63
64
  ...midiEffects.map(adapter => adapter.box),
64
65
  ...audioEffects.map(adapter => adapter.box)
65
66
  ];
66
- const dependencies = deviceBoxes.flatMap(box => Array.from(boxGraph.dependenciesOf(box, {
67
- alwaysFollowMandatory: true,
68
- excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
69
- }).boxes).filter(dep => dep.resource === "preserved"));
70
- const allBoxes = [...deviceBoxes, ...dependencies];
71
- const instrumentContent = instrument !== null
67
+ const dependencies = deviceBoxes.flatMap(box => {
68
+ const ownedChildren = box.incomingEdges()
69
+ .filter(pointer => pointer.mandatory && !pointer.box.ephemeral
70
+ && !isDefined(pointer.box.resource))
71
+ .map(pointer => pointer.box);
72
+ const mandatoryDeps = Array.from(boxGraph.dependenciesOf(box, {
73
+ alwaysFollowMandatory: true,
74
+ excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
75
+ || dep.name === RootBox.ClassName
76
+ }).boxes).filter(dep => !isDefined(dep.resource));
77
+ const preserved = [box, ...ownedChildren].flatMap(root => Array.from(boxGraph.dependenciesOf(root, {
78
+ alwaysFollowMandatory: true,
79
+ excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
80
+ }).boxes).filter(dep => dep.resource === "preserved"));
81
+ return [...ownedChildren, ...mandatoryDeps, ...preserved];
82
+ });
83
+ const trackContent = [];
84
+ if (isNotNull(instrument)) {
85
+ getHost().ifSome(host => {
86
+ const tracksField = host.audioUnitBoxAdapter().tracksField;
87
+ for (const pointer of tracksField.pointerHub.filter(Pointers.TrackCollection)) {
88
+ if (!isInstanceOf(pointer.box, TrackBox)) {
89
+ continue;
90
+ }
91
+ const track = pointer.box;
92
+ trackContent.push(track);
93
+ for (const regionPointer of track.regions.pointerHub.incoming()) {
94
+ trackContent.push(regionPointer.box);
95
+ const regionDeps = Array.from(boxGraph.dependenciesOf(regionPointer.box, {
96
+ alwaysFollowMandatory: true,
97
+ excludeBox: (dep) => dep.ephemeral
98
+ || isInstanceOf(dep, TrackBox)
99
+ || DeviceBoxUtils.isDeviceBox(dep)
100
+ }).boxes);
101
+ trackContent.push(...regionDeps);
102
+ }
103
+ }
104
+ });
105
+ }
106
+ const allBoxes = [...deviceBoxes, ...dependencies, ...trackContent];
107
+ const instrumentContent = isNotNull(instrument)
72
108
  ? instrument.box.tags.content ?? ""
73
109
  : "";
74
110
  const metadata = {
75
- hasInstrument: instrument !== null,
111
+ hasInstrument: isNotNull(instrument),
76
112
  instrumentContent,
77
113
  midiEffectCount: midiEffects.length,
78
114
  midiEffectMaxIndex,
@@ -142,6 +178,12 @@ export var DevicesClipboard;
142
178
  editing.modify(() => {
143
179
  selection.deselectAll();
144
180
  if (replaceInstrument && isDefined(selectedInstrument)) {
181
+ const tracksField = host.audioUnitBoxAdapter().tracksField;
182
+ for (const pointer of tracksField.pointerHub.filter(Pointers.TrackCollection)) {
183
+ if (isInstanceOf(pointer.box, TrackBox)) {
184
+ pointer.box.delete();
185
+ }
186
+ }
145
187
  selectedInstrument.box.delete();
146
188
  }
147
189
  for (const adapter of host.midiEffects.adapters()) {
@@ -157,7 +199,10 @@ export var DevicesClipboard;
157
199
  }
158
200
  }
159
201
  const boxes = ClipboardUtils.deserializeBoxes(entry.data, boxGraph, {
160
- mapPointer: pointer => {
202
+ mapPointer: (pointer, address) => {
203
+ if (address.isEmpty()) {
204
+ return Option.None;
205
+ }
161
206
  if (pointer.pointerType === Pointers.InstrumentHost && replaceInstrument) {
162
207
  return Option.wrap(host.inputField.address);
163
208
  }
@@ -167,9 +212,23 @@ export var DevicesClipboard;
167
212
  if (pointer.pointerType === Pointers.AudioEffectHost) {
168
213
  return Option.wrap(host.audioEffectsField.address);
169
214
  }
215
+ if (pointer.pointerType === Pointers.TrackCollection && replaceInstrument) {
216
+ return Option.wrap(host.audioUnitBoxAdapter().tracksField.address);
217
+ }
218
+ if (pointer.pointerType === Pointers.Automation && replaceInstrument) {
219
+ return Option.wrap(host.audioUnitBoxAdapter().address);
220
+ }
221
+ if (pointer.pointerType === Pointers.MIDIDevice) {
222
+ const rootBox = boxGraph.boxes()
223
+ .find(box => isInstanceOf(box, RootBox));
224
+ if (isDefined(rootBox)) {
225
+ return Option.wrap(rootBox.outputMidiDevices.address);
226
+ }
227
+ }
170
228
  return Option.None;
171
229
  },
172
- excludeBox: box => DeviceBoxUtils.isInstrumentDeviceBox(box) && !replaceInstrument
230
+ excludeBox: box => !replaceInstrument
231
+ && (DeviceBoxUtils.isInstrumentDeviceBox(box) || isInstanceOf(box, TrackBox))
173
232
  });
174
233
  const deviceBoxes = boxes.filter(box => DeviceBoxUtils.isDeviceBox(box));
175
234
  const newMidiEffects = deviceBoxes
@@ -180,6 +239,14 @@ export var DevicesClipboard;
180
239
  .sort((a, b) => a.index.getValue() - b.index.getValue());
181
240
  newMidiEffects.forEach((box, idx) => box.index.setValue(midiInsertIndex + idx));
182
241
  newAudioEffects.forEach((box, idx) => box.index.setValue(audioInsertIndex + idx));
242
+ if (replaceInstrument) {
243
+ const tracksField = host.audioUnitBoxAdapter().tracksField;
244
+ const allTracks = tracksField.pointerHub.filter(Pointers.TrackCollection)
245
+ .filter(pointer => isInstanceOf(pointer.box, TrackBox))
246
+ .map(pointer => pointer.box)
247
+ .sort((trackA, trackB) => trackA.index.getValue() - trackB.index.getValue());
248
+ allTracks.forEach((track, idx) => track.index.setValue(idx));
249
+ }
183
250
  selection.select(...deviceBoxes.map(box => boxAdapters.adapterFor(box, Devices.isAny)));
184
251
  });
185
252
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DevicesClipboardHandler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevicesClipboardHandler.test.d.ts","sourceRoot":"","sources":["../../../../src/ui/clipboard/types/DevicesClipboardHandler.test.ts"],"names":[],"mappings":""}