@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
@@ -1 +1 @@
1
- {"version":3,"file":"AudioOfflineRenderer.d.ts","sourceRoot":"","sources":["../src/AudioOfflineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,GAAG,EAAE,MAAM,EAAmC,MAAM,kBAAkB,CAAA;AAItG,OAAO,EAAC,wBAAwB,EAAC,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,oBAAoB,CAAC;IAC3B,MAAM,KAAK,GAAU,QAAQ,OAAO,EACf,wBAAwB,MAAM,CAAC,wBAAwB,CAAC,EACxD,aAAY,GAAY,KAAG,OAAO,CAAC,WAAW,CA4BzE,CAAA;CACJ"}
1
+ {"version":3,"file":"AudioOfflineRenderer.d.ts","sourceRoot":"","sources":["../src/AudioOfflineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,GAAG,EACH,MAAM,EAKT,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,wBAAwB,EAAC,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,oBAAoB,CAAC;IAC3B,MAAM,KAAK,GAAU,QAAQ,OAAO,EACf,wBAAwB,MAAM,CAAC,wBAAwB,CAAC,EACxD,aAAY,GAAY,KAAG,OAAO,CAAC,WAAW,CA+CzE,CAAA;CACJ"}
@@ -1,5 +1,4 @@
1
- import { DefaultObservableValue, panic, RuntimeNotifier, TimeSpan } from "@opendaw/lib-std";
2
- import { PPQN } from "@opendaw/lib-dsp";
1
+ import { DefaultObservableValue, Errors, panic, RuntimeNotifier, Terminator, TimeSpan } from "@opendaw/lib-std";
3
2
  import { AnimationFrame } from "@opendaw/lib-dom";
4
3
  import { Wait } from "@opendaw/lib-runtime";
5
4
  import { ExportStemsConfiguration } from "@opendaw/studio-adapters";
@@ -11,19 +10,20 @@ export var AudioOfflineRenderer;
11
10
  if (numStems === 0) {
12
11
  return panic("Nothing to export");
13
12
  }
14
- const project = source.copy();
15
- const progress = new DefaultObservableValue(0.0);
16
- const dialog = RuntimeNotifier.progress({ headline: "Rendering...", progress });
17
- project.boxGraph.beginTransaction();
18
- project.timelineBox.loopArea.enabled.setValue(false);
19
- project.boxGraph.endTransaction();
20
- const durationInPulses = project.timelineBox.durationInPulses.getValue();
21
- const numSamples = PPQN.pulsesToSamples(durationInPulses, project.bpm, sampleRate);
13
+ const { promise, reject, resolve } = Promise.withResolvers();
14
+ const projectCopy = source.copy();
15
+ const terminator = new Terminator();
16
+ const progress = terminator.own(new DefaultObservableValue(0.0));
17
+ projectCopy.boxGraph.beginTransaction();
18
+ projectCopy.timelineBox.loopArea.enabled.setValue(false);
19
+ projectCopy.boxGraph.endTransaction();
20
+ const durationInPulses = projectCopy.timelineBox.durationInPulses.getValue();
21
+ const numSamples = Math.ceil(projectCopy.tempoMap.intervalToSeconds(0, durationInPulses) * sampleRate);
22
22
  const context = new OfflineAudioContext(numStems * 2, numSamples, sampleRate);
23
23
  const durationInSeconds = numSamples / sampleRate;
24
24
  const worklets = await AudioWorklets.createFor(context);
25
25
  const engineWorklet = worklets.createEngine({
26
- project: project,
26
+ project: projectCopy,
27
27
  exportConfiguration: optExportConfiguration.unwrapOrUndefined()
28
28
  });
29
29
  engineWorklet.play();
@@ -32,11 +32,24 @@ export var AudioOfflineRenderer;
32
32
  while (!await engineWorklet.queryLoadingComplete()) {
33
33
  await Wait.timeSpan(TimeSpan.seconds(1));
34
34
  }
35
- const terminable = AnimationFrame.add(() => progress.setValue(context.currentTime / durationInSeconds));
36
- const buffer = await context.startRendering();
37
- terminable.terminate();
38
- dialog.terminate();
39
- project.terminate();
40
- return buffer;
35
+ // Start rendering...
36
+ let cancelled = false;
37
+ terminator.ownAll(projectCopy, RuntimeNotifier.progress({
38
+ headline: "Rendering...", progress, cancel: () => {
39
+ engineWorklet.stop(true);
40
+ engineWorklet.sleep();
41
+ terminator.terminate();
42
+ cancelled = true;
43
+ reject(Errors.AbortError);
44
+ }
45
+ }), AnimationFrame.add(() => progress.setValue(context.currentTime / durationInSeconds)));
46
+ context.startRendering().then(buffer => {
47
+ console.debug(`rendering complete. cancelled: ${cancelled}`);
48
+ if (!cancelled) {
49
+ terminator.terminate();
50
+ resolve(buffer);
51
+ }
52
+ }, reason => reject(reason));
53
+ return promise;
41
54
  };
42
55
  })(AudioOfflineRenderer || (AudioOfflineRenderer = {}));
@@ -1,3 +1,3 @@
1
- import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DelayDeviceBox, FoldDeviceBox, ModularDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, UnknownAudioEffectDeviceBox, UnknownMidiEffectDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
2
- export type EffectBox = ArpeggioDeviceBox | PitchDeviceBox | VelocityDeviceBox | ZeitgeistDeviceBox | UnknownMidiEffectDeviceBox | DelayDeviceBox | ReverbDeviceBox | RevampDeviceBox | StereoToolDeviceBox | ModularDeviceBox | UnknownAudioEffectDeviceBox | CompressorDeviceBox | CrusherDeviceBox | FoldDeviceBox;
1
+ import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DelayDeviceBox, TidalDeviceBox, FoldDeviceBox, ModularDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, UnknownAudioEffectDeviceBox, UnknownMidiEffectDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
2
+ export type EffectBox = ArpeggioDeviceBox | PitchDeviceBox | VelocityDeviceBox | ZeitgeistDeviceBox | UnknownMidiEffectDeviceBox | DelayDeviceBox | ReverbDeviceBox | RevampDeviceBox | StereoToolDeviceBox | TidalDeviceBox | ModularDeviceBox | UnknownAudioEffectDeviceBox | CompressorDeviceBox | CrusherDeviceBox | FoldDeviceBox;
3
3
  //# sourceMappingURL=EffectBox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EffectBox.d.ts","sourceRoot":"","sources":["../src/EffectBox.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EACrB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,SAAS,GACf,iBAAiB,GAAG,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,0BAA0B,GACxG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,mBAAmB,GACxE,gBAAgB,GAAG,2BAA2B,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,aAAa,CAAA"}
1
+ {"version":3,"file":"EffectBox.d.ts","sourceRoot":"","sources":["../src/EffectBox.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EACrB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,SAAS,GACf,iBAAiB,GAAG,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,0BAA0B,GACxG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,mBAAmB,GAAG,cAAc,GACzF,gBAAgB,GAAG,2BAA2B,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,aAAa,CAAA"}
@@ -10,6 +10,7 @@ export declare namespace EffectFactories {
10
10
  const Reverb: EffectFactory;
11
11
  const Crusher: EffectFactory;
12
12
  const Fold: EffectFactory;
13
+ const Tidal: EffectFactory;
13
14
  const Revamp: EffectFactory;
14
15
  const Modular: EffectFactory;
15
16
  const MidiNamed: {
@@ -26,6 +27,7 @@ export declare namespace EffectFactories {
26
27
  Revamp: EffectFactory;
27
28
  Crusher: EffectFactory;
28
29
  Fold: EffectFactory;
30
+ Tidal: EffectFactory;
29
31
  Modular: EffectFactory;
30
32
  };
31
33
  const MidiList: ReadonlyArray<Readonly<EffectFactory>>;
@@ -38,6 +40,7 @@ export declare namespace EffectFactories {
38
40
  Revamp: EffectFactory;
39
41
  Crusher: EffectFactory;
40
42
  Fold: EffectFactory;
43
+ Tidal: EffectFactory;
41
44
  Modular: EffectFactory;
42
45
  Arpeggio: EffectFactory;
43
46
  Pitch: EffectFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"EffectFactories.d.ts","sourceRoot":"","sources":["../src/EffectFactories.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAG7C,yBAAiB,eAAe,CAAC;IACtB,MAAM,QAAQ,EAAE,aAWtB,CAAA;IAEM,MAAM,KAAK,EAAE,aAWnB,CAAA;IAEM,MAAM,QAAQ,EAAE,aAYtB,CAAA;IAEM,MAAM,SAAS,EAAE,aAqBvB,CAAA;IAEM,MAAM,UAAU,EAAE,aAYxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAYnB,CAAA;IAEM,MAAM,UAAU,EAAE,aAYxB,CAAA;IAEM,MAAM,MAAM,EAAE,aAapB,CAAA;IAEM,MAAM,OAAO,EAAE,aAYrB,CAAA;IAEM,MAAM,IAAI,EAAE,aAYlB,CAAA;IAEM,MAAM,MAAM,EAAE,aAYpB,CAAA;IAEM,MAAM,OAAO,EAAE,aAoCrB,CAAA;IAEM,MAAM,SAAS;;;;;KAAyC,CAAA;IACxD,MAAM,UAAU;;;;;;;;;KAA0E,CAAA;IAC1F,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":"AAsBA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAG7C,yBAAiB,eAAe,CAAC;IACtB,MAAM,QAAQ,EAAE,aAWtB,CAAA;IAEM,MAAM,KAAK,EAAE,aAWnB,CAAA;IAEM,MAAM,QAAQ,EAAE,aAYtB,CAAA;IAEM,MAAM,SAAS,EAAE,aAqBvB,CAAA;IAEM,MAAM,UAAU,EAAE,aAYxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAYnB,CAAA;IAEM,MAAM,UAAU,EAAE,aAYxB,CAAA;IAEM,MAAM,MAAM,EAAE,aAapB,CAAA;IAEM,MAAM,OAAO,EAAE,aAYrB,CAAA;IAEM,MAAM,IAAI,EAAE,aAYlB,CAAA;IAEM,MAAM,KAAK,EAAE,aAanB,CAAA;IAEM,MAAM,MAAM,EAAE,aAYpB,CAAA;IAEM,MAAM,OAAO,EAAE,aAoCrB,CAAA;IAEM,MAAM,SAAS;;;;;KAAyC,CAAA;IACxD,MAAM,UAAU;;;;;;;;;;KAAiF,CAAA;IACjG,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,6 +1,6 @@
1
1
  import { UUID } from "@opendaw/lib-std";
2
- import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DelayDeviceBox, FoldDeviceBox, GrooveShuffleBox, ModularAudioInputBox, ModularAudioOutputBox, ModularBox, ModularDeviceBox, ModuleConnectionBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
3
- import { IconSymbol } from "@opendaw/studio-adapters";
2
+ import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DelayDeviceBox, FoldDeviceBox, GrooveShuffleBox, ModularAudioInputBox, ModularAudioOutputBox, ModularBox, ModularDeviceBox, ModuleConnectionBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
3
+ import { IconSymbol } from "@opendaw/studio-enums";
4
4
  import { EffectParameterDefaults } from "./EffectParameterDefaults";
5
5
  export var EffectFactories;
6
6
  (function (EffectFactories) {
@@ -10,10 +10,10 @@ export var EffectFactories;
10
10
  description: "Generates rhythmic note sequences from chords",
11
11
  separatorBefore: false,
12
12
  type: "midi",
13
- create: ({ boxGraph }, unit, index) => ArpeggioDeviceBox.create(boxGraph, UUID.generate(), box => {
13
+ create: ({ boxGraph }, hostField, index) => ArpeggioDeviceBox.create(boxGraph, UUID.generate(), box => {
14
14
  box.label.setValue("Arpeggio");
15
15
  box.index.setValue(index);
16
- box.host.refer(unit);
16
+ box.host.refer(hostField);
17
17
  })
18
18
  };
19
19
  EffectFactories.Pitch = {
@@ -22,10 +22,10 @@ export var EffectFactories;
22
22
  description: "Shifts the pitch of incoming notes",
23
23
  separatorBefore: false,
24
24
  type: "midi",
25
- create: ({ boxGraph }, unit, index) => PitchDeviceBox.create(boxGraph, UUID.generate(), box => {
25
+ create: ({ boxGraph }, hostField, index) => PitchDeviceBox.create(boxGraph, UUID.generate(), box => {
26
26
  box.label.setValue("Pitch");
27
27
  box.index.setValue(index);
28
- box.host.refer(unit);
28
+ box.host.refer(hostField);
29
29
  })
30
30
  };
31
31
  EffectFactories.Velocity = {
@@ -35,10 +35,10 @@ export var EffectFactories;
35
35
  manualPage: "manuals/devices/midi/velocity",
36
36
  separatorBefore: false,
37
37
  type: "midi",
38
- create: ({ boxGraph }, unit, index) => VelocityDeviceBox.create(boxGraph, UUID.generate(), box => {
38
+ create: ({ boxGraph }, hostField, index) => VelocityDeviceBox.create(boxGraph, UUID.generate(), box => {
39
39
  box.label.setValue("Velocity");
40
40
  box.index.setValue(index);
41
- box.host.refer(unit);
41
+ box.host.refer(hostField);
42
42
  })
43
43
  };
44
44
  EffectFactories.Zeitgeist = {
@@ -47,7 +47,7 @@ export var EffectFactories;
47
47
  description: "Distorts space and time",
48
48
  separatorBefore: false,
49
49
  type: "midi",
50
- create: ({ boxGraph, rootBoxAdapter }, unit, index) => {
50
+ create: ({ boxGraph, rootBoxAdapter }, hostField, index) => {
51
51
  const useGlobal = false; // TODO First Zeitgeist should be true
52
52
  const shuffleBox = useGlobal
53
53
  ? rootBoxAdapter.groove.box
@@ -59,7 +59,7 @@ export var EffectFactories;
59
59
  box.label.setValue("Zeitgeist");
60
60
  box.groove.refer(shuffleBox);
61
61
  box.index.setValue(index);
62
- box.host.refer(unit);
62
+ box.host.refer(hostField);
63
63
  });
64
64
  }
65
65
  };
@@ -69,10 +69,10 @@ export var EffectFactories;
69
69
  description: "Computes a stereo transformation matrix with volume, panning, phase inversion and stereo width.",
70
70
  separatorBefore: false,
71
71
  type: "audio",
72
- create: ({ boxGraph }, unit, index) => StereoToolDeviceBox.create(boxGraph, UUID.generate(), box => {
72
+ create: ({ boxGraph }, hostField, index) => StereoToolDeviceBox.create(boxGraph, UUID.generate(), box => {
73
73
  box.label.setValue("Stereo Tool");
74
74
  box.index.setValue(index);
75
- box.host.refer(unit);
75
+ box.host.refer(hostField);
76
76
  })
77
77
  };
78
78
  EffectFactories.Delay = {
@@ -81,10 +81,10 @@ export var EffectFactories;
81
81
  description: "Echoes the input signal with time-based repeats",
82
82
  separatorBefore: false,
83
83
  type: "audio",
84
- create: ({ boxGraph }, unit, index) => DelayDeviceBox.create(boxGraph, UUID.generate(), box => {
84
+ create: ({ boxGraph }, hostField, index) => DelayDeviceBox.create(boxGraph, UUID.generate(), box => {
85
85
  box.label.setValue("Delay");
86
86
  box.index.setValue(index);
87
- box.host.refer(unit);
87
+ box.host.refer(hostField);
88
88
  })
89
89
  };
90
90
  EffectFactories.Compressor = {
@@ -93,10 +93,10 @@ export var EffectFactories;
93
93
  description: "Reduces the dynamic range by attenuating signals above a threshold",
94
94
  separatorBefore: false,
95
95
  type: "audio",
96
- create: ({ boxGraph }, unit, index) => CompressorDeviceBox.create(boxGraph, UUID.generate(), box => {
96
+ create: ({ boxGraph }, hostField, index) => CompressorDeviceBox.create(boxGraph, UUID.generate(), box => {
97
97
  box.label.setValue("Compressor");
98
98
  box.index.setValue(index);
99
- box.host.refer(unit);
99
+ box.host.refer(hostField);
100
100
  })
101
101
  };
102
102
  EffectFactories.Reverb = {
@@ -105,11 +105,11 @@ export var EffectFactories;
105
105
  description: "Simulates space and depth with reflections",
106
106
  separatorBefore: false,
107
107
  type: "audio",
108
- create: ({ boxGraph }, unit, index) => ReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
108
+ create: ({ boxGraph }, hostField, index) => ReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
109
109
  box.label.setValue("Reverb");
110
110
  box.preDelay.setInitValue(0.001);
111
111
  box.index.setValue(index);
112
- box.host.refer(unit);
112
+ box.host.refer(hostField);
113
113
  })
114
114
  };
115
115
  EffectFactories.Crusher = {
@@ -118,10 +118,10 @@ export var EffectFactories;
118
118
  description: "Degrates the audio signal",
119
119
  separatorBefore: false,
120
120
  type: "audio",
121
- create: ({ boxGraph }, unit, index) => CrusherDeviceBox.create(boxGraph, UUID.generate(), box => {
121
+ create: ({ boxGraph }, hostField, index) => CrusherDeviceBox.create(boxGraph, UUID.generate(), box => {
122
122
  box.label.setValue("Crusher");
123
123
  box.index.setValue(index);
124
- box.host.refer(unit);
124
+ box.host.refer(hostField);
125
125
  })
126
126
  };
127
127
  EffectFactories.Fold = {
@@ -130,10 +130,23 @@ export var EffectFactories;
130
130
  description: "Folds the signal back into audio-range",
131
131
  separatorBefore: false,
132
132
  type: "audio",
133
- create: ({ boxGraph }, unit, index) => FoldDeviceBox.create(boxGraph, UUID.generate(), box => {
133
+ create: ({ boxGraph }, hostField, index) => FoldDeviceBox.create(boxGraph, UUID.generate(), box => {
134
134
  box.label.setValue("Fold");
135
135
  box.index.setValue(index);
136
- box.host.refer(unit);
136
+ box.host.refer(hostField);
137
+ })
138
+ };
139
+ EffectFactories.Tidal = {
140
+ defaultName: "Tidal",
141
+ defaultIcon: IconSymbol.Tidal,
142
+ description: "Shape rhythm and space through volume and pan.",
143
+ separatorBefore: false,
144
+ type: "audio",
145
+ create: ({ boxGraph }, hostField, index) => TidalDeviceBox.create(boxGraph, UUID.generate(), box => {
146
+ box.label.setValue("Tidal");
147
+ box.index.setValue(index);
148
+ box.depth.setValue(0.75);
149
+ box.host.refer(hostField);
137
150
  })
138
151
  };
139
152
  EffectFactories.Revamp = {
@@ -142,10 +155,10 @@ export var EffectFactories;
142
155
  description: "Shapes the frequency balance of the sound",
143
156
  separatorBefore: false,
144
157
  type: "audio",
145
- create: ({ boxGraph }, unit, index) => RevampDeviceBox.create(boxGraph, UUID.generate(), box => {
158
+ create: ({ boxGraph }, hostField, index) => RevampDeviceBox.create(boxGraph, UUID.generate(), box => {
146
159
  EffectParameterDefaults.defaultRevampDeviceBox(box);
147
160
  box.index.setValue(index);
148
- box.host.refer(unit);
161
+ box.host.refer(hostField);
149
162
  })
150
163
  };
151
164
  EffectFactories.Modular = {
@@ -154,7 +167,7 @@ export var EffectFactories;
154
167
  description: "",
155
168
  separatorBefore: true,
156
169
  type: "audio",
157
- create: ({ boxGraph, rootBox, userEditingManager }, unit, index) => {
170
+ create: ({ boxGraph, rootBox, userEditingManager }, hostField, index) => {
158
171
  const moduleSetupBox = ModularBox.create(boxGraph, UUID.generate(), box => {
159
172
  box.collection.refer(rootBox.modularSetups);
160
173
  box.label.setValue("Modular");
@@ -181,12 +194,12 @@ export var EffectFactories;
181
194
  box.label.setValue("Modular");
182
195
  box.modularSetup.refer(moduleSetupBox.device);
183
196
  box.index.setValue(index);
184
- box.host.refer(unit);
197
+ box.host.refer(hostField);
185
198
  });
186
199
  }
187
200
  };
188
201
  EffectFactories.MidiNamed = { Arpeggio: EffectFactories.Arpeggio, Pitch: EffectFactories.Pitch, Velocity: EffectFactories.Velocity, Zeitgeist: EffectFactories.Zeitgeist };
189
- EffectFactories.AudioNamed = { StereoTool: EffectFactories.StereoTool, Compressor: EffectFactories.Compressor, Delay: EffectFactories.Delay, Reverb: EffectFactories.Reverb, Revamp: EffectFactories.Revamp, Crusher: EffectFactories.Crusher, Fold: EffectFactories.Fold, Modular: EffectFactories.Modular };
202
+ EffectFactories.AudioNamed = { StereoTool: EffectFactories.StereoTool, Compressor: EffectFactories.Compressor, Delay: EffectFactories.Delay, Reverb: EffectFactories.Reverb, Revamp: EffectFactories.Revamp, Crusher: EffectFactories.Crusher, Fold: EffectFactories.Fold, Tidal: EffectFactories.Tidal, Modular: EffectFactories.Modular };
190
203
  EffectFactories.MidiList = Object.values(EffectFactories.MidiNamed);
191
204
  EffectFactories.AudioList = Object.values(EffectFactories.AudioNamed);
192
205
  EffectFactories.MergedNamed = { ...EffectFactories.MidiNamed, ...EffectFactories.AudioNamed };
@@ -1,4 +1,5 @@
1
- import { EffectPointerType, IconSymbol } from "@opendaw/studio-adapters";
1
+ import { EffectPointerType } from "@opendaw/studio-adapters";
2
+ import { IconSymbol } from "@opendaw/studio-enums";
2
3
  import { Field } from "@opendaw/lib-box";
3
4
  import { int } from "@opendaw/lib-std";
4
5
  import { Project } from "./project";
@@ -10,6 +11,6 @@ export interface EffectFactory {
10
11
  readonly manualPage?: string;
11
12
  readonly separatorBefore: boolean;
12
13
  readonly type: "audio" | "midi";
13
- create(project: Project, unit: Field<EffectPointerType>, index: int): EffectBox;
14
+ create(project: Project, host: Field<EffectPointerType>, index: int): EffectBox;
14
15
  }
15
16
  //# sourceMappingURL=EffectFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EffectFactory.d.ts","sourceRoot":"","sources":["../src/EffectFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AACpC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAErC,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IAE/B,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,CAAA;CAClF"}
1
+ {"version":3,"file":"EffectFactory.d.ts","sourceRoot":"","sources":["../src/EffectFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AACpC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAErC,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IAE/B,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,CAAA;CAClF"}
package/dist/Engine.d.ts CHANGED
@@ -12,6 +12,8 @@ export interface Engine extends Terminable {
12
12
  queryLoadingComplete(): Promise<boolean>;
13
13
  stop(): void;
14
14
  panic(): void;
15
+ sleep(): void;
16
+ wake(): void;
15
17
  noteSignal(signal: NoteSignal): void;
16
18
  subscribeNotes(observer: Observer<NoteSignal>): Subscription;
17
19
  ignoreNoteRegion(uuid: UUID.Bytes): void;
@@ -1 +1 @@
1
- {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,GAAG,EACH,sBAAsB,EACtB,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAC,gBAAgB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACrE,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,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,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,gBAAgB,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAChD,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,wBAAwB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAC/D,IAAI,gBAAgB,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;IAC5C,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;CACzB"}
1
+ {"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,GAAG,EACH,sBAAsB,EACtB,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAC,gBAAgB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACrE,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,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,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,gBAAgB,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IAChD,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,wBAAwB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAC/D,IAAI,gBAAgB,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;IAC5C,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;CACzB"}
@@ -29,6 +29,8 @@ export declare class EngineFacade implements Engine {
29
29
  isReady(): Promise<void>;
30
30
  queryLoadingComplete(): Promise<boolean>;
31
31
  panic(): void;
32
+ sleep(): void;
33
+ wake(): void;
32
34
  sampleRate(): number;
33
35
  subscribeClipNotification(observer: Observer<ClipNotification>): Subscription;
34
36
  subscribeNotes(observer: Observer<NoteSignal>): Subscription;
@@ -1 +1 @@
1
- {"version":3,"file":"EngineFacade.d.ts","sourceRoot":"","sources":["../src/EngineFacade.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,sBAAsB,EACtB,GAAG,EACH,sBAAsB,EACtB,QAAQ,EACR,eAAe,EACf,QAAQ,EAER,YAAY,EAEZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAC,gBAAgB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjC,qBAAa,YAAa,YAAW,MAAM;;;IAmBvC,UAAU,CAAC,OAAO,EAAE,aAAa;IAoBjC,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,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,gBAAgB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAgC;IACvF,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAiC;IAC/E,IAAI,wBAAwB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAwC;IACvG,IAAI,gBAAgB,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAgC;IACnF,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;IAEzF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAGxC,KAAK,IAAI,IAAI;IACb,UAAU,IAAI,MAAM;IACpB,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":"AAAA,OAAO,EACH,sBAAsB,EACtB,GAAG,EACH,sBAAsB,EACtB,QAAQ,EACR,eAAe,EACf,QAAQ,EAER,YAAY,EAEZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAC,gBAAgB,EAAE,UAAU,EAAC,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjC,qBAAa,YAAa,YAAW,MAAM;;;IAmBvC,UAAU,CAAC,OAAO,EAAE,aAAa;IAoBjC,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,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,gBAAgB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAgC;IACvF,IAAI,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAiC;IAC/E,IAAI,wBAAwB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAwC;IACvG,IAAI,gBAAgB,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAgC;IACnF,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;IAEzF,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,UAAU,IAAI,MAAM;IACpB,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"}
@@ -46,6 +46,8 @@ export class EngineFacade {
46
46
  return this.#worklet.mapOr(worklet => worklet.queryLoadingComplete(), Promise.resolve(false));
47
47
  }
48
48
  panic() { this.#worklet.ifSome(worklet => worklet.panic()); }
49
+ sleep() { this.#worklet.ifSome(worklet => worklet.sleep()); }
50
+ wake() { this.#worklet.ifSome(worklet => worklet.wake()); }
49
51
  sampleRate() { return this.#worklet.isEmpty() ? 44_100 : this.#worklet.unwrap().context.sampleRate; }
50
52
  subscribeClipNotification(observer) {
51
53
  return this.#worklet.unwrap("No worklet to subscribeClipNotification").subscribeClipNotification(observer);
@@ -14,6 +14,8 @@ export declare class EngineWorklet extends AudioWorkletNode implements Engine {
14
14
  prepareRecordingState(countIn: boolean): void;
15
15
  stopRecording(): void;
16
16
  panic(): void;
17
+ sleep(): void;
18
+ wake(): void;
17
19
  get isPlaying(): ObservableValue<boolean>;
18
20
  get isRecording(): ObservableValue<boolean>;
19
21
  get isCountingIn(): ObservableValue<boolean>;
@@ -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,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAIrC,OAAO,EAEH,gBAAgB,EAOhB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,qBAAa,aAAc,SAAQ,gBAAiB,YAAW,MAAM;;IACjE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAQ;IAEtB,QAAQ,CAAC,EAAE,SAAqB;gBAqBpB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,wBAAwB,EAC9C,OAAO,CAAC,EAAE,gBAAgB;IAoItC,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;IAEb,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,gBAAgB,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAgC;IACnF,IAAI,qBAAqB,IAAI,eAAe,CAAC,MAAM,CAAC,CAAqC;IACzF,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAwB;IAC7D,IAAI,iBAAiB,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAiC;IACxF,IAAI,wBAAwB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAwC;IACvG,IAAI,gBAAgB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAgC;IACvF,IAAI,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAA2B;IAC1F,IAAI,OAAO,IAAI,OAAO,CAAuB;IAE7C,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;CAIpB"}
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,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAIrC,OAAO,EAEH,gBAAgB,EAOhB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,qBAAa,aAAc,SAAQ,gBAAiB,YAAW,MAAM;;IACjE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAQ;IAEtB,QAAQ,CAAC,EAAE,SAAqB;gBAuBpB,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;IAEZ,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,gBAAgB,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAgC;IACnF,IAAI,qBAAqB,IAAI,eAAe,CAAC,MAAM,CAAC,CAAqC;IACzF,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAwB;IAC7D,IAAI,iBAAiB,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAiC;IACxF,IAAI,wBAAwB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAwC;IACvG,IAAI,gBAAgB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAgC;IACvF,IAAI,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAA2B;IAC1F,IAAI,OAAO,IAAI,OAAO,CAAuB;IAE7C,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"}
@@ -18,6 +18,7 @@ export class EngineWorklet extends AudioWorkletNode {
18
18
  #countInBeatsRemaining = new DefaultObservableValue(0);
19
19
  #metronomeEnabled = new DefaultObservableValue(false);
20
20
  #markerState = new DefaultObservableValue(null);
21
+ #controlFlags;
21
22
  #notifyClipNotification;
22
23
  #notifyNoteSignals;
23
24
  #playingClips;
@@ -33,12 +34,14 @@ export class EngineWorklet extends AudioWorkletNode {
33
34
  this.#playbackTimestamp.setValue(state.playbackTimestamp);
34
35
  this.#position.setValue(state.position); // This must be the last to handle the state values before
35
36
  });
37
+ const controlFlagsSAB = new SharedArrayBuffer(4); // 4 bytes minimum
36
38
  super(context, "engine-processor", {
37
39
  numberOfInputs: 0,
38
40
  numberOfOutputs: 1,
39
41
  outputChannelCount: [numberOfChannels],
40
42
  processorOptions: {
41
- sab: reader.buffer,
43
+ syncStreamBuffer: reader.buffer,
44
+ controlFlagsBuffer: controlFlagsSAB,
42
45
  project: project.toArrayBuffer(),
43
46
  exportConfiguration,
44
47
  options
@@ -51,6 +54,7 @@ export class EngineWorklet extends AudioWorkletNode {
51
54
  this.#notifyClipNotification = this.#terminator.own(new Notifier());
52
55
  this.#notifyNoteSignals = this.#terminator.own(new Notifier());
53
56
  this.#playingClips = [];
57
+ this.#controlFlags = new Int32Array(controlFlagsSAB);
54
58
  this.#commands = this.#terminator.own(Communicator.sender(messenger.channel("engine-commands"), dispatcher => new class {
55
59
  play() { dispatcher.dispatchAndForget(this.play); }
56
60
  stop(reset) { dispatcher.dispatchAndForget(this.stop, reset); }
@@ -72,6 +76,8 @@ export class EngineWorklet extends AudioWorkletNode {
72
76
  return dispatcher.dispatchAndReturn(this.queryLoadingComplete);
73
77
  }
74
78
  panic() { dispatcher.dispatchAndForget(this.panic); }
79
+ sleep() { dispatcher.dispatchAndForget(this.sleep); }
80
+ wake() { dispatcher.dispatchAndForget(this.wake); }
75
81
  noteSignal(signal) { dispatcher.dispatchAndForget(this.noteSignal, signal); }
76
82
  ignoreNoteRegion(uuid) {
77
83
  dispatcher.dispatchAndForget(this.ignoreNoteRegion, uuid);
@@ -147,6 +153,11 @@ export class EngineWorklet extends AudioWorkletNode {
147
153
  prepareRecordingState(countIn) { this.#commands.prepareRecordingState(countIn); }
148
154
  stopRecording() { this.#commands.stopRecording(); }
149
155
  panic() { this.#commands.panic(); }
156
+ sleep() {
157
+ Atomics.store(this.#controlFlags, 0, 1);
158
+ this.#commands.stop(true);
159
+ }
160
+ wake() { Atomics.store(this.#controlFlags, 0, 0); }
150
161
  get isPlaying() { return this.#isPlaying; }
151
162
  get isRecording() { return this.#isRecording; }
152
163
  get isCountingIn() { return this.#isCountingIn; }
@@ -178,6 +189,7 @@ export class EngineWorklet extends AudioWorkletNode {
178
189
  return this.#notifyClipNotification.subscribe(observer);
179
190
  }
180
191
  terminate() {
192
+ console.debug("WORKLET.terminate");
181
193
  this.#terminator.terminate();
182
194
  this.disconnect();
183
195
  }
@@ -0,0 +1,6 @@
1
+ export declare namespace ExternalLib {
2
+ const JSZip: () => Promise<import("jszip")>;
3
+ const SoundFont2: () => Promise<typeof import("soundfont2").SoundFont2>;
4
+ const FFmpegWorker: () => Promise<typeof import("@opendaw/studio-core/FFmpegWorker").FFmpegWorker>;
5
+ }
6
+ //# sourceMappingURL=ExternalLib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExternalLib.d.ts","sourceRoot":"","sources":["../src/ExternalLib.ts"],"names":[],"mappings":"AAGA,yBAAiB,WAAW,CAAC;IAMlB,MAAM,KAAK,gCAC8C,CAAA;IAEzD,MAAM,UAAU,uDAC+C,CAAA;IAE/D,MAAM,YAAY,gFACwE,CAAA;CACpG"}
@@ -0,0 +1,11 @@
1
+ import { Promises } from "@opendaw/lib-runtime";
2
+ export var ExternalLib;
3
+ (function (ExternalLib) {
4
+ const callback = (error, count) => {
5
+ console.debug(`ExternalLib.importFailure count: ${count}, online: ${navigator.onLine}`, error);
6
+ return count < 10;
7
+ };
8
+ ExternalLib.JSZip = async () => await Promises.guardedRetry(() => import("jszip").then(({ default: JSZip }) => JSZip), callback);
9
+ ExternalLib.SoundFont2 = async () => await Promises.guardedRetry(() => import("soundfont2").then(({ SoundFont2 }) => SoundFont2), callback);
10
+ ExternalLib.FFmpegWorker = async () => await Promises.guardedRetry(() => import("@opendaw/studio-core/FFmpegWorker").then(({ FFmpegWorker }) => FFmpegWorker), callback);
11
+ })(ExternalLib || (ExternalLib = {}));
@@ -3,6 +3,7 @@ export declare namespace FilePickerAcceptTypes {
3
3
  const SoundfontFiles: FilePickerOptions;
4
4
  const ProjectSyncLog: FilePickerOptions;
5
5
  const ProjectFileType: FilePickerAcceptType;
6
+ const PresetFileType: FilePickerAcceptType;
6
7
  const ProjectBundleFileType: FilePickerAcceptType;
7
8
  const DawprojectFileType: FilePickerAcceptType;
8
9
  const JsonFileType: FilePickerAcceptType;
@@ -1 +1 @@
1
- {"version":3,"file":"FilePickerAcceptTypes.d.ts","sourceRoot":"","sources":["../src/FilePickerAcceptTypes.ts"],"names":[],"mappings":"AAAA,yBAAiB,qBAAqB,CAAC;IAC5B,MAAM,QAAQ,EAAE,iBAKtB,CAAA;IACM,MAAM,cAAc,EAAE,iBAK5B,CAAA;IACM,MAAM,cAAc,EAAE,iBAK5B,CAAA;IAEM,MAAM,eAAe,EAAE,oBAG7B,CAAA;IAEM,MAAM,qBAAqB,EAAE,oBAGnC,CAAA;IAEM,MAAM,kBAAkB,EAAE,oBAGhC,CAAA;IACM,MAAM,YAAY,EAAE,oBAG1B,CAAA;CAEJ"}
1
+ {"version":3,"file":"FilePickerAcceptTypes.d.ts","sourceRoot":"","sources":["../src/FilePickerAcceptTypes.ts"],"names":[],"mappings":"AAAA,yBAAiB,qBAAqB,CAAC;IAC5B,MAAM,QAAQ,EAAE,iBAKtB,CAAA;IACM,MAAM,cAAc,EAAE,iBAK5B,CAAA;IACM,MAAM,cAAc,EAAE,iBAK5B,CAAA;IAEM,MAAM,eAAe,EAAE,oBAG7B,CAAA;IAEM,MAAM,cAAc,EAAE,oBAG5B,CAAA;IAEM,MAAM,qBAAqB,EAAE,oBAGnC,CAAA;IAEM,MAAM,kBAAkB,EAAE,oBAGhC,CAAA;IACM,MAAM,YAAY,EAAE,oBAG1B,CAAA;CAEJ"}
@@ -22,6 +22,10 @@ export var FilePickerAcceptTypes;
22
22
  description: "openDAW project",
23
23
  accept: { "application/octet-stream": [".od"] }
24
24
  };
25
+ FilePickerAcceptTypes.PresetFileType = {
26
+ description: "openDAW preset",
27
+ accept: { "application/octet-stream": [".odp"] }
28
+ };
25
29
  FilePickerAcceptTypes.ProjectBundleFileType = {
26
30
  description: "openDAW project bundle",
27
31
  accept: { "application/octet-stream": [".odb"] }
@@ -5,6 +5,7 @@ declare const PreferencesSchema: z.ZodObject<{
5
5
  "auto-create-output-compressor": z.ZodDefault<z.ZodBoolean>;
6
6
  "footer-show-fps-meter": z.ZodDefault<z.ZodBoolean>;
7
7
  "footer-show-build-infos": z.ZodDefault<z.ZodBoolean>;
8
+ "dragging-use-pointer-lock": z.ZodDefault<z.ZodBoolean>;
8
9
  }, z.core.$strip>;
9
10
  export type Preferences = z.infer<typeof PreferencesSchema>;
10
11
  export declare const Preferences: {
@@ -13,6 +14,7 @@ export declare const Preferences: {
13
14
  "auto-create-output-compressor": boolean;
14
15
  "footer-show-fps-meter": boolean;
15
16
  "footer-show-build-infos": boolean;
17
+ "dragging-use-pointer-lock": boolean;
16
18
  };
17
19
  catchupAndSubscribe: <KEY extends keyof Preferences>(observer: Observer<Preferences[KEY]>, property: KEY) => Subscription;
18
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Preferences.d.ts","sourceRoot":"","sources":["../src/Preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AACrB,OAAO,EAAsB,QAAQ,EAAE,YAAY,EAAW,MAAM,kBAAkB,CAAA;AAEtF,QAAA,MAAM,iBAAiB;;;;;iBAKrB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,eAAO,MAAM,WAAW;;;;;;;0BAkCM,GAAG,SAAS,MAAM,WAAW,YACrC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,KAAG,YAAY;CAK1E,CAAA"}
1
+ {"version":3,"file":"Preferences.d.ts","sourceRoot":"","sources":["../src/Preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AACrB,OAAO,EAAsB,QAAQ,EAAE,YAAY,EAAW,MAAM,kBAAkB,CAAA;AAEtF,QAAA,MAAM,iBAAiB;;;;;;iBAMrB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,eAAO,MAAM,WAAW;;;;;;;;0BAkCM,GAAG,SAAS,MAAM,WAAW,YACrC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,KAAG,YAAY;CAK1E,CAAA"}
@@ -4,7 +4,8 @@ const PreferencesSchema = z.object({
4
4
  "auto-open-clips": z.boolean().default(false),
5
5
  "auto-create-output-compressor": z.boolean().default(true),
6
6
  "footer-show-fps-meter": z.boolean().default(false),
7
- "footer-show-build-infos": z.boolean().default(false)
7
+ "footer-show-build-infos": z.boolean().default(false),
8
+ "dragging-use-pointer-lock": z.boolean().default(false),
8
9
  });
9
10
  export const Preferences = (() => {
10
11
  const STORAGE_KEY = "preferences";
@@ -1,6 +1,6 @@
1
1
  import { Terminable } from "@opendaw/lib-std";
2
2
  import { SampleLoaderManager } from "@opendaw/studio-adapters";
3
- import { Project } from "../project/Project";
3
+ import { Project } from "../project";
4
4
  import { RecordingWorklet } from "../RecordingWorklet";
5
5
  import { Capture } from "./Capture";
6
6
  export declare namespace RecordAudio {
@@ -1 +1 @@
1
- {"version":3,"file":"RecordAudio.d.ts","sourceRoot":"","sources":["../../src/capture/RecordAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,UAAU,EAAmB,MAAM,kBAAkB,CAAA;AAGvG,OAAO,EAAC,mBAAmB,EAAY,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,yBAAiB,WAAW,CAAC;IACzB,KAAK,kBAAkB,GAAG;QACtB,gBAAgB,EAAE,gBAAgB,CAAA;QAClC,WAAW,EAAE,WAAW,CAAA;QACxB,aAAa,EAAE,mBAAmB,CAAA;QAClC,YAAY,EAAE,YAAY,CAAA;QAC1B,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;KACjB,CAAA;IAED,MAAM,CAAC,MAAM,KAAK,GACd,0FAAwF,kBAAkB,KACxG,UAsEL,CAAA;;CACJ"}
1
+ {"version":3,"file":"RecordAudio.d.ts","sourceRoot":"","sources":["../../src/capture/RecordAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,UAAU,EAAmB,MAAM,kBAAkB,CAAA;AAGvG,OAAO,EAAa,mBAAmB,EAAY,MAAM,0BAA0B,CAAA;AACnF,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,WAAW,CAAC;IACzB,KAAK,kBAAkB,GAAG;QACtB,gBAAgB,EAAE,gBAAgB,CAAA;QAClC,WAAW,EAAE,WAAW,CAAA;QACxB,aAAa,EAAE,mBAAmB,CAAA;QAClC,YAAY,EAAE,YAAY,CAAA;QAC1B,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;KACjB,CAAA;IAED,MAAM,CAAC,MAAM,KAAK,GACd,0FAAwF,kBAAkB,KACxG,UAsEL,CAAA;;CACJ"}
@@ -1,9 +1,8 @@
1
1
  import { Option, quantizeCeil, quantizeFloor, Terminable, Terminator, UUID } from "@opendaw/lib-std";
2
2
  import { dbToGain, PPQN } from "@opendaw/lib-dsp";
3
3
  import { AudioFileBox, AudioRegionBox } from "@opendaw/studio-boxes";
4
- import { TrackType } from "@opendaw/studio-adapters";
4
+ import { ColorCodes, TrackType } from "@opendaw/studio-adapters";
5
5
  import { RecordTrack } from "./RecordTrack";
6
- import { ColorCodes } from "../ColorCodes";
7
6
  export var RecordAudio;
8
7
  (function (RecordAudio) {
9
8
  RecordAudio.start = ({ recordingWorklet, mediaStream, sampleManager, audioContext, project, capture, gainDb }) => {
@@ -40,7 +39,7 @@ export var RecordAudio;
40
39
  });
41
40
  return { fileBox, regionBox };
42
41
  });
43
- const { bpm, env: { audioContext: { sampleRate } } } = project;
42
+ const { tempoMap, env: { audioContext: { sampleRate } } } = project;
44
43
  terminator.ownAll(Terminable.create(() => {
45
44
  if (recordingWorklet.numberOfFrames === 0 || recordingData.isEmpty()) {
46
45
  console.debug("Abort recording audio.");
@@ -49,7 +48,7 @@ export var RecordAudio;
49
48
  }
50
49
  else {
51
50
  const { regionBox: { duration }, fileBox } = recordingData.unwrap("No recording data available");
52
- recordingWorklet.limit(PPQN.pulsesToSamples(duration.getValue(), bpm, sampleRate) | 0);
51
+ recordingWorklet.limit(Math.ceil(tempoMap.intervalToSeconds(0, duration.getValue()) * sampleRate));
53
52
  fileBox.endInSeconds.setValue(recordingWorklet.numberOfFrames / sampleRate);
54
53
  }
55
54
  }), engine.position.catchupAndSubscribe(owner => {
@@ -67,7 +66,7 @@ export var RecordAudio;
67
66
  const newDuration = quantizeCeil(engine.position.getValue(), beats) - regionBox.position.getValue();
68
67
  duration.setValue(newDuration);
69
68
  loopDuration.setValue(newDuration);
70
- const totalSamples = PPQN.pulsesToSamples(newDuration, project.bpm, sampleRate) | 0;
69
+ const totalSamples = Math.ceil(tempoMap.intervalToSeconds(0, newDuration) * sampleRate);
71
70
  recordingWorklet.setFillLength(totalSamples);
72
71
  }
73
72
  else {
@@ -1,6 +1,6 @@
1
1
  import { Notifier, Terminable } from "@opendaw/lib-std";
2
2
  import { NoteSignal } from "@opendaw/studio-adapters";
3
- import { Project } from "../project/Project";
3
+ import { Project } from "../project";
4
4
  import { Capture } from "./Capture";
5
5
  export declare namespace RecordMidi {
6
6
  type RecordMidiContext = {