@opendaw/studio-core 0.0.126 → 0.0.127

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 (76) 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/capture/RecordAudio.d.ts.map +1 -1
  25. package/dist/capture/RecordAudio.js +48 -18
  26. package/dist/capture/RecordAutomation.d.ts.map +1 -1
  27. package/dist/capture/RecordAutomation.js +219 -198
  28. package/dist/capture/RecordMidi.d.ts.map +1 -1
  29. package/dist/capture/RecordMidi.js +1 -1
  30. package/dist/cloud/CloudBackupSamples.js +1 -1
  31. package/dist/dawproject/DawProjectExporter.js +1 -1
  32. package/dist/dawproject/DawProjectService.d.ts.map +1 -1
  33. package/dist/dawproject/DawProjectService.js +3 -16
  34. package/dist/index.d.ts +0 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +0 -1
  37. package/dist/midi/MidiDevices.d.ts.map +1 -1
  38. package/dist/midi/MidiDevices.js +8 -2
  39. package/dist/offline-engine.js +1 -1
  40. package/dist/offline-engine.js.map +3 -3
  41. package/dist/processors.js +37 -25
  42. package/dist/processors.js.map +4 -4
  43. package/dist/project/Project.d.ts.map +1 -1
  44. package/dist/project/Project.js +27 -2
  45. package/dist/project/Recovery.js +1 -1
  46. package/dist/project/migration/MigrateAudioClipBox.d.ts.map +1 -1
  47. package/dist/project/migration/MigrateAudioClipBox.js +7 -0
  48. package/dist/project/migration/MigrateAudioRegionBox.d.ts.map +1 -1
  49. package/dist/project/migration/MigrateAudioRegionBox.js +7 -0
  50. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  51. package/dist/samples/OpenSampleAPI.js +1 -1
  52. package/dist/samples/SampleService.js +1 -1
  53. package/dist/samples/SampleStorage.d.ts.map +1 -1
  54. package/dist/samples/SampleStorage.js +1 -1
  55. package/dist/ui/clipboard/ClipboardManager.d.ts.map +1 -1
  56. package/dist/ui/clipboard/ClipboardManager.js +18 -4
  57. package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.js +2 -2
  58. package/dist/ui/clipboard/types/DevicesClipboardHandler.d.ts.map +1 -1
  59. package/dist/ui/clipboard/types/DevicesClipboardHandler.js +61 -9
  60. package/dist/ui/clipboard/types/DevicesClipboardHandler.test.d.ts +2 -0
  61. package/dist/ui/clipboard/types/DevicesClipboardHandler.test.d.ts.map +1 -0
  62. package/dist/ui/clipboard/types/DevicesClipboardHandler.test.js +976 -0
  63. package/dist/ui/timeline/RegionClipResolver.d.ts.map +1 -1
  64. package/dist/ui/timeline/RegionClipResolver.js +21 -29
  65. package/dist/ui/timeline/TimeGrid.d.ts +2 -0
  66. package/dist/ui/timeline/TimeGrid.d.ts.map +1 -1
  67. package/dist/ui/timeline/TimeGrid.js +13 -1
  68. package/dist/workers-main.js +1 -1
  69. package/dist/workers-main.js.map +3 -3
  70. package/dist/ysync/YService.d.ts +6 -1
  71. package/dist/ysync/YService.d.ts.map +1 -1
  72. package/dist/ysync/YService.js +2 -2
  73. package/package.json +15 -15
  74. package/dist/WavFile.d.ts +0 -7
  75. package/dist/WavFile.d.ts.map +0 -1
  76. 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";
@@ -130,6 +130,31 @@ export class Project {
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
@@ -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(() => {
@@ -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,CA2M3E,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 { 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,46 @@ 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 preserved = [box, ...ownedChildren].flatMap(root => Array.from(boxGraph.dependenciesOf(root, {
73
+ alwaysFollowMandatory: true,
74
+ excludeBox: (dep) => dep.ephemeral || DeviceBoxUtils.isDeviceBox(dep)
75
+ }).boxes).filter(dep => dep.resource === "preserved"));
76
+ return [...ownedChildren, ...preserved];
77
+ });
78
+ const trackContent = [];
79
+ if (isNotNull(instrument)) {
80
+ getHost().ifSome(host => {
81
+ const tracksField = host.audioUnitBoxAdapter().tracksField;
82
+ for (const pointer of tracksField.pointerHub.filter(Pointers.TrackCollection)) {
83
+ if (!isInstanceOf(pointer.box, TrackBox)) {
84
+ continue;
85
+ }
86
+ const track = pointer.box;
87
+ trackContent.push(track);
88
+ for (const regionPointer of track.regions.pointerHub.incoming()) {
89
+ trackContent.push(regionPointer.box);
90
+ const regionDeps = Array.from(boxGraph.dependenciesOf(regionPointer.box, {
91
+ alwaysFollowMandatory: true,
92
+ excludeBox: (dep) => dep.ephemeral
93
+ || isInstanceOf(dep, TrackBox)
94
+ || DeviceBoxUtils.isDeviceBox(dep)
95
+ }).boxes);
96
+ trackContent.push(...regionDeps);
97
+ }
98
+ }
99
+ });
100
+ }
101
+ const allBoxes = [...deviceBoxes, ...dependencies, ...trackContent];
102
+ const instrumentContent = isNotNull(instrument)
72
103
  ? instrument.box.tags.content ?? ""
73
104
  : "";
74
105
  const metadata = {
75
- hasInstrument: instrument !== null,
106
+ hasInstrument: isNotNull(instrument),
76
107
  instrumentContent,
77
108
  midiEffectCount: midiEffects.length,
78
109
  midiEffectMaxIndex,
@@ -142,6 +173,12 @@ export var DevicesClipboard;
142
173
  editing.modify(() => {
143
174
  selection.deselectAll();
144
175
  if (replaceInstrument && isDefined(selectedInstrument)) {
176
+ const tracksField = host.audioUnitBoxAdapter().tracksField;
177
+ for (const pointer of tracksField.pointerHub.filter(Pointers.TrackCollection)) {
178
+ if (isInstanceOf(pointer.box, TrackBox)) {
179
+ pointer.box.delete();
180
+ }
181
+ }
145
182
  selectedInstrument.box.delete();
146
183
  }
147
184
  for (const adapter of host.midiEffects.adapters()) {
@@ -167,9 +204,16 @@ export var DevicesClipboard;
167
204
  if (pointer.pointerType === Pointers.AudioEffectHost) {
168
205
  return Option.wrap(host.audioEffectsField.address);
169
206
  }
207
+ if (pointer.pointerType === Pointers.TrackCollection && replaceInstrument) {
208
+ return Option.wrap(host.audioUnitBoxAdapter().tracksField.address);
209
+ }
210
+ if (pointer.pointerType === Pointers.Automation && replaceInstrument) {
211
+ return Option.wrap(host.audioUnitBoxAdapter().address);
212
+ }
170
213
  return Option.None;
171
214
  },
172
- excludeBox: box => DeviceBoxUtils.isInstrumentDeviceBox(box) && !replaceInstrument
215
+ excludeBox: box => !replaceInstrument
216
+ && (DeviceBoxUtils.isInstrumentDeviceBox(box) || isInstanceOf(box, TrackBox))
173
217
  });
174
218
  const deviceBoxes = boxes.filter(box => DeviceBoxUtils.isDeviceBox(box));
175
219
  const newMidiEffects = deviceBoxes
@@ -180,6 +224,14 @@ export var DevicesClipboard;
180
224
  .sort((a, b) => a.index.getValue() - b.index.getValue());
181
225
  newMidiEffects.forEach((box, idx) => box.index.setValue(midiInsertIndex + idx));
182
226
  newAudioEffects.forEach((box, idx) => box.index.setValue(audioInsertIndex + idx));
227
+ if (replaceInstrument) {
228
+ const tracksField = host.audioUnitBoxAdapter().tracksField;
229
+ const allTracks = tracksField.pointerHub.filter(Pointers.TrackCollection)
230
+ .filter(pointer => isInstanceOf(pointer.box, TrackBox))
231
+ .map(pointer => pointer.box)
232
+ .sort((trackA, trackB) => trackA.index.getValue() - trackB.index.getValue());
233
+ allTracks.forEach((track, idx) => track.index.setValue(idx));
234
+ }
183
235
  selection.select(...deviceBoxes.map(box => boxAdapters.adapterFor(box, Devices.isAny)));
184
236
  });
185
237
  }
@@ -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":""}