@opendaw/studio-core 0.0.100 → 0.0.102

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 (114) hide show
  1. package/dist/AssetService.js +2 -2
  2. package/dist/EffectFactories.d.ts +2 -0
  3. package/dist/EffectFactories.d.ts.map +1 -1
  4. package/dist/EffectFactories.js +44 -24
  5. package/dist/Engine.d.ts +5 -0
  6. package/dist/Engine.d.ts.map +1 -1
  7. package/dist/EngineFacade.d.ts +5 -0
  8. package/dist/EngineFacade.d.ts.map +1 -1
  9. package/dist/EngineFacade.js +23 -2
  10. package/dist/EngineWorklet.d.ts +5 -0
  11. package/dist/EngineWorklet.d.ts.map +1 -1
  12. package/dist/EngineWorklet.js +107 -11
  13. package/dist/HRClockWorker.d.ts +7 -0
  14. package/dist/HRClockWorker.d.ts.map +1 -0
  15. package/dist/HRClockWorker.js +54 -0
  16. package/dist/OfflineEngineRenderer.d.ts.map +1 -1
  17. package/dist/OfflineEngineRenderer.js +6 -2
  18. package/dist/RecordingWorklet.d.ts +2 -1
  19. package/dist/RecordingWorklet.d.ts.map +1 -1
  20. package/dist/RecordingWorklet.js +9 -1
  21. package/dist/Storage.d.ts.map +1 -1
  22. package/dist/Storage.js +1 -0
  23. package/dist/StudioPreferences.d.ts +9 -0
  24. package/dist/StudioPreferences.d.ts.map +1 -1
  25. package/dist/StudioSettings.d.ts +14 -0
  26. package/dist/StudioSettings.d.ts.map +1 -1
  27. package/dist/StudioSettings.js +19 -2
  28. package/dist/capture/CaptureAudio.d.ts +3 -1
  29. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  30. package/dist/capture/CaptureAudio.js +51 -29
  31. package/dist/capture/MonitoringMode.d.ts +2 -0
  32. package/dist/capture/MonitoringMode.d.ts.map +1 -0
  33. package/dist/capture/MonitoringMode.js +1 -0
  34. package/dist/capture/RecordAudio.d.ts.map +1 -1
  35. package/dist/capture/RecordAudio.js +1 -0
  36. package/dist/capture/index.d.ts +1 -0
  37. package/dist/capture/index.d.ts.map +1 -1
  38. package/dist/capture/index.js +1 -0
  39. package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
  40. package/dist/dawproject/DawProjectImporter.js +4 -0
  41. package/dist/processors.js +24 -24
  42. package/dist/processors.js.map +4 -4
  43. package/dist/project/Project.d.ts +7 -1
  44. package/dist/project/Project.d.ts.map +1 -1
  45. package/dist/project/Project.js +58 -8
  46. package/dist/project/ProjectApi.d.ts +1 -1
  47. package/dist/project/ProjectApi.d.ts.map +1 -1
  48. package/dist/project/ProjectApi.js +17 -3
  49. package/dist/project/ProjectMigration.d.ts.map +1 -1
  50. package/dist/project/ProjectMigration.js +3 -2
  51. package/dist/project/audio/AudioContentFactory.d.ts +5 -0
  52. package/dist/project/audio/AudioContentFactory.d.ts.map +1 -1
  53. package/dist/project/audio/AudioContentFactory.js +13 -0
  54. package/dist/project/migration/MigrateNeuralAmpDeviceBox.d.ts +4 -0
  55. package/dist/project/migration/MigrateNeuralAmpDeviceBox.d.ts.map +1 -0
  56. package/dist/project/migration/MigrateNeuralAmpDeviceBox.js +29 -0
  57. package/dist/project/migration/index.d.ts +1 -0
  58. package/dist/project/migration/index.d.ts.map +1 -1
  59. package/dist/project/migration/index.js +1 -0
  60. package/dist/ui/{generic → clipboard}/ClipboardManager.d.ts +3 -3
  61. package/dist/ui/clipboard/ClipboardManager.d.ts.map +1 -0
  62. package/dist/ui/clipboard/ClipboardManager.js +147 -0
  63. package/dist/ui/clipboard/ClipboardUtils.d.ts +12 -0
  64. package/dist/ui/clipboard/ClipboardUtils.d.ts.map +1 -0
  65. package/dist/ui/clipboard/ClipboardUtils.js +94 -0
  66. package/dist/ui/{generic → clipboard}/ContextMenu.d.ts +1 -1
  67. package/dist/ui/clipboard/ContextMenu.d.ts.map +1 -0
  68. package/dist/ui/{generic → clipboard}/ContextMenu.js +1 -1
  69. package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.d.ts +18 -0
  70. package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.d.ts.map +1 -0
  71. package/dist/ui/clipboard/types/AudioUnitsClipboardHandler.js +215 -0
  72. package/dist/ui/clipboard/types/DevicesClipboardHandler.d.ts +18 -0
  73. package/dist/ui/clipboard/types/DevicesClipboardHandler.d.ts.map +1 -0
  74. package/dist/ui/clipboard/types/DevicesClipboardHandler.js +188 -0
  75. package/dist/ui/clipboard/types/NotesClipboardHandler.d.ts +21 -0
  76. package/dist/ui/clipboard/types/NotesClipboardHandler.d.ts.map +1 -0
  77. package/dist/ui/clipboard/types/NotesClipboardHandler.js +72 -0
  78. package/dist/ui/clipboard/types/RegionsClipboardHandler.d.ts +24 -0
  79. package/dist/ui/clipboard/types/RegionsClipboardHandler.d.ts.map +1 -0
  80. package/dist/ui/clipboard/types/RegionsClipboardHandler.js +137 -0
  81. package/dist/ui/clipboard/types/ValuesClipboardHandler.d.ts +22 -0
  82. package/dist/ui/clipboard/types/ValuesClipboardHandler.d.ts.map +1 -0
  83. package/dist/ui/clipboard/types/ValuesClipboardHandler.js +135 -0
  84. package/dist/ui/index.d.ts +14 -3
  85. package/dist/ui/index.d.ts.map +1 -1
  86. package/dist/ui/index.js +14 -3
  87. package/dist/ui/menu/MenuItems.d.ts.map +1 -0
  88. package/dist/ui/timeline/RegionClipResolver.d.ts +5 -1
  89. package/dist/ui/timeline/RegionClipResolver.d.ts.map +1 -1
  90. package/dist/ui/timeline/RegionClipResolver.js +5 -1
  91. package/dist/ui/timeline/RegionKeepExistingResolver.d.ts +34 -0
  92. package/dist/ui/timeline/RegionKeepExistingResolver.d.ts.map +1 -0
  93. package/dist/ui/timeline/RegionKeepExistingResolver.js +171 -0
  94. package/dist/ui/timeline/RegionOverlapResolver.d.ts +33 -0
  95. package/dist/ui/timeline/RegionOverlapResolver.d.ts.map +1 -0
  96. package/dist/ui/timeline/RegionOverlapResolver.js +79 -0
  97. package/dist/ui/timeline/RegionPushExistingResolver.d.ts +31 -0
  98. package/dist/ui/timeline/RegionPushExistingResolver.d.ts.map +1 -0
  99. package/dist/ui/timeline/RegionPushExistingResolver.js +159 -0
  100. package/dist/ui/timeline/TimelineFocus.d.ts +14 -0
  101. package/dist/ui/timeline/TimelineFocus.d.ts.map +1 -0
  102. package/dist/ui/timeline/TimelineFocus.js +45 -0
  103. package/dist/ui/timeline/TrackResolver.d.ts +11 -0
  104. package/dist/ui/timeline/TrackResolver.d.ts.map +1 -0
  105. package/dist/ui/timeline/TrackResolver.js +5 -0
  106. package/dist/workers-main.js +1 -1
  107. package/dist/workers-main.js.map +3 -3
  108. package/package.json +62 -62
  109. package/dist/ui/generic/ClipboardManager.d.ts.map +0 -1
  110. package/dist/ui/generic/ClipboardManager.js +0 -77
  111. package/dist/ui/generic/ContextMenu.d.ts.map +0 -1
  112. package/dist/ui/generic/MenuItems.d.ts.map +0 -1
  113. /package/dist/ui/{generic → menu}/MenuItems.d.ts +0 -0
  114. /package/dist/ui/{generic → menu}/MenuItems.js +0 -0
@@ -32,7 +32,7 @@ export class AssetService {
32
32
  }
33
33
  const { error, status, value: files } = await Promises.tryCatch(Files.open({ ...this.filePickerOptions, multiple: false }));
34
34
  if (status === "rejected") {
35
- if (Errors.isAbort(error)) {
35
+ if (Errors.isAbort(error) || Errors.isNotAllowed(error)) {
36
36
  return;
37
37
  }
38
38
  else {
@@ -54,7 +54,7 @@ export class AssetService {
54
54
  async browseFiles(multiple, filePickerSettings) {
55
55
  const { error, status, value: files } = await Promises.tryCatch(Files.open({ ...filePickerSettings, multiple }));
56
56
  if (status === "rejected") {
57
- if (Errors.isAbort(error)) {
57
+ if (Errors.isAbort(error) || Errors.isNotAllowed(error)) {
58
58
  return [];
59
59
  }
60
60
  else {
@@ -34,6 +34,7 @@ export declare namespace EffectFactories {
34
34
  Crusher: EffectFactory;
35
35
  Fold: EffectFactory;
36
36
  Tidal: EffectFactory;
37
+ NeuralAmp: EffectFactory;
37
38
  Maximizer: EffectFactory;
38
39
  };
39
40
  const MidiList: ReadonlyArray<Readonly<EffectFactory>>;
@@ -49,6 +50,7 @@ export declare namespace EffectFactories {
49
50
  Crusher: EffectFactory;
50
51
  Fold: EffectFactory;
51
52
  Tidal: EffectFactory;
53
+ NeuralAmp: EffectFactory;
52
54
  Maximizer: EffectFactory;
53
55
  Arpeggio: EffectFactory;
54
56
  Pitch: EffectFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"EffectFactories.d.ts","sourceRoot":"","sources":["../src/EffectFactories.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAG7C,yBAAiB,eAAe,CAAC;IACtB,MAAM,QAAQ,EAAE,aAYtB,CAAA;IAEM,MAAM,KAAK,EAAE,aAYnB,CAAA;IAEM,MAAM,QAAQ,EAAE,aAYtB,CAAA;IAEM,MAAM,SAAS,EAAE,aAsBvB,CAAA;IAEM,MAAM,UAAU,EAAE,aAaxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,cAAc,EAAE,aAa5B,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,UAAU,EAAE,aAaxB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,MAAM,EAAE,aAcpB,CAAA;IAEM,MAAM,OAAO,EAAE,aAarB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,MAAM,EAAE,aAapB,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,OAAO,EAAE,aAqCrB,CAAA;IAEM,MAAM,SAAS;;;;;KAAyC,CAAA;IACxD,MAAM,UAAU;;;;;;;;;;;;KAEtB,CAAA;IACM,MAAM,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA4B,CAAA;IACjF,MAAM,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA6B,CAAA;IACnF,MAAM,WAAW;;;;;;;;;;;;;;;;KAAgC,CAAA;IACxD,KAAY,cAAc,GAAG,MAAM,OAAO,SAAS,CAAA;IACnD,KAAY,eAAe,GAAG,MAAM,OAAO,UAAU,CAAA;CACxD"}
1
+ {"version":3,"file":"EffectFactories.d.ts","sourceRoot":"","sources":["../src/EffectFactories.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAG7C,yBAAiB,eAAe,CAAC;IACtB,MAAM,QAAQ,EAAE,aAatB,CAAA;IAEM,MAAM,KAAK,EAAE,aAanB,CAAA;IAEM,MAAM,QAAQ,EAAE,aAatB,CAAA;IAEM,MAAM,SAAS,EAAE,aA8BvB,CAAA;IAEM,MAAM,UAAU,EAAE,aAcxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,cAAc,EAAE,aAc5B,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,UAAU,EAAE,aAcxB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,MAAM,EAAE,aAcpB,CAAA;IAEM,MAAM,OAAO,EAAE,aAarB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,MAAM,EAAE,aAapB,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,OAAO,EAAE,aAqDrB,CAAA;IAEM,MAAM,SAAS;;;;;KAKrB,CAAA;IAIM,MAAM,UAAU;;;;;;;;;;;;;KAatB,CAAA;IAIM,MAAM,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAA;IACrB,MAAM,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAA;IACtB,MAAM,WAAW;;;;;;;;;;;;;;;;;KAAgC,CAAA;IACxD,KAAY,cAAc,GAAG,MAAM,OAAO,SAAS,CAAA;IACnD,KAAY,eAAe,GAAG,MAAM,OAAO,UAAU,CAAA;CACxD"}
@@ -12,7 +12,7 @@ export var EffectFactories;
12
12
  manualPage: DeviceManualUrls.Arpeggio,
13
13
  separatorBefore: false,
14
14
  type: "midi",
15
- create: ({ boxGraph }, hostField, index) => ArpeggioDeviceBox.create(boxGraph, UUID.generate(), box => {
15
+ create: ({ boxGraph }, hostField, index) => ArpeggioDeviceBox.create(boxGraph, UUID.generate(), (box) => {
16
16
  box.label.setValue("Arpeggio");
17
17
  box.index.setValue(index);
18
18
  box.host.refer(hostField);
@@ -25,7 +25,7 @@ export var EffectFactories;
25
25
  manualPage: DeviceManualUrls.Pitch,
26
26
  separatorBefore: false,
27
27
  type: "midi",
28
- create: ({ boxGraph }, hostField, index) => PitchDeviceBox.create(boxGraph, UUID.generate(), box => {
28
+ create: ({ boxGraph }, hostField, index) => PitchDeviceBox.create(boxGraph, UUID.generate(), (box) => {
29
29
  box.label.setValue("Pitch");
30
30
  box.index.setValue(index);
31
31
  box.host.refer(hostField);
@@ -38,7 +38,7 @@ export var EffectFactories;
38
38
  manualPage: DeviceManualUrls.Velocity,
39
39
  separatorBefore: false,
40
40
  type: "midi",
41
- create: ({ boxGraph }, hostField, index) => VelocityDeviceBox.create(boxGraph, UUID.generate(), box => {
41
+ create: ({ boxGraph }, hostField, index) => VelocityDeviceBox.create(boxGraph, UUID.generate(), (box) => {
42
42
  box.label.setValue("Velocity");
43
43
  box.index.setValue(index);
44
44
  box.host.refer(hostField);
@@ -55,11 +55,11 @@ export var EffectFactories;
55
55
  const useGlobal = false; // TODO First Zeitgeist should be true
56
56
  const shuffleBox = useGlobal
57
57
  ? rootBoxAdapter.groove.box
58
- : GrooveShuffleBox.create(boxGraph, UUID.generate(), box => {
58
+ : GrooveShuffleBox.create(boxGraph, UUID.generate(), (box) => {
59
59
  box.label.setValue("Shuffle");
60
60
  box.duration.setValue(480);
61
61
  });
62
- return ZeitgeistDeviceBox.create(boxGraph, UUID.generate(), box => {
62
+ return ZeitgeistDeviceBox.create(boxGraph, UUID.generate(), (box) => {
63
63
  box.label.setValue("Zeitgeist");
64
64
  box.groove.refer(shuffleBox);
65
65
  box.index.setValue(index);
@@ -74,7 +74,7 @@ export var EffectFactories;
74
74
  manualPage: DeviceManualUrls.StereoTool,
75
75
  separatorBefore: false,
76
76
  type: "audio",
77
- create: ({ boxGraph }, hostField, index) => StereoToolDeviceBox.create(boxGraph, UUID.generate(), box => {
77
+ create: ({ boxGraph }, hostField, index) => StereoToolDeviceBox.create(boxGraph, UUID.generate(), (box) => {
78
78
  box.label.setValue("Stereo Tool");
79
79
  box.index.setValue(index);
80
80
  box.host.refer(hostField);
@@ -87,7 +87,7 @@ export var EffectFactories;
87
87
  manualPage: DeviceManualUrls.Delay,
88
88
  separatorBefore: false,
89
89
  type: "audio",
90
- create: ({ boxGraph }, hostField, index) => DelayDeviceBox.create(boxGraph, UUID.generate(), box => {
90
+ create: ({ boxGraph }, hostField, index) => DelayDeviceBox.create(boxGraph, UUID.generate(), (box) => {
91
91
  box.label.setValue("Delay");
92
92
  box.index.setValue(index);
93
93
  box.host.refer(hostField);
@@ -101,7 +101,7 @@ export var EffectFactories;
101
101
  manualPage: DeviceManualUrls.DattorroReverb,
102
102
  separatorBefore: false,
103
103
  type: "audio",
104
- create: ({ boxGraph }, hostField, index) => DattorroReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
104
+ create: ({ boxGraph }, hostField, index) => DattorroReverbDeviceBox.create(boxGraph, UUID.generate(), (box) => {
105
105
  box.label.setValue("Dattorro Reverb");
106
106
  box.index.setValue(index);
107
107
  box.host.refer(hostField);
@@ -114,7 +114,7 @@ export var EffectFactories;
114
114
  manualPage: DeviceManualUrls.Maximizer,
115
115
  separatorBefore: false,
116
116
  type: "audio",
117
- create: ({ boxGraph }, hostField, index) => MaximizerDeviceBox.create(boxGraph, UUID.generate(), box => {
117
+ create: ({ boxGraph }, hostField, index) => MaximizerDeviceBox.create(boxGraph, UUID.generate(), (box) => {
118
118
  box.label.setValue("Maximizer");
119
119
  box.index.setValue(index);
120
120
  box.host.refer(hostField);
@@ -127,7 +127,7 @@ export var EffectFactories;
127
127
  manualPage: DeviceManualUrls.Compressor,
128
128
  separatorBefore: false,
129
129
  type: "audio",
130
- create: ({ boxGraph }, hostField, index) => CompressorDeviceBox.create(boxGraph, UUID.generate(), box => {
130
+ create: ({ boxGraph }, hostField, index) => CompressorDeviceBox.create(boxGraph, UUID.generate(), (box) => {
131
131
  box.label.setValue("Compressor");
132
132
  box.index.setValue(index);
133
133
  box.host.refer(hostField);
@@ -140,7 +140,7 @@ export var EffectFactories;
140
140
  manualPage: DeviceManualUrls.Gate,
141
141
  separatorBefore: false,
142
142
  type: "audio",
143
- create: ({ boxGraph }, hostField, index) => GateDeviceBox.create(boxGraph, UUID.generate(), box => {
143
+ create: ({ boxGraph }, hostField, index) => GateDeviceBox.create(boxGraph, UUID.generate(), (box) => {
144
144
  box.label.setValue("Gate");
145
145
  box.index.setValue(index);
146
146
  box.host.refer(hostField);
@@ -153,7 +153,7 @@ export var EffectFactories;
153
153
  manualPage: DeviceManualUrls.Reverb,
154
154
  separatorBefore: false,
155
155
  type: "audio",
156
- create: ({ boxGraph }, hostField, index) => ReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
156
+ create: ({ boxGraph }, hostField, index) => ReverbDeviceBox.create(boxGraph, UUID.generate(), (box) => {
157
157
  box.label.setValue("Reverb");
158
158
  box.preDelay.setInitValue(0.001);
159
159
  box.index.setValue(index);
@@ -167,7 +167,7 @@ export var EffectFactories;
167
167
  manualPage: DeviceManualUrls.Crusher,
168
168
  separatorBefore: false,
169
169
  type: "audio",
170
- create: ({ boxGraph }, hostField, index) => CrusherDeviceBox.create(boxGraph, UUID.generate(), box => {
170
+ create: ({ boxGraph }, hostField, index) => CrusherDeviceBox.create(boxGraph, UUID.generate(), (box) => {
171
171
  box.label.setValue("Crusher");
172
172
  box.index.setValue(index);
173
173
  box.host.refer(hostField);
@@ -180,7 +180,7 @@ export var EffectFactories;
180
180
  manualPage: DeviceManualUrls.Fold,
181
181
  separatorBefore: false,
182
182
  type: "audio",
183
- create: ({ boxGraph }, hostField, index) => FoldDeviceBox.create(boxGraph, UUID.generate(), box => {
183
+ create: ({ boxGraph }, hostField, index) => FoldDeviceBox.create(boxGraph, UUID.generate(), (box) => {
184
184
  box.label.setValue("Fold");
185
185
  box.index.setValue(index);
186
186
  box.host.refer(hostField);
@@ -193,7 +193,7 @@ export var EffectFactories;
193
193
  manualPage: DeviceManualUrls.Tidal,
194
194
  separatorBefore: false,
195
195
  type: "audio",
196
- create: ({ boxGraph }, hostField, index) => TidalDeviceBox.create(boxGraph, UUID.generate(), box => {
196
+ create: ({ boxGraph }, hostField, index) => TidalDeviceBox.create(boxGraph, UUID.generate(), (box) => {
197
197
  box.label.setValue("Tidal");
198
198
  box.index.setValue(index);
199
199
  box.depth.setValue(0.75);
@@ -207,7 +207,7 @@ export var EffectFactories;
207
207
  manualPage: DeviceManualUrls.Revamp,
208
208
  separatorBefore: false,
209
209
  type: "audio",
210
- create: ({ boxGraph }, hostField, index) => RevampDeviceBox.create(boxGraph, UUID.generate(), box => {
210
+ create: ({ boxGraph }, hostField, index) => RevampDeviceBox.create(boxGraph, UUID.generate(), (box) => {
211
211
  EffectParameterDefaults.defaultRevampDeviceBox(box);
212
212
  box.index.setValue(index);
213
213
  box.host.refer(hostField);
@@ -220,7 +220,7 @@ export var EffectFactories;
220
220
  manualPage: DeviceManualUrls.NeuralAmp,
221
221
  separatorBefore: false,
222
222
  type: "audio",
223
- create: ({ boxGraph }, hostField, index) => NeuralAmpDeviceBox.create(boxGraph, UUID.generate(), box => {
223
+ create: ({ boxGraph }, hostField, index) => NeuralAmpDeviceBox.create(boxGraph, UUID.generate(), (box) => {
224
224
  box.label.setValue("Neural Amp");
225
225
  box.index.setValue(index);
226
226
  box.host.refer(hostField);
@@ -234,29 +234,29 @@ export var EffectFactories;
234
234
  separatorBefore: true,
235
235
  type: "audio",
236
236
  create: ({ boxGraph, rootBox, userEditingManager }, hostField, index) => {
237
- const moduleSetupBox = ModularBox.create(boxGraph, UUID.generate(), box => {
237
+ const moduleSetupBox = ModularBox.create(boxGraph, UUID.generate(), (box) => {
238
238
  box.collection.refer(rootBox.modularSetups);
239
239
  box.label.setValue("Modular");
240
240
  });
241
- const modularInput = ModularAudioInputBox.create(boxGraph, UUID.generate(), box => {
241
+ const modularInput = ModularAudioInputBox.create(boxGraph, UUID.generate(), (box) => {
242
242
  box.attributes.collection.refer(moduleSetupBox.modules);
243
243
  box.attributes.label.setValue("Modular Input");
244
244
  box.attributes.x.setValue(-256);
245
245
  box.attributes.y.setValue(32);
246
246
  });
247
- const modularOutput = ModularAudioOutputBox.create(boxGraph, UUID.generate(), box => {
247
+ const modularOutput = ModularAudioOutputBox.create(boxGraph, UUID.generate(), (box) => {
248
248
  box.attributes.collection.refer(moduleSetupBox.modules);
249
249
  box.attributes.label.setValue("Modular Output");
250
250
  box.attributes.x.setValue(256);
251
251
  box.attributes.y.setValue(32);
252
252
  });
253
- ModuleConnectionBox.create(boxGraph, UUID.generate(), box => {
253
+ ModuleConnectionBox.create(boxGraph, UUID.generate(), (box) => {
254
254
  box.collection.refer(moduleSetupBox.connections);
255
255
  box.source.refer(modularInput.output);
256
256
  box.target.refer(modularOutput.input);
257
257
  });
258
258
  userEditingManager.modularSystem.edit(moduleSetupBox.editing);
259
- return ModularDeviceBox.create(boxGraph, UUID.generate(), box => {
259
+ return ModularDeviceBox.create(boxGraph, UUID.generate(), (box) => {
260
260
  box.label.setValue("Modular");
261
261
  box.modularSetup.refer(moduleSetupBox.device);
262
262
  box.index.setValue(index);
@@ -264,10 +264,30 @@ export var EffectFactories;
264
264
  });
265
265
  }
266
266
  };
267
- EffectFactories.MidiNamed = { Arpeggio: EffectFactories.Arpeggio, Pitch: EffectFactories.Pitch, Velocity: EffectFactories.Velocity, Zeitgeist: EffectFactories.Zeitgeist };
267
+ EffectFactories.MidiNamed = {
268
+ Arpeggio: EffectFactories.Arpeggio,
269
+ Pitch: EffectFactories.Pitch,
270
+ Velocity: EffectFactories.Velocity,
271
+ Zeitgeist: EffectFactories.Zeitgeist
272
+ };
273
+ const includeNeuralAmp = false;
268
274
  EffectFactories.AudioNamed = {
269
- StereoTool: EffectFactories.StereoTool, Compressor: EffectFactories.Compressor, Gate: EffectFactories.Gate, Delay: EffectFactories.Delay, Reverb: EffectFactories.Reverb, DattorroReverb: EffectFactories.DattorroReverb, Revamp: EffectFactories.Revamp, Crusher: EffectFactories.Crusher, Fold: EffectFactories.Fold, Tidal: EffectFactories.Tidal, Maximizer: EffectFactories.Maximizer /*NeuralAmp*/
275
+ StereoTool: EffectFactories.StereoTool,
276
+ Compressor: EffectFactories.Compressor,
277
+ Gate: EffectFactories.Gate,
278
+ Delay: EffectFactories.Delay,
279
+ Reverb: EffectFactories.Reverb,
280
+ DattorroReverb: EffectFactories.DattorroReverb,
281
+ Revamp: EffectFactories.Revamp,
282
+ Crusher: EffectFactories.Crusher,
283
+ Fold: EffectFactories.Fold,
284
+ Tidal: EffectFactories.Tidal,
285
+ NeuralAmp: EffectFactories.NeuralAmp,
286
+ Maximizer: EffectFactories.Maximizer
270
287
  };
288
+ if (!includeNeuralAmp) {
289
+ delete EffectFactories.AudioNamed.NeuralAmp;
290
+ }
271
291
  EffectFactories.MidiList = Object.values(EffectFactories.MidiNamed);
272
292
  EffectFactories.AudioList = Object.values(EffectFactories.AudioNamed);
273
293
  EffectFactories.MergedNamed = { ...EffectFactories.MidiNamed, ...EffectFactories.AudioNamed };
package/dist/Engine.d.ts CHANGED
@@ -21,6 +21,8 @@ export interface Engine extends Terminable {
21
21
  scheduleClipPlay(clipIds: ReadonlyArray<UUID.Bytes>): void;
22
22
  scheduleClipStop(trackIds: ReadonlyArray<UUID.Bytes>): void;
23
23
  subscribeClipNotification(observer: Observer<ClipNotification>): Subscription;
24
+ registerMonitoringSource(uuid: UUID.Bytes, node: AudioNode, numChannels: 1 | 2): void;
25
+ unregisterMonitoringSource(uuid: UUID.Bytes): void;
24
26
  get position(): ObservableValue<ppqn>;
25
27
  get bpm(): ObservableValue<bpm>;
26
28
  get isPlaying(): ObservableValue<boolean>;
@@ -29,7 +31,10 @@ export interface Engine extends Terminable {
29
31
  get playbackTimestamp(): ObservableValue<ppqn>;
30
32
  get countInBeatsRemaining(): ObservableValue<number>;
31
33
  get markerState(): ObservableValue<Nullable<[UUID.Bytes, int]>>;
34
+ get cpuLoad(): ObservableValue<number>;
32
35
  get project(): Project;
33
36
  get preferences(): EnginePreferences;
37
+ get perfBuffer(): Float32Array;
38
+ get perfIndex(): number;
34
39
  }
35
40
  //# sourceMappingURL=Engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACxF,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjC,MAAM,WAAW,MAAO,SAAQ,UAAU;IACtC,IAAI,IAAI,IAAI,CAAA;IACZ,IAAI,IAAI,IAAI,CAAA;IACZ,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;IACjC,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7C,aAAa,IAAI,IAAI,CAAA;IACrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,IAAI,IAAI,IAAI,CAAA;IACZ,KAAK,IAAI,IAAI,CAAA;IACb,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACnD,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACpC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY,CAAA;IAC5D,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACxC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IAC1D,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,YAAY,CAAA;IAE7E,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,YAAY,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,qBAAqB,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;IACpD,IAAI,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC/D,IAAI,OAAO,IAAI,OAAO,CAAA;IACtB,IAAI,WAAW,IAAI,iBAAiB,CAAA;CACvC"}
1
+ {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACxF,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjC,MAAM,WAAW,MAAO,SAAQ,UAAU;IACtC,IAAI,IAAI,IAAI,CAAA;IACZ,IAAI,IAAI,IAAI,CAAA;IACZ,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;IACjC,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7C,aAAa,IAAI,IAAI,CAAA;IACrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,IAAI,IAAI,IAAI,CAAA;IACZ,KAAK,IAAI,IAAI,CAAA;IACb,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACnD,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACpC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY,CAAA;IAC5D,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACxC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IAC1D,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,YAAY,CAAA;IAC7E,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACrF,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IAElD,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,YAAY,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,qBAAqB,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;IACpD,IAAI,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC/D,IAAI,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,OAAO,IAAI,OAAO,CAAA;IACtB,IAAI,WAAW,IAAI,iBAAiB,CAAA;IACpC,IAAI,UAAU,IAAI,YAAY,CAAA;IAC9B,IAAI,SAAS,IAAI,MAAM,CAAA;CAC1B"}
@@ -23,9 +23,12 @@ export declare class EngineFacade implements Engine {
23
23
  get playbackTimestamp(): ObservableValue<ppqn>;
24
24
  get countInBeatsRemaining(): ObservableValue<int>;
25
25
  get markerState(): DefaultObservableValue<Nullable<[UUID.Bytes, int]>>;
26
+ get cpuLoad(): ObservableValue<number>;
26
27
  get project(): Project;
27
28
  get sampleRate(): number;
28
29
  get preferences(): EnginePreferences;
30
+ get perfBuffer(): Float32Array;
31
+ get perfIndex(): number;
29
32
  isReady(): Promise<void>;
30
33
  queryLoadingComplete(): Promise<boolean>;
31
34
  panic(): void;
@@ -38,6 +41,8 @@ export declare class EngineFacade implements Engine {
38
41
  noteSignal(signal: NoteSignal): void;
39
42
  scheduleClipPlay(clipIds: ReadonlyArray<UUID.Bytes>): void;
40
43
  scheduleClipStop(trackIds: ReadonlyArray<UUID.Bytes>): void;
44
+ registerMonitoringSource(uuid: UUID.Bytes, node: AudioNode, numChannels: 1 | 2): void;
45
+ unregisterMonitoringSource(uuid: UUID.Bytes): void;
41
46
  terminate(): void;
42
47
  }
43
48
  //# sourceMappingURL=EngineFacade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EngineFacade.d.ts","sourceRoot":"","sources":["../src/EngineFacade.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,sBAAsB,EACtB,GAAG,EACH,QAAQ,EACR,eAAe,EACf,QAAQ,EAER,YAAY,EAEZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACH,gBAAgB,EAChB,iBAAiB,EAGjB,UAAU,EAEb,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,qBAAa,YAAa,YAAW,MAAM;;;IAoBvC,UAAU,CAAC,OAAO,EAAE,aAAa;IAgBjC,aAAa,IAAI,IAAI;IAErB,cAAc,IAAI,IAAI;IAMtB,IAAI,IAAI,IAAI;IACZ,IAAI,CAAC,KAAK,GAAE,OAAe,GAAG,IAAI;IAClC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IACjC,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAC7C,aAAa,IAAI,IAAI;IAErB,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAwB;IAC7D,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAmB;IAClD,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,CAAyB;IAClE,IAAI,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,CAA2B;IACtE,IAAI,YAAY,IAAI,eAAe,CAAC,OAAO,CAAC,CAA4B;IACxE,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAiC;IAC/E,IAAI,qBAAqB,IAAI,eAAe,CAAC,GAAG,CAAC,CAAqC;IACtF,IAAI,WAAW,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAA2B;IACjG,IAAI,OAAO,IAAI,OAAO,CAAmE;IACzF,IAAI,UAAU,IAAI,MAAM,CAAsF;IAC9G,IAAI,WAAW,IAAI,iBAAiB,CAAiC;IAErE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAGxC,KAAK,IAAI,IAAI;IACb,KAAK,IAAI,IAAI;IACb,IAAI,IAAI,IAAI;IACZ,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAGnD,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,YAAY;IAG7E,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY;IAG5D,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;IAGxC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAGpC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;IAG1D,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;IAI3D,SAAS,IAAI,IAAI;CAIpB"}
1
+ {"version":3,"file":"EngineFacade.d.ts","sourceRoot":"","sources":["../src/EngineFacade.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export class EngineFacade {
12
12
  #isRecording = new DefaultObservableValue(false);
13
13
  #isCountingIn = new DefaultObservableValue(false);
14
14
  #markerState = new DefaultObservableValue(null);
15
+ #cpuLoad = new DefaultObservableValue(0);
15
16
  #preferencesFacade;
16
17
  #worklet = Option.None;
17
18
  constructor() {
@@ -21,15 +22,26 @@ export class EngineFacade {
21
22
  this.#worklet = Option.wrap(worklet);
22
23
  this.#preferencesFacade.setHost(worklet.preferences);
23
24
  this.#lifecycle.terminate();
24
- this.#lifecycle.ownAll(worklet.playbackTimestamp.catchupAndSubscribe(owner => this.#playbackTimestamp.setValue(owner.getValue())), worklet.countInBeatsRemaining.catchupAndSubscribe(owner => this.#countInBeatsRemaining.setValue(owner.getValue())), worklet.position.catchupAndSubscribe(owner => this.#position.setValue(owner.getValue())), worklet.bpm.catchupAndSubscribe(owner => this.#bpm.setValue(owner.getValue())), worklet.isPlaying.catchupAndSubscribe(owner => this.#isPlaying.setValue(owner.getValue())), worklet.isRecording.catchupAndSubscribe(owner => this.#isRecording.setValue(owner.getValue())), worklet.isCountingIn.catchupAndSubscribe(owner => this.#isCountingIn.setValue(owner.getValue())), worklet.markerState.catchupAndSubscribe(owner => this.#markerState.setValue(owner.getValue())));
25
+ this.#lifecycle.ownAll(worklet.playbackTimestamp.catchupAndSubscribe(owner => this.#playbackTimestamp.setValue(owner.getValue())), worklet.countInBeatsRemaining.catchupAndSubscribe(owner => this.#countInBeatsRemaining.setValue(owner.getValue())), worklet.position.catchupAndSubscribe(owner => this.#position.setValue(owner.getValue())), worklet.bpm.catchupAndSubscribe(owner => this.#bpm.setValue(owner.getValue())), worklet.isPlaying.catchupAndSubscribe(owner => this.#isPlaying.setValue(owner.getValue())), worklet.isRecording.catchupAndSubscribe(owner => this.#isRecording.setValue(owner.getValue())), worklet.isCountingIn.catchupAndSubscribe(owner => this.#isCountingIn.setValue(owner.getValue())), worklet.markerState.catchupAndSubscribe(owner => this.#markerState.setValue(owner.getValue())), worklet.cpuLoad.catchupAndSubscribe(owner => this.#cpuLoad.setValue(owner.getValue())));
25
26
  }
26
27
  assertWorklet() { this.#worklet.unwrap("No worklet available"); }
27
28
  releaseWorklet() {
29
+ this.#worklet.ifSome(worklet => worklet.terminate());
28
30
  this.#preferencesFacade.releaseHost();
29
31
  this.#lifecycle.terminate();
30
32
  this.#worklet = Option.None;
31
33
  }
32
- play() { this.#worklet.ifSome(worklet => worklet.play()); }
34
+ play() {
35
+ this.#worklet.ifSome(worklet => {
36
+ const context = worklet.context;
37
+ if (context.state === "suspended") {
38
+ context.resume().then(() => worklet.play());
39
+ }
40
+ else {
41
+ worklet.play();
42
+ }
43
+ });
44
+ }
33
45
  stop(reset = false) { this.#worklet.ifSome(worklet => worklet.stop(reset)); }
34
46
  setPosition(position) { this.#worklet.ifSome(worklet => worklet.setPosition(position)); }
35
47
  prepareRecordingState(countIn) { this.#worklet.ifSome(worklet => worklet.prepareRecordingState(countIn)); }
@@ -42,9 +54,12 @@ export class EngineFacade {
42
54
  get playbackTimestamp() { return this.#playbackTimestamp; }
43
55
  get countInBeatsRemaining() { return this.#countInBeatsRemaining; }
44
56
  get markerState() { return this.#markerState; }
57
+ get cpuLoad() { return this.#cpuLoad; }
45
58
  get project() { return this.#worklet.unwrap("No worklet to get project").project; }
46
59
  get sampleRate() { return this.#worklet.isEmpty() ? 44_100 : this.#worklet.unwrap().context.sampleRate; }
47
60
  get preferences() { return this.#preferencesFacade; }
61
+ get perfBuffer() { return this.#worklet.mapOr(worklet => worklet.perfBuffer, new Float32Array(0)); }
62
+ get perfIndex() { return this.#worklet.mapOr(worklet => worklet.perfIndex, 0); }
48
63
  isReady() { return this.#worklet.mapOr(worklet => worklet.isReady(), Promise.resolve()); }
49
64
  queryLoadingComplete() {
50
65
  return this.#worklet.mapOr(worklet => worklet.queryLoadingComplete(), Promise.resolve(false));
@@ -73,6 +88,12 @@ export class EngineFacade {
73
88
  scheduleClipStop(trackIds) {
74
89
  this.#worklet.unwrap("No worklet to scheduleClipStop").scheduleClipStop(trackIds);
75
90
  }
91
+ registerMonitoringSource(uuid, node, numChannels) {
92
+ this.#worklet.ifSome(worklet => worklet.registerMonitoringSource(uuid, node, numChannels));
93
+ }
94
+ unregisterMonitoringSource(uuid) {
95
+ this.#worklet.ifSome(worklet => worklet.unregisterMonitoringSource(uuid));
96
+ }
76
97
  terminate() {
77
98
  this.releaseWorklet();
78
99
  this.#terminator.terminate();
@@ -27,6 +27,9 @@ export declare class EngineWorklet extends AudioWorkletNode implements Engine {
27
27
  get markerState(): ObservableValue<Nullable<[UUID.Bytes, int]>>;
28
28
  get project(): Project;
29
29
  get preferences(): PreferencesHost<EngineSettings>;
30
+ get cpuLoad(): ObservableValue<number>;
31
+ get perfBuffer(): Float32Array;
32
+ get perfIndex(): number;
30
33
  isReady(): Promise<void>;
31
34
  queryLoadingComplete(): Promise<boolean>;
32
35
  noteSignal(signal: NoteSignal): void;
@@ -35,6 +38,8 @@ export declare class EngineWorklet extends AudioWorkletNode implements Engine {
35
38
  scheduleClipPlay(clipIds: ReadonlyArray<UUID.Bytes>): void;
36
39
  scheduleClipStop(trackIds: ReadonlyArray<UUID.Bytes>): void;
37
40
  subscribeClipNotification(observer: Observer<ClipNotification>): Subscription;
41
+ registerMonitoringSource(uuid: UUID.Bytes, node: AudioNode, numChannels: 1 | 2): void;
42
+ unregisterMonitoringSource(uuid: UUID.Bytes): void;
38
43
  terminate(): void;
39
44
  }
40
45
  //# sourceMappingURL=EngineWorklet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EngineWorklet.d.ts","sourceRoot":"","sources":["../src/EngineWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,GAAG,EACH,sBAAsB,EAEtB,QAAQ,EACR,eAAe,EACf,QAAQ,EAER,YAAY,EAGZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAIrD,OAAO,EACH,gBAAgB,EAIhB,cAAc,EAKd,wBAAwB,EACxB,UAAU,EACV,eAAe,EACf,gBAAgB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,qBAAa,aAAc,SAAQ,gBAAiB,YAAW,MAAM;;IACjE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAQ;IAEtB,QAAQ,CAAC,EAAE,SAAqB;gBAsBpB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,wBAAwB,EAC9C,OAAO,CAAC,EAAE,gBAAgB;IA0ItC,IAAI,IAAI,IAAI;IACZ,IAAI,CAAC,KAAK,GAAE,OAAe,GAAG,IAAI;IAClC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IACjC,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAC7C,aAAa,IAAI,IAAI;IACrB,KAAK,IAAI,IAAI;IACb,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IACZ,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAInD,IAAI,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,CAAyB;IAClE,IAAI,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,CAA2B;IACtE,IAAI,YAAY,IAAI,eAAe,CAAC,OAAO,CAAC,CAA4B;IACxE,IAAI,qBAAqB,IAAI,eAAe,CAAC,MAAM,CAAC,CAAqC;IACzF,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAwB;IAC7D,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAmB;IAClD,IAAI,iBAAiB,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAiC;IACxF,IAAI,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAA2B;IAC1F,IAAI,OAAO,IAAI,OAAO,CAAuB;IAC7C,IAAI,WAAW,IAAI,eAAe,CAAC,cAAc,CAAC,CAA2B;IAE7E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IACxC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IACpC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY;IAC5D,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;IACxC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;IAI1D,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;IAG3D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,YAAY;IAQ7E,SAAS,IAAI,IAAI;CAKpB"}
1
+ {"version":3,"file":"EngineWorklet.d.ts","sourceRoot":"","sources":["../src/EngineWorklet.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- import { Arrays, DefaultObservableValue, Notifier, Option, SyncStream, Terminator, UUID } from "@opendaw/lib-std";
1
+ import { Arrays, DefaultObservableValue, isDefined, Notifier, Option, SyncStream, Terminator, UUID } from "@opendaw/lib-std";
2
+ import { RenderQuantum } from "@opendaw/lib-dsp";
3
+ import { Communicator, Messenger } from "@opendaw/lib-runtime";
4
+ import { EngineSettingsSchema, EngineStateSchema, ExportStemsConfiguration, PERF_BUFFER_SIZE, PreferencesHost } from "@opendaw/studio-adapters";
2
5
  import { SyncSource } from "@opendaw/lib-box";
3
6
  import { AnimationFrame } from "@opendaw/lib-dom";
4
- import { Communicator, Messenger } from "@opendaw/lib-runtime";
5
- import { EngineSettingsSchema, EngineStateSchema, ExportStemsConfiguration, PreferencesHost } from "@opendaw/studio-adapters";
6
7
  import { MIDIReceiver } from "./midi";
8
+ import { HRClockWorker } from "./HRClockWorker";
7
9
  export class EngineWorklet extends AudioWorkletNode {
8
10
  static ID = 0 | 0;
9
11
  id = EngineWorklet.ID++;
@@ -18,14 +20,24 @@ export class EngineWorklet extends AudioWorkletNode {
18
20
  #countInBeatsRemaining = new DefaultObservableValue(0);
19
21
  #preferences;
20
22
  #markerState = new DefaultObservableValue(null);
23
+ #cpuLoad = new DefaultObservableValue(0);
21
24
  #controlFlags;
22
25
  #notifyClipNotification;
23
26
  #notifyNoteSignals;
24
27
  #playingClips;
25
28
  #commands;
26
29
  #isReady;
30
+ #perfBuffer = new Float32Array(0);
31
+ #perfIndex = 0;
32
+ #lastPerfReadIndex = 0;
33
+ #consecutiveOverloadCount = 0;
34
+ #lastCpuLoadUpdate = 0;
35
+ #maxMsSinceLastUpdate = 0;
36
+ #channelMerger = null;
37
+ #monitoringSources = new Map();
27
38
  constructor(context, project, exportConfiguration, options) {
28
39
  const numberOfChannels = ExportStemsConfiguration.countStems(Option.wrap(exportConfiguration)) * 2;
40
+ const budgetMs = (RenderQuantum / context.sampleRate) * 1000;
29
41
  const reader = SyncStream.reader(EngineStateSchema(), state => {
30
42
  this.#isPlaying.setValue(state.isPlaying);
31
43
  this.#isRecording.setValue(state.isRecording);
@@ -33,25 +45,29 @@ export class EngineWorklet extends AudioWorkletNode {
33
45
  this.#countInBeatsRemaining.setValue(state.countInBeatsRemaining);
34
46
  this.#playbackTimestamp.setValue(state.playbackTimestamp);
35
47
  this.#bpm.setValue(state.bpm);
48
+ this.#perfBuffer = state.perfBuffer;
49
+ this.#perfIndex = state.perfIndex;
50
+ this.#updateCpuLoad(budgetMs, project);
36
51
  this.#position.setValue(state.position); // This must be the last to handle the state values before
37
52
  });
38
53
  const controlFlagsSAB = new SharedArrayBuffer(4); // 4 bytes minimum
39
54
  super(context, "engine-processor", {
40
- numberOfInputs: 0,
55
+ numberOfInputs: 1,
41
56
  numberOfOutputs: 1,
42
57
  outputChannelCount: [numberOfChannels],
43
58
  processorOptions: {
44
59
  syncStreamBuffer: reader.buffer,
45
60
  controlFlagsBuffer: controlFlagsSAB,
61
+ hrClockBuffer: HRClockWorker.get().sab,
46
62
  project: project.toArrayBuffer(),
47
63
  exportConfiguration,
48
64
  options
49
65
  }
50
66
  });
51
- const { resolve, promise } = Promise.withResolvers();
67
+ const { resolve, promise: isReady } = Promise.withResolvers();
52
68
  const messenger = Messenger.for(this.port);
53
69
  this.#project = project;
54
- this.#isReady = promise;
70
+ this.#isReady = isReady;
55
71
  this.#notifyClipNotification = this.#terminator.own(new Notifier());
56
72
  this.#notifyNoteSignals = this.#terminator.own(new Notifier());
57
73
  this.#playingClips = [];
@@ -86,6 +102,9 @@ export class EngineWorklet extends AudioWorkletNode {
86
102
  setupMIDI(port, buffer) {
87
103
  dispatcher.dispatchAndForget(this.setupMIDI, port, buffer);
88
104
  }
105
+ updateMonitoringMap(map) {
106
+ dispatcher.dispatchAndForget(this.updateMonitoringMap, map);
107
+ }
89
108
  terminate() { dispatcher.dispatchAndForget(this.terminate); }
90
109
  }));
91
110
  const { port, sab } = this.#terminator.own(MIDIReceiver.create(() => context instanceof AudioContext ? context.outputLatency * 1000 : 20, (deviceId, data, relativeTimeInMs) => this.#project.receivedMIDIFromEngine(deviceId, data, relativeTimeInMs)));
@@ -146,20 +165,25 @@ export class EngineWorklet extends AudioWorkletNode {
146
165
  this.#preferences = this.#terminator.own(new PreferencesHost(EngineSettingsSchema.parse({})));
147
166
  this.#terminator.ownAll(AnimationFrame.add(() => reader.tryRead()), project.liveStreamReceiver.connect(messenger.channel("engine-live-data")), this.#preferences.syncWith(messenger.channel("engine-preferences")), new SyncSource(project.boxGraph, messenger.channel("engine-sync"), false));
148
167
  }
149
- play() { this.#commands.play(); }
150
- stop(reset = false) { this.#commands.stop(reset); }
168
+ play() {
169
+ this.wake();
170
+ this.#commands.play();
171
+ }
172
+ stop(reset = false) {
173
+ this.#isPlaying.setValue(false);
174
+ this.#commands.stop(reset);
175
+ }
151
176
  setPosition(position) { this.#commands.setPosition(position); }
152
177
  prepareRecordingState(countIn) { this.#commands.prepareRecordingState(countIn); }
153
178
  stopRecording() { this.#commands.stopRecording(); }
154
179
  panic() { this.#commands.panic(); }
155
180
  sleep() {
156
181
  Atomics.store(this.#controlFlags, 0, 1);
182
+ this.#isPlaying.setValue(false);
157
183
  this.#commands.stop(true);
158
184
  }
159
185
  wake() { Atomics.store(this.#controlFlags, 0, 0); }
160
- loadClickSound(index, data) {
161
- this.#commands.loadClickSound(index, data);
162
- }
186
+ loadClickSound(index, data) { this.#commands.loadClickSound(index, data); }
163
187
  get isPlaying() { return this.#isPlaying; }
164
188
  get isRecording() { return this.#isRecording; }
165
189
  get isCountingIn() { return this.#isCountingIn; }
@@ -170,6 +194,9 @@ export class EngineWorklet extends AudioWorkletNode {
170
194
  get markerState() { return this.#markerState; }
171
195
  get project() { return this.#project; }
172
196
  get preferences() { return this.#preferences; }
197
+ get cpuLoad() { return this.#cpuLoad; }
198
+ get perfBuffer() { return this.#perfBuffer; }
199
+ get perfIndex() { return this.#perfIndex; }
173
200
  isReady() { return this.#isReady; }
174
201
  queryLoadingComplete() { return this.#commands.queryLoadingComplete(); }
175
202
  noteSignal(signal) { this.#commands.noteSignal(signal); }
@@ -189,6 +216,75 @@ export class EngineWorklet extends AudioWorkletNode {
189
216
  });
190
217
  return this.#notifyClipNotification.subscribe(observer);
191
218
  }
219
+ registerMonitoringSource(uuid, node, numChannels) {
220
+ this.#monitoringSources.set(UUID.toString(uuid), { node, numChannels });
221
+ this.#rebuildMonitoringMerger();
222
+ }
223
+ unregisterMonitoringSource(uuid) {
224
+ const key = UUID.toString(uuid);
225
+ const entry = this.#monitoringSources.get(key);
226
+ if (isDefined(entry)) {
227
+ entry.node.disconnect();
228
+ this.#monitoringSources.delete(key);
229
+ }
230
+ this.#rebuildMonitoringMerger();
231
+ }
232
+ #rebuildMonitoringMerger() {
233
+ if (isDefined(this.#channelMerger)) {
234
+ this.#channelMerger.disconnect();
235
+ this.#channelMerger = null;
236
+ }
237
+ if (this.#monitoringSources.size === 0) {
238
+ this.#commands.updateMonitoringMap([]);
239
+ return;
240
+ }
241
+ let totalChannels = 0;
242
+ for (const { numChannels } of this.#monitoringSources.values()) {
243
+ totalChannels += numChannels;
244
+ }
245
+ this.#channelMerger = this.context.createChannelMerger(totalChannels);
246
+ this.#channelMerger.connect(this);
247
+ const map = [];
248
+ let channel = 0;
249
+ for (const [uuidString, { node, numChannels }] of this.#monitoringSources) {
250
+ const uuid = UUID.parse(uuidString);
251
+ const splitter = this.context.createChannelSplitter(numChannels);
252
+ node.connect(splitter);
253
+ const channels = [];
254
+ for (let i = 0; i < numChannels; i++) {
255
+ splitter.connect(this.#channelMerger, i, channel);
256
+ channels.push(channel);
257
+ channel++;
258
+ }
259
+ map.push({ uuid, channels });
260
+ }
261
+ this.#commands.updateMonitoringMap(map);
262
+ }
263
+ #updateCpuLoad(budgetMs, project) {
264
+ while (this.#lastPerfReadIndex !== this.#perfIndex) {
265
+ const ms = this.#perfBuffer[this.#lastPerfReadIndex];
266
+ if (ms > this.#maxMsSinceLastUpdate) {
267
+ this.#maxMsSinceLastUpdate = ms;
268
+ }
269
+ if (ms >= budgetMs) {
270
+ this.#consecutiveOverloadCount++;
271
+ if (this.#consecutiveOverloadCount >= 30) {
272
+ project.handleCpuOverload();
273
+ this.#consecutiveOverloadCount = 0;
274
+ }
275
+ }
276
+ else {
277
+ this.#consecutiveOverloadCount = 0;
278
+ }
279
+ this.#lastPerfReadIndex = (this.#lastPerfReadIndex + 1) % PERF_BUFFER_SIZE;
280
+ }
281
+ const now = performance.now();
282
+ if (now - this.#lastCpuLoadUpdate >= 1000) {
283
+ this.#cpuLoad.setValue(Math.round((this.#maxMsSinceLastUpdate / budgetMs) * 100));
284
+ this.#maxMsSinceLastUpdate = 0;
285
+ this.#lastCpuLoadUpdate = now;
286
+ }
287
+ }
192
288
  terminate() {
193
289
  this.#commands.terminate();
194
290
  this.#terminator.terminate();
@@ -0,0 +1,7 @@
1
+ export declare class HRClockWorker {
2
+ #private;
3
+ static get(): HRClockWorker;
4
+ readonly sab: SharedArrayBuffer;
5
+ private constructor();
6
+ }
7
+ //# sourceMappingURL=HRClockWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HRClockWorker.d.ts","sourceRoot":"","sources":["../src/HRClockWorker.ts"],"names":[],"mappings":"AAKA,qBAAa,aAAa;;IAEtB,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAA;IAG/B,OAAO;CA+BV"}