@opendaw/studio-core 0.0.120 → 0.0.121

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AudioUnitFreeze.d.ts","sourceRoot":"","sources":["../src/AudioUnitFreeze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,QAAQ,EAA2B,YAAY,EAAE,UAAU,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAGhI,OAAO,EAAC,mBAAmB,EAA2B,MAAM,0BAA0B,CAAA;AAItF,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAItC,qBAAa,eAAgB,YAAW,UAAU;;gBAMlC,OAAO,EAAE,OAAO;IAU5B,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO;IAI3D,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO;IAIvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,YAAY;IAEvD,sBAAsB,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO;IAoBnE,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiErE,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,IAAI;IAIxD,SAAS,IAAI,IAAI;CAwBpB"}
1
+ {"version":3,"file":"AudioUnitFreeze.d.ts","sourceRoot":"","sources":["../src/AudioUnitFreeze.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,QAAQ,EAA2B,YAAY,EAAE,UAAU,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAGxJ,OAAO,EAAC,mBAAmB,EAA2B,MAAM,0BAA0B,CAAA;AAItF,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAItC,qBAAa,eAAgB,YAAW,UAAU;;gBAMlC,OAAO,EAAE,OAAO;IAU5B,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO;IAI3D,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO;IAIvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,YAAY;IAEvD,sBAAsB,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO;IAoBnE,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmErE,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,IAAI;IAIxD,SAAS,IAAI,IAAI;CAwBpB"}
@@ -1,4 +1,4 @@
1
- import { Errors, Notifier, Option, RuntimeNotifier, Terminator, UUID } from "@opendaw/lib-std";
1
+ import { DefaultObservableValue, Errors, Notifier, Option, RuntimeNotifier, Terminator, UUID } from "@opendaw/lib-std";
2
2
  import { Promises } from "@opendaw/lib-runtime";
3
3
  import { OfflineEngineRenderer } from "./OfflineEngineRenderer";
4
4
  export class AudioUnitFreeze {
@@ -62,11 +62,13 @@ export class AudioUnitFreeze {
62
62
  };
63
63
  const copiedProject = this.#project.copy();
64
64
  const abortController = new AbortController();
65
+ const progress = new DefaultObservableValue(0.0);
65
66
  const dialog = RuntimeNotifier.progress({
66
67
  headline: "Freezing AudioUnit...",
68
+ progress,
67
69
  cancel: () => abortController.abort()
68
70
  });
69
- const renderResult = await Promises.tryCatch(OfflineEngineRenderer.start(copiedProject, Option.wrap(exportConfiguration), progress => dialog.message = `${Math.round(progress)}s rendered`, abortController.signal, engine.sampleRate));
71
+ const renderResult = await Promises.tryCatch(OfflineEngineRenderer.start(copiedProject, Option.wrap(exportConfiguration), progress, abortController.signal, engine.sampleRate));
70
72
  if (renderResult.status === "rejected") {
71
73
  dialog.terminate();
72
74
  if (!Errors.isAbort(renderResult.error)) {
@@ -1,4 +1,4 @@
1
- import { int, Option, Progress } from "@opendaw/lib-std";
1
+ import { DefaultObservableValue, int, Option } from "@opendaw/lib-std";
2
2
  import { AudioData, ppqn } from "@opendaw/lib-dsp";
3
3
  import { ExportStemsConfiguration, OfflineEngineRenderConfig } from "@opendaw/studio-adapters";
4
4
  import { Project } from "./project";
@@ -7,7 +7,7 @@ export declare class OfflineEngineRenderer {
7
7
  static install(url: string): void;
8
8
  static getWorkerUrl(): string;
9
9
  static create(source: Project, optExportConfiguration: Option<ExportStemsConfiguration>, sampleRate?: int): Promise<OfflineEngineRenderer>;
10
- static start(source: Project, optExportConfiguration: Option<ExportStemsConfiguration>, progress: Progress.Handler, abortSignal?: AbortSignal, sampleRate?: int): Promise<AudioData>;
10
+ static start(source: Project, optExportConfiguration: Option<ExportStemsConfiguration>, progress: DefaultObservableValue<number>, abortSignal?: AbortSignal, sampleRate?: int): Promise<AudioData>;
11
11
  private constructor();
12
12
  get sampleRate(): int;
13
13
  get numberOfChannels(): int;
@@ -18,6 +18,6 @@ export declare class OfflineEngineRenderer {
18
18
  waitForLoading(): Promise<void>;
19
19
  terminate(): void;
20
20
  step(samples: int): Promise<Float32Array[]>;
21
- render(config: OfflineEngineRenderConfig, progress: Progress.Handler, abortSignal?: AbortSignal): Promise<AudioData>;
21
+ render(config: OfflineEngineRenderConfig, endPosition: ppqn, progress: DefaultObservableValue<number>, abortSignal?: AbortSignal): Promise<AudioData>;
22
22
  }
23
23
  //# sourceMappingURL=OfflineEngineRenderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OfflineEngineRenderer.d.ts","sourceRoot":"","sources":["../src/OfflineEngineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,GAAG,EAAuB,MAAM,EAAS,QAAQ,EAA6B,MAAM,kBAAkB,CAAA;AACtH,OAAO,EAAC,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAEhD,OAAO,EAIH,wBAAwB,EAKxB,yBAAyB,EAC5B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAOjC,qBAAa,qBAAqB;;IAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC,MAAM,CAAC,YAAY,IAAI,MAAM;WAIhB,MAAM,CAAC,MAAM,EAAE,OAAO,EACf,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC,EACxD,UAAU,GAAE,GAAY,GACzC,OAAO,CAAC,qBAAqB,CAAC;WAqHpB,KAAK,CAAC,MAAM,EAAE,OAAO,EACf,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC,EACxD,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAC1B,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,GAAE,GAAY,GACxC,OAAO,CAAC,SAAS,CAAC;IAwBrB,OAAO;IAkBP,IAAI,UAAU,IAAI,GAAG,CAA0B;IAC/C,IAAI,gBAAgB,IAAI,GAAG,CAAgC;IAC3D,IAAI,WAAW,IAAI,GAAG,CAA2B;IAEjD,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;IAKZ,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAI3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,SAAS,IAAI,IAAI;IAKX,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAM3C,MAAM,CACR,MAAM,EAAE,yBAAyB,EACjC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAC1B,WAAW,CAAC,EAAE,WAAW,GAC1B,OAAO,CAAC,SAAS,CAAC;CAqCxB"}
1
+ {"version":3,"file":"OfflineEngineRenderer.d.ts","sourceRoot":"","sources":["../src/OfflineEngineRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAU,GAAG,EAAuB,MAAM,EAA4D,MAAM,kBAAkB,CAAA;AAC5J,OAAO,EAAC,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAGhD,OAAO,EAKH,wBAAwB,EAKxB,yBAAyB,EAC5B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAOjC,qBAAa,qBAAqB;;IAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC,MAAM,CAAC,YAAY,IAAI,MAAM;WAIhB,MAAM,CAAC,MAAM,EAAE,OAAO,EACf,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC,EACxD,UAAU,GAAE,GAAY,GACzC,OAAO,CAAC,qBAAqB,CAAC;WAqHpB,KAAK,CAAC,MAAM,EAAE,OAAO,EACf,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC,EACxD,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,EACxC,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,GAAE,GAAY,GACxC,OAAO,CAAC,SAAS,CAAC;IA0BrB,OAAO;IAoBP,IAAI,UAAU,IAAI,GAAG,CAA0B;IAC/C,IAAI,gBAAgB,IAAI,GAAG,CAAgC;IAC3D,IAAI,WAAW,IAAI,GAAG,CAA2B;IAEjD,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;IAKZ,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAI3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,SAAS,IAAI,IAAI;IAKX,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAM3C,MAAM,CACR,MAAM,EAAE,yBAAyB,EACjC,WAAW,EAAE,IAAI,EACjB,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,EACxC,WAAW,CAAC,EAAE,WAAW,GAC1B,OAAO,CAAC,SAAS,CAAC;CA0CxB"}
@@ -1,6 +1,7 @@
1
- import { Errors, isDefined, Option, panic, Terminator, TimeSpan } from "@opendaw/lib-std";
1
+ import { Errors, isDefined, Option, panic, SyncStream, Terminable, Terminator, TimeSpan } from "@opendaw/lib-std";
2
2
  import { AudioData } from "@opendaw/lib-dsp";
3
3
  import { Communicator, Messenger, Wait } from "@opendaw/lib-runtime";
4
+ import { AnimationFrame } from "@opendaw/lib-dom";
4
5
  import { EngineStateSchema, ExportStemsConfiguration } from "@opendaw/studio-adapters";
5
6
  import { AudioWorklets } from "./AudioWorklets";
6
7
  import { MIDIReceiver } from "./midi";
@@ -22,8 +23,8 @@ export class OfflineEngineRenderer {
22
23
  const worker = new Worker(this.getWorkerUrl(), { type: "module" });
23
24
  const messenger = Messenger.for(worker);
24
25
  const protocol = Communicator.sender(messenger.channel("offline-engine"), dispatcher => new class {
25
- initialize(enginePort, progressPort, config) {
26
- return dispatcher.dispatchAndReturn(this.initialize, enginePort, progressPort, config);
26
+ initialize(enginePort, config) {
27
+ return dispatcher.dispatchAndReturn(this.initialize, enginePort, config);
27
28
  }
28
29
  render(config) {
29
30
  return dispatcher.dispatchAndReturn(this.render, config);
@@ -34,8 +35,8 @@ export class OfflineEngineRenderer {
34
35
  stop() { dispatcher.dispatchAndForget(this.stop); }
35
36
  });
36
37
  const channel = new MessageChannel();
37
- const progressChannel = new MessageChannel();
38
- const syncStreamBuffer = new SharedArrayBuffer(EngineStateSchema().bytesTotal + 1);
38
+ const engineStateIO = EngineStateSchema();
39
+ const reader = SyncStream.reader(engineStateIO, () => { });
39
40
  const controlFlagsBuffer = new SharedArrayBuffer(4);
40
41
  const terminator = new Terminator();
41
42
  const engineMessenger = Messenger.for(channel.port2);
@@ -96,20 +97,19 @@ export class OfflineEngineRenderer {
96
97
  terminate() { dispatcher.dispatchAndForget(this.terminate); }
97
98
  });
98
99
  channel.port2.start();
99
- progressChannel.port2.start();
100
100
  terminator.own(source.liveStreamReceiver.connect(engineMessenger.channel("engine-live-data")));
101
101
  const { port, sab } = terminator.own(MIDIReceiver.create(() => 0, (deviceId, data, relativeTimeInMs) => source.receivedMIDIFromEngine(deviceId, data, relativeTimeInMs)));
102
- await protocol.initialize(channel.port1, progressChannel.port1, {
102
+ await protocol.initialize(channel.port1, {
103
103
  sampleRate,
104
104
  numberOfChannels,
105
105
  processorsUrl: AudioWorklets.processorsUrl,
106
- syncStreamBuffer,
106
+ syncStreamBuffer: reader.buffer,
107
107
  controlFlagsBuffer,
108
108
  project: source.toArrayBuffer(),
109
109
  exportConfiguration: optExportConfiguration.unwrapOrUndefined()
110
110
  });
111
111
  engineCommands.setupMIDI(port, sab);
112
- return new OfflineEngineRenderer(worker, protocol, engineCommands, terminator, progressChannel.port2, sampleRate, numberOfChannels);
112
+ return new OfflineEngineRenderer(worker, protocol, engineCommands, terminator, reader, engineStateIO, sampleRate, numberOfChannels);
113
113
  }
114
114
  static async start(source, optExportConfiguration, progress, abortSignal, sampleRate = 48_000) {
115
115
  const { timelineBox: { loopArea: { enabled } }, boxGraph } = source;
@@ -117,8 +117,9 @@ export class OfflineEngineRenderer {
117
117
  boxGraph.beginTransaction();
118
118
  enabled.setValue(false);
119
119
  boxGraph.endTransaction();
120
+ const endPosition = source.lastRegionAction();
120
121
  const renderer = await this.create(source, optExportConfiguration, sampleRate);
121
- const result = await renderer.render({}, progress, abortSignal);
122
+ const result = await renderer.render({}, endPosition, progress, abortSignal);
122
123
  boxGraph.beginTransaction();
123
124
  enabled.setValue(wasEnabled);
124
125
  boxGraph.endTransaction();
@@ -128,16 +129,18 @@ export class OfflineEngineRenderer {
128
129
  #protocol;
129
130
  #engineCommands;
130
131
  #terminator;
131
- #progressPort;
132
+ #reader;
133
+ #engineStateIO;
132
134
  #sampleRate;
133
135
  #numberOfChannels;
134
136
  #totalFrames = 0;
135
- constructor(worker, protocol, engineCommands, terminator, progressPort, sampleRate, numberOfChannels) {
137
+ constructor(worker, protocol, engineCommands, terminator, reader, engineStateIO, sampleRate, numberOfChannels) {
136
138
  this.#worker = worker;
137
139
  this.#protocol = protocol;
138
140
  this.#engineCommands = engineCommands;
139
141
  this.#terminator = terminator;
140
- this.#progressPort = progressPort;
142
+ this.#reader = reader;
143
+ this.#engineStateIO = engineStateIO;
141
144
  this.#sampleRate = sampleRate;
142
145
  this.#numberOfChannels = numberOfChannels;
143
146
  }
@@ -168,26 +171,34 @@ export class OfflineEngineRenderer {
168
171
  this.#totalFrames += samples;
169
172
  return channels;
170
173
  }
171
- async render(config, progress, abortSignal) {
174
+ async render(config, endPosition, progress, abortSignal) {
172
175
  const { promise, reject, resolve } = Promise.withResolvers();
173
176
  let cancelled = false;
177
+ const polling = endPosition > 0
178
+ ? AnimationFrame.add(() => {
179
+ this.#reader.tryRead();
180
+ progress.setValue(Math.min(1.0, this.#engineStateIO.object.position / endPosition));
181
+ })
182
+ : Terminable.Empty;
174
183
  if (isDefined(abortSignal)) {
175
184
  abortSignal.onabort = () => {
185
+ polling.terminate();
176
186
  this.stop();
177
187
  this.terminate();
178
188
  cancelled = true;
179
189
  reject(Errors.AbortError);
180
190
  };
181
191
  }
182
- this.#progressPort.onmessage = (event) => progress(event.data.frames / this.#sampleRate);
183
192
  while (!await this.#engineCommands.queryLoadingComplete()) {
184
193
  await Wait.timeSpan(TimeSpan.millis(100));
185
194
  }
186
195
  this.play();
187
196
  this.#protocol.render(config).then(channels => {
197
+ polling.terminate();
188
198
  if (cancelled) {
189
199
  return;
190
200
  }
201
+ progress.setValue(1.0);
191
202
  this.terminate();
192
203
  const numberOfFrames = channels[0].length;
193
204
  const audioData = AudioData.create(this.#sampleRate, numberOfFrames, this.#numberOfChannels);
@@ -196,6 +207,7 @@ export class OfflineEngineRenderer {
196
207
  }
197
208
  resolve(audioData);
198
209
  }).catch(reason => {
210
+ polling.terminate();
199
211
  if (!cancelled) {
200
212
  this.terminate();
201
213
  reject(reason);
@@ -1,2 +1,2 @@
1
- var m=s=>s!=null;var b=(s,e="asDefined failed")=>s??p(S(e));var S=s=>s instanceof Function?s():s;var U=s=>{throw new Error(`Unhandled ${s}`)},p=s=>{throw typeof s=="string"?new Error(s):s},j=(s,e)=>s?void 0:p(S(e));var H=s=>new Proxy({},{get(){return p(s)}});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=s=>{try{return new k(s())}catch(e){return new C(e)}};var q=()=>{};var $;(function(s){s[s.Ascending=1]="Ascending",s[s.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 n=0;n<t;n++)r[n]=e(n);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 n=1;n<e.length;n++)if(!t(r,e[n]))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 n of e)r.has(n)||(r.add(n),e[t++]=n);return e.length=t,e};static removeDuplicateKeys=(e,t)=>{let r=0,n=new Set;for(let i of e){let c=i[t];n.has(c)||(n.add(c),e[r++]=i)}return e.length=r,e};static subtract(e,t,r){return e.filter(n=>!t.some(i=>r(n,i)))}static intersect(e,t,r){return e.filter(n=>t.some(i=>r(n,i)))}static merge(e,t,r){return[...e.filter(n=>!t.some(i=>r(n,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 n=e[t];yield[r,n],r=n}}static isSorted(e,t=$.Ascending){if(e.length<2)return!0;let r=e[0];for(let n=1;n<e.length;n++){let i=e[n];if(Math.sign(r-i)===t)return!1;r=i}return!0}static toRecord(e,t){return e.reduce((r,n)=>(r[t(n)]=n,r),{})}static concatArrayBuffers(e,t){let r=new ArrayBuffer(e.byteLength+t.byteLength),n=new Uint8Array(r);return n.set(new Uint8Array(e),0),n.set(new Uint8Array(t),e.byteLength),r}};var E;(function(s){s.wrap=t=>m(t)?new e(t):s.None,s.from=t=>s.wrap(t()),s.tryCatch=t=>{try{return s.wrap(t())}catch{return s.None}},s.execute=(t,...r)=>s.wrap(t?.apply(null,r)),s.async=t=>t.then(r=>s.wrap(r),()=>s.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 s.wrap(r(this.#e))}mapOr(r,n){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()}}s.Some=e,s.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=>s.None;mapOr=(t,r)=>S(r);flatMap=t=>s.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 n=r,i=0;for(let c of e)n=t(n,c,i++);return n}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 n of e)yield t(n,r++)}static*take(e,t){let r=0;for(let n of e){if(r++>=t)return;yield n}}static filter(e,t){let r=[];for(let n of e)t(n)&&r.push(n);return r}static filterMap(e,t){let r=[];for(let n of e){let i=t(n);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:n}=t.next(),i=n;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:s=>({terminate:s}),many:(...s)=>({terminate:()=>{for(;s.length>0;)s.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 s{static createEstimator=()=>{let e=performance.now(),t=s.millis(Number.POSITIVE_INFINITY),r=0;return n=>{if(n===0)return s.POSITIVE_INFINITY;if(n>=1)return s.millis(0);let i=performance.now()-e;return i>r*1e3&&(t=s.millis(i/n-i),r++),t}};static POSITIVE_INFINITY=new s(Number.POSITIVE_INFINITY);static millis=e=>new s(e);static seconds=e=>new s(e*s.#e);static minutes=e=>new s(e*s.#t);static hours=e=>new s(e*s.#n);static days=e=>new s(e*s.#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#n=36e5;static#o=864e5;#r;constructor(e){this.#r=e}millis(){return this.#r}absSeconds(){return Math.abs(this.#r)/s.#e}absMinutes(){return Math.abs(this.#r)/s.#t}absHours(){return Math.abs(this.#r)/s.#n}absDays(){return Math.abs(this.#r)/s.#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),n=Math.floor(r/60),i=Math.floor(n/60),c=Math.floor(i/24);return r<60?(e=r,t="second"):n<60?(e=n,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:n}=this.split();return e>0?[s.#s("d",e),s.#s("h",t),s.#s("m",r),s.#s("s",n)].join(", "):t>0?[s.#s("h",t),s.#s("m",r),s.#s("s",n)].join(", "):r>0?[s.#s("m",r),s.#s("s",n)].join(", "):n>0?s.#s("s",n):"now"}static#s=(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(s){class e{value;constructor(o){this.value=o}}s.Transfer=e,s.makeTransferable=c=>new e(c),s.sender=(c,o)=>o(new n(c)),s.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 n{#e;#t=new Map;#n;#o=0;constructor(o){this.#e=o,this.#n=o.subscribe(this.#r)}terminate(){this.#n.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;#n;constructor(o,a){this.#e=o,this.#t=a,this.#n=o.subscribe(this.#o)}terminate(){this.#n.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.#s(u,h)}},f=>this.#s(u,f))}catch(w){this.#s(u,w)}};#r=(o,a)=>this.#e.send({type:"resolve",returnId:o,resolve:a});#s=(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})}s.Executor=i})(F||(F={}));var V={for:s=>new R(s)},se=[],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??se)}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 s{#e;#t;#n=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.#n.notify(r.message)})}send(e,t){this.#e.send({__id__:"42",channel:this.#t,message:e},t)}channel(e){return new s(this,e)}subscribe(e){return this.#n.subscribe(e)}terminate(){this.#o.terminate(),this.#n.terminate()}};var A;(function(s){s.frame=()=>new Promise(e=>requestAnimationFrame(()=>e())),s.frames=e=>new Promise(t=>{let r=e,n=()=>{--r<=0?t():requestAnimationFrame(n)};requestAnimationFrame(n)}),s.timeSpan=(e,...t)=>new Promise(r=>setTimeout(r,e.millis(),...t)),s.event=(e,t)=>new Promise(r=>e.addEventListener(t,r,{once:!0})),s.observable=e=>new Promise(t=>{let r=e.subscribe(()=>{r.terminate(),t()})}),s.complete=e=>new Promise((t,r)=>{let n=setInterval(()=>{let{status:i,value:c,error:o}=G(()=>e.next());if(i==="success"){let{done:a,value:l}=c;a&&(clearInterval(n),t(l))}else clearInterval(n),r(o)},0)})})(A||(A={}));var L=(s,e)=>Math.floor(3840/e)*s,Y=(s,e=4,t=4)=>{let r=L(1,t),n=Math.floor(s/r),i=Math.floor(n/e),o=(Math.floor(s)-L(i*e,t))%r,a=Math.floor(o/240),l=o%240;return{bars:i,beats:n-i*e,semiquavers:a,ticks:l}},K=(s,e)=>s*e/60*960,Z=(s,e)=>s*60/960/e,ne=(s,e)=>e*60/960/s,oe=(s,e,t)=>K(s/t,e),ie=(s,e,t)=>Z(s,e)*t,J={Bar:3840,Quarter:960,SemiQuaver:240,fromSignature:L,toParts:Y,secondsToPulses:K,pulsesToSeconds:Z,secondsToBpm:ne,samplesToPulses:oe,pulsesToSamples:ie,toString:(s,e=4,t=4)=>{let{bars:r,beats:n,semiquavers:i,ticks:c}=Y(s|0,e,t);return`${r+1}.${n+1}.${i+1}:${c}`}};var M=128,Fe=J.fromSignature(1,48);var ae=Math.log(10)/20;var X=s=>Math.exp(s*ae);var g=globalThis,B=class{port;constructor(){this.port=g.__workletPort__}process(e,t){return!1}},ee=s=>{g.sampleRate=s.sampleRate,g.currentFrame=0,g.currentTime=0,g.AudioWorkletProcessor=B,g.registerProcessor=(e,t)=>{g.__registeredProcessors__=g.__registeredProcessors__||{},g.__registeredProcessors__[e]=t}},Q=(s,e)=>{g.currentFrame=s,g.currentTime=s/e};var te=globalThis,N=E.None;F.executor(V.for(self).channel("offline-engine"),{async initialize(s,e,t){ee({sampleRate:t.sampleRate}),te.__workletPort__=s,await import(t.processorsUrl);let r=te.__registeredProcessors__["engine-processor"];N=E.wrap({processor:new r({processorOptions:{syncStreamBuffer:t.syncStreamBuffer,controlFlagsBuffer:t.controlFlagsBuffer,hrClockBuffer:new SharedArrayBuffer(32),project:t.project,exportConfiguration:t.exportConfiguration}}),progressPort:e,sampleRate:t.sampleRate,numberOfChannels:t.numberOfChannels,totalFrames:0,running:!1})},async step(s){let e=N.unwrap(),t=v.create(()=>new Float32Array(s),e.numberOfChannels),r=v.create(()=>new Float32Array(M),e.numberOfChannels),n=0;for(;n<s;){let i=[r];Q(e.totalFrames,e.sampleRate),e.processor.process([[]],i),e.totalFrames+=M;let c=s-n,o=Math.min(c,M);for(let a=0;a<e.numberOfChannels;a++)t[a].set(i[0][a].subarray(0,o),n);n+=o}return t},async render(s){let e=N.unwrap(),{silenceThresholdDb:t,silenceDurationSeconds:r,maxDurationSeconds:n}=s,i=X(t??-72),c=Math.ceil((r??10)*e.sampleRate),o=m(n)?Math.ceil(n*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,e.progressPort.postMessage({frames: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 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}});
2
2
  //# sourceMappingURL=offline-engine.js.map