@opendaw/studio-core 0.0.56 → 0.0.57

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 (127) hide show
  1. package/dist/AudioOfflineRenderer.d.ts.map +1 -1
  2. package/dist/AudioOfflineRenderer.js +30 -17
  3. package/dist/EffectBox.d.ts +2 -2
  4. package/dist/EffectBox.d.ts.map +1 -1
  5. package/dist/EffectFactories.d.ts +3 -0
  6. package/dist/EffectFactories.d.ts.map +1 -1
  7. package/dist/EffectFactories.js +40 -27
  8. package/dist/EffectFactory.d.ts +3 -2
  9. package/dist/EffectFactory.d.ts.map +1 -1
  10. package/dist/Engine.d.ts +2 -0
  11. package/dist/Engine.d.ts.map +1 -1
  12. package/dist/EngineFacade.d.ts +2 -0
  13. package/dist/EngineFacade.d.ts.map +1 -1
  14. package/dist/EngineFacade.js +2 -0
  15. package/dist/EngineWorklet.d.ts +2 -0
  16. package/dist/EngineWorklet.d.ts.map +1 -1
  17. package/dist/EngineWorklet.js +13 -1
  18. package/dist/ExternalLib.d.ts +6 -0
  19. package/dist/ExternalLib.d.ts.map +1 -0
  20. package/dist/ExternalLib.js +11 -0
  21. package/dist/FilePickerAcceptTypes.d.ts +1 -0
  22. package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
  23. package/dist/FilePickerAcceptTypes.js +4 -0
  24. package/dist/Preferences.d.ts +2 -0
  25. package/dist/Preferences.d.ts.map +1 -1
  26. package/dist/Preferences.js +2 -1
  27. package/dist/capture/RecordAudio.d.ts +1 -1
  28. package/dist/capture/RecordAudio.d.ts.map +1 -1
  29. package/dist/capture/RecordAudio.js +4 -5
  30. package/dist/capture/RecordMidi.d.ts +1 -1
  31. package/dist/capture/RecordMidi.d.ts.map +1 -1
  32. package/dist/capture/RecordMidi.js +1 -2
  33. package/dist/capture/Recording.js +2 -2
  34. package/dist/dawproject/AudioUnitExportLayout.d.ts.map +1 -1
  35. package/dist/dawproject/AudioUnitExportLayout.js +1 -1
  36. package/dist/dawproject/BuiltinDevices.d.ts +3 -3
  37. package/dist/dawproject/BuiltinDevices.d.ts.map +1 -1
  38. package/dist/dawproject/BuiltinDevices.js +1 -1
  39. package/dist/dawproject/DawProject.d.ts +3 -3
  40. package/dist/dawproject/DawProject.d.ts.map +1 -1
  41. package/dist/dawproject/DawProject.js +6 -5
  42. package/dist/dawproject/DawProjectExporter.d.ts +2 -2
  43. package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
  44. package/dist/dawproject/DawProjectExporter.js +5 -6
  45. package/dist/dawproject/DawProjectExporter.test.js +24 -28
  46. package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
  47. package/dist/dawproject/DawProjectImporter.js +3 -6
  48. package/dist/dawproject/DawProjectService.d.ts.map +1 -1
  49. package/dist/dawproject/DawProjectService.js +11 -1
  50. package/dist/dawproject/DeviceIO.d.ts +1 -1
  51. package/dist/dawproject/DeviceIO.d.ts.map +1 -1
  52. package/dist/dawproject/DeviceIO.js +2 -2
  53. package/dist/index.d.ts +1 -9
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -9
  56. package/dist/processors.js +19 -17
  57. package/dist/processors.js.map +4 -4
  58. package/dist/project/Project.d.ts +2 -2
  59. package/dist/project/Project.d.ts.map +1 -1
  60. package/dist/project/Project.js +18 -64
  61. package/dist/project/ProjectApi.d.ts +5 -8
  62. package/dist/project/ProjectApi.d.ts.map +1 -1
  63. package/dist/project/ProjectApi.js +8 -59
  64. package/dist/project/ProjectBundle.d.ts.map +1 -1
  65. package/dist/project/ProjectBundle.js +3 -2
  66. package/dist/project/ProjectMigration.d.ts.map +1 -1
  67. package/dist/project/ProjectMigration.js +64 -3
  68. package/dist/project/ProjectStorage.js +2 -2
  69. package/dist/project/index.d.ts +0 -1
  70. package/dist/project/index.d.ts.map +1 -1
  71. package/dist/project/index.js +0 -1
  72. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  73. package/dist/samples/OpenSampleAPI.js +6 -0
  74. package/dist/samples/SampleService.js +1 -1
  75. package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -1
  76. package/dist/soundfont/DefaultSoundfontLoader.js +3 -2
  77. package/dist/soundfont/SoundfontService.d.ts.map +1 -1
  78. package/dist/soundfont/SoundfontService.js +2 -2
  79. package/dist/ui/RegionClipResolver.d.ts +37 -0
  80. package/dist/ui/RegionClipResolver.d.ts.map +1 -0
  81. package/dist/ui/RegionClipResolver.js +179 -0
  82. package/dist/ui/RegionClipResolver.test.d.ts +2 -0
  83. package/dist/ui/RegionClipResolver.test.d.ts.map +1 -0
  84. package/dist/ui/RegionClipResolver.test.js +166 -0
  85. package/dist/ui/RegionModifyStrategies.d.ts +25 -0
  86. package/dist/ui/RegionModifyStrategies.d.ts.map +1 -0
  87. package/dist/ui/RegionModifyStrategies.js +25 -0
  88. package/dist/ui/index.d.ts +2 -0
  89. package/dist/ui/index.d.ts.map +1 -1
  90. package/dist/ui/index.js +2 -0
  91. package/dist/workers-main.js +4 -2
  92. package/dist/workers-main.js.map +3 -3
  93. package/dist/ysync/YService.js +2 -2
  94. package/package.json +15 -15
  95. package/dist/AudioUnitOrdering.d.ts +0 -3
  96. package/dist/AudioUnitOrdering.d.ts.map +0 -1
  97. package/dist/AudioUnitOrdering.js +0 -7
  98. package/dist/ColorCodes.d.ts +0 -7
  99. package/dist/ColorCodes.d.ts.map +0 -1
  100. package/dist/ColorCodes.js +0 -32
  101. package/dist/Colors.d.ts +0 -15
  102. package/dist/Colors.d.ts.map +0 -1
  103. package/dist/Colors.js +0 -23
  104. package/dist/InstrumentBox.d.ts +0 -3
  105. package/dist/InstrumentBox.d.ts.map +0 -1
  106. package/dist/InstrumentBox.js +0 -1
  107. package/dist/InstrumentFactories.d.ts +0 -33
  108. package/dist/InstrumentFactories.d.ts.map +0 -1
  109. package/dist/InstrumentFactories.js +0 -122
  110. package/dist/InstrumentFactory.d.ts +0 -13
  111. package/dist/InstrumentFactory.d.ts.map +0 -1
  112. package/dist/InstrumentFactory.js +0 -1
  113. package/dist/InstrumentOptions.d.ts +0 -9
  114. package/dist/InstrumentOptions.d.ts.map +0 -1
  115. package/dist/InstrumentOptions.js +0 -1
  116. package/dist/InstrumentProduct.d.ts +0 -8
  117. package/dist/InstrumentProduct.d.ts.map +0 -1
  118. package/dist/InstrumentProduct.js +0 -1
  119. package/dist/project/ProjectUtils.d.ts +0 -12
  120. package/dist/project/ProjectUtils.d.ts.map +0 -1
  121. package/dist/project/ProjectUtils.js +0 -153
  122. package/dist/utils/AutofitUtils.d.ts +0 -7
  123. package/dist/utils/AutofitUtils.d.ts.map +0 -1
  124. package/dist/utils/AutofitUtils.js +0 -78
  125. package/dist/utils/index.d.ts +0 -2
  126. package/dist/utils/index.d.ts.map +0 -1
  127. package/dist/utils/index.js +0 -1
@@ -0,0 +1,179 @@
1
+ import { asDefined, assert, mod, panic } from "@opendaw/lib-std";
2
+ import { EventCollection, TimeBase } from "@opendaw/lib-dsp";
3
+ import { AudioRegionBoxAdapter, RegionEditing, TrackType, UnionAdapterTypes } from "@opendaw/studio-adapters";
4
+ import { RegionModifyStrategies } from "./RegionModifyStrategies";
5
+ // AudioRegions in absolute time-domain are allowed to overlap. Their duration changes when the tempo changes,
6
+ // but we do not truncate them to keep the original durations.
7
+ const allowOverlap = (region) => region instanceof AudioRegionBoxAdapter && region.timeBase !== TimeBase.Musical;
8
+ export class RegionClipResolver {
9
+ static fromSelection(tracks, adapters, strategy, deltaIndex = 0) {
10
+ const clipResolvers = new Map(tracks.map(track => ([track.listIndex, new RegionClipResolver(strategy, track)])));
11
+ adapters.forEach(adapter => {
12
+ const index = adapter.trackBoxAdapter.unwrap().listIndex + deltaIndex;
13
+ asDefined(clipResolvers.get(index), `Cannot find clip resolver for index(${index})`)
14
+ .addMask(adapter);
15
+ });
16
+ const tasks = Array.from(clipResolvers.values()).flatMap(resolver => resolver.#createSolver());
17
+ return () => tasks.forEach(task => task());
18
+ }
19
+ static fromRange(track, position, complete) {
20
+ // IdentityIncludeOrigin will include selected regions
21
+ const clipResolver = new RegionClipResolver(RegionModifyStrategies.IdentityIncludeOrigin, track);
22
+ clipResolver.addMaskRange(position, complete);
23
+ return clipResolver.#createSolver();
24
+ }
25
+ static validateTracks(tracks) {
26
+ for (const track of tracks) {
27
+ this.validateTrack(track);
28
+ }
29
+ }
30
+ static validateTrack(track) {
31
+ const array = track.regions.collection.asArray();
32
+ if (array.length === 0) {
33
+ return;
34
+ }
35
+ try {
36
+ let prev = array[0];
37
+ assert(prev.duration > 0, `duration(${prev.duration}) must be positive`);
38
+ for (let i = 1; i < array.length; i++) {
39
+ const next = array[i];
40
+ assert(next.duration > 0, `duration(${next.duration}) must be positive`);
41
+ if (!allowOverlap(prev) && prev.complete > next.position) {
42
+ return panic("Overlapping detected after clipping");
43
+ }
44
+ prev = next;
45
+ }
46
+ }
47
+ catch (error) {
48
+ console.error(JSON.stringify({
49
+ track: TrackType[track.type],
50
+ regions: array.map(x => ({ p: x.position, d: x.duration }))
51
+ }));
52
+ throw error;
53
+ }
54
+ }
55
+ static sortAndJoinMasks(masks) {
56
+ if (masks.length === 0) {
57
+ return panic("No clip-masks to solve");
58
+ }
59
+ if (masks.length === 1) {
60
+ return [masks[0]];
61
+ }
62
+ // Sort by position (start time) - create a copy to avoid mutating input
63
+ const sorted = [...masks].sort(EventCollection.DefaultComparator);
64
+ const merged = [];
65
+ let current = sorted[0];
66
+ for (let i = 1; i < sorted.length; i++) {
67
+ const next = sorted[i];
68
+ // Check if the next mask overlaps or is adjacent to the current
69
+ if (next.position <= current.complete) {
70
+ // Merge: extend current to cover both ranges
71
+ current = {
72
+ type: "range",
73
+ position: current.position,
74
+ complete: Math.max(current.complete, next.complete)
75
+ };
76
+ }
77
+ else {
78
+ // No overlap or adjacency: save current and move to next
79
+ merged.push(current);
80
+ current = next;
81
+ }
82
+ }
83
+ merged.push(current);
84
+ return merged;
85
+ }
86
+ #strategy;
87
+ #ground;
88
+ #masks;
89
+ constructor(strategy, ground) {
90
+ this.#strategy = strategy;
91
+ this.#ground = ground;
92
+ this.#masks = [];
93
+ }
94
+ addMask(region) {
95
+ const strategy = this.#strategy.selectedModifyStrategy();
96
+ this.addMaskRange(strategy.readPosition(region), strategy.readComplete(region));
97
+ }
98
+ addMaskRange(position, complete) {
99
+ this.#masks.push({ type: "range", position, complete });
100
+ }
101
+ #createSolver() {
102
+ const tasks = this.#createTasksFromMasks(RegionClipResolver.sortAndJoinMasks(this.#masks));
103
+ this.#masks.length = 0;
104
+ return () => this.#executeTasks(tasks);
105
+ }
106
+ #createTasksFromMasks(masks) {
107
+ const tasks = [];
108
+ masks.forEach(({ position, complete }) => {
109
+ for (const region of this.#ground.regions.collection.iterateRange(position, complete)) {
110
+ if (region.isSelected && !this.#strategy.showOrigin()) {
111
+ continue;
112
+ }
113
+ else if (region.duration <= 0) {
114
+ return panic(`Invalid duration(${region.duration})`);
115
+ }
116
+ else if (region.complete <= position || region.position >= complete) {
117
+ return panic("Not overlapping");
118
+ }
119
+ const positionIn = region.position >= position;
120
+ const completeIn = region.complete <= complete;
121
+ if (positionIn && completeIn) {
122
+ tasks.push({ type: "delete", region });
123
+ }
124
+ else if (!positionIn && !completeIn) {
125
+ tasks.push({ type: "separate", region, begin: position, end: complete });
126
+ }
127
+ else if (completeIn) {
128
+ tasks.push({ type: "complete", region, position });
129
+ }
130
+ else {
131
+ tasks.push({ type: "start", region, position: complete });
132
+ }
133
+ }
134
+ });
135
+ return tasks;
136
+ }
137
+ #executeTasks(tasks) {
138
+ tasks
139
+ .toSorted(({ type: a }, { type: b }) => {
140
+ if (a === "delete" && b !== "delete") {
141
+ return 1;
142
+ }
143
+ if (b === "delete" && a !== "delete") {
144
+ return -1;
145
+ }
146
+ return 0;
147
+ })
148
+ .forEach(task => {
149
+ const { type, region } = task;
150
+ switch (type) {
151
+ case "delete":
152
+ region.box.delete();
153
+ break;
154
+ case "start":
155
+ if (UnionAdapterTypes.isLoopableRegion(region)) {
156
+ const delta = task.position - region.position;
157
+ region.box.position.setValue(region.position + delta);
158
+ region.box.duration.setValue(region.duration - delta);
159
+ region.box.loopOffset.setValue(mod(region.loopOffset + delta, region.loopDuration));
160
+ }
161
+ else {
162
+ return panic("Not yet implemented");
163
+ }
164
+ break;
165
+ case "complete":
166
+ if (UnionAdapterTypes.isLoopableRegion(region)) {
167
+ region.box.duration.setValue(task.position - task.region.position);
168
+ }
169
+ else {
170
+ return panic("Not yet implemented");
171
+ }
172
+ break;
173
+ case "separate":
174
+ RegionEditing.clip(region, task.begin, task.end);
175
+ break;
176
+ }
177
+ });
178
+ }
179
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RegionClipResolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegionClipResolver.test.d.ts","sourceRoot":"","sources":["../../src/ui/RegionClipResolver.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,166 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { RegionClipResolver } from "./RegionClipResolver";
3
+ const createMask = (position, complete) => ({ type: "range", position, complete });
4
+ describe("RegionClipResolver.sortAndJoinMasks", () => {
5
+ it("should handle single mask", () => {
6
+ const masks = [createMask(0, 10)];
7
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
8
+ expect(result).toHaveLength(1);
9
+ expect(result[0]).toEqual(createMask(0, 10));
10
+ });
11
+ it("should merge two adjacent masks", () => {
12
+ const masks = [createMask(0, 10), createMask(10, 20)];
13
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
14
+ expect(result).toHaveLength(1);
15
+ expect(result[0]).toEqual(createMask(0, 20));
16
+ });
17
+ it("should keep two non-adjacent masks separate", () => {
18
+ const masks = [createMask(0, 10), createMask(15, 20)];
19
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
20
+ expect(result).toHaveLength(2);
21
+ expect(result[0]).toEqual(createMask(0, 10));
22
+ expect(result[1]).toEqual(createMask(15, 20));
23
+ });
24
+ it("should merge two overlapping masks", () => {
25
+ const masks = [createMask(0, 15), createMask(10, 20)];
26
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
27
+ expect(result).toHaveLength(1);
28
+ expect(result[0]).toEqual(createMask(0, 20));
29
+ });
30
+ it("should handle mask completely contained in another", () => {
31
+ const masks = [createMask(0, 100), createMask(10, 20)];
32
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
33
+ expect(result).toHaveLength(1);
34
+ expect(result[0]).toEqual(createMask(0, 100));
35
+ });
36
+ it("should handle multiple masks completely contained in one", () => {
37
+ const masks = [
38
+ createMask(0, 100),
39
+ createMask(10, 20),
40
+ createMask(30, 40),
41
+ createMask(50, 60)
42
+ ];
43
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
44
+ expect(result).toHaveLength(1);
45
+ expect(result[0]).toEqual(createMask(0, 100));
46
+ });
47
+ it("should sort unsorted masks before merging", () => {
48
+ const masks = [createMask(20, 30), createMask(0, 10), createMask(10, 20)];
49
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
50
+ expect(result).toHaveLength(1);
51
+ expect(result[0]).toEqual(createMask(0, 30));
52
+ });
53
+ it("should merge multiple overlapping masks into one", () => {
54
+ const masks = [
55
+ createMask(0, 15),
56
+ createMask(10, 25),
57
+ createMask(20, 35),
58
+ createMask(30, 40)
59
+ ];
60
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
61
+ expect(result).toHaveLength(1);
62
+ expect(result[0]).toEqual(createMask(0, 40));
63
+ });
64
+ it("should create multiple ranges for separated groups", () => {
65
+ const masks = [
66
+ createMask(0, 10),
67
+ createMask(10, 20),
68
+ createMask(30, 40),
69
+ createMask(40, 50),
70
+ createMask(60, 70)
71
+ ];
72
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
73
+ expect(result).toHaveLength(3);
74
+ expect(result[0]).toEqual(createMask(0, 20));
75
+ expect(result[1]).toEqual(createMask(30, 50));
76
+ expect(result[2]).toEqual(createMask(60, 70));
77
+ });
78
+ it("should handle complex mix of overlapping and separated masks", () => {
79
+ const masks = [
80
+ createMask(0, 15),
81
+ createMask(10, 25),
82
+ createMask(50, 60),
83
+ createMask(55, 70),
84
+ createMask(100, 110)
85
+ ];
86
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
87
+ expect(result).toHaveLength(3);
88
+ expect(result[0]).toEqual(createMask(0, 25));
89
+ expect(result[1]).toEqual(createMask(50, 70));
90
+ expect(result[2]).toEqual(createMask(100, 110));
91
+ });
92
+ it("should handle masks with same start position", () => {
93
+ const masks = [
94
+ createMask(0, 10),
95
+ createMask(0, 20),
96
+ createMask(0, 15)
97
+ ];
98
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
99
+ expect(result).toHaveLength(1);
100
+ expect(result[0]).toEqual(createMask(0, 20));
101
+ });
102
+ it("should handle masks with same end position", () => {
103
+ const masks = [
104
+ createMask(0, 20),
105
+ createMask(10, 20),
106
+ createMask(5, 20)
107
+ ];
108
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
109
+ expect(result).toHaveLength(1);
110
+ expect(result[0]).toEqual(createMask(0, 20));
111
+ });
112
+ it("should handle identical masks", () => {
113
+ const masks = [
114
+ createMask(0, 10),
115
+ createMask(0, 10),
116
+ createMask(0, 10)
117
+ ];
118
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
119
+ expect(result).toHaveLength(1);
120
+ expect(result[0]).toEqual(createMask(0, 10));
121
+ });
122
+ it("should handle zero-length masks (position equals complete)", () => {
123
+ const masks = [createMask(10, 10), createMask(20, 20)];
124
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
125
+ expect(result).toHaveLength(2);
126
+ expect(result[0]).toEqual(createMask(10, 10));
127
+ expect(result[1]).toEqual(createMask(20, 20));
128
+ });
129
+ it("should merge adjacent zero-length and non-zero-length masks", () => {
130
+ const masks = [createMask(10, 10), createMask(10, 20)];
131
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
132
+ expect(result).toHaveLength(1);
133
+ expect(result[0]).toEqual(createMask(10, 20));
134
+ });
135
+ it("should not mutate input array", () => {
136
+ const masks = [createMask(20, 30), createMask(0, 10), createMask(10, 20)];
137
+ const original = [...masks];
138
+ RegionClipResolver.sortAndJoinMasks(masks);
139
+ expect(masks).toEqual(original);
140
+ });
141
+ it("should handle large number of masks", () => {
142
+ const masks = [];
143
+ for (let i = 0; i < 100; i++) {
144
+ masks.push(createMask(i * 5, i * 5 + 10));
145
+ }
146
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
147
+ // All masks overlap, should merge into one
148
+ expect(result).toHaveLength(1);
149
+ expect(result[0].position).toBe(0);
150
+ expect(result[0].complete).toBe(505); // 99 * 5 + 10
151
+ });
152
+ it("should handle masks in reverse order", () => {
153
+ const masks = [
154
+ createMask(60, 70),
155
+ createMask(40, 50),
156
+ createMask(20, 30),
157
+ createMask(0, 10)
158
+ ];
159
+ const result = RegionClipResolver.sortAndJoinMasks(masks);
160
+ expect(result).toHaveLength(4);
161
+ expect(result[0]).toEqual(createMask(0, 10));
162
+ expect(result[1]).toEqual(createMask(20, 30));
163
+ expect(result[2]).toEqual(createMask(40, 50));
164
+ expect(result[3]).toEqual(createMask(60, 70));
165
+ });
166
+ });
@@ -0,0 +1,25 @@
1
+ import { ppqn, RegionCollection } from "@opendaw/lib-dsp";
2
+ import { int } from "@opendaw/lib-std";
3
+ import { AnyRegionBoxAdapter } from "@opendaw/studio-adapters";
4
+ export interface RegionModifyStrategies {
5
+ showOrigin(): boolean;
6
+ selectedModifyStrategy(): RegionModifyStrategy;
7
+ unselectedModifyStrategy(): RegionModifyStrategy;
8
+ }
9
+ export declare namespace RegionModifyStrategies {
10
+ const Identity: RegionModifyStrategies;
11
+ const IdentityIncludeOrigin: RegionModifyStrategies;
12
+ }
13
+ export interface RegionModifyStrategy {
14
+ readPosition(region: AnyRegionBoxAdapter): ppqn;
15
+ readComplete(region: AnyRegionBoxAdapter): ppqn;
16
+ readLoopOffset(region: AnyRegionBoxAdapter): ppqn;
17
+ readLoopDuration(region: AnyRegionBoxAdapter): ppqn;
18
+ readMirror(region: AnyRegionBoxAdapter): boolean;
19
+ translateTrackIndex(value: int): int;
20
+ iterateRange<R extends AnyRegionBoxAdapter>(regions: RegionCollection<R>, from: ppqn, to: ppqn): Iterable<R>;
21
+ }
22
+ export declare namespace RegionModifyStrategy {
23
+ const Identity: RegionModifyStrategy;
24
+ }
25
+ //# sourceMappingURL=RegionModifyStrategies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegionModifyStrategies.d.ts","sourceRoot":"","sources":["../../src/ui/RegionModifyStrategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAU,gBAAgB,EAAC,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AACpC,OAAO,EAA8B,mBAAmB,EAAC,MAAM,0BAA0B,CAAA;AAEzF,MAAM,WAAW,sBAAsB;IACnC,UAAU,IAAI,OAAO,CAAA;IACrB,sBAAsB,IAAI,oBAAoB,CAAA;IAC9C,wBAAwB,IAAI,oBAAoB,CAAA;CACnD;AAED,yBAAiB,sBAAsB,CAAC;IAC7B,MAAM,QAAQ,EAAE,sBAIrB,CAAA;IACK,MAAM,qBAAqB,EAAE,sBAIlC,CAAA;CACL;AAED,MAAM,WAAW,oBAAoB;IACjC,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAA;IAC/C,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAA;IAC/C,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACjD,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACnD,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAA;IAChD,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAAA;IACpC,YAAY,CAAC,CAAC,SAAS,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;CAC/G;AAED,yBAAiB,oBAAoB,CAAC;IAC3B,MAAM,QAAQ,EAAE,oBASrB,CAAA;CACL"}
@@ -0,0 +1,25 @@
1
+ export var RegionModifyStrategies;
2
+ (function (RegionModifyStrategies) {
3
+ RegionModifyStrategies.Identity = Object.freeze({
4
+ showOrigin: () => false,
5
+ selectedModifyStrategy: () => RegionModifyStrategy.Identity,
6
+ unselectedModifyStrategy: () => RegionModifyStrategy.Identity
7
+ });
8
+ RegionModifyStrategies.IdentityIncludeOrigin = Object.freeze({
9
+ showOrigin: () => true,
10
+ selectedModifyStrategy: () => RegionModifyStrategy.Identity,
11
+ unselectedModifyStrategy: () => RegionModifyStrategy.Identity
12
+ });
13
+ })(RegionModifyStrategies || (RegionModifyStrategies = {}));
14
+ export var RegionModifyStrategy;
15
+ (function (RegionModifyStrategy) {
16
+ RegionModifyStrategy.Identity = Object.freeze({
17
+ readPosition: (region) => region.position,
18
+ readComplete: (region) => region.complete,
19
+ readLoopOffset: (region) => region.loopOffset,
20
+ readLoopDuration: (region) => region.loopDuration,
21
+ readMirror: (region) => region.isMirrowed,
22
+ translateTrackIndex: (value) => value,
23
+ iterateRange: (regions, from, to) => regions.iterateRange(from, to)
24
+ });
25
+ })(RegionModifyStrategy || (RegionModifyStrategy = {}));
@@ -1,3 +1,5 @@
1
+ export * from "./RegionClipResolver";
2
+ export * from "./RegionModifyStrategies";
1
3
  export * from "./TimeGrid";
2
4
  export * from "./TimelineRange";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,0BAA0B,CAAA;AACxC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA"}
package/dist/ui/index.js CHANGED
@@ -1,2 +1,4 @@
1
+ export * from "./RegionClipResolver";
2
+ export * from "./RegionModifyStrategies";
1
3
  export * from "./TimeGrid";
2
4
  export * from "./TimelineRange";