@opendaw/studio-core 0.0.85 → 0.0.87

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 (83) hide show
  1. package/dist/AudioOfflineRenderer.d.ts.map +1 -1
  2. package/dist/AudioOfflineRenderer.js +1 -0
  3. package/dist/AudioWorklets.d.ts +3 -2
  4. package/dist/AudioWorklets.d.ts.map +1 -1
  5. package/dist/AudioWorklets.js +5 -2
  6. package/dist/EffectBox.d.ts +2 -2
  7. package/dist/EffectBox.d.ts.map +1 -1
  8. package/dist/EffectFactories.d.ts +3 -0
  9. package/dist/EffectFactories.d.ts.map +1 -1
  10. package/dist/EffectFactories.js +30 -3
  11. package/dist/EffectFactory.d.ts +2 -7
  12. package/dist/EffectFactory.d.ts.map +1 -1
  13. package/dist/Engine.d.ts +3 -5
  14. package/dist/Engine.d.ts.map +1 -1
  15. package/dist/EngineFacade.d.ts +3 -5
  16. package/dist/EngineFacade.d.ts.map +1 -1
  17. package/dist/EngineFacade.js +10 -9
  18. package/dist/EngineWorklet.d.ts +2 -4
  19. package/dist/EngineWorklet.d.ts.map +1 -1
  20. package/dist/EngineWorklet.js +6 -18
  21. package/dist/OfflineEngineRenderer.d.ts +10 -0
  22. package/dist/OfflineEngineRenderer.d.ts.map +1 -0
  23. package/dist/OfflineEngineRenderer.js +141 -0
  24. package/dist/RecordingWorklet.d.ts +1 -1
  25. package/dist/RecordingWorklet.d.ts.map +1 -1
  26. package/dist/RecordingWorklet.js +10 -17
  27. package/dist/StudioPreferences.d.ts +21 -0
  28. package/dist/StudioPreferences.d.ts.map +1 -0
  29. package/dist/StudioPreferences.js +3 -0
  30. package/dist/StudioSettings.d.ts +24 -0
  31. package/dist/StudioSettings.d.ts.map +1 -0
  32. package/dist/StudioSettings.js +22 -0
  33. package/dist/WavFile.js +4 -3
  34. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  35. package/dist/capture/CaptureAudio.js +8 -7
  36. package/dist/capture/RecordAudio.d.ts +2 -1
  37. package/dist/capture/RecordAudio.d.ts.map +1 -1
  38. package/dist/capture/RecordAudio.js +78 -37
  39. package/dist/capture/RecordTrack.d.ts +1 -1
  40. package/dist/capture/RecordTrack.d.ts.map +1 -1
  41. package/dist/capture/RecordTrack.js +7 -5
  42. package/dist/dawproject/DawProjectExporter.test.js +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +3 -1
  46. package/dist/offline-engine.js +2 -0
  47. package/dist/offline-engine.js.map +7 -0
  48. package/dist/processors.js +35 -18
  49. package/dist/processors.js.map +4 -4
  50. package/dist/project/Project.d.ts.map +1 -1
  51. package/dist/project/Project.js +39 -18
  52. package/dist/project/ProjectMigration.d.ts.map +1 -1
  53. package/dist/project/ProjectMigration.js +41 -1
  54. package/dist/project/index.d.ts +1 -0
  55. package/dist/project/index.d.ts.map +1 -1
  56. package/dist/project/index.js +1 -0
  57. package/dist/samples/DefaultSampleLoader.d.ts +5 -3
  58. package/dist/samples/DefaultSampleLoader.d.ts.map +1 -1
  59. package/dist/samples/DefaultSampleLoader.js +21 -82
  60. package/dist/samples/{DefaultSampleLoaderManager.d.ts → GlobalSampleLoaderManager.d.ts} +4 -3
  61. package/dist/samples/GlobalSampleLoaderManager.d.ts.map +1 -0
  62. package/dist/samples/GlobalSampleLoaderManager.js +146 -0
  63. package/dist/samples/OpenSampleAPI.d.ts +1 -2
  64. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  65. package/dist/samples/OpenSampleAPI.js +22 -26
  66. package/dist/samples/SampleAPI.d.ts +1 -1
  67. package/dist/samples/SampleAPI.d.ts.map +1 -1
  68. package/dist/samples/SampleService.d.ts.map +1 -1
  69. package/dist/samples/SampleService.js +5 -7
  70. package/dist/samples/SampleStorage.d.ts +0 -1
  71. package/dist/samples/SampleStorage.d.ts.map +1 -1
  72. package/dist/samples/SampleStorage.js +0 -1
  73. package/dist/samples/index.d.ts +1 -1
  74. package/dist/samples/index.d.ts.map +1 -1
  75. package/dist/samples/index.js +1 -1
  76. package/dist/workers-main.js +1 -1
  77. package/dist/workers-main.js.map +3 -3
  78. package/package.json +18 -16
  79. package/dist/Preferences.d.ts +0 -32
  80. package/dist/Preferences.d.ts.map +0 -1
  81. package/dist/Preferences.js +0 -52
  82. package/dist/samples/DefaultSampleLoaderManager.d.ts.map +0 -1
  83. package/dist/samples/DefaultSampleLoaderManager.js +0 -35
@@ -1 +1 @@
1
- {"version":3,"file":"AudioOfflineRenderer.d.ts","sourceRoot":"","sources":["../src/AudioOfflineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,GAAG,EAAa,MAAM,EAAS,QAAQ,EAAuB,MAAM,kBAAkB,CAAA;AAGtG,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,UAAU,QAAQ,CAAC,OAAO,EAC1B,cAAc,WAAW,EACzB,aAAY,GAAY,KAAG,OAAO,CAAC,WAAW,CA+CzE,CAAA;CACJ"}
1
+ {"version":3,"file":"AudioOfflineRenderer.d.ts","sourceRoot":"","sources":["../src/AudioOfflineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,GAAG,EAAa,MAAM,EAAS,QAAQ,EAAuB,MAAM,kBAAkB,CAAA;AAGtG,OAAO,EAAC,wBAAwB,EAAC,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,oBAAoB,CAAC;IAE3B,MAAM,KAAK,GAAU,QAAQ,OAAO,EACf,wBAAwB,MAAM,CAAC,wBAAwB,CAAC,EACxD,UAAU,QAAQ,CAAC,OAAO,EAC1B,cAAc,WAAW,EACzB,aAAY,GAAY,KAAG,OAAO,CAAC,WAAW,CA+CzE,CAAA;CACJ"}
@@ -5,6 +5,7 @@ import { ExportStemsConfiguration } from "@opendaw/studio-adapters";
5
5
  import { AudioWorklets } from "./AudioWorklets";
6
6
  export var AudioOfflineRenderer;
7
7
  (function (AudioOfflineRenderer) {
8
+ /* Deprecated */
8
9
  AudioOfflineRenderer.start = async (source, optExportConfiguration, progress, abortSignal, sampleRate = 48_000) => {
9
10
  const numStems = ExportStemsConfiguration.countStems(optExportConfiguration);
10
11
  if (numStems === 0) {
@@ -1,12 +1,13 @@
1
1
  import { int } from "@opendaw/lib-std";
2
2
  import { ExportStemsConfiguration, ProcessorOptions } from "@opendaw/studio-adapters";
3
- import { Project } from "./project/Project";
3
+ import { Project } from "./project";
4
4
  import { EngineWorklet } from "./EngineWorklet";
5
5
  import { MeterWorklet } from "./MeterWorklet";
6
6
  import { RecordingWorklet } from "./RecordingWorklet";
7
7
  export declare class AudioWorklets {
8
8
  #private;
9
9
  static install(url: string): void;
10
+ static get processorsUrl(): string;
10
11
  static createFor(context: BaseAudioContext): Promise<AudioWorklets>;
11
12
  static get(context: BaseAudioContext): AudioWorklets;
12
13
  constructor(context: BaseAudioContext);
@@ -17,6 +18,6 @@ export declare class AudioWorklets {
17
18
  exportConfiguration?: ExportStemsConfiguration;
18
19
  options?: ProcessorOptions;
19
20
  }): EngineWorklet;
20
- createRecording(numberOfChannels: int, numChunks: int, outputLatency: number): RecordingWorklet;
21
+ createRecording(numberOfChannels: int, numChunks: int): RecordingWorklet;
21
22
  }
22
23
  //# sourceMappingURL=AudioWorklets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioWorklets.d.ts","sourceRoot":"","sources":["../src/AudioWorklets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,GAAG,EAAS,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAC,wBAAwB,EAAE,gBAAgB,EAAa,MAAM,0BAA0B,CAAA;AAC/F,OAAO,EAAC,OAAO,EAAC,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAGnD,qBAAa,aAAa;;IACtB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;WAOpB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQzE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa;gBAMxC,OAAO,EAAE,gBAAgB;IAErC,IAAI,OAAO,IAAI,gBAAgB,CAAuB;IAEtD,WAAW,CAAC,gBAAgB,EAAE,GAAG,GAAG,YAAY;IAIhD,YAAY,CAAC,EAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAC,EAAE;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;QAC/C,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAC7B,GAAG,aAAa;IAIjB,eAAe,CAAC,gBAAgB,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAG,gBAAgB;CAOlG"}
1
+ {"version":3,"file":"AudioWorklets.d.ts","sourceRoot":"","sources":["../src/AudioWorklets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,GAAG,EAAS,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAC,wBAAwB,EAAE,gBAAgB,EAAa,MAAM,0BAA0B,CAAA;AAC/F,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAGnD,qBAAa,aAAa;;IACtB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC,MAAM,KAAK,aAAa,IAAI,MAAM,CAEjC;WAIY,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQzE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa;gBAMxC,OAAO,EAAE,gBAAgB;IAErC,IAAI,OAAO,IAAI,gBAAgB,CAAuB;IAEtD,WAAW,CAAC,gBAAgB,EAAE,GAAG,GAAG,YAAY;IAIhD,YAAY,CAAC,EAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAC,EAAE;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;QAC/C,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAC7B,GAAG,aAAa;IAIjB,eAAe,CAAC,gBAAgB,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,gBAAgB;CAO3E"}
@@ -8,6 +8,9 @@ export class AudioWorklets {
8
8
  console.debug(`WorkletUrl: '${url}'`);
9
9
  this.#workletUrl = Option.wrap(url);
10
10
  }
11
+ static get processorsUrl() {
12
+ return this.#workletUrl.unwrap("WorkletUrl is missing (call 'install' first)");
13
+ }
11
14
  static #workletUrl = Option.None;
12
15
  static async createFor(context) {
13
16
  return context.audioWorklet.addModule(this.#workletUrl.unwrap("WorkletUrl is missing (call 'install' first)")).then(() => {
@@ -27,11 +30,11 @@ export class AudioWorklets {
27
30
  createEngine({ project, exportConfiguration, options }) {
28
31
  return new EngineWorklet(this.#context, project, exportConfiguration, options);
29
32
  }
30
- createRecording(numberOfChannels, numChunks, outputLatency) {
33
+ createRecording(numberOfChannels, numChunks) {
31
34
  const audioBytes = numberOfChannels * numChunks * RenderQuantum * Float32Array.BYTES_PER_ELEMENT;
32
35
  const pointerBytes = Int32Array.BYTES_PER_ELEMENT * 2;
33
36
  const sab = new SharedArrayBuffer(audioBytes + pointerBytes);
34
37
  const buffer = { sab, numChunks, numberOfChannels, bufferSize: RenderQuantum };
35
- return new RecordingWorklet(this.#context, buffer, outputLatency);
38
+ return new RecordingWorklet(this.#context, buffer);
36
39
  }
37
40
  }
@@ -1,3 +1,3 @@
1
- import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, ModularDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, 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 | DattorroReverbDeviceBox;
1
+ import { ArpeggioDeviceBox, MaximizerDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, ModularDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, UnknownAudioEffectDeviceBox, UnknownMidiEffectDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
2
+ export type EffectBox = ArpeggioDeviceBox | PitchDeviceBox | VelocityDeviceBox | ZeitgeistDeviceBox | UnknownMidiEffectDeviceBox | MaximizerDeviceBox | DelayDeviceBox | ReverbDeviceBox | RevampDeviceBox | StereoToolDeviceBox | TidalDeviceBox | ModularDeviceBox | UnknownAudioEffectDeviceBox | CompressorDeviceBox | CrusherDeviceBox | FoldDeviceBox | DattorroReverbDeviceBox;
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,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,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,GACvG,uBAAuB,CAAA"}
1
+ {"version":3,"file":"EffectBox.d.ts","sourceRoot":"","sources":["../src/EffectBox.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,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,kBAAkB,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,mBAAmB,GAAG,cAAc,GAC9G,gBAAgB,GAAG,2BAA2B,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,aAAa,GACvG,uBAAuB,CAAA"}
@@ -7,6 +7,7 @@ export declare namespace EffectFactories {
7
7
  const StereoTool: EffectFactory;
8
8
  const Delay: EffectFactory;
9
9
  const DattorroReverb: EffectFactory;
10
+ const Maximizer: EffectFactory;
10
11
  const Compressor: EffectFactory;
11
12
  const Reverb: EffectFactory;
12
13
  const Crusher: EffectFactory;
@@ -30,6 +31,7 @@ export declare namespace EffectFactories {
30
31
  Crusher: EffectFactory;
31
32
  Fold: EffectFactory;
32
33
  Tidal: EffectFactory;
34
+ Maximizer: EffectFactory;
33
35
  };
34
36
  const MidiList: ReadonlyArray<Readonly<EffectFactory>>;
35
37
  const AudioList: ReadonlyArray<Readonly<EffectFactory>>;
@@ -43,6 +45,7 @@ export declare namespace EffectFactories {
43
45
  Crusher: EffectFactory;
44
46
  Fold: EffectFactory;
45
47
  Tidal: EffectFactory;
48
+ Maximizer: EffectFactory;
46
49
  Arpeggio: EffectFactory;
47
50
  Pitch: EffectFactory;
48
51
  Velocity: EffectFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"EffectFactories.d.ts","sourceRoot":"","sources":["../src/EffectFactories.ts"],"names":[],"mappings":"AAuBA,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,cAAc,EAAE,aAY5B,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;;;;;;;;;;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":"AAyBA,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,aAanB,CAAA;IAEM,MAAM,cAAc,EAAE,aAa5B,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,UAAU,EAAE,aAaxB,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,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,6 +1,7 @@
1
1
  import { UUID } from "@opendaw/lib-std";
2
- import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, GrooveShuffleBox, ModularAudioInputBox, ModularAudioOutputBox, ModularBox, ModularDeviceBox, ModuleConnectionBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
2
+ import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, GrooveShuffleBox, MaximizerDeviceBox, ModularAudioInputBox, ModularAudioOutputBox, ModularBox, ModularDeviceBox, ModuleConnectionBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
3
3
  import { IconSymbol } from "@opendaw/studio-enums";
4
+ import { DeviceManualUrls } from "@opendaw/studio-adapters";
4
5
  import { EffectParameterDefaults } from "./EffectParameterDefaults";
5
6
  export var EffectFactories;
6
7
  (function (EffectFactories) {
@@ -8,6 +9,7 @@ export var EffectFactories;
8
9
  defaultName: "Arpeggio",
9
10
  defaultIcon: IconSymbol.Stack,
10
11
  description: "Generates rhythmic note sequences from chords",
12
+ manualPage: DeviceManualUrls.Arpeggio,
11
13
  separatorBefore: false,
12
14
  type: "midi",
13
15
  create: ({ boxGraph }, hostField, index) => ArpeggioDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -20,6 +22,7 @@ export var EffectFactories;
20
22
  defaultName: "Pitch",
21
23
  defaultIcon: IconSymbol.Note,
22
24
  description: "Shifts the pitch of incoming notes",
25
+ manualPage: DeviceManualUrls.Pitch,
23
26
  separatorBefore: false,
24
27
  type: "midi",
25
28
  create: ({ boxGraph }, hostField, index) => PitchDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -32,7 +35,7 @@ export var EffectFactories;
32
35
  defaultName: "Velocity",
33
36
  defaultIcon: IconSymbol.Velocity,
34
37
  description: "Manipulates the velocity of incoming notes",
35
- manualPage: "manuals/devices/midi/velocity",
38
+ manualPage: DeviceManualUrls.Velocity,
36
39
  separatorBefore: false,
37
40
  type: "midi",
38
41
  create: ({ boxGraph }, hostField, index) => VelocityDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -45,6 +48,7 @@ export var EffectFactories;
45
48
  defaultName: "Zeitgeist",
46
49
  defaultIcon: IconSymbol.Zeitgeist,
47
50
  description: "Distorts space and time",
51
+ manualPage: DeviceManualUrls.Zeitgeist,
48
52
  separatorBefore: false,
49
53
  type: "midi",
50
54
  create: ({ boxGraph, rootBoxAdapter }, hostField, index) => {
@@ -67,6 +71,7 @@ export var EffectFactories;
67
71
  defaultName: "Stereo Tool",
68
72
  defaultIcon: IconSymbol.Stereo,
69
73
  description: "Computes a stereo transformation matrix with volume, panning, phase inversion and stereo width.",
74
+ manualPage: DeviceManualUrls.StereoTool,
70
75
  separatorBefore: false,
71
76
  type: "audio",
72
77
  create: ({ boxGraph }, hostField, index) => StereoToolDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -79,6 +84,7 @@ export var EffectFactories;
79
84
  defaultName: "Delay",
80
85
  defaultIcon: IconSymbol.Time,
81
86
  description: "Echoes the input signal with time-based repeats",
87
+ manualPage: DeviceManualUrls.Delay,
82
88
  separatorBefore: false,
83
89
  type: "audio",
84
90
  create: ({ boxGraph }, hostField, index) => DelayDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -91,6 +97,7 @@ export var EffectFactories;
91
97
  defaultName: "Dattorro Reverb",
92
98
  defaultIcon: IconSymbol.Dattorro,
93
99
  description: "Dense algorithmic reverb based on Dattorro's design, capable of infinite decay",
100
+ manualPage: DeviceManualUrls.DattorroReverb,
94
101
  separatorBefore: false,
95
102
  type: "audio",
96
103
  create: ({ boxGraph }, hostField, index) => DattorroReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -99,10 +106,24 @@ export var EffectFactories;
99
106
  box.host.refer(hostField);
100
107
  })
101
108
  };
109
+ EffectFactories.Maximizer = {
110
+ defaultName: "Maximizer",
111
+ defaultIcon: IconSymbol.Volume,
112
+ description: "Brickwall limiter with automatic makeup gain",
113
+ manualPage: DeviceManualUrls.Maximizer,
114
+ separatorBefore: false,
115
+ type: "audio",
116
+ create: ({ boxGraph }, hostField, index) => MaximizerDeviceBox.create(boxGraph, UUID.generate(), box => {
117
+ box.label.setValue("Maximizer");
118
+ box.index.setValue(index);
119
+ box.host.refer(hostField);
120
+ })
121
+ };
102
122
  EffectFactories.Compressor = {
103
123
  defaultName: "Compressor",
104
124
  defaultIcon: IconSymbol.Compressor,
105
125
  description: "Reduces the dynamic range by attenuating signals above a threshold",
126
+ manualPage: DeviceManualUrls.Compressor,
106
127
  separatorBefore: false,
107
128
  type: "audio",
108
129
  create: ({ boxGraph }, hostField, index) => CompressorDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -115,6 +136,7 @@ export var EffectFactories;
115
136
  defaultName: "Cheap Reverb",
116
137
  defaultIcon: IconSymbol.Cube,
117
138
  description: "Simulates space and depth with reflections",
139
+ manualPage: DeviceManualUrls.Reverb,
118
140
  separatorBefore: false,
119
141
  type: "audio",
120
142
  create: ({ boxGraph }, hostField, index) => ReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -128,6 +150,7 @@ export var EffectFactories;
128
150
  defaultName: "Crusher",
129
151
  defaultIcon: IconSymbol.Bug,
130
152
  description: "Degrates the audio signal",
153
+ manualPage: DeviceManualUrls.Crusher,
131
154
  separatorBefore: false,
132
155
  type: "audio",
133
156
  create: ({ boxGraph }, hostField, index) => CrusherDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -140,6 +163,7 @@ export var EffectFactories;
140
163
  defaultName: "Fold",
141
164
  defaultIcon: IconSymbol.Fold,
142
165
  description: "Folds the signal back into audio-range",
166
+ manualPage: DeviceManualUrls.Fold,
143
167
  separatorBefore: false,
144
168
  type: "audio",
145
169
  create: ({ boxGraph }, hostField, index) => FoldDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -152,6 +176,7 @@ export var EffectFactories;
152
176
  defaultName: "Tidal",
153
177
  defaultIcon: IconSymbol.Tidal,
154
178
  description: "Shape rhythm and space through volume and pan.",
179
+ manualPage: DeviceManualUrls.Tidal,
155
180
  separatorBefore: false,
156
181
  type: "audio",
157
182
  create: ({ boxGraph }, hostField, index) => TidalDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -165,6 +190,7 @@ export var EffectFactories;
165
190
  defaultName: "Revamp",
166
191
  defaultIcon: IconSymbol.EQ,
167
192
  description: "Shapes the frequency balance of the sound",
193
+ manualPage: DeviceManualUrls.Revamp,
168
194
  separatorBefore: false,
169
195
  type: "audio",
170
196
  create: ({ boxGraph }, hostField, index) => RevampDeviceBox.create(boxGraph, UUID.generate(), box => {
@@ -177,6 +203,7 @@ export var EffectFactories;
177
203
  defaultName: "🔇 Create New Modular Audio Effect (inaudible yet)",
178
204
  defaultIcon: IconSymbol.Box,
179
205
  description: "",
206
+ manualPage: DeviceManualUrls.Modular,
180
207
  separatorBefore: true,
181
208
  type: "audio",
182
209
  create: ({ boxGraph, rootBox, userEditingManager }, hostField, index) => {
@@ -212,7 +239,7 @@ export var EffectFactories;
212
239
  };
213
240
  EffectFactories.MidiNamed = { Arpeggio: EffectFactories.Arpeggio, Pitch: EffectFactories.Pitch, Velocity: EffectFactories.Velocity, Zeitgeist: EffectFactories.Zeitgeist };
214
241
  EffectFactories.AudioNamed = {
215
- StereoTool: EffectFactories.StereoTool, Compressor: EffectFactories.Compressor, Delay: EffectFactories.Delay, Reverb: EffectFactories.Reverb, DattorroReverb: EffectFactories.DattorroReverb, Revamp: EffectFactories.Revamp, Crusher: EffectFactories.Crusher, Fold: EffectFactories.Fold, Tidal: EffectFactories.Tidal
242
+ StereoTool: EffectFactories.StereoTool, Compressor: EffectFactories.Compressor, Delay: EffectFactories.Delay, Reverb: EffectFactories.Reverb, DattorroReverb: EffectFactories.DattorroReverb, Revamp: EffectFactories.Revamp, Crusher: EffectFactories.Crusher, Fold: EffectFactories.Fold, Tidal: EffectFactories.Tidal, Maximizer: EffectFactories.Maximizer
216
243
  };
217
244
  EffectFactories.MidiList = Object.values(EffectFactories.MidiNamed);
218
245
  EffectFactories.AudioList = Object.values(EffectFactories.AudioNamed);
@@ -1,14 +1,9 @@
1
- import { EffectPointerType } from "@opendaw/studio-adapters";
2
- import { IconSymbol } from "@opendaw/studio-enums";
1
+ import { DeviceFactory, EffectPointerType } from "@opendaw/studio-adapters";
3
2
  import { Field } from "@opendaw/lib-box";
4
3
  import { int } from "@opendaw/lib-std";
5
4
  import { Project } from "./project";
6
5
  import { EffectBox } from "./EffectBox";
7
- export interface EffectFactory {
8
- readonly defaultName: string;
9
- readonly defaultIcon: IconSymbol;
10
- readonly description: string;
11
- readonly manualPage?: string;
6
+ export interface EffectFactory extends DeviceFactory {
12
7
  readonly separatorBefore: boolean;
13
8
  readonly type: "audio" | "midi";
14
9
  create(project: Project, host: Field<EffectPointerType>, index: int): EffectBox;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"EffectFactory.d.ts","sourceRoot":"","sources":["../src/EffectFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AACzE,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,aAAc,SAAQ,aAAa;IAChD,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
@@ -1,6 +1,6 @@
1
- import { int, MutableObservableValue, Nullable, ObservableValue, Observer, Subscription, Terminable, UUID } from "@opendaw/lib-std";
1
+ import { int, Nullable, ObservableValue, Observer, Subscription, Terminable, UUID } from "@opendaw/lib-std";
2
2
  import { bpm, ppqn } from "@opendaw/lib-dsp";
3
- import { ClipNotification, NoteSignal } from "@opendaw/studio-adapters";
3
+ import { ClipNotification, EnginePreferences, NoteSignal } from "@opendaw/studio-adapters";
4
4
  import { Project } from "./project";
5
5
  export interface Engine extends Terminable {
6
6
  play(): void;
@@ -25,12 +25,10 @@ export interface Engine extends Terminable {
25
25
  get isPlaying(): ObservableValue<boolean>;
26
26
  get isRecording(): ObservableValue<boolean>;
27
27
  get isCountingIn(): ObservableValue<boolean>;
28
- get metronomeEnabled(): MutableObservableValue<boolean>;
29
28
  get playbackTimestamp(): ObservableValue<ppqn>;
30
- get playbackTimestampEnabled(): MutableObservableValue<boolean>;
31
- get countInBarsTotal(): ObservableValue<int>;
32
29
  get countInBeatsRemaining(): ObservableValue<number>;
33
30
  get markerState(): ObservableValue<Nullable<[UUID.Bytes, int]>>;
34
31
  get project(): Project;
32
+ get preferences(): EnginePreferences;
35
33
  }
36
34
  //# sourceMappingURL=Engine.d.ts.map
@@ -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,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1C,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,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,gBAAgB,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAA;IACvD,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,EAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1C,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,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,6 +1,6 @@
1
- import { DefaultObservableValue, int, MutableObservableValue, Nullable, ObservableValue, Observer, Subscription, UUID } from "@opendaw/lib-std";
1
+ import { DefaultObservableValue, int, Nullable, ObservableValue, Observer, Subscription, UUID } from "@opendaw/lib-std";
2
2
  import { bpm, ppqn } from "@opendaw/lib-dsp";
3
- import { ClipNotification, NoteSignal } from "@opendaw/studio-adapters";
3
+ import { ClipNotification, EnginePreferences, NoteSignal } from "@opendaw/studio-adapters";
4
4
  import { Engine } from "./Engine";
5
5
  import { EngineWorklet } from "./EngineWorklet";
6
6
  import { Project } from "./project";
@@ -20,14 +20,12 @@ export declare class EngineFacade implements Engine {
20
20
  get isPlaying(): ObservableValue<boolean>;
21
21
  get isRecording(): ObservableValue<boolean>;
22
22
  get isCountingIn(): ObservableValue<boolean>;
23
- get metronomeEnabled(): MutableObservableValue<boolean>;
24
23
  get playbackTimestamp(): ObservableValue<ppqn>;
25
- get playbackTimestampEnabled(): MutableObservableValue<boolean>;
26
- get countInBarsTotal(): MutableObservableValue<int>;
27
24
  get countInBeatsRemaining(): ObservableValue<int>;
28
25
  get markerState(): DefaultObservableValue<Nullable<[UUID.Bytes, int]>>;
29
26
  get project(): Project;
30
27
  get sampleRate(): number;
28
+ get preferences(): EnginePreferences;
31
29
  isReady(): Promise<void>;
32
30
  queryLoadingComplete(): Promise<boolean>;
33
31
  panic(): void;
@@ -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,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1C,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;;;IAoBvC,UAAU,CAAC,OAAO,EAAE,aAAa;IAqBjC,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,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;IACzF,IAAI,UAAU,IAAI,MAAM,CAAsF;IAE9G,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,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,QAAQ,EACR,eAAe,EACf,QAAQ,EAER,YAAY,EAEZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1C,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,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,29 +1,32 @@
1
1
  import { DefaultObservableValue, Option, Terminator } from "@opendaw/lib-std";
2
+ import { EngineSettingsSchema } from "@opendaw/studio-adapters";
3
+ import { Preferences } from "@opendaw/lib-fusion";
2
4
  export class EngineFacade {
3
5
  #terminator = new Terminator();
4
6
  #lifecycle = this.#terminator.own(new Terminator());
5
7
  #playbackTimestamp = new DefaultObservableValue(0.0);
6
- #playbackTimestampEnabled = new DefaultObservableValue(true);
7
- #countInBarsTotal = new DefaultObservableValue(1);
8
8
  #countInBeatsRemaining = new DefaultObservableValue(0);
9
9
  #position = new DefaultObservableValue(0.0);
10
10
  #bpm = new DefaultObservableValue(12.0);
11
11
  #isPlaying = new DefaultObservableValue(false);
12
12
  #isRecording = new DefaultObservableValue(false);
13
13
  #isCountingIn = new DefaultObservableValue(false);
14
- #metronomeEnabled = new DefaultObservableValue(false);
15
14
  #markerState = new DefaultObservableValue(null);
15
+ #preferencesFacade;
16
16
  #worklet = Option.None;
17
- constructor() { }
17
+ constructor() {
18
+ this.#preferencesFacade = Preferences.facade("engine-preferences", EngineSettingsSchema);
19
+ }
18
20
  setWorklet(worklet) {
19
21
  this.#worklet = Option.wrap(worklet);
22
+ this.#preferencesFacade.setHost(worklet.preferences);
20
23
  this.#lifecycle.terminate();
21
- this.#lifecycle.ownAll(worklet.playbackTimestamp.catchupAndSubscribe(owner => this.#playbackTimestamp.setValue(owner.getValue())), worklet.playbackTimestampEnabled.catchupAndSubscribe(owner => this.#playbackTimestampEnabled.setValue(owner.getValue())), worklet.countInBarsTotal.catchupAndSubscribe(owner => this.#countInBarsTotal.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.metronomeEnabled.catchupAndSubscribe(owner => this.#metronomeEnabled.setValue(owner.getValue())), worklet.markerState.catchupAndSubscribe(owner => this.#markerState.setValue(owner.getValue())), this.#metronomeEnabled.catchupAndSubscribe(owner => worklet.metronomeEnabled.setValue(owner.getValue())), this.#playbackTimestampEnabled.catchupAndSubscribe(owner => worklet.playbackTimestampEnabled.setValue(owner.getValue())), this.#countInBarsTotal.catchupAndSubscribe(owner => worklet.countInBarsTotal.setValue(owner.getValue())));
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())));
22
25
  }
23
26
  assertWorklet() { this.#worklet.unwrap("No worklet available"); }
24
27
  releaseWorklet() {
28
+ this.#preferencesFacade.releaseHost();
25
29
  this.#lifecycle.terminate();
26
- this.#worklet.ifSome(worklet => worklet.terminate());
27
30
  this.#worklet = Option.None;
28
31
  }
29
32
  play() { this.#worklet.ifSome(worklet => worklet.play()); }
@@ -36,14 +39,12 @@ export class EngineFacade {
36
39
  get isPlaying() { return this.#isPlaying; }
37
40
  get isRecording() { return this.#isRecording; }
38
41
  get isCountingIn() { return this.#isCountingIn; }
39
- get metronomeEnabled() { return this.#metronomeEnabled; }
40
42
  get playbackTimestamp() { return this.#playbackTimestamp; }
41
- get playbackTimestampEnabled() { return this.#playbackTimestampEnabled; }
42
- get countInBarsTotal() { return this.#countInBarsTotal; }
43
43
  get countInBeatsRemaining() { return this.#countInBeatsRemaining; }
44
44
  get markerState() { return this.#markerState; }
45
45
  get project() { return this.#worklet.unwrap("No worklet to get project").project; }
46
46
  get sampleRate() { return this.#worklet.isEmpty() ? 44_100 : this.#worklet.unwrap().context.sampleRate; }
47
+ get preferences() { return this.#preferencesFacade; }
47
48
  isReady() { return this.#worklet.mapOr(worklet => worklet.isReady(), Promise.resolve()); }
48
49
  queryLoadingComplete() {
49
50
  return this.#worklet.mapOr(worklet => worklet.queryLoadingComplete(), Promise.resolve(false));
@@ -1,6 +1,6 @@
1
1
  import { int, MutableObservableValue, Nullable, ObservableValue, Observer, Subscription, UUID } from "@opendaw/lib-std";
2
2
  import { bpm, ppqn } from "@opendaw/lib-dsp";
3
- import { ClipNotification, ExportStemsConfiguration, NoteSignal, ProcessorOptions } from "@opendaw/studio-adapters";
3
+ import { ClipNotification, EngineSettings, ExportStemsConfiguration, NoteSignal, PreferencesHost, ProcessorOptions } from "@opendaw/studio-adapters";
4
4
  import { Engine } from "./Engine";
5
5
  import { Project } from "./project";
6
6
  export declare class EngineWorklet extends AudioWorkletNode implements Engine {
@@ -19,15 +19,13 @@ export declare class EngineWorklet extends AudioWorkletNode implements Engine {
19
19
  get isPlaying(): ObservableValue<boolean>;
20
20
  get isRecording(): ObservableValue<boolean>;
21
21
  get isCountingIn(): ObservableValue<boolean>;
22
- get countInBarsTotal(): MutableObservableValue<int>;
23
22
  get countInBeatsRemaining(): ObservableValue<number>;
24
23
  get position(): ObservableValue<ppqn>;
25
24
  get bpm(): ObservableValue<bpm>;
26
25
  get playbackTimestamp(): MutableObservableValue<number>;
27
- get playbackTimestampEnabled(): MutableObservableValue<boolean>;
28
- get metronomeEnabled(): MutableObservableValue<boolean>;
29
26
  get markerState(): ObservableValue<Nullable<[UUID.Bytes, int]>>;
30
27
  get project(): Project;
28
+ get preferences(): PreferencesHost<EngineSettings>;
31
29
  isReady(): Promise<void>;
32
30
  queryLoadingComplete(): Promise<boolean>;
33
31
  noteSignal(signal: NoteSignal): void;
@@ -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,EAAY,GAAG,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAIrD,OAAO,EACH,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;AAIjC,qBAAa,aAAc,SAAQ,gBAAiB,YAAW,MAAM;;IACjE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAQ;IAEtB,QAAQ,CAAC,EAAE,SAAqB;gBAwBpB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,wBAAwB,EAC9C,OAAO,CAAC,EAAE,gBAAgB;IA4ItC,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,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAmB;IAClD,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"}
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,EAAY,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;IAgItC,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,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"}
@@ -2,7 +2,7 @@ import { Arrays, DefaultObservableValue, Notifier, Option, SyncStream, Terminato
2
2
  import { SyncSource } from "@opendaw/lib-box";
3
3
  import { AnimationFrame } from "@opendaw/lib-dom";
4
4
  import { Communicator, Messenger } from "@opendaw/lib-runtime";
5
- import { EngineStateSchema, ExportStemsConfiguration } from "@opendaw/studio-adapters";
5
+ import { EngineSettingsSchema, EngineStateSchema, ExportStemsConfiguration, PreferencesHost } from "@opendaw/studio-adapters";
6
6
  import { MIDIReceiver } from "./midi/MIDIReceiver";
7
7
  export class EngineWorklet extends AudioWorkletNode {
8
8
  static ID = 0 | 0;
@@ -10,15 +10,13 @@ export class EngineWorklet extends AudioWorkletNode {
10
10
  #terminator = new Terminator();
11
11
  #project;
12
12
  #playbackTimestamp = new DefaultObservableValue(0.0);
13
- #playbackTimestampEnabled = new DefaultObservableValue(true);
14
13
  #position = new DefaultObservableValue(0.0);
15
14
  #bpm = new DefaultObservableValue(120.0);
16
15
  #isPlaying = new DefaultObservableValue(false);
17
16
  #isRecording = new DefaultObservableValue(false);
18
17
  #isCountingIn = new DefaultObservableValue(false);
19
- #countInBarsTotal = new DefaultObservableValue(1);
20
18
  #countInBeatsRemaining = new DefaultObservableValue(0);
21
- #metronomeEnabled = new DefaultObservableValue(false);
19
+ #preferences;
22
20
  #markerState = new DefaultObservableValue(null);
23
21
  #controlFlags;
24
22
  #notifyClipNotification;
@@ -66,15 +64,6 @@ export class EngineWorklet extends AudioWorkletNode {
66
64
  dispatcher.dispatchAndForget(this.prepareRecordingState, countIn);
67
65
  }
68
66
  stopRecording() { dispatcher.dispatchAndForget(this.stopRecording); }
69
- setMetronomeEnabled(enabled) {
70
- dispatcher.dispatchAndForget(this.setMetronomeEnabled, enabled);
71
- }
72
- setPlaybackTimestampEnabled(enabled) {
73
- dispatcher.dispatchAndForget(this.setPlaybackTimestampEnabled, enabled);
74
- }
75
- setCountInBarsTotal(value) {
76
- dispatcher.dispatchAndForget(this.setCountInBarsTotal, value);
77
- }
78
67
  queryLoadingComplete() {
79
68
  return dispatcher.dispatchAndReturn(this.queryLoadingComplete);
80
69
  }
@@ -146,7 +135,8 @@ export class EngineWorklet extends AudioWorkletNode {
146
135
  },
147
136
  switchMarkerState: (state) => this.#markerState.setValue(state)
148
137
  });
149
- this.#terminator.ownAll(AnimationFrame.add(() => reader.tryRead()), project.liveStreamReceiver.connect(messenger.channel("engine-live-data")), new SyncSource(project.boxGraph, messenger.channel("engine-sync"), false), this.#metronomeEnabled.catchupAndSubscribe(owner => this.#commands.setMetronomeEnabled(owner.getValue())), this.#playbackTimestampEnabled.catchupAndSubscribe(owner => this.#commands.setPlaybackTimestampEnabled(owner.getValue())), this.#countInBarsTotal.catchupAndSubscribe(owner => this.#commands.setCountInBarsTotal(owner.getValue())));
138
+ this.#preferences = this.#terminator.own(new PreferencesHost(EngineSettingsSchema.parse({})));
139
+ 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));
150
140
  }
151
141
  play() { this.#commands.play(); }
152
142
  stop(reset = false) { this.#commands.stop(reset); }
@@ -162,15 +152,13 @@ export class EngineWorklet extends AudioWorkletNode {
162
152
  get isPlaying() { return this.#isPlaying; }
163
153
  get isRecording() { return this.#isRecording; }
164
154
  get isCountingIn() { return this.#isCountingIn; }
165
- get countInBarsTotal() { return this.#countInBarsTotal; }
166
155
  get countInBeatsRemaining() { return this.#countInBeatsRemaining; }
167
156
  get position() { return this.#position; }
168
157
  get bpm() { return this.#bpm; }
169
158
  get playbackTimestamp() { return this.#playbackTimestamp; }
170
- get playbackTimestampEnabled() { return this.#playbackTimestampEnabled; }
171
- get metronomeEnabled() { return this.#metronomeEnabled; }
172
159
  get markerState() { return this.#markerState; }
173
160
  get project() { return this.#project; }
161
+ get preferences() { return this.#preferences; }
174
162
  isReady() { return this.#isReady; }
175
163
  queryLoadingComplete() { return this.#commands.queryLoadingComplete(); }
176
164
  noteSignal(signal) { this.#commands.noteSignal(signal); }
@@ -191,7 +179,7 @@ export class EngineWorklet extends AudioWorkletNode {
191
179
  return this.#notifyClipNotification.subscribe(observer);
192
180
  }
193
181
  terminate() {
194
- console.debug("WORKLET.terminate");
182
+ this.#commands.terminate();
195
183
  this.#terminator.terminate();
196
184
  this.disconnect();
197
185
  }
@@ -0,0 +1,10 @@
1
+ import { int, Option, Progress } from "@opendaw/lib-std";
2
+ import { AudioData } from "@opendaw/lib-dsp";
3
+ import { ExportStemsConfiguration } from "@opendaw/studio-adapters";
4
+ import { Project } from "./project";
5
+ export declare namespace OfflineEngineRenderer {
6
+ const install: (url: string) => void;
7
+ const getWorkerUrl: () => string;
8
+ const start: (source: Project, optExportConfiguration: Option<ExportStemsConfiguration>, progress: Progress.Handler, abortSignal?: AbortSignal, sampleRate?: int) => Promise<AudioData>;
9
+ }
10
+ //# sourceMappingURL=OfflineEngineRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineEngineRenderer.d.ts","sourceRoot":"","sources":["../src/OfflineEngineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,GAAG,EAAa,MAAM,EAAS,QAAQ,EAAmB,MAAM,kBAAkB,CAAA;AAClG,OAAO,EAAC,SAAS,EAAO,MAAM,kBAAkB,CAAA;AAEhD,OAAO,EAGH,wBAAwB,EAK3B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,yBAAiB,qBAAqB,CAAC;IAG5B,MAAM,OAAO,GAAI,KAAK,MAAM,KAAG,IAGrC,CAAA;IAEM,MAAM,YAAY,QAAO,MAE/B,CAAA;IAEM,MAAM,KAAK,GAAU,QAAQ,OAAO,EACf,wBAAwB,MAAM,CAAC,wBAAwB,CAAC,EACxD,UAAU,QAAQ,CAAC,OAAO,EAC1B,cAAc,WAAW,EACzB,aAAY,GAAY,KAAG,OAAO,CAAC,SAAS,CAuIvE,CAAA;CACJ"}