@opendaw/studio-core 0.0.121 → 0.0.123

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 (46) hide show
  1. package/dist/AssetService.d.ts +4 -3
  2. package/dist/AssetService.d.ts.map +1 -1
  3. package/dist/AssetService.js +3 -5
  4. package/dist/EffectBox.d.ts +2 -2
  5. package/dist/EffectBox.d.ts.map +1 -1
  6. package/dist/EffectFactories.d.ts +3 -0
  7. package/dist/EffectFactories.d.ts.map +1 -1
  8. package/dist/EffectFactories.js +15 -1
  9. package/dist/RecordingWorklet.d.ts +2 -0
  10. package/dist/RecordingWorklet.d.ts.map +1 -1
  11. package/dist/RecordingWorklet.js +8 -25
  12. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  13. package/dist/capture/CaptureAudio.js +2 -1
  14. package/dist/capture/RecordMidi.d.ts.map +1 -1
  15. package/dist/capture/RecordMidi.js +24 -2
  16. package/dist/offline-engine.js +1 -1
  17. package/dist/offline-engine.js.map +1 -1
  18. package/dist/processors.js +25 -25
  19. package/dist/processors.js.map +4 -4
  20. package/dist/project/ProjectEnv.d.ts +4 -0
  21. package/dist/project/ProjectEnv.d.ts.map +1 -1
  22. package/dist/project/audio/AudioContentFactory.d.ts +2 -1
  23. package/dist/project/audio/AudioContentFactory.d.ts.map +1 -1
  24. package/dist/project/audio/AudioContentFactory.js +8 -7
  25. package/dist/samples/SampleService.d.ts +5 -3
  26. package/dist/samples/SampleService.d.ts.map +1 -1
  27. package/dist/samples/SampleService.js +16 -7
  28. package/dist/soundfont/SoundfontService.d.ts +2 -2
  29. package/dist/soundfont/SoundfontService.d.ts.map +1 -1
  30. package/dist/soundfont/SoundfontService.js +3 -3
  31. package/dist/ui/renderer/audio.d.ts +13 -1
  32. package/dist/ui/renderer/audio.d.ts.map +1 -1
  33. package/dist/ui/renderer/audio.js +28 -20
  34. package/dist/ui/renderer/fading.d.ts.map +1 -1
  35. package/dist/ui/renderer/fading.js +23 -20
  36. package/dist/ui/renderer/index.d.ts +1 -0
  37. package/dist/ui/renderer/index.d.ts.map +1 -1
  38. package/dist/ui/renderer/index.js +1 -0
  39. package/dist/ui/renderer/notes.d.ts.map +1 -1
  40. package/dist/ui/renderer/notes.js +7 -4
  41. package/dist/ui/renderer/riffle.d.ts +3 -0
  42. package/dist/ui/renderer/riffle.d.ts.map +1 -0
  43. package/dist/ui/renderer/riffle.js +106 -0
  44. package/dist/workers-main.js +1 -1
  45. package/dist/workers-main.js.map +1 -1
  46. package/package.json +15 -15
@@ -1,4 +1,4 @@
1
- import { Class, Procedure, Progress, UUID } from "@opendaw/lib-std";
1
+ import { Class, Notifier, Observer, Progress, Subscription, UUID } from "@opendaw/lib-std";
2
2
  import { BoxGraph } from "@opendaw/lib-box";
3
3
  import { Sample, Soundfont } from "@opendaw/studio-adapters";
4
4
  import { AudioFileBox, SoundfontFileBox } from "@opendaw/studio-boxes";
@@ -8,15 +8,16 @@ export declare namespace AssetService {
8
8
  name?: string;
9
9
  arrayBuffer: ArrayBuffer;
10
10
  progressHandler?: Progress.Handler;
11
+ origin?: "import" | "recording";
11
12
  };
12
13
  }
13
14
  export declare abstract class AssetService<T extends Sample | Soundfont> {
14
- protected readonly onUpdate: Procedure<T>;
15
15
  protected abstract readonly nameSingular: string;
16
16
  protected abstract readonly namePlural: string;
17
17
  protected abstract readonly boxType: Class<AudioFileBox | SoundfontFileBox>;
18
18
  protected abstract readonly filePickerOptions: FilePickerOptions;
19
- protected constructor(onUpdate: Procedure<T>);
19
+ protected readonly notifier: Notifier<T>;
20
+ subscribe(observer: Observer<T>): Subscription;
20
21
  browse(multiple: boolean): Promise<ReadonlyArray<T>>;
21
22
  abstract importFile(args: AssetService.ImportArgs): Promise<T>;
22
23
  replaceMissingFiles(boxGraph: BoxGraph, manager: {
@@ -1 +1 @@
1
- {"version":3,"file":"AssetService.d.ts","sourceRoot":"","sources":["../src/AssetService.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EAML,SAAS,EACT,QAAQ,EAER,IAAI,EACP,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AAEpE,yBAAiB,YAAY,CAAC;IAC1B,KAAY,UAAU,GAAG;QACrB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,WAAW,CAAC;QACzB,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACrC,CAAA;CACJ;AAED,8BAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS;IAMrC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAL/D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAChD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC9C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAA;IAC3E,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAEhE,SAAS,aAAgC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAEzD,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAI1D,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAExD,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;QAAE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAsCjG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoChH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAClE"}
1
+ {"version":3,"file":"AssetService.d.ts","sourceRoot":"","sources":["../src/AssetService.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EAKL,QAAQ,EACR,QAAQ,EAER,QAAQ,EAER,YAAY,EACZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AAEpE,yBAAiB,YAAY,CAAC;IAC1B,KAAY,UAAU,GAAG;QACrB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,WAAW,CAAC;QACzB,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;QACnC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;KAClC,CAAA;CACJ;AAED,8BAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS;IAC3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAChD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC9C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAA;IAC3E,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAEhE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAoB;IAE5D,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY;IAExC,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAI1D,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAExD,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;QAAE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAsCjG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoChH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAClE"}
@@ -1,11 +1,9 @@
1
- import { DefaultObservableValue, Errors, isInstanceOf, isNotUndefined, panic, Progress, RuntimeNotifier, UUID } from "@opendaw/lib-std";
1
+ import { DefaultObservableValue, Errors, isInstanceOf, isNotUndefined, Notifier, panic, Progress, RuntimeNotifier, UUID } from "@opendaw/lib-std";
2
2
  import { Files } from "@opendaw/lib-dom";
3
3
  import { Promises } from "@opendaw/lib-runtime";
4
4
  export class AssetService {
5
- onUpdate;
6
- constructor(onUpdate) {
7
- this.onUpdate = onUpdate;
8
- }
5
+ notifier = new Notifier();
6
+ subscribe(observer) { return this.notifier.subscribe(observer); }
9
7
  async browse(multiple) {
10
8
  return this.browseFiles(multiple, this.filePickerOptions);
11
9
  }
@@ -1,3 +1,3 @@
1
- import { ArpeggioDeviceBox, MaximizerDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, GateDeviceBox, ModularDeviceBox, NeuralAmpDeviceBox, 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 | GateDeviceBox | CrusherDeviceBox | FoldDeviceBox | DattorroReverbDeviceBox | NeuralAmpDeviceBox;
1
+ import { ArpeggioDeviceBox, MaximizerDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, GateDeviceBox, ModularDeviceBox, NeuralAmpDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, UnknownAudioEffectDeviceBox, UnknownMidiEffectDeviceBox, VelocityDeviceBox, WaveshaperDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
2
+ export type EffectBox = ArpeggioDeviceBox | PitchDeviceBox | VelocityDeviceBox | ZeitgeistDeviceBox | UnknownMidiEffectDeviceBox | MaximizerDeviceBox | DelayDeviceBox | ReverbDeviceBox | RevampDeviceBox | StereoToolDeviceBox | TidalDeviceBox | ModularDeviceBox | UnknownAudioEffectDeviceBox | CompressorDeviceBox | GateDeviceBox | CrusherDeviceBox | FoldDeviceBox | DattorroReverbDeviceBox | NeuralAmpDeviceBox | WaveshaperDeviceBox;
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,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,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,aAAa,GACpF,gBAAgB,GAAG,aAAa,GAAG,uBAAuB,GAAG,kBAAkB,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,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,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,aAAa,GACpF,gBAAgB,GAAG,aAAa,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,mBAAmB,CAAA"}
@@ -13,6 +13,7 @@ export declare namespace EffectFactories {
13
13
  const Reverb: EffectFactory;
14
14
  const Crusher: EffectFactory;
15
15
  const Fold: EffectFactory;
16
+ const Waveshaper: EffectFactory;
16
17
  const Tidal: EffectFactory;
17
18
  const Revamp: EffectFactory;
18
19
  const NeuralAmp: EffectFactory;
@@ -33,6 +34,7 @@ export declare namespace EffectFactories {
33
34
  Revamp: EffectFactory;
34
35
  Crusher: EffectFactory;
35
36
  Fold: EffectFactory;
37
+ Waveshaper: EffectFactory;
36
38
  Tidal: EffectFactory;
37
39
  NeuralAmp: EffectFactory;
38
40
  Maximizer: EffectFactory;
@@ -49,6 +51,7 @@ export declare namespace EffectFactories {
49
51
  Revamp: EffectFactory;
50
52
  Crusher: EffectFactory;
51
53
  Fold: EffectFactory;
54
+ Waveshaper: EffectFactory;
52
55
  Tidal: EffectFactory;
53
56
  NeuralAmp: EffectFactory;
54
57
  Maximizer: EffectFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"EffectFactories.d.ts","sourceRoot":"","sources":["../src/EffectFactories.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAG7C,yBAAiB,eAAe,CAAC;IACtB,MAAM,QAAQ,EAAE,aAatB,CAAA;IAEM,MAAM,KAAK,EAAE,aAanB,CAAA;IAEM,MAAM,QAAQ,EAAE,aAatB,CAAA;IAEM,MAAM,SAAS,EAAE,aA8BvB,CAAA;IAEM,MAAM,UAAU,EAAE,aAcxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,cAAc,EAAE,aAc5B,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,UAAU,EAAE,aAcxB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,MAAM,EAAE,aAcpB,CAAA;IAEM,MAAM,OAAO,EAAE,aAarB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,MAAM,EAAE,aAapB,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,OAAO,EAAE,aAqDrB,CAAA;IAEM,MAAM,SAAS;;;;;KAKrB,CAAA;IAIM,MAAM,UAAU;;;;;;;;;;;;;KAatB,CAAA;IAIM,MAAM,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAA;IACrB,MAAM,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAA;IACtB,MAAM,WAAW;;;;;;;;;;;;;;;;;KAAgC,CAAA;IACxD,KAAY,cAAc,GAAG,MAAM,OAAO,SAAS,CAAA;IACnD,KAAY,eAAe,GAAG,MAAM,OAAO,UAAU,CAAA;CACxD"}
1
+ {"version":3,"file":"EffectFactories.d.ts","sourceRoot":"","sources":["../src/EffectFactories.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAG7C,yBAAiB,eAAe,CAAC;IACtB,MAAM,QAAQ,EAAE,aAatB,CAAA;IAEM,MAAM,KAAK,EAAE,aAanB,CAAA;IAEM,MAAM,QAAQ,EAAE,aAatB,CAAA;IAEM,MAAM,SAAS,EAAE,aA8BvB,CAAA;IAEM,MAAM,UAAU,EAAE,aAcxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,cAAc,EAAE,aAc5B,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,UAAU,EAAE,aAcxB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,MAAM,EAAE,aAcpB,CAAA;IAEM,MAAM,OAAO,EAAE,aAarB,CAAA;IAEM,MAAM,IAAI,EAAE,aAalB,CAAA;IAEM,MAAM,UAAU,EAAE,aAaxB,CAAA;IAEM,MAAM,KAAK,EAAE,aAcnB,CAAA;IAEM,MAAM,MAAM,EAAE,aAapB,CAAA;IAEM,MAAM,SAAS,EAAE,aAavB,CAAA;IAEM,MAAM,OAAO,EAAE,aAqDrB,CAAA;IAEM,MAAM,SAAS;;;;;KAKrB,CAAA;IAIM,MAAM,UAAU;;;;;;;;;;;;;;KActB,CAAA;IAIM,MAAM,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAA;IACrB,MAAM,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAA;IACtB,MAAM,WAAW;;;;;;;;;;;;;;;;;;KAAgC,CAAA;IACxD,KAAY,cAAc,GAAG,MAAM,OAAO,SAAS,CAAA;IACnD,KAAY,eAAe,GAAG,MAAM,OAAO,UAAU,CAAA;CACxD"}
@@ -1,5 +1,5 @@
1
1
  import { UUID } from "@opendaw/lib-std";
2
- import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, GateDeviceBox, GrooveShuffleBox, MaximizerDeviceBox, ModularAudioInputBox, ModularAudioOutputBox, ModularBox, ModularDeviceBox, ModuleConnectionBox, NeuralAmpDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, VelocityDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
2
+ import { ArpeggioDeviceBox, CompressorDeviceBox, CrusherDeviceBox, DattorroReverbDeviceBox, DelayDeviceBox, FoldDeviceBox, GateDeviceBox, GrooveShuffleBox, MaximizerDeviceBox, ModularAudioInputBox, ModularAudioOutputBox, ModularBox, ModularDeviceBox, ModuleConnectionBox, NeuralAmpDeviceBox, PitchDeviceBox, RevampDeviceBox, ReverbDeviceBox, StereoToolDeviceBox, TidalDeviceBox, VelocityDeviceBox, WaveshaperDeviceBox, ZeitgeistDeviceBox } from "@opendaw/studio-boxes";
3
3
  import { IconSymbol } from "@opendaw/studio-enums";
4
4
  import { DeviceManualUrls } from "@opendaw/studio-adapters";
5
5
  import { EffectParameterDefaults } from "./EffectParameterDefaults";
@@ -186,6 +186,19 @@ export var EffectFactories;
186
186
  box.host.refer(hostField);
187
187
  })
188
188
  };
189
+ EffectFactories.Waveshaper = {
190
+ defaultName: "Waveshaper",
191
+ defaultIcon: IconSymbol.Curve,
192
+ description: "Applies nonlinear waveshaping distortion",
193
+ manualPage: DeviceManualUrls.Waveshaper,
194
+ separatorBefore: false,
195
+ type: "audio",
196
+ create: ({ boxGraph }, hostField, index) => WaveshaperDeviceBox.create(boxGraph, UUID.generate(), (box) => {
197
+ box.label.setValue("Waveshaper");
198
+ box.index.setValue(index);
199
+ box.host.refer(hostField);
200
+ })
201
+ };
189
202
  EffectFactories.Tidal = {
190
203
  defaultName: "Tidal",
191
204
  defaultIcon: IconSymbol.Tidal,
@@ -281,6 +294,7 @@ export var EffectFactories;
281
294
  Revamp: EffectFactories.Revamp,
282
295
  Crusher: EffectFactories.Crusher,
283
296
  Fold: EffectFactories.Fold,
297
+ Waveshaper: EffectFactories.Waveshaper,
284
298
  Tidal: EffectFactories.Tidal,
285
299
  NeuralAmp: EffectFactories.NeuralAmp,
286
300
  Maximizer: EffectFactories.Maximizer
@@ -2,6 +2,7 @@ import { int, Observer, Option, Procedure, Subscription, Terminable, UUID } from
2
2
  import { AudioData } from "@opendaw/lib-dsp";
3
3
  import { Peaks } from "@opendaw/lib-fusion";
4
4
  import { RingBuffer, SampleLoader, SampleLoaderState } from "@opendaw/studio-adapters";
5
+ import { SampleService } from "./samples";
5
6
  export declare class RecordingWorklet extends AudioWorkletNode implements Terminable, SampleLoader {
6
7
  #private;
7
8
  readonly uuid: UUID.Bytes;
@@ -9,6 +10,7 @@ export declare class RecordingWorklet extends AudioWorkletNode implements Termin
9
10
  own<T extends Terminable>(terminable: T): T;
10
11
  limit(count: int): void;
11
12
  set onSaved(callback: Procedure<UUID.Bytes>);
13
+ set sampleService(service: SampleService);
12
14
  setFillLength(value: int): void;
13
15
  get numberOfFrames(): int;
14
16
  get data(): Option<AudioData>;
@@ -1 +1 @@
1
- {"version":3,"file":"RecordingWorklet.d.ts","sourceRoot":"","sources":["../src/RecordingWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,GAAG,EAEH,QAAQ,EACR,MAAM,EAEN,SAAS,EAET,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;gBAc/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM;IAuBhE,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC;IAE3C,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAOvB,IAAI,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAyC;IAEpF,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;CAsCrB"}
1
+ {"version":3,"file":"RecordingWorklet.d.ts","sourceRoot":"","sources":["../src/RecordingWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAY,QAAQ,EAAE,MAAM,EAAS,SAAS,EAAE,YAAY,EAAE,UAAU,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC9H,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAmB,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAGtG,OAAO,EAAC,aAAa,EAAC,MAAM,WAAW,CAAA;AAEvC,qBAAa,gBAAiB,SAAQ,gBAAiB,YAAW,UAAU,EAAE,YAAY;;IAGtF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAkB;gBAe/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM;IAuBhE,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC;IAE3C,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAOvB,IAAI,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAyC;IACpF,IAAI,aAAa,CAAC,OAAO,EAAE,aAAa,EAA8C;IAEtF,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;CAsBrB"}
@@ -1,10 +1,7 @@
1
- import { ByteArrayInput, Notifier, Option, panic, Progress, Terminable, Terminator, UUID } from "@opendaw/lib-std";
2
- import { AudioData, BPMTools } from "@opendaw/lib-dsp";
3
- import { SamplePeaks } from "@opendaw/lib-fusion";
1
+ import { Notifier, Option, panic, Terminable, Terminator, UUID } from "@opendaw/lib-std";
2
+ import { AudioData } from "@opendaw/lib-dsp";
4
3
  import { mergeChunkPlanes, RingBuffer } from "@opendaw/studio-adapters";
5
- import { SampleStorage } from "./samples";
6
4
  import { RenderQuantum } from "./RenderQuantum";
7
- import { Workers } from "./Workers";
8
5
  import { PeaksWriter } from "./PeaksWriter";
9
6
  export class RecordingWorklet extends AudioWorkletNode {
10
7
  #terminator = new Terminator();
@@ -19,6 +16,7 @@ export class RecordingWorklet extends AudioWorkletNode {
19
16
  #limitSamples = Number.POSITIVE_INFINITY;
20
17
  #state = { type: "record" };
21
18
  #onSaved = Option.None;
19
+ #sampleService = Option.None;
22
20
  constructor(context, config) {
23
21
  super(context, "recording-processor", {
24
22
  numberOfInputs: 1,
@@ -48,6 +46,7 @@ export class RecordingWorklet extends AudioWorkletNode {
48
46
  }
49
47
  }
50
48
  set onSaved(callback) { this.#onSaved = Option.wrap(callback); }
49
+ set sampleService(service) { this.#sampleService = Option.wrap(service); }
51
50
  setFillLength(value) { this.#peakWriter.numFrames = value; }
52
51
  get numberOfFrames() { return this.#output.length * RenderQuantum; }
53
52
  get data() { return this.#data; }
@@ -74,31 +73,15 @@ export class RecordingWorklet extends AudioWorkletNode {
74
73
  return panic("No recording data available");
75
74
  }
76
75
  const totalSamples = this.#limitSamples;
77
- const sample_rate = this.context.sampleRate;
78
- const numberOfChannels = this.channelCount;
79
76
  const mergedFrames = mergeChunkPlanes(this.#output, RenderQuantum, this.#output.length * RenderQuantum)
80
77
  .map(frame => frame.slice(-totalSamples));
81
- const audioData = AudioData.create(sample_rate, totalSamples, numberOfChannels);
82
- mergedFrames.forEach((frame, i) => audioData.frames[i].set(frame));
78
+ const audioData = AudioData.create(this.context.sampleRate, totalSamples, this.channelCount);
79
+ mergedFrames.forEach((frame, index) => audioData.frames[index].set(frame));
83
80
  this.#data = Option.wrap(audioData);
84
- const shifts = SamplePeaks.findBestFit(totalSamples);
85
- const peaks = await Workers
86
- .Peak.generateAsync(Progress.Empty, shifts, audioData.frames, totalSamples, numberOfChannels);
87
- this.#peaks = Option.wrap(SamplePeaks.from(new ByteArrayInput(peaks)));
88
- const bpm = BPMTools.detect(audioData.frames[0], sample_rate);
89
- const duration = totalSamples / sample_rate;
90
- const meta = { name: "Recording", bpm, sample_rate, duration, origin: "recording" };
91
- const sample = {
92
- uuid: this.uuid,
93
- audio: audioData,
94
- peaks: peaks,
95
- meta
96
- };
97
- await SampleStorage.get().save(sample);
98
- this.#onSaved.ifSome(callback => callback(this.uuid));
81
+ const sample = await this.#sampleService.unwrap("SampleService not set").importRecording(audioData);
82
+ this.#onSaved.ifSome(callback => callback(UUID.parse(sample.uuid)));
99
83
  this.#setState({ type: "loaded" });
100
84
  this.terminate();
101
- return sample;
102
85
  }
103
86
  #setState(value) {
104
87
  this.#state = value;
@@ -1 +1 @@
1
- {"version":3,"file":"CaptureAudio.d.ts","sourceRoot":"","sources":["../../src/capture/CaptureAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,uBAAuB,EAEvB,MAAM,EAEN,UAAU,EACb,MAAM,kBAAkB,CAAA;AAGzB,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;AAK/C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAE/C,qBAAa,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;;gBAe1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAwCjG,IAAI,YAAY,IAAI,OAAO,CAAwC;IACnE,IAAI,cAAc,IAAI,cAAc,CAA8B;IAClE,IAAI,cAAc,CAAC,KAAK,EAAE,cAAc,EAQvC;IACD,IAAI,MAAM,IAAI,MAAM,CAAsB;IAC1C,IAAI,eAAe,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAA+B;IACnE,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAmD;IACnF,IAAI,MAAM,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAsB;IACxE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,CAEnC;IACD,IAAI,KAAK,IAAI,MAAM,CAAsE;IACzF,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAA+D;IAChG,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAE/C;IACD,IAAI,UAAU,IAAI,MAAM,CAAC,SAAS,CAAC,CAAiD;IACpF,IAAI,qBAAqB,IAAI,MAAM,CAA6C;IAE1E,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BvC,cAAc,IAAI,UAAU;CAsH/B"}
1
+ {"version":3,"file":"CaptureAudio.d.ts","sourceRoot":"","sources":["../../src/capture/CaptureAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,uBAAuB,EAEvB,MAAM,EAEN,UAAU,EACb,MAAM,kBAAkB,CAAA;AAGzB,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;AAK/C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAE/C,qBAAa,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;;gBAe1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAwCjG,IAAI,YAAY,IAAI,OAAO,CAAwC;IACnE,IAAI,cAAc,IAAI,cAAc,CAA8B;IAClE,IAAI,cAAc,CAAC,KAAK,EAAE,cAAc,EAQvC;IACD,IAAI,MAAM,IAAI,MAAM,CAAsB;IAC1C,IAAI,eAAe,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAA+B;IACnE,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAmD;IACnF,IAAI,MAAM,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAsB;IACxE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,CAEnC;IACD,IAAI,KAAK,IAAI,MAAM,CAAsE;IACzF,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAA+D;IAChG,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAE/C;IACD,IAAI,UAAU,IAAI,MAAM,CAAC,SAAS,CAAC,CAAiD;IACpF,IAAI,qBAAqB,IAAI,MAAM,CAA6C;IAE1E,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BvC,cAAc,IAAI,UAAU;CAsH/B"}
@@ -75,7 +75,7 @@ export class CaptureAudio extends Capture {
75
75
  get effectiveChannelCount() { return this.#audioChain?.channelCount ?? 1; }
76
76
  async prepareRecording() {
77
77
  const { project } = this.manager;
78
- const { env: { audioContext, audioWorklets, sampleManager } } = project;
78
+ const { env: { audioContext, audioWorklets, sampleManager, sampleService } } = project;
79
79
  if (isUndefined(audioContext.outputLatency)) {
80
80
  const approved = RuntimeNotifier.approve({
81
81
  headline: "Warning",
@@ -94,6 +94,7 @@ export class CaptureAudio extends Capture {
94
94
  }
95
95
  const { gainNode, channelCount } = audioChain;
96
96
  const recordingWorklet = audioWorklets.createRecording(channelCount, RenderQuantum);
97
+ recordingWorklet.sampleService = sampleService;
97
98
  sampleManager.record(recordingWorklet);
98
99
  gainNode.connect(recordingWorklet);
99
100
  this.#preparedWorklet = recordingWorklet;
@@ -1 +1 @@
1
- {"version":3,"file":"RecordMidi.d.ts","sourceRoot":"","sources":["../../src/capture/RecordMidi.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EAKR,UAAU,EAGb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAa,UAAU,EAA2B,MAAM,0BAA0B,CAAA;AACzF,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,UAAU,CAAC;IACxB,KAAK,iBAAiB,GAAG;QACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAA;IAgBD,MAAM,CAAC,MAAM,KAAK,GAAI,gCAA8B,iBAAiB,KAAG,UAmJvE,CAAA;;CACJ"}
1
+ {"version":3,"file":"RecordMidi.d.ts","sourceRoot":"","sources":["../../src/capture/RecordMidi.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EAKR,UAAU,EAGb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAa,UAAU,EAA2B,MAAM,0BAA0B,CAAA;AACzF,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,UAAU,CAAC;IACxB,KAAK,iBAAiB,GAAG;QACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAA;IAgBD,MAAM,CAAC,MAAM,KAAK,GAAI,gCAA8B,iBAAiB,KAAG,UA2KvE,CAAA;;CACJ"}
@@ -13,6 +13,7 @@ export var RecordMidi;
13
13
  const { loopArea } = timelineBox;
14
14
  const terminator = new Terminator();
15
15
  const activeNotes = new Map();
16
+ const pendingNotes = new Map();
16
17
  const latency = PPQN.secondsToPulses(audioContext.outputLatency ?? 10.0, timelineBox.bpm.getValue());
17
18
  let currentTake = Option.None;
18
19
  let lastPosition = 0;
@@ -79,6 +80,19 @@ export var RecordMidi;
79
80
  }
80
81
  }
81
82
  };
83
+ const flushPendingNotes = (take) => {
84
+ for (const [pitch, velocity] of pendingNotes) {
85
+ const event = NoteEventBox.create(boxGraph, UUID.generate(), box => {
86
+ box.position.setValue(0);
87
+ box.duration.setValue(MIN_NOTE_DURATION);
88
+ box.pitch.setValue(pitch);
89
+ box.velocity.setValue(velocity);
90
+ box.events.refer(take.collection.events);
91
+ });
92
+ activeNotes.set(pitch, { event, take, creationOffset: positionOffset });
93
+ }
94
+ pendingNotes.clear();
95
+ };
82
96
  const startNewTake = (position) => {
83
97
  const previousTrack = currentTake.mapOr(take => take.trackBox, null);
84
98
  currentTake = Option.wrap(createTakeRegion(position, previousTrack));
@@ -107,7 +121,9 @@ export var RecordMidi;
107
121
  if (currentTake.isEmpty()) {
108
122
  editing.modify(() => {
109
123
  const pos = quantizeFloor(currentPosition, beats);
110
- currentTake = Option.wrap(createTakeRegion(pos, null));
124
+ const take = createTakeRegion(pos, null);
125
+ currentTake = Option.wrap(take);
126
+ flushPendingNotes(take);
111
127
  }, false);
112
128
  }
113
129
  currentTake.ifSome(({ regionBox, collection }) => {
@@ -140,6 +156,7 @@ export var RecordMidi;
140
156
  if (NoteSignal.isOn(signal)) {
141
157
  const { pitch, velocity } = signal;
142
158
  if (currentTake.isEmpty()) {
159
+ pendingNotes.set(pitch, velocity);
143
160
  return;
144
161
  }
145
162
  const take = currentTake.unwrap();
@@ -160,7 +177,12 @@ export var RecordMidi;
160
177
  }, false);
161
178
  }
162
179
  else if (NoteSignal.isOff(signal)) {
163
- activeNotes.delete(signal.pitch);
180
+ if (pendingNotes.has(signal.pitch)) {
181
+ pendingNotes.delete(signal.pitch);
182
+ }
183
+ else {
184
+ activeNotes.delete(signal.pitch);
185
+ }
164
186
  }
165
187
  }));
166
188
  return terminator;
@@ -1,2 +1,2 @@
1
- var m=n=>n!=null;var b=(n,e="asDefined failed")=>n??p(S(e));var S=n=>n instanceof Function?n():n;var U=n=>{throw new Error(`Unhandled ${n}`)},p=n=>{throw typeof n=="string"?new Error(n):n},j=(n,e)=>n?void 0:p(S(e));var H=n=>new Proxy({},{get(){return p(n)}});var k=class{value;status="success";constructor(e){this.value=e}error=H("Cannot access error when succeeded")},C=class{error;status="failure";constructor(e){this.error=e}value=H("Cannot access value when failed")},G=n=>{try{return new k(n())}catch(e){return new C(e)}};var q=()=>{};var $;(function(n){n[n.Ascending=1]="Ascending",n[n.Descending=-1]="Descending"})($||($={}));var v=class{static#e=Object.freeze(new Array(0));static empty=()=>this.#e;static clear=e=>{e.length=0};static replace=(e,t)=>{e.length=0,e.push(...t)};static consume=(e,t)=>{for(let r=0;r<e.length;)t(e[r])?e.splice(r,1):r++};static peekFirst=e=>e.at(0)??null;static peekLast=e=>e.at(-1)??null;static getFirst=(e,t)=>b(e.at(0),t);static getLast=(e,t)=>b(e.at(-1),t);static getPrev=(e,t)=>{let r=e.indexOf(t);return r===-1?p(`${t} not found in ${e}`):b(e.at((r-1)%e.length),"Internal Error")};static getNext=(e,t)=>{let r=e.indexOf(t);return r===-1?p(`${t} not found in ${e}`):b(e.at((r+1)%e.length),"Internal Error")};static removeLast=(e,t)=>b(e.pop(),t);static create=(e,t)=>{let r=new Array(t);for(let s=0;s<t;s++)r[s]=e(s);return r};static equals=(e,t)=>{if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0};static satisfy=(e,t)=>{if(e.length<2)return!0;let r=e[0];for(let s=1;s<e.length;s++)if(!t(r,e[s]))return!1;return!0};static remove=(e,t)=>{let r=e.indexOf(t);if(r===-1)return p(`${t} not found in ${e}`);e.splice(r,1)};static removeIf=(e,t)=>{for(let r=e.length-1;r>=0;r--)t(e[r])&&e.splice(r,1)};static removeOpt=(e,t)=>{let r=e.indexOf(t);return r===-1?!1:(e.splice(r,1),!0)};static hasDuplicates=e=>new Set(e).size<e.length;static removeDuplicates=e=>{let t=0,r=new Set;for(let s of e)r.has(s)||(r.add(s),e[t++]=s);return e.length=t,e};static removeDuplicateKeys=(e,t)=>{let r=0,s=new Set;for(let i of e){let c=i[t];s.has(c)||(s.add(c),e[r++]=i)}return e.length=r,e};static subtract(e,t,r){return e.filter(s=>!t.some(i=>r(s,i)))}static intersect(e,t,r){return e.filter(s=>t.some(i=>r(s,i)))}static merge(e,t,r){return[...e.filter(s=>!t.some(i=>r(s,i))),...t]}static*iterate(e){for(let t=0;t<e.length;t++)yield e[t]}static*iterateReverse(e){for(let t=e.length-1;t>=0;t--)yield e[t]}static*iterateStateFull(e){let t=e.length-1;for(let r=0;r<=t;r++)yield{value:e[r],isFirst:r===0,isLast:r===t}}static*iterateAdjacent(e){if(!(e.length<=1))for(let t=1,r=e[0];t<e.length;t++){let s=e[t];yield[r,s],r=s}}static isSorted(e,t=$.Ascending){if(e.length<2)return!0;let r=e[0];for(let s=1;s<e.length;s++){let i=e[s];if(Math.sign(r-i)===t)return!1;r=i}return!0}static toRecord(e,t){return e.reduce((r,s)=>(r[t(s)]=s,r),{})}static concatArrayBuffers(e,t){let r=new ArrayBuffer(e.byteLength+t.byteLength),s=new Uint8Array(r);return s.set(new Uint8Array(e),0),s.set(new Uint8Array(t),e.byteLength),r}};var E;(function(n){n.wrap=t=>m(t)?new e(t):n.None,n.from=t=>n.wrap(t()),n.tryCatch=t=>{try{return n.wrap(t())}catch{return n.None}},n.execute=(t,...r)=>n.wrap(t?.apply(null,r)),n.async=t=>t.then(r=>n.wrap(r),()=>n.None);class e{#e;constructor(r){this.#e=b(r)}unwrap(){return this.#e}unwrapOrElse(r){return this.#e}unwrapOrNull(){return this.#e}unwrapOrUndefined(){return this.#e}contains(r){return r===this.#e}match(r){return r.some(this.#e)}ifSome(r){return r(this.#e)}ifAbsent(r){}isEmpty(){return!1}nonEmpty(){return!0}map(r){return n.wrap(r(this.#e))}mapOr(r,s){return r(this.#e)}flatMap(r){return r(this.#e)}equals(r){return this.unwrapOrNull()===r.unwrapOrNull()}assert(r){return this}toString(){return`{Option.Some(${this.#e})}`}get[Symbol.toStringTag](){return this.toString()}}n.Some=e,n.None=new class{unwrap=t=>p(m(t)?S(t):"unwrap failed");unwrapOrElse=t=>S(t);unwrapOrNull=()=>null;unwrapOrUndefined=()=>{};contains=t=>!1;match=t=>t.none();ifSome=t=>{};ifAbsent=t=>t(void 0);isEmpty=()=>!0;nonEmpty=()=>!1;map=t=>n.None;mapOr=(t,r)=>S(r);flatMap=t=>n.None;equals=t=>t.isEmpty();assert=t=>p(S(t)??"assert failed");toString=()=>"{Option.None}";get[Symbol.toStringTag](){return this.toString()}}})(E||(E={}));var I=class{static*empty(){}static one(e){return[e]}static count(e){let t=0;for(let r of e)t++;return t}static some(e,t){for(let r of e)if(t(r))return!0;return!1}static every(e,t){for(let r of e)if(!t(r))return!1;return!0}static reduce(e,t,r){let s=r,i=0;for(let c of e)s=t(s,c,i++);return s}static includes(e,t){for(let r of e)if(r===t)return!0;return!1}static forEach(e,t){for(let r of e)t(r)}static*map(e,t){let r=0;for(let s of e)yield t(s,r++)}static*take(e,t){let r=0;for(let s of e){if(r++>=t)return;yield s}}static filter(e,t){let r=[];for(let s of e)t(s)&&r.push(s);return r}static filterMap(e,t){let r=[];for(let s of e){let i=t(s);m(i)&&r.push(i)}return r}static reverse(e){let t=[];for(let r of e)t.push(r);return t.reverse()}static*pairWise(e){let t=e[Symbol.iterator](),{done:r,value:s}=t.next(),i=s;if(r!==!0)for(;;){let{done:c,value:o}=t.next();if(c===!0){yield[i,null];return}yield[i,o],i=o}}};var z=Object.freeze({Empty:{terminate:q},create:n=>({terminate:n}),many:(...n)=>({terminate:()=>{for(;n.length>0;)n.pop().terminate()}})});var O=class{static subscribeMany(e,...t){return z.many(...t.map(r=>r.subscribe(()=>e(r))))}#e=new Set;subscribe(e){return this.#e.add(e),{terminate:()=>this.#e.delete(e)}}isEmpty(){return this.#e.size===0}notify(e){this.#e.forEach(t=>t(e))}observers(){return this.#e}terminate(){this.#e.clear()}};var _=class n{static createEstimator=()=>{let e=performance.now(),t=n.millis(Number.POSITIVE_INFINITY),r=0;return s=>{if(s===0)return n.POSITIVE_INFINITY;if(s>=1)return n.millis(0);let i=performance.now()-e;return i>r*1e3&&(t=n.millis(i/s-i),r++),t}};static POSITIVE_INFINITY=new n(Number.POSITIVE_INFINITY);static millis=e=>new n(e);static seconds=e=>new n(e*n.#e);static minutes=e=>new n(e*n.#t);static hours=e=>new n(e*n.#s);static days=e=>new n(e*n.#o);static toHHMMSS=e=>((e/3600|0)+100).toString().slice(1)+":"+((e/60|0)%60+100).toString().slice(1)+":"+(e%60+100).toString().slice(1);static#e=1e3;static#t=6e4;static#s=36e5;static#o=864e5;#r;constructor(e){this.#r=e}millis(){return this.#r}absSeconds(){return Math.abs(this.#r)/n.#e}absMinutes(){return Math.abs(this.#r)/n.#t}absHours(){return Math.abs(this.#r)/n.#s}absDays(){return Math.abs(this.#r)/n.#o}split(){return{d:Math.floor(this.absDays()),h:Math.floor(this.absHours())%24,m:Math.floor(this.absMinutes())%60,s:Math.floor(this.absSeconds())%60}}isNow(){return this.#r===0}isPast(){return this.#r<0}isFuture(){return this.#r>0}toUnitString(){let e,t,r=Math.floor(Math.abs(this.#r)/1e3),s=Math.floor(r/60),i=Math.floor(s/60),c=Math.floor(i/24);return r<60?(e=r,t="second"):s<60?(e=s,t="minute"):i<24?(e=i,t="hour"):(e=c,t="day"),new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"}).format(e*Math.sign(this.#r),t)}toString(){if(isNaN(this.#r))return"NaN";if(!isFinite(this.#r))return"\u221E";let{d:e,h:t,m:r,s}=this.split();return e>0?[n.#n("d",e),n.#n("h",t),n.#n("m",r),n.#n("s",s)].join(", "):t>0?[n.#n("h",t),n.#n("m",r),n.#n("s",s)].join(", "):r>0?[n.#n("m",r),n.#n("s",s)].join(", "):s>0?n.#n("s",s):"now"}static#n=(e,t)=>{switch(e){case"d":return`${t} ${t<2?"day":"days"}`;case"h":return`${t} ${t<2?"hour":"hours"}`;case"m":return`${t} ${t<2?"minute":"minutes"}`;case"s":return`${t} ${t<2?"second":"seconds"}`;default:return U(e)}}};var F;(function(n){class e{value;constructor(o){this.value=o}}n.Transfer=e,n.makeTransferable=c=>new e(c),n.sender=(c,o)=>o(new s(c)),n.executor=(c,o)=>new i(c,o);let t=c=>{let o=[];for(let a of c)a instanceof e?o.push(a.value):(a instanceof MessagePort||typeof ImageBitmap<"u"&&a instanceof ImageBitmap||typeof OffscreenCanvas<"u"&&a instanceof OffscreenCanvas)&&o.push(a);return o},r=c=>c instanceof e?c.value:c;class s{#e;#t=new Map;#s;#o=0;constructor(o){this.#e=o,this.#s=o.subscribe(this.#r)}terminate(){this.#s.terminate()}dispatchAndForget=(o,...a)=>{let l=t(a);this.#e.send({type:"send",returnId:!1,func:o.name,args:Array.from(I.map(a,u=>({value:r(u)})))},l)};dispatchAndReturn=(o,...a)=>new Promise((l,u)=>{let w=I.reduce(a,(h,d,x)=>(typeof d=="function"&&h.push([x,d]),h),[]);this.#t.set(this.#o,{executorTuple:{resolve:l,reject:u},callbacks:new Map(w)});let f=t(a);this.#e.send({type:"send",returnId:this.#o,func:o.name,args:Array.from(I.map(a,(h,d)=>typeof h=="function"?{callback:d}:{value:r(h)}))},f),this.#o++});#r=o=>{let a=this.#t.get(o.returnId);m(a)?o.type==="resolve"?(a.executorTuple.resolve(o.resolve),this.#t.delete(o.returnId)):o.type==="reject"?(a.executorTuple.reject(o.reject),this.#t.delete(o.returnId)):o.type==="callback"&&a.callbacks?.get(o.funcAt).apply(this,o.args):p(`Promise has already been resolved. ${JSON.stringify(o)}`)}}class i{#e;#t;#s;constructor(o,a){this.#e=o,this.#t=a,this.#s=o.subscribe(this.#o)}terminate(){this.#s.terminate()}#o=o=>{j(o.type==="send",()=>"Message type must be 'send'");let a=Object.getPrototypeOf(this.#t)===Object.getPrototypeOf({})?this.#t:Object.getPrototypeOf(this.#t),l=b(a[o.func],`${o.func.toString()} does not exists on ${this.#t}`),u=o.returnId;if(u===!1)l.apply(this.#t,o.args.map(w=>"value"in w?w.value:p(`${o.func.toString()} has no promise.`)));else try{l.apply(this.#t,o.args.map(f=>"callback"in f?(...h)=>this.#i(u,f.callback,h):f.value)).then(f=>{try{this.#r(u,f)}catch(h){this.#n(u,h)}},f=>this.#n(u,f))}catch(w){this.#n(u,w)}};#r=(o,a)=>this.#e.send({type:"resolve",returnId:o,resolve:a});#n=(o,a)=>this.#e.send({type:"reject",returnId:o,reject:a});#i=(o,a,l)=>this.#e.send({type:"callback",returnId:o,funcAt:a,args:l})}n.Executor=i})(F||(F={}));var V={for:n=>new R(n)},ne=[],R=class{#e;#t=new O;constructor(e){if(this.#e=e,m(e.onmessage)||m(e.onmessageerror))throw console.error(e),new Error(`${e} is already wrapped.`);e.onmessage=t=>this.#t.notify(t.data),e.onmessageerror=t=>{throw new Error(t.type)}}send(e,t){this.#e.postMessage(e,t??ne)}channel(e){return new D(this,e)}subscribe(e){return this.#t.subscribe(e)}terminate(){this.#t.terminate(),this.#e.onmessage=null,this.#e.onmessageerror=null}},D=class n{#e;#t;#s=new O;#o;constructor(e,t){this.#e=e,this.#t=t,this.#o=e.subscribe(r=>{"__id__"in r&&r.__id__==="42"&&"message"in r&&"channel"in r&&r.channel===t&&this.#s.notify(r.message)})}send(e,t){this.#e.send({__id__:"42",channel:this.#t,message:e},t)}channel(e){return new n(this,e)}subscribe(e){return this.#s.subscribe(e)}terminate(){this.#o.terminate(),this.#s.terminate()}};var A;(function(n){n.frame=()=>new Promise(e=>requestAnimationFrame(()=>e())),n.frames=e=>new Promise(t=>{let r=e,s=()=>{--r<=0?t():requestAnimationFrame(s)};requestAnimationFrame(s)}),n.timeSpan=(e,...t)=>new Promise(r=>setTimeout(r,e.millis(),...t)),n.event=(e,t)=>new Promise(r=>e.addEventListener(t,r,{once:!0})),n.observable=e=>new Promise(t=>{let r=e.subscribe(()=>{r.terminate(),t()})}),n.complete=e=>new Promise((t,r)=>{let s=setInterval(()=>{let{status:i,value:c,error:o}=G(()=>e.next());if(i==="success"){let{done:a,value:l}=c;a&&(clearInterval(s),t(l))}else clearInterval(s),r(o)},0)})})(A||(A={}));var L=(n,e)=>Math.floor(3840/e)*n,Y=(n,e=4,t=4)=>{let r=L(1,t),s=Math.floor(n/r),i=Math.floor(s/e),o=(Math.floor(n)-L(i*e,t))%r,a=Math.floor(o/240),l=o%240;return{bars:i,beats:s-i*e,semiquavers:a,ticks:l}},K=(n,e)=>n*e/60*960,Z=(n,e)=>n*60/960/e,se=(n,e)=>e*60/960/n,oe=(n,e,t)=>K(n/t,e),ie=(n,e,t)=>Z(n,e)*t,J={Bar:3840,Quarter:960,SemiQuaver:240,fromSignature:L,toParts:Y,secondsToPulses:K,pulsesToSeconds:Z,secondsToBpm:se,samplesToPulses:oe,pulsesToSamples:ie,toString:(n,e=4,t=4)=>{let{bars:r,beats:s,semiquavers:i,ticks:c}=Y(n|0,e,t);return`${r+1}.${s+1}.${i+1}:${c}`}};var M=128,Fe=J.fromSignature(1,48);var ae=Math.log(10)/20;var X=n=>Math.exp(n*ae);var g=globalThis,B=class{port;constructor(){this.port=g.__workletPort__}process(e,t){return!1}},ee=n=>{g.sampleRate=n.sampleRate,g.currentFrame=0,g.currentTime=0,g.AudioWorkletProcessor=B,g.registerProcessor=(e,t)=>{g.__registeredProcessors__=g.__registeredProcessors__||{},g.__registeredProcessors__[e]=t}},Q=(n,e)=>{g.currentFrame=n,g.currentTime=n/e};var te=globalThis,N=E.None;F.executor(V.for(self).channel("offline-engine"),{async initialize(n,e){ee({sampleRate:e.sampleRate}),te.__workletPort__=n,await import(e.processorsUrl);let t=te.__registeredProcessors__["engine-processor"];N=E.wrap({processor:new t({processorOptions:{syncStreamBuffer:e.syncStreamBuffer,controlFlagsBuffer:e.controlFlagsBuffer,hrClockBuffer:new SharedArrayBuffer(32),project:e.project,exportConfiguration:e.exportConfiguration}}),sampleRate:e.sampleRate,numberOfChannels:e.numberOfChannels,totalFrames:0,running:!1})},async step(n){let e=N.unwrap(),t=v.create(()=>new Float32Array(n),e.numberOfChannels),r=v.create(()=>new Float32Array(M),e.numberOfChannels),s=0;for(;s<n;){let i=[r];Q(e.totalFrames,e.sampleRate),e.processor.process([[]],i),e.totalFrames+=M;let c=n-s,o=Math.min(c,M);for(let a=0;a<e.numberOfChannels;a++)t[a].set(i[0][a].subarray(0,o),s);s+=o}return t},async render(n){let e=N.unwrap(),{silenceThresholdDb:t,silenceDurationSeconds:r,maxDurationSeconds:s}=n,i=X(t??-72),c=Math.ceil((r??10)*e.sampleRate),o=m(s)?Math.ceil(s*e.sampleRate):1/0,a=v.create(()=>[],e.numberOfChannels),l=0,u=!1,w=0;for(e.running=!0,await A.timeSpan(_.seconds(0));e.running&&e.totalFrames<o;){let d=[v.create(()=>new Float32Array(M),e.numberOfChannels)];Q(e.totalFrames,e.sampleRate);let x=e.processor.process([[]],d),P=0;for(let y of d[0])for(let re of y){let W=Math.abs(re);W>P&&(P=W)}let T=P<=i;if(P>i&&(u=!0),T&&u){if(l+=M,l>=c)break}else l=0;for(let y=0;y<e.numberOfChannels;y++)a[y].push(d[0][y].slice());if(e.totalFrames+=M,!x)break;e.totalFrames-w>=e.sampleRate&&(w=e.totalFrames,await new Promise(y=>setTimeout(y,0)))}let f=e.totalFrames-l+Math.min(e.sampleRate/4,l);return v.create(h=>{let d=new Float32Array(f),x=0;for(let P of a[h]){if(x>=f)break;let T=Math.min(P.length,f-x);d.set(P.subarray(0,T),x),x+=T}return d},e.numberOfChannels)},stop(){N.unwrap().running=!1}});
1
+ var m=n=>n!=null;var w=(n,e="asDefined failed")=>n??p(S(e));var S=n=>n instanceof Function?n():n;var U=n=>{throw new Error(`Unhandled ${n}`)},p=n=>{throw typeof n=="string"?new Error(n):n},j=(n,e)=>n?void 0:p(S(e));var H=n=>new Proxy({},{get(){return p(n)}});var k=class{value;status="success";constructor(e){this.value=e}error=H("Cannot access error when succeeded")},$=class{error;status="failure";constructor(e){this.error=e}value=H("Cannot access value when failed")},G=n=>{try{return new k(n())}catch(e){return new $(e)}};var q=()=>{};var C;(function(n){n[n.Ascending=1]="Ascending",n[n.Descending=-1]="Descending"})(C||(C={}));var v=class{static#e=Object.freeze(new Array(0));static empty=()=>this.#e;static clear=e=>{e.length=0};static replace=(e,t)=>{e.length=0,e.push(...t)};static consume=(e,t)=>{for(let r=0;r<e.length;)t(e[r])?e.splice(r,1):r++};static peekFirst=e=>e.at(0)??null;static peekLast=e=>e.at(-1)??null;static getFirst=(e,t)=>w(e.at(0),t);static getLast=(e,t)=>w(e.at(-1),t);static getPrev=(e,t)=>{let r=e.indexOf(t);return r===-1?p(`${t} not found in ${e}`):w(e.at((r-1)%e.length),"Internal Error")};static getNext=(e,t)=>{let r=e.indexOf(t);return r===-1?p(`${t} not found in ${e}`):w(e.at((r+1)%e.length),"Internal Error")};static removeLast=(e,t)=>w(e.pop(),t);static create=(e,t)=>{let r=new Array(t);for(let s=0;s<t;s++)r[s]=e(s);return r};static equals=(e,t)=>{if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0};static satisfy=(e,t)=>{if(e.length<2)return!0;let r=e[0];for(let s=1;s<e.length;s++)if(!t(r,e[s]))return!1;return!0};static remove=(e,t)=>{let r=e.indexOf(t);if(r===-1)return p(`${t} not found in ${e}`);e.splice(r,1)};static removeIf=(e,t)=>{for(let r=e.length-1;r>=0;r--)t(e[r])&&e.splice(r,1)};static removeOpt=(e,t)=>{let r=e.indexOf(t);return r===-1?!1:(e.splice(r,1),!0)};static hasDuplicates=e=>new Set(e).size<e.length;static removeDuplicates=e=>{let t=0,r=new Set;for(let s of e)r.has(s)||(r.add(s),e[t++]=s);return e.length=t,e};static removeDuplicateKeys=(e,t)=>{let r=0,s=new Set;for(let i of e){let c=i[t];s.has(c)||(s.add(c),e[r++]=i)}return e.length=r,e};static subtract(e,t,r){return e.filter(s=>!t.some(i=>r(s,i)))}static intersect(e,t,r){return e.filter(s=>t.some(i=>r(s,i)))}static merge(e,t,r){return[...e.filter(s=>!t.some(i=>r(s,i))),...t]}static*iterate(e){for(let t=0;t<e.length;t++)yield e[t]}static*iterateReverse(e){for(let t=e.length-1;t>=0;t--)yield e[t]}static*iterateStateFull(e){let t=e.length-1;for(let r=0;r<=t;r++)yield{value:e[r],isFirst:r===0,isLast:r===t}}static*iterateAdjacent(e){if(!(e.length<=1))for(let t=1,r=e[0];t<e.length;t++){let s=e[t];yield[r,s],r=s}}static isSorted(e,t=C.Ascending){if(e.length<2)return!0;let r=e[0];for(let s=1;s<e.length;s++){let i=e[s];if(Math.sign(r-i)===t)return!1;r=i}return!0}static toRecord(e,t){return e.reduce((r,s)=>(r[t(s)]=s,r),{})}static concatArrayBuffers(e,t){let r=new ArrayBuffer(e.byteLength+t.byteLength),s=new Uint8Array(r);return s.set(new Uint8Array(e),0),s.set(new Uint8Array(t),e.byteLength),r}};var E;(function(n){n.wrap=t=>m(t)?new e(t):n.None,n.from=t=>n.wrap(t()),n.tryCatch=t=>{try{return n.wrap(t())}catch{return n.None}},n.execute=(t,...r)=>n.wrap(t?.apply(null,r)),n.async=t=>t.then(r=>n.wrap(r),()=>n.None);class e{#e;constructor(r){this.#e=w(r)}unwrap(){return this.#e}unwrapOrElse(r){return this.#e}unwrapOrNull(){return this.#e}unwrapOrUndefined(){return this.#e}contains(r){return r===this.#e}match(r){return r.some(this.#e)}ifSome(r){return r(this.#e)}ifAbsent(r){}isEmpty(){return!1}nonEmpty(){return!0}map(r){return n.wrap(r(this.#e))}mapOr(r,s){return r(this.#e)}flatMap(r){return r(this.#e)}equals(r){return this.unwrapOrNull()===r.unwrapOrNull()}assert(r){return this}toString(){return`{Option.Some(${this.#e})}`}get[Symbol.toStringTag](){return this.toString()}}n.Some=e,n.None=new class{unwrap=t=>p(m(t)?S(t):"unwrap failed");unwrapOrElse=t=>S(t);unwrapOrNull=()=>null;unwrapOrUndefined=()=>{};contains=t=>!1;match=t=>t.none();ifSome=t=>{};ifAbsent=t=>t(void 0);isEmpty=()=>!0;nonEmpty=()=>!1;map=t=>n.None;mapOr=(t,r)=>S(r);flatMap=t=>n.None;equals=t=>t.isEmpty();assert=t=>p(S(t)??"assert failed");toString=()=>"{Option.None}";get[Symbol.toStringTag](){return this.toString()}}})(E||(E={}));var I=class{static*empty(){}static one(e){return[e]}static count(e){let t=0;for(let r of e)t++;return t}static some(e,t){for(let r of e)if(t(r))return!0;return!1}static every(e,t){for(let r of e)if(!t(r))return!1;return!0}static reduce(e,t,r){let s=r,i=0;for(let c of e)s=t(s,c,i++);return s}static includes(e,t){for(let r of e)if(r===t)return!0;return!1}static forEach(e,t){for(let r of e)t(r)}static*map(e,t){let r=0;for(let s of e)yield t(s,r++)}static*take(e,t){let r=0;for(let s of e){if(r++>=t)return;yield s}}static filter(e,t){let r=[];for(let s of e)t(s)&&r.push(s);return r}static filterMap(e,t){let r=[];for(let s of e){let i=t(s);m(i)&&r.push(i)}return r}static reverse(e){let t=[];for(let r of e)t.push(r);return t.reverse()}static*pairWise(e){let t=e[Symbol.iterator](),{done:r,value:s}=t.next(),i=s;if(r!==!0)for(;;){let{done:c,value:o}=t.next();if(c===!0){yield[i,null];return}yield[i,o],i=o}}};var z=Object.freeze({Empty:{terminate:q},create:n=>({terminate:n}),many:(...n)=>({terminate:()=>{for(;n.length>0;)n.pop().terminate()}})});var O=class{static subscribeMany(e,...t){return z.many(...t.map(r=>r.subscribe(()=>e(r))))}#e=new Set;subscribe(e){return this.#e.add(e),{terminate:()=>this.#e.delete(e)}}isEmpty(){return this.#e.size===0}notify(e){this.#e.forEach(t=>t(e))}observers(){return this.#e}terminate(){this.#e.clear()}};var _=class n{static createEstimator=()=>{let e=performance.now(),t=n.millis(Number.POSITIVE_INFINITY),r=0;return s=>{if(s===0)return n.POSITIVE_INFINITY;if(s>=1)return n.millis(0);let i=performance.now()-e;return i>r*1e3&&(t=n.millis(i/s-i),r++),t}};static POSITIVE_INFINITY=new n(Number.POSITIVE_INFINITY);static millis=e=>new n(e);static seconds=e=>new n(e*n.#e);static minutes=e=>new n(e*n.#t);static hours=e=>new n(e*n.#s);static days=e=>new n(e*n.#o);static toHHMMSS=e=>((e/3600|0)+100).toString().slice(1)+":"+((e/60|0)%60+100).toString().slice(1)+":"+(e%60+100).toString().slice(1);static#e=1e3;static#t=6e4;static#s=36e5;static#o=864e5;#r;constructor(e){this.#r=e}millis(){return this.#r}absSeconds(){return Math.abs(this.#r)/n.#e}absMinutes(){return Math.abs(this.#r)/n.#t}absHours(){return Math.abs(this.#r)/n.#s}absDays(){return Math.abs(this.#r)/n.#o}split(){return{d:Math.floor(this.absDays()),h:Math.floor(this.absHours())%24,m:Math.floor(this.absMinutes())%60,s:Math.floor(this.absSeconds())%60}}isNow(){return this.#r===0}isPast(){return this.#r<0}isFuture(){return this.#r>0}toUnitString(){let e,t,r=Math.floor(Math.abs(this.#r)/1e3),s=Math.floor(r/60),i=Math.floor(s/60),c=Math.floor(i/24);return r<60?(e=r,t="second"):s<60?(e=s,t="minute"):i<24?(e=i,t="hour"):(e=c,t="day"),new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"}).format(e*Math.sign(this.#r),t)}toString(){if(isNaN(this.#r))return"NaN";if(!isFinite(this.#r))return"\u221E";let{d:e,h:t,m:r,s}=this.split();return e>0?[n.#n("d",e),n.#n("h",t),n.#n("m",r),n.#n("s",s)].join(", "):t>0?[n.#n("h",t),n.#n("m",r),n.#n("s",s)].join(", "):r>0?[n.#n("m",r),n.#n("s",s)].join(", "):s>0?n.#n("s",s):"now"}static#n=(e,t)=>{switch(e){case"d":return`${t} ${t<2?"day":"days"}`;case"h":return`${t} ${t<2?"hour":"hours"}`;case"m":return`${t} ${t<2?"minute":"minutes"}`;case"s":return`${t} ${t<2?"second":"seconds"}`;default:return U(e)}}};var F;(function(n){class e{value;constructor(o){this.value=o}}n.Transfer=e,n.makeTransferable=c=>new e(c),n.sender=(c,o)=>o(new s(c)),n.executor=(c,o)=>new i(c,o);let t=c=>{let o=[];for(let a of c)a instanceof e?o.push(a.value):(a instanceof MessagePort||typeof ImageBitmap<"u"&&a instanceof ImageBitmap||typeof OffscreenCanvas<"u"&&a instanceof OffscreenCanvas)&&o.push(a);return o},r=c=>c instanceof e?c.value:c;class s{#e;#t=new Map;#s;#o=0;constructor(o){this.#e=o,this.#s=o.subscribe(this.#r)}terminate(){this.#s.terminate()}dispatchAndForget=(o,...a)=>{let l=t(a);this.#e.send({type:"send",returnId:!1,func:o.name,args:Array.from(I.map(a,u=>({value:r(u)})))},l)};dispatchAndReturn=(o,...a)=>new Promise((l,u)=>{let b=I.reduce(a,(h,d,x)=>(typeof d=="function"&&h.push([x,d]),h),[]);this.#t.set(this.#o,{executorTuple:{resolve:l,reject:u},callbacks:new Map(b)});let f=t(a);this.#e.send({type:"send",returnId:this.#o,func:o.name,args:Array.from(I.map(a,(h,d)=>typeof h=="function"?{callback:d}:{value:r(h)}))},f),this.#o++});#r=o=>{let a=this.#t.get(o.returnId);m(a)?o.type==="resolve"?(a.executorTuple.resolve(o.resolve),this.#t.delete(o.returnId)):o.type==="reject"?(a.executorTuple.reject(o.reject),this.#t.delete(o.returnId)):o.type==="callback"&&a.callbacks?.get(o.funcAt).apply(this,o.args):p(`Promise has already been resolved. ${JSON.stringify(o)}`)}}class i{#e;#t;#s;constructor(o,a){this.#e=o,this.#t=a,this.#s=o.subscribe(this.#o)}terminate(){this.#s.terminate()}#o=o=>{j(o.type==="send",()=>"Message type must be 'send'");let a=Object.getPrototypeOf(this.#t)===Object.getPrototypeOf({})?this.#t:Object.getPrototypeOf(this.#t),l=w(a[o.func],`${o.func.toString()} does not exists on ${this.#t}`),u=o.returnId;if(u===!1)l.apply(this.#t,o.args.map(b=>"value"in b?b.value:p(`${o.func.toString()} has no promise.`)));else try{l.apply(this.#t,o.args.map(f=>"callback"in f?(...h)=>this.#i(u,f.callback,h):f.value)).then(f=>{try{this.#r(u,f)}catch(h){this.#n(u,h)}},f=>this.#n(u,f))}catch(b){this.#n(u,b)}};#r=(o,a)=>this.#e.send({type:"resolve",returnId:o,resolve:a});#n=(o,a)=>this.#e.send({type:"reject",returnId:o,reject:a});#i=(o,a,l)=>this.#e.send({type:"callback",returnId:o,funcAt:a,args:l})}n.Executor=i})(F||(F={}));var V={for:n=>new R(n)},ne=[],R=class{#e;#t=new O;constructor(e){if(this.#e=e,m(e.onmessage)||m(e.onmessageerror))throw console.error(e),new Error(`${e} is already wrapped.`);e.onmessage=t=>this.#t.notify(t.data),e.onmessageerror=t=>{throw new Error(t.type)}}send(e,t){this.#e.postMessage(e,t??ne)}channel(e){return new D(this,e)}subscribe(e){return this.#t.subscribe(e)}terminate(){this.#t.terminate(),this.#e.onmessage=null,this.#e.onmessageerror=null}},D=class n{#e;#t;#s=new O;#o;constructor(e,t){this.#e=e,this.#t=t,this.#o=e.subscribe(r=>{"__id__"in r&&r.__id__==="42"&&"message"in r&&"channel"in r&&r.channel===t&&this.#s.notify(r.message)})}send(e,t){this.#e.send({__id__:"42",channel:this.#t,message:e},t)}channel(e){return new n(this,e)}subscribe(e){return this.#s.subscribe(e)}terminate(){this.#o.terminate(),this.#s.terminate()}};var A;(function(n){n.frame=()=>new Promise(e=>requestAnimationFrame(()=>e())),n.frames=e=>new Promise(t=>{let r=e,s=()=>{--r<=0?t():requestAnimationFrame(s)};requestAnimationFrame(s)}),n.timeSpan=(e,...t)=>new Promise(r=>setTimeout(r,e.millis(),...t)),n.event=(e,t)=>new Promise(r=>e.addEventListener(t,r,{once:!0})),n.observable=e=>new Promise(t=>{let r=e.subscribe(()=>{r.terminate(),t()})}),n.complete=e=>new Promise((t,r)=>{let s=setInterval(()=>{let{status:i,value:c,error:o}=G(()=>e.next());if(i==="success"){let{done:a,value:l}=c;a&&(clearInterval(s),t(l))}else clearInterval(s),r(o)},0)})})(A||(A={}));var L=(n,e)=>Math.floor(3840/e)*n,Y=(n,e=4,t=4)=>{let r=L(1,t),s=Math.floor(n/r),i=Math.floor(s/e),o=(Math.floor(n)-L(i*e,t))%r,a=Math.floor(o/240),l=o%240;return{bars:i,beats:s-i*e,semiquavers:a,ticks:l}},K=(n,e)=>n*e/60*960,Z=(n,e)=>n*60/960/e,se=(n,e)=>e*60/960/n,oe=(n,e,t)=>K(n/t,e),ie=(n,e,t)=>Z(n,e)*t,J={Bar:3840,Quarter:960,SemiQuaver:240,fromSignature:L,toParts:Y,secondsToPulses:K,pulsesToSeconds:Z,secondsToBpm:se,samplesToPulses:oe,pulsesToSamples:ie,toString:(n,e=4,t=4)=>{let{bars:r,beats:s,semiquavers:i,ticks:c}=Y(n|0,e,t);return`${r+1}.${s+1}.${i+1}:${c}`}};var M=128,Fe=J.fromSignature(1,48);var ae=Math.log(10)/20;var X=n=>Math.exp(n*ae);var g=globalThis,B=class{port;constructor(){this.port=g.__workletPort__}process(e,t){return!1}},ee=n=>{g.sampleRate=n.sampleRate,g.currentFrame=0,g.currentTime=0,g.AudioWorkletProcessor=B,g.registerProcessor=(e,t)=>{g.__registeredProcessors__=g.__registeredProcessors__||{},g.__registeredProcessors__[e]=t}},Q=(n,e)=>{g.currentFrame=n,g.currentTime=n/e};var te=globalThis,N=E.None;F.executor(V.for(self).channel("offline-engine"),{async initialize(n,e){ee({sampleRate:e.sampleRate}),te.__workletPort__=n,await import(e.processorsUrl);let t=te.__registeredProcessors__["engine-processor"];N=E.wrap({processor:new t({processorOptions:{syncStreamBuffer:e.syncStreamBuffer,controlFlagsBuffer:e.controlFlagsBuffer,hrClockBuffer:new SharedArrayBuffer(32),project:e.project,exportConfiguration:e.exportConfiguration}}),sampleRate:e.sampleRate,numberOfChannels:e.numberOfChannels,totalFrames:0,running:!1})},async step(n){let e=N.unwrap(),t=v.create(()=>new Float32Array(n),e.numberOfChannels),r=v.create(()=>new Float32Array(M),e.numberOfChannels),s=0;for(;s<n;){let i=[r];Q(e.totalFrames,e.sampleRate),e.processor.process([[]],i),e.totalFrames+=M;let c=n-s,o=Math.min(c,M);for(let a=0;a<e.numberOfChannels;a++)t[a].set(i[0][a].subarray(0,o),s);s+=o}return t},async render(n){let e=N.unwrap(),{silenceThresholdDb:t,silenceDurationSeconds:r,maxDurationSeconds:s}=n,i=X(t??-72),c=Math.ceil((r??10)*e.sampleRate),o=m(s)?Math.ceil(s*e.sampleRate):1/0,a=v.create(()=>[],e.numberOfChannels),l=0,u=!1,b=0;for(e.running=!0,await A.timeSpan(_.seconds(0));e.running&&e.totalFrames<o;){let d=[v.create(()=>new Float32Array(M),e.numberOfChannels)];Q(e.totalFrames,e.sampleRate);let x=e.processor.process([[]],d),P=0;for(let y of d[0])for(let re of y){let W=Math.abs(re);W>P&&(P=W)}let T=P<=i;if(P>i&&(u=!0),T&&u){if(l+=M,l>=c)break}else l=0;for(let y=0;y<e.numberOfChannels;y++)a[y].push(d[0][y].slice());if(e.totalFrames+=M,!x)break;e.totalFrames-b>=e.sampleRate&&(b=e.totalFrames,await new Promise(y=>setTimeout(y,0)))}let f=e.totalFrames-l+Math.min(e.sampleRate/4,l);return v.create(h=>{let d=new Float32Array(f),x=0;for(let P of a[h]){if(x>=f)break;let T=Math.min(P.length,f-x);d.set(P.subarray(0,T),x),x+=T}return d},e.numberOfChannels)},stop(){N.unwrap().running=!1}});
2
2
  //# sourceMappingURL=offline-engine.js.map