@opendaw/studio-core 0.0.58 → 0.0.60

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 (112) hide show
  1. package/dist/AudioOfflineRenderer.d.ts +2 -2
  2. package/dist/AudioOfflineRenderer.d.ts.map +1 -1
  3. package/dist/AudioOfflineRenderer.js +9 -9
  4. package/dist/AudioUtils.d.ts +4 -0
  5. package/dist/AudioUtils.d.ts.map +1 -0
  6. package/dist/AudioUtils.js +20 -0
  7. package/dist/EffectBox.d.ts +2 -2
  8. package/dist/EffectBox.d.ts.map +1 -1
  9. package/dist/EffectFactories.d.ts +3 -0
  10. package/dist/EffectFactories.d.ts.map +1 -1
  11. package/dist/EffectFactories.js +17 -3
  12. package/dist/Engine.d.ts +1 -1
  13. package/dist/Engine.d.ts.map +1 -1
  14. package/dist/EngineFacade.d.ts +1 -1
  15. package/dist/EngineFacade.d.ts.map +1 -1
  16. package/dist/EngineFacade.js +1 -1
  17. package/dist/EngineWorklet.d.ts.map +1 -1
  18. package/dist/EngineWorklet.js +7 -8
  19. package/dist/ExternalLib.d.ts +0 -1
  20. package/dist/ExternalLib.d.ts.map +1 -1
  21. package/dist/ExternalLib.js +0 -1
  22. package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
  23. package/dist/Preferences.d.ts +4 -0
  24. package/dist/Preferences.d.ts.map +1 -1
  25. package/dist/Preferences.js +2 -0
  26. package/dist/RecordingWorklet.d.ts +2 -1
  27. package/dist/RecordingWorklet.d.ts.map +1 -1
  28. package/dist/WavFile.d.ts +4 -7
  29. package/dist/WavFile.d.ts.map +1 -1
  30. package/dist/WavFile.js +22 -21
  31. package/dist/Workers.d.ts +2 -0
  32. package/dist/Workers.d.ts.map +1 -1
  33. package/dist/Workers.js +11 -0
  34. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  35. package/dist/capture/CaptureAudio.js +0 -2
  36. package/dist/capture/RecordAudio.d.ts.map +1 -1
  37. package/dist/capture/RecordAudio.js +3 -1
  38. package/dist/cloud/CloudBackupProjects.js +4 -4
  39. package/dist/cloud/CloudBackupSamples.d.ts.map +1 -1
  40. package/dist/cloud/CloudBackupSamples.js +3 -9
  41. package/dist/cloud/CloudBackupSoundfonts.js +1 -1
  42. package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
  43. package/dist/dawproject/DawProjectExporter.js +2 -12
  44. package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
  45. package/dist/dawproject/DawProjectImporter.js +5 -3
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -0
  49. package/dist/midi/MIDIReceiver.d.ts +12 -0
  50. package/dist/midi/MIDIReceiver.d.ts.map +1 -0
  51. package/dist/midi/MIDIReceiver.js +65 -0
  52. package/dist/midi/MidiDevices.d.ts +4 -1
  53. package/dist/midi/MidiDevices.d.ts.map +1 -1
  54. package/dist/midi/MidiDevices.js +40 -1
  55. package/dist/processors.js +17 -19
  56. package/dist/processors.js.map +4 -4
  57. package/dist/project/Project.d.ts.map +1 -1
  58. package/dist/project/Project.js +14 -2
  59. package/dist/project/ProjectApi.d.ts +13 -4
  60. package/dist/project/ProjectApi.d.ts.map +1 -1
  61. package/dist/project/ProjectApi.js +71 -29
  62. package/dist/project/ProjectBundle.d.ts +2 -2
  63. package/dist/project/ProjectBundle.d.ts.map +1 -1
  64. package/dist/project/ProjectBundle.js +3 -3
  65. package/dist/project/ProjectMeta.d.ts +2 -0
  66. package/dist/project/ProjectMeta.d.ts.map +1 -1
  67. package/dist/project/ProjectMeta.js +1 -0
  68. package/dist/project/ProjectMigration.d.ts.map +1 -1
  69. package/dist/project/ProjectMigration.js +47 -5
  70. package/dist/project/ProjectProfile.d.ts +1 -0
  71. package/dist/project/ProjectProfile.d.ts.map +1 -1
  72. package/dist/project/ProjectProfile.js +5 -0
  73. package/dist/project/audio/AudioContentFactory.d.ts +34 -0
  74. package/dist/project/audio/AudioContentFactory.d.ts.map +1 -0
  75. package/dist/project/audio/AudioContentFactory.js +107 -0
  76. package/dist/project/audio/AudioContentHelpers.d.ts +7 -0
  77. package/dist/project/audio/AudioContentHelpers.d.ts.map +1 -0
  78. package/dist/project/audio/AudioContentHelpers.js +17 -0
  79. package/dist/project/audio/AudioContentModifier.d.ts +10 -0
  80. package/dist/project/audio/AudioContentModifier.d.ts.map +1 -0
  81. package/dist/project/audio/AudioContentModifier.js +129 -0
  82. package/dist/project/audio/AudioFileBoxFactory.d.ts +8 -0
  83. package/dist/project/audio/AudioFileBoxFactory.d.ts.map +1 -0
  84. package/dist/project/audio/AudioFileBoxFactory.js +36 -0
  85. package/dist/project/audio/index.d.ts +4 -0
  86. package/dist/project/audio/index.d.ts.map +1 -0
  87. package/dist/project/audio/index.js +3 -0
  88. package/dist/project/index.d.ts +1 -0
  89. package/dist/project/index.d.ts.map +1 -1
  90. package/dist/project/index.js +1 -0
  91. package/dist/samples/DefaultSampleLoader.d.ts +2 -1
  92. package/dist/samples/DefaultSampleLoader.d.ts.map +1 -1
  93. package/dist/samples/DefaultSampleLoader.js +1 -1
  94. package/dist/samples/DefaultSampleLoaderManager.d.ts +3 -1
  95. package/dist/samples/DefaultSampleLoaderManager.d.ts.map +1 -1
  96. package/dist/samples/DefaultSampleLoaderManager.js +13 -0
  97. package/dist/samples/OpenSampleAPI.d.ts +2 -1
  98. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  99. package/dist/samples/OpenSampleAPI.js +2 -2
  100. package/dist/samples/SampleAPI.d.ts +2 -1
  101. package/dist/samples/SampleAPI.d.ts.map +1 -1
  102. package/dist/samples/SampleProvider.d.ts +2 -1
  103. package/dist/samples/SampleProvider.d.ts.map +1 -1
  104. package/dist/samples/SampleService.d.ts.map +1 -1
  105. package/dist/samples/SampleStorage.d.ts +2 -1
  106. package/dist/samples/SampleStorage.d.ts.map +1 -1
  107. package/dist/samples/SampleStorage.js +6 -5
  108. package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -1
  109. package/dist/soundfont/OpenSoundfontAPI.js +3 -3
  110. package/dist/workers-main.js +1 -5
  111. package/dist/workers-main.js.map +4 -4
  112. package/package.json +15 -15
@@ -1,7 +1,7 @@
1
- import { int, Option } from "@opendaw/lib-std";
1
+ import { int, Option, Progress } from "@opendaw/lib-std";
2
2
  import { ExportStemsConfiguration } from "@opendaw/studio-adapters";
3
3
  import { Project } from "./project";
4
4
  export declare namespace AudioOfflineRenderer {
5
- const start: (source: Project, optExportConfiguration: Option<ExportStemsConfiguration>, sampleRate?: int) => Promise<AudioBuffer>;
5
+ const start: (source: Project, optExportConfiguration: Option<ExportStemsConfiguration>, progress: Progress.Handler, abortSignal?: AbortSignal, sampleRate?: int) => Promise<AudioBuffer>;
6
6
  }
7
7
  //# sourceMappingURL=AudioOfflineRenderer.d.ts.map
@@ -1 +1 @@
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
+ {"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,11 +1,11 @@
1
- import { DefaultObservableValue, Errors, panic, RuntimeNotifier, Terminator, TimeSpan } from "@opendaw/lib-std";
1
+ import { Errors, isDefined, panic, Terminator, TimeSpan } from "@opendaw/lib-std";
2
2
  import { AnimationFrame } from "@opendaw/lib-dom";
3
3
  import { Wait } from "@opendaw/lib-runtime";
4
4
  import { ExportStemsConfiguration } from "@opendaw/studio-adapters";
5
5
  import { AudioWorklets } from "./AudioWorklets";
6
6
  export var AudioOfflineRenderer;
7
7
  (function (AudioOfflineRenderer) {
8
- AudioOfflineRenderer.start = async (source, optExportConfiguration, sampleRate = 48_000) => {
8
+ AudioOfflineRenderer.start = async (source, optExportConfiguration, progress, abortSignal, sampleRate = 48_000) => {
9
9
  const numStems = ExportStemsConfiguration.countStems(optExportConfiguration);
10
10
  if (numStems === 0) {
11
11
  return panic("Nothing to export");
@@ -13,7 +13,6 @@ export var AudioOfflineRenderer;
13
13
  const { promise, reject, resolve } = Promise.withResolvers();
14
14
  const projectCopy = source.copy();
15
15
  const terminator = new Terminator();
16
- const progress = terminator.own(new DefaultObservableValue(0.0));
17
16
  projectCopy.boxGraph.beginTransaction();
18
17
  projectCopy.timelineBox.loopArea.enabled.setValue(false);
19
18
  projectCopy.boxGraph.endTransaction();
@@ -32,17 +31,18 @@ export var AudioOfflineRenderer;
32
31
  while (!await engineWorklet.queryLoadingComplete()) {
33
32
  await Wait.timeSpan(TimeSpan.seconds(1));
34
33
  }
35
- // Start rendering...
36
- let cancelled = false;
37
- terminator.ownAll(projectCopy, RuntimeNotifier.progress({
38
- headline: "Rendering...", progress, cancel: () => {
34
+ if (isDefined(abortSignal)) {
35
+ abortSignal.onabort = () => {
39
36
  engineWorklet.stop(true);
40
37
  engineWorklet.sleep();
41
38
  terminator.terminate();
42
39
  cancelled = true;
43
40
  reject(Errors.AbortError);
44
- }
45
- }), AnimationFrame.add(() => progress.setValue(context.currentTime / durationInSeconds)));
41
+ };
42
+ }
43
+ // Start rendering...
44
+ let cancelled = false;
45
+ terminator.ownAll(projectCopy, AnimationFrame.add(() => progress(context.currentTime / durationInSeconds)));
46
46
  context.startRendering().then(buffer => {
47
47
  console.debug(`rendering complete. cancelled: ${cancelled}`);
48
48
  if (!cancelled) {
@@ -0,0 +1,4 @@
1
+ export declare namespace AudioUtils {
2
+ const findLastNonSilentSample: (buffer: AudioBuffer, thresholdDb?: number) => number;
3
+ }
4
+ //# sourceMappingURL=AudioUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioUtils.d.ts","sourceRoot":"","sources":["../src/AudioUtils.ts"],"names":[],"mappings":"AAEA,yBAAiB,UAAU,CAAC;IACjB,MAAM,uBAAuB,GAAI,QAAQ,WAAW,EAAE,cAAa,MAAc,KAAG,MAe1F,CAAA;CACJ"}
@@ -0,0 +1,20 @@
1
+ import { dbToGain } from "@opendaw/lib-dsp";
2
+ export var AudioUtils;
3
+ (function (AudioUtils) {
4
+ AudioUtils.findLastNonSilentSample = (buffer, thresholdDb = -72.0) => {
5
+ const threshold = dbToGain(thresholdDb);
6
+ const numChannels = buffer.numberOfChannels;
7
+ const length = buffer.length;
8
+ let lastNonSilentSample = 0;
9
+ for (let channel = 0; channel < numChannels; channel++) {
10
+ const channelData = buffer.getChannelData(channel);
11
+ for (let i = length - 1; i >= 0; i--) {
12
+ if (Math.abs(channelData[i]) > threshold) {
13
+ lastNonSilentSample = Math.max(lastNonSilentSample, i);
14
+ break;
15
+ }
16
+ }
17
+ }
18
+ return lastNonSilentSample + 1;
19
+ };
20
+ })(AudioUtils || (AudioUtils = {}));
@@ -1,3 +1,3 @@
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;
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;
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,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"}
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"}
@@ -6,6 +6,7 @@ export declare namespace EffectFactories {
6
6
  const Zeitgeist: EffectFactory;
7
7
  const StereoTool: EffectFactory;
8
8
  const Delay: EffectFactory;
9
+ const DattorroReverb: EffectFactory;
9
10
  const Compressor: EffectFactory;
10
11
  const Reverb: EffectFactory;
11
12
  const Crusher: EffectFactory;
@@ -24,6 +25,7 @@ export declare namespace EffectFactories {
24
25
  Compressor: EffectFactory;
25
26
  Delay: EffectFactory;
26
27
  Reverb: EffectFactory;
28
+ DattorroReverb: EffectFactory;
27
29
  Revamp: EffectFactory;
28
30
  Crusher: EffectFactory;
29
31
  Fold: EffectFactory;
@@ -37,6 +39,7 @@ export declare namespace EffectFactories {
37
39
  Compressor: EffectFactory;
38
40
  Delay: EffectFactory;
39
41
  Reverb: EffectFactory;
42
+ DattorroReverb: EffectFactory;
40
43
  Revamp: EffectFactory;
41
44
  Crusher: EffectFactory;
42
45
  Fold: EffectFactory;
@@ -1 +1 @@
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
+ {"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,5 +1,5 @@
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, TidalDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
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";
3
3
  import { IconSymbol } from "@opendaw/studio-enums";
4
4
  import { EffectParameterDefaults } from "./EffectParameterDefaults";
5
5
  export var EffectFactories;
@@ -87,6 +87,18 @@ export var EffectFactories;
87
87
  box.host.refer(hostField);
88
88
  })
89
89
  };
90
+ EffectFactories.DattorroReverb = {
91
+ defaultName: "Dattorro Reverb",
92
+ defaultIcon: IconSymbol.Dattorro,
93
+ description: "Dense algorithmic reverb based on Dattorro's design, capable of infinite decay",
94
+ separatorBefore: false,
95
+ type: "audio",
96
+ create: ({ boxGraph }, hostField, index) => DattorroReverbDeviceBox.create(boxGraph, UUID.generate(), box => {
97
+ box.label.setValue("Dattorro Reverb");
98
+ box.index.setValue(index);
99
+ box.host.refer(hostField);
100
+ })
101
+ };
90
102
  EffectFactories.Compressor = {
91
103
  defaultName: "Compressor",
92
104
  defaultIcon: IconSymbol.Compressor,
@@ -100,7 +112,7 @@ export var EffectFactories;
100
112
  })
101
113
  };
102
114
  EffectFactories.Reverb = {
103
- defaultName: "Reverb",
115
+ defaultName: "Cheap Reverb",
104
116
  defaultIcon: IconSymbol.Cube,
105
117
  description: "Simulates space and depth with reflections",
106
118
  separatorBefore: false,
@@ -199,7 +211,9 @@ export var EffectFactories;
199
211
  }
200
212
  };
201
213
  EffectFactories.MidiNamed = { Arpeggio: EffectFactories.Arpeggio, Pitch: EffectFactories.Pitch, Velocity: EffectFactories.Velocity, Zeitgeist: EffectFactories.Zeitgeist };
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 };
214
+ 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, Modular: EffectFactories.Modular
216
+ };
203
217
  EffectFactories.MidiList = Object.values(EffectFactories.MidiNamed);
204
218
  EffectFactories.AudioList = Object.values(EffectFactories.AudioNamed);
205
219
  EffectFactories.MergedNamed = { ...EffectFactories.MidiNamed, ...EffectFactories.AudioNamed };
package/dist/Engine.d.ts CHANGED
@@ -24,7 +24,7 @@ export interface Engine extends Terminable {
24
24
  get isPlaying(): ObservableValue<boolean>;
25
25
  get isRecording(): ObservableValue<boolean>;
26
26
  get isCountingIn(): ObservableValue<boolean>;
27
- get metronomeEnabled(): ObservableValue<boolean>;
27
+ get metronomeEnabled(): MutableObservableValue<boolean>;
28
28
  get playbackTimestamp(): ObservableValue<ppqn>;
29
29
  get playbackTimestampEnabled(): MutableObservableValue<boolean>;
30
30
  get countInBarsTotal(): ObservableValue<int>;
@@ -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,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"}
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,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"}
@@ -26,12 +26,12 @@ export declare class EngineFacade implements Engine {
26
26
  get countInBeatsRemaining(): ObservableValue<int>;
27
27
  get markerState(): DefaultObservableValue<Nullable<[UUID.Bytes, int]>>;
28
28
  get project(): Project;
29
+ get sampleRate(): number;
29
30
  isReady(): Promise<void>;
30
31
  queryLoadingComplete(): Promise<boolean>;
31
32
  panic(): void;
32
33
  sleep(): void;
33
34
  wake(): void;
34
- sampleRate(): number;
35
35
  subscribeClipNotification(observer: Observer<ClipNotification>): Subscription;
36
36
  subscribeNotes(observer: Observer<NoteSignal>): Subscription;
37
37
  ignoreNoteRegion(uuid: UUID.Bytes): 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,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"}
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;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"}
@@ -41,6 +41,7 @@ export class EngineFacade {
41
41
  get countInBeatsRemaining() { return this.#countInBeatsRemaining; }
42
42
  get markerState() { return this.#markerState; }
43
43
  get project() { return this.#worklet.unwrap("No worklet to get project").project; }
44
+ get sampleRate() { return this.#worklet.isEmpty() ? 44_100 : this.#worklet.unwrap().context.sampleRate; }
44
45
  isReady() { return this.#worklet.mapOr(worklet => worklet.isReady(), Promise.resolve()); }
45
46
  queryLoadingComplete() {
46
47
  return this.#worklet.mapOr(worklet => worklet.queryLoadingComplete(), Promise.resolve(false));
@@ -48,7 +49,6 @@ export class EngineFacade {
48
49
  panic() { this.#worklet.ifSome(worklet => worklet.panic()); }
49
50
  sleep() { this.#worklet.ifSome(worklet => worklet.sleep()); }
50
51
  wake() { this.#worklet.ifSome(worklet => worklet.wake()); }
51
- sampleRate() { return this.#worklet.isEmpty() ? 44_100 : this.#worklet.unwrap().context.sampleRate; }
52
52
  subscribeClipNotification(observer) {
53
53
  return this.#worklet.unwrap("No worklet to subscribeClipNotification").subscribeClipNotification(observer);
54
54
  }
@@ -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;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"}
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,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAIhD,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;gBAuBpB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,OAAO,EAChB,mBAAmB,CAAC,EAAE,wBAAwB,EAC9C,OAAO,CAAC,EAAE,gBAAgB;IA2ItC,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"}
@@ -3,6 +3,7 @@ import { SyncSource } from "@opendaw/lib-box";
3
3
  import { AnimationFrame } from "@opendaw/lib-dom";
4
4
  import { Communicator, Messenger } from "@opendaw/lib-runtime";
5
5
  import { EngineStateSchema, ExportStemsConfiguration } from "@opendaw/studio-adapters";
6
+ import { MIDIReceiver } from "./midi/MIDIReceiver";
6
7
  export class EngineWorklet extends AudioWorkletNode {
7
8
  static ID = 0 | 0;
8
9
  id = EngineWorklet.ID++;
@@ -88,8 +89,13 @@ export class EngineWorklet extends AudioWorkletNode {
88
89
  scheduleClipStop(trackIds) {
89
90
  dispatcher.dispatchAndForget(this.scheduleClipStop, trackIds);
90
91
  }
92
+ setupMIDI(port, buffer) {
93
+ dispatcher.dispatchAndForget(this.setupMIDI, port, buffer);
94
+ }
91
95
  terminate() { dispatcher.dispatchAndForget(this.terminate); }
92
96
  }));
97
+ const { port, sab } = this.#terminator.own(MIDIReceiver.create(context, (deviceId, data, relativeTimeInMs) => this.#project.receivedMIDIFromEngine(deviceId, data, relativeTimeInMs)));
98
+ this.#commands.setupMIDI(port, sab);
93
99
  Communicator.executor(messenger.channel("engine-to-client"), {
94
100
  log: (message) => console.log("WORKLET", message),
95
101
  error: (reason) => this.dispatchEvent(new ErrorEvent("error", { error: reason })),
@@ -136,14 +142,7 @@ export class EngineWorklet extends AudioWorkletNode {
136
142
  changes.started.forEach(uuid => this.#playingClips.push(uuid));
137
143
  this.#notifyClipNotification.notify({ type: "sequencing", changes });
138
144
  },
139
- switchMarkerState: (state) => this.#markerState.setValue(state),
140
- sendMIDIData: (midiDeviceId, data, relativeTimeInMs) => {
141
- let delay = 20.0; // default 20ms
142
- if (this.context instanceof AudioContext) {
143
- delay = this.context.outputLatency / 1000.0;
144
- }
145
- this.#project.receivedMIDIFromEngine(midiDeviceId, data, relativeTimeInMs + delay);
146
- }
145
+ switchMarkerState: (state) => this.#markerState.setValue(state)
147
146
  });
148
147
  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())));
149
148
  }
@@ -1,6 +1,5 @@
1
1
  export declare namespace ExternalLib {
2
2
  const JSZip: () => Promise<import("jszip")>;
3
3
  const SoundFont2: () => Promise<typeof import("soundfont2").SoundFont2>;
4
- const FFmpegWorker: () => Promise<typeof import("@opendaw/studio-core/FFmpegWorker").FFmpegWorker>;
5
4
  }
6
5
  //# sourceMappingURL=ExternalLib.d.ts.map
@@ -1 +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"}
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;CACzE"}
@@ -7,5 +7,4 @@ export var ExternalLib;
7
7
  };
8
8
  ExternalLib.JSZip = async () => await Promises.guardedRetry(() => import("jszip").then(({ default: JSZip }) => JSZip), callback);
9
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
10
  })(ExternalLib || (ExternalLib = {}));
@@ -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,cAAc,EAAE,oBAG5B,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;CACJ"}
@@ -1,20 +1,24 @@
1
1
  import { z } from "zod";
2
2
  import { Observer, Subscription } from "@opendaw/lib-std";
3
3
  declare const PreferencesSchema: z.ZodObject<{
4
+ "visible-help-hints": z.ZodDefault<z.ZodBoolean>;
4
5
  "auto-open-clips": z.ZodDefault<z.ZodBoolean>;
5
6
  "auto-create-output-compressor": z.ZodDefault<z.ZodBoolean>;
6
7
  "footer-show-fps-meter": z.ZodDefault<z.ZodBoolean>;
7
8
  "footer-show-build-infos": z.ZodDefault<z.ZodBoolean>;
8
9
  "dragging-use-pointer-lock": z.ZodDefault<z.ZodBoolean>;
10
+ "enable-beta-features": z.ZodDefault<z.ZodBoolean>;
9
11
  }, z.core.$strip>;
10
12
  export type Preferences = z.infer<typeof PreferencesSchema>;
11
13
  export declare const Preferences: {
12
14
  values: {
15
+ "visible-help-hints": boolean;
13
16
  "auto-open-clips": boolean;
14
17
  "auto-create-output-compressor": boolean;
15
18
  "footer-show-fps-meter": boolean;
16
19
  "footer-show-build-infos": boolean;
17
20
  "dragging-use-pointer-lock": boolean;
21
+ "enable-beta-features": boolean;
18
22
  };
19
23
  catchupAndSubscribe: <KEY extends keyof Preferences>(observer: Observer<Preferences[KEY]>, property: KEY) => Subscription;
20
24
  };
@@ -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;;;;;;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"}
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;;;;;;;;iBAQrB,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,11 +1,13 @@
1
1
  import { z } from "zod";
2
2
  import { isDefined, Notifier, tryCatch } from "@opendaw/lib-std";
3
3
  const PreferencesSchema = z.object({
4
+ "visible-help-hints": z.boolean().default(true),
4
5
  "auto-open-clips": z.boolean().default(false),
5
6
  "auto-create-output-compressor": z.boolean().default(true),
6
7
  "footer-show-fps-meter": z.boolean().default(false),
7
8
  "footer-show-build-infos": z.boolean().default(false),
8
9
  "dragging-use-pointer-lock": z.boolean().default(false),
10
+ "enable-beta-features": z.boolean().default(false),
9
11
  });
10
12
  export const Preferences = (() => {
11
13
  const STORAGE_KEY = "preferences";
@@ -1,6 +1,7 @@
1
1
  import { int, Observer, Option, Subscription, Terminable, UUID } from "@opendaw/lib-std";
2
+ import { AudioData } from "@opendaw/lib-dsp";
2
3
  import { Peaks } from "@opendaw/lib-fusion";
3
- import { AudioData, RingBuffer, SampleLoader, SampleLoaderState } from "@opendaw/studio-adapters";
4
+ import { RingBuffer, SampleLoader, SampleLoaderState } from "@opendaw/studio-adapters";
4
5
  export declare class RecordingWorklet extends AudioWorkletNode implements Terminable, SampleLoader {
5
6
  #private;
6
7
  readonly uuid: UUID.Bytes;
@@ -1 +1 @@
1
- {"version":3,"file":"RecordingWorklet.d.ts","sourceRoot":"","sources":["../src/RecordingWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,GAAG,EAEH,QAAQ,EACR,MAAM,EAGN,YAAY,EACZ,UAAU,EAEV,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EACH,SAAS,EAET,UAAU,EACV,YAAY,EACZ,iBAAiB,EAEpB,MAAM,0BAA0B,CAAA;AAMjC,qBAAa,gBAAiB,SAAQ,gBAAiB,YAAW,UAAU,EAAE,YAAY;;IAGtF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAkB;gBAa/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM;IA2BvF,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC;IAE3C,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAEvB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAE/B,IAAI,cAAc,IAAI,GAAG,CAA6C;IACtE,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAoB;IACjD,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAA6E;IACvG,IAAI,KAAK,IAAI,iBAAiB,CAAqB;IAEnD,UAAU,IAAI,IAAI;IAElB,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,YAAY;IAQ9D,SAAS,IAAI,IAAI;IAMjB,QAAQ,IAAI,MAAM;CAyCrB"}
1
+ {"version":3,"file":"RecordingWorklet.d.ts","sourceRoot":"","sources":["../src/RecordingWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,GAAG,EAEH,QAAQ,EACR,MAAM,EAGN,YAAY,EACZ,UAAU,EAEV,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,SAAS,EAAW,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAEH,UAAU,EACV,YAAY,EACZ,iBAAiB,EAEpB,MAAM,0BAA0B,CAAA;AAMjC,qBAAa,gBAAiB,SAAQ,gBAAiB,YAAW,UAAU,EAAE,YAAY;;IAGtF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAkB;gBAa/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM;IA2BvF,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC;IAE3C,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAEvB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAE/B,IAAI,cAAc,IAAI,GAAG,CAA6C;IACtE,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAoB;IACjD,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAA6E;IACvG,IAAI,KAAK,IAAI,iBAAiB,CAAqB;IAEnD,UAAU,IAAI,IAAI;IAElB,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,YAAY;IAQ9D,SAAS,IAAI,IAAI;IAMjB,QAAQ,IAAI,MAAM;CAyCrB"}
package/dist/WavFile.d.ts CHANGED
@@ -1,10 +1,7 @@
1
+ import { int } from "@opendaw/lib-std";
2
+ import { AudioData } from "@opendaw/lib-dsp";
1
3
  export declare namespace WavFile {
2
- type Audio = {
3
- channels: ReadonlyArray<Float32Array>;
4
- sampleRate: number;
5
- numFrames: number;
6
- };
7
- const decodeFloats: (buffer: ArrayBuffer) => Audio;
8
- const encodeFloats: (audio: Audio | AudioBuffer) => ArrayBuffer;
4
+ const decodeFloats: (buffer: ArrayBuffer) => AudioData;
5
+ const encodeFloats: (audio: AudioData | AudioBuffer, maxLength?: int) => ArrayBuffer;
9
6
  }
10
7
  //# sourceMappingURL=WavFile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WavFile.d.ts","sourceRoot":"","sources":["../src/WavFile.ts"],"names":[],"mappings":"AAEA,yBAAiB,OAAO,CAAC;IAMrB,KAAY,KAAK,GAAG;QAChB,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACtC,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAA;KACpB,CAAA;IAEM,MAAM,YAAY,GAAI,QAAQ,WAAW,KAAG,KA2ClD,CAAA;IAEM,MAAM,YAAY,GAAI,OAAO,KAAK,GAAG,WAAW,KAAG,WAuCzD,CAAA;CACJ"}
1
+ {"version":3,"file":"WavFile.d.ts","sourceRoot":"","sources":["../src/WavFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,GAAG,EAAQ,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAE1C,yBAAiB,OAAO,CAAC;IAMd,MAAM,YAAY,GAAI,QAAQ,WAAW,KAAG,SA2ClD,CAAA;IAEM,MAAM,YAAY,GAAI,OAAO,SAAS,GAAG,WAAW,EAAE,YAAW,GAA6B,KAAG,WAwCvG,CAAA;CACJ"}
package/dist/WavFile.js CHANGED
@@ -30,43 +30,44 @@ export var WavFile;
30
30
  return panic("Missing fmt or data chunk");
31
31
  }
32
32
  const audioFormat = view.getUint16(fmtOffset, true); // 3 = IEEE float
33
- const numChannels = view.getUint16(fmtOffset + 2, true);
33
+ const numberOfChannels = view.getUint16(fmtOffset + 2, true);
34
34
  const sampleRate = view.getUint32(fmtOffset + 4, true);
35
35
  const blockAlign = view.getUint16(fmtOffset + 12, true);
36
36
  const bitsPerSample = view.getUint16(fmtOffset + 14, true);
37
37
  if (audioFormat !== 3 || bitsPerSample !== 32) {
38
38
  return panic("Expected 32-bit float WAV (format 3)");
39
39
  }
40
- if (blockAlign !== numChannels * 4) {
40
+ if (blockAlign !== numberOfChannels * 4) {
41
41
  return panic("Invalid block alignment");
42
42
  }
43
- const numFrames = Math.floor(dataSize / blockAlign);
44
- const interleaved = new Float32Array(buffer, dataOffset, numFrames * numChannels);
45
- const channels = Arrays.create(() => new Float32Array(numFrames), numChannels);
46
- for (let i = 0, w = 0; i < numFrames; i++) {
47
- for (let c = 0; c < numChannels; c++) {
48
- channels[c][i] = interleaved[w++];
43
+ const numberOfFrames = Math.floor(dataSize / blockAlign);
44
+ const interleaved = new Float32Array(buffer, dataOffset, numberOfFrames * numberOfChannels);
45
+ const frames = Arrays.create(() => new Float32Array(numberOfFrames), numberOfChannels);
46
+ for (let i = 0, w = 0; i < numberOfFrames; i++) {
47
+ for (let c = 0; c < numberOfChannels; c++) {
48
+ frames[c][i] = interleaved[w++];
49
49
  }
50
50
  }
51
- return { channels, sampleRate, numFrames };
51
+ return { frames, sampleRate, numberOfFrames, numberOfChannels };
52
52
  };
53
- WavFile.encodeFloats = (audio) => {
53
+ WavFile.encodeFloats = (audio, maxLength = Number.MAX_SAFE_INTEGER) => {
54
54
  const bytesPerChannel = Float32Array.BYTES_PER_ELEMENT;
55
55
  const sampleRate = audio.sampleRate;
56
- let numFrames;
56
+ let numberOfFrames;
57
57
  let numberOfChannels;
58
- let channels;
58
+ let frames;
59
59
  if (audio instanceof AudioBuffer) {
60
- channels = Arrays.create(index => audio.getChannelData(index), audio.numberOfChannels);
61
- numFrames = audio.length;
60
+ frames = Arrays.create(index => audio.getChannelData(index), audio.numberOfChannels);
61
+ numberOfFrames = audio.length;
62
62
  numberOfChannels = audio.numberOfChannels;
63
63
  }
64
64
  else {
65
- channels = audio.channels;
66
- numFrames = audio.numFrames;
67
- numberOfChannels = audio.channels.length;
65
+ frames = audio.frames;
66
+ numberOfFrames = audio.numberOfFrames;
67
+ numberOfChannels = audio.frames.length;
68
68
  }
69
- const size = 44 + numFrames * numberOfChannels * bytesPerChannel;
69
+ numberOfFrames = Math.min(maxLength, numberOfFrames);
70
+ const size = 44 + numberOfFrames * numberOfChannels * bytesPerChannel;
70
71
  const buf = new ArrayBuffer(size);
71
72
  const view = new DataView(buf);
72
73
  view.setUint32(0, MAGIC_RIFF, true);
@@ -81,11 +82,11 @@ export var WavFile;
81
82
  view.setUint16(32, numberOfChannels * bytesPerChannel, true);
82
83
  view.setUint16(34, 8 * bytesPerChannel, true);
83
84
  view.setUint32(36, MAGIC_DATA, true);
84
- view.setUint32(40, numberOfChannels * numFrames * bytesPerChannel, true);
85
+ view.setUint32(40, numberOfChannels * numberOfFrames * bytesPerChannel, true);
85
86
  let w = 44;
86
- for (let i = 0; i < numFrames; ++i) {
87
+ for (let i = 0; i < numberOfFrames; ++i) {
87
88
  for (let j = 0; j < numberOfChannels; ++j) {
88
- view.setFloat32(w, channels[j][i], true);
89
+ view.setFloat32(w, frames[j][i], true);
89
90
  w += bytesPerChannel;
90
91
  }
91
92
  }
package/dist/Workers.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  import { Option } from "@opendaw/lib-std";
2
2
  import { Messenger } from "@opendaw/lib-runtime";
3
3
  import type { OpfsProtocol, SamplePeakProtocol } from "@opendaw/lib-fusion";
4
+ import type { TransientProtocol } from "@opendaw/lib-dsp";
4
5
  export declare class Workers {
5
6
  static install(url: string): Promise<void>;
6
7
  static messenger: Option<Messenger>;
7
8
  static get Peak(): SamplePeakProtocol;
8
9
  static get Opfs(): OpfsProtocol;
10
+ static get Transients(): TransientProtocol;
9
11
  }
10
12
  //# sourceMappingURL=Workers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Workers.d.ts","sourceRoot":"","sources":["../src/Workers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAY,MAAM,kBAAkB,CAAA;AACjF,OAAO,EAAe,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAC,YAAY,EAAE,kBAAkB,EAAC,MAAM,qBAAqB,CAAA;AAEzE,qBAAa,OAAO;WACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAc;IAGjD,MAAM,KAAK,IAAI,IAAI,kBAAkB,CAapC;IAGD,MAAM,KAAK,IAAI,IAAI,YAAY,CAS9B;CACJ"}
1
+ {"version":3,"file":"Workers.d.ts","sourceRoot":"","sources":["../src/Workers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAY,MAAM,kBAAkB,CAAA;AACjF,OAAO,EAAe,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAC,YAAY,EAAE,kBAAkB,EAAC,MAAM,qBAAqB,CAAA;AACzE,OAAO,KAAK,EAAY,iBAAiB,EAAC,MAAM,kBAAkB,CAAA;AAElE,qBAAa,OAAO;WACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAc;IAGjD,MAAM,KAAK,IAAI,IAAI,kBAAkB,CAapC;IAGD,MAAM,KAAK,IAAI,IAAI,YAAY,CAS9B;IAGD,MAAM,KAAK,UAAU,IAAI,iBAAiB,CAMzC;CACJ"}
package/dist/Workers.js CHANGED
@@ -43,6 +43,12 @@ export class Workers {
43
43
  list(path) { return router.dispatchAndReturn(this.list, path); }
44
44
  });
45
45
  }
46
+ static get Transients() {
47
+ return Communicator
48
+ .sender(this.messenger.unwrap("Workers are not installed").channel("transients"), router => new class {
49
+ detect(audioData) { return router.dispatchAndReturn(this.detect, audioData); }
50
+ });
51
+ }
46
52
  }
47
53
  __decorate([
48
54
  Lazy,
@@ -54,3 +60,8 @@ __decorate([
54
60
  __metadata("design:type", Object),
55
61
  __metadata("design:paramtypes", [])
56
62
  ], Workers, "Opfs", null);
63
+ __decorate([
64
+ Lazy,
65
+ __metadata("design:type", Object),
66
+ __metadata("design:paramtypes", [])
67
+ ], Workers, "Transients", null);
@@ -1 +1 @@
1
- {"version":3,"file":"CaptureAudio.d.ts","sourceRoot":"","sources":["../../src/capture/CaptureAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,uBAAuB,EACvB,MAAM,EAEN,UAAU,EACb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAI/C,qBAAa,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;;gBAQ1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IA4BjG,IAAI,MAAM,IAAI,MAAM,CAAsB;IAE1C,IAAI,MAAM,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAsB;IAExE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,CAEnC;IAED,IAAI,KAAK,IAAI,MAAM,CAAsE;IAEzF,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAA+D;IAEhG,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAE/C;IAEK,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBvC,cAAc,IAAI,UAAU;CA+D/B"}
1
+ {"version":3,"file":"CaptureAudio.d.ts","sourceRoot":"","sources":["../../src/capture/CaptureAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,uBAAuB,EACvB,MAAM,EAEN,UAAU,EACb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAI/C,qBAAa,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;;gBAQ1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IA4BjG,IAAI,MAAM,IAAI,MAAM,CAAsB;IAE1C,IAAI,MAAM,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAsB;IAExE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,CAEnC;IAED,IAAI,KAAK,IAAI,MAAM,CAAsE;IAEzF,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAA+D;IAEhG,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAE/C;IAEK,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBvC,cAAc,IAAI,UAAU;CA6D/B"}
@@ -93,8 +93,6 @@ export class CaptureAudio extends Capture {
93
93
  const channelCount = this.#requestChannels.unwrapOrElse(1);
94
94
  return AudioDevices.requestStream({
95
95
  deviceId: { exact: deviceId },
96
- sampleRate: this.manager.project.engine.sampleRate(),
97
- sampleSize: 32,
98
96
  echoCancellation: false,
99
97
  noiseSuppression: false,
100
98
  autoGainControl: false,
@@ -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,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
+ {"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,UAwEL,CAAA;;CACJ"}
@@ -1,6 +1,6 @@
1
1
  import { Option, quantizeCeil, quantizeFloor, Terminable, Terminator, UUID } from "@opendaw/lib-std";
2
2
  import { dbToGain, PPQN } from "@opendaw/lib-dsp";
3
- import { AudioFileBox, AudioRegionBox } from "@opendaw/studio-boxes";
3
+ import { AudioFileBox, AudioRegionBox, ValueEventCollectionBox } from "@opendaw/studio-boxes";
4
4
  import { ColorCodes, TrackType } from "@opendaw/studio-adapters";
5
5
  import { RecordTrack } from "./RecordTrack";
6
6
  export var RecordAudio;
@@ -30,8 +30,10 @@ export var RecordAudio;
30
30
  .replaceAll("Z", "");
31
31
  const fileName = `Recording-${fileDateString}`;
32
32
  const fileBox = AudioFileBox.create(boxGraph, uuid, box => box.fileName.setValue(fileName));
33
+ const collectionBox = ValueEventCollectionBox.create(boxGraph, UUID.generate());
33
34
  const regionBox = AudioRegionBox.create(boxGraph, UUID.generate(), box => {
34
35
  box.file.refer(fileBox);
36
+ box.events.refer(collectionBox.owners);
35
37
  box.regions.refer(trackBox.regions);
36
38
  box.position.setValue(position);
37
39
  box.hue.setValue(ColorCodes.forTrackType(TrackType.Audio));
@@ -123,7 +123,7 @@ export class CloudBackupProjects {
123
123
  const uuid = UUID.parse(uuidAsString);
124
124
  const path = `${CloudBackupProjects.RemotePath}/${uuidAsString}`;
125
125
  this.#log(`Downloading project '${meta.name}'`);
126
- const files = await Promises.guardedRetry(() => this.#cloudHandler.list(path), network.DefaultRetry);
126
+ const files = await Promises.guardedRetry(() => this.#cloudHandler.list(path), network.defaultRetry);
127
127
  const hasProjectFile = files.includes("project.od");
128
128
  const hasMetaFile = files.includes("meta.json");
129
129
  if (!hasProjectFile || !hasMetaFile) {
@@ -144,13 +144,13 @@ export class CloudBackupProjects {
144
144
  const projectPath = `${path}/project.od`;
145
145
  const metaPath = `${path}/meta.json`;
146
146
  const coverPath = `${path}/image.bin`;
147
- const projectArrayBuffer = await Promises.guardedRetry(() => this.#cloudHandler.download(projectPath), network.DefaultRetry);
148
- const metaArrayBuffer = await Promises.guardedRetry(() => this.#cloudHandler.download(metaPath), network.DefaultRetry);
147
+ const projectArrayBuffer = await Promises.guardedRetry(() => this.#cloudHandler.download(projectPath), network.defaultRetry);
148
+ const metaArrayBuffer = await Promises.guardedRetry(() => this.#cloudHandler.download(metaPath), network.defaultRetry);
149
149
  await Workers.Opfs.write(ProjectPaths.projectFile(uuid), new Uint8Array(projectArrayBuffer));
150
150
  await Workers.Opfs.write(ProjectPaths.projectMeta(uuid), new Uint8Array(metaArrayBuffer));
151
151
  const hasCover = files.some(file => file.endsWith("image.bin"));
152
152
  if (hasCover) {
153
- const arrayBuffer = await Promises.guardedRetry(() => this.#cloudHandler.download(coverPath), network.DefaultRetry);
153
+ const arrayBuffer = await Promises.guardedRetry(() => this.#cloudHandler.download(coverPath), network.defaultRetry);
154
154
  await Workers.Opfs.write(ProjectPaths.projectCover(uuid), new Uint8Array(arrayBuffer));
155
155
  }
156
156
  return uuidAsString;