@opendaw/studio-core 0.0.121 → 0.0.122
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.
- package/dist/EffectBox.d.ts +2 -2
- package/dist/EffectBox.d.ts.map +1 -1
- package/dist/EffectFactories.d.ts +3 -0
- package/dist/EffectFactories.d.ts.map +1 -1
- package/dist/EffectFactories.js +15 -1
- package/dist/offline-engine.js +1 -1
- package/dist/offline-engine.js.map +1 -1
- package/dist/processors.js +25 -25
- package/dist/processors.js.map +4 -4
- package/dist/project/audio/AudioContentFactory.d.ts +2 -1
- package/dist/project/audio/AudioContentFactory.d.ts.map +1 -1
- package/dist/project/audio/AudioContentFactory.js +8 -7
- package/dist/workers-main.js +1 -1
- package/dist/workers-main.js.map +1 -1
- package/package.json +15 -15
package/dist/EffectBox.d.ts
CHANGED
|
@@ -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
|
package/dist/EffectBox.d.ts.map
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/EffectFactories.js
CHANGED
|
@@ -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
|
package/dist/offline-engine.js
CHANGED
|
@@ -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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../lib/std/dist/lang.js", "../../../lib/std/dist/arrays.js", "../../../lib/std/dist/option.js", "../../../lib/std/dist/iterables.js", "../../../lib/std/dist/terminable.js", "../../../lib/std/dist/notifier.js", "../../../lib/std/dist/time-span.js", "../../../lib/runtime/dist/communicator.js", "../../../lib/runtime/dist/messenger.js", "../../../lib/runtime/dist/wait.js", "../../../lib/dsp/dist/ppqn.js", "../../../lib/dsp/dist/constants.js", "../../../lib/dsp/dist/utils.js", "../../core-workers/src/worklet-env.ts", "../../core-workers/src/offline-engine-main.ts"],
|
|
4
|
-
"sourcesContent": ["// noinspection JSUnusedGlobalSymbols\nexport const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const isNull = (value) => value === null;\nexport const isNotNull = (value) => value !== null;\nexport const isUndefined = (value) => value === undefined;\nexport const isNotUndefined = (value) => value !== undefined;\nexport const isAbsent = (value) => value === undefined || value === null;\nexport const ifDefined = (value, procedure) => value !== undefined && value !== null ? procedure(value) : undefined;\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(getOrProvide(fail)) : value;\nexport const isInstanceOf = (obj, clazz) => obj instanceof clazz;\nexport const asInstanceOf = (obj, clazz) => obj instanceof clazz ? obj : panic(`${obj} is not instance of ${clazz}`);\nexport const assertInstanceOf = (obj, clazz) => {\n if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n }\n};\nexport const isSameClass = (a, b) => a.constructor === b.constructor;\nexport const tryProvide = (provider) => {\n try {\n return provider();\n }\n catch (reason) {\n return panic(String(reason));\n }\n};\nexport const getOrProvide = (value) => value instanceof Function ? value() : value;\nexport const safeWrite = (object, property, value) => property in object ? object[property] = value : undefined;\nexport const safeExecute = (func, ...args) => func?.apply(null, args);\nexport const isRecord = (value) => isDefined(value) && typeof value === \"object\";\nexport const hasField = (record, key, type) => {\n if (!(key in record))\n return false;\n const value = record[key];\n return type === \"null\" ? value === null : typeof value === type;\n};\nexport const safeRead = (object, ...keys) => {\n let current = object;\n for (const key of keys) {\n if (!isRecord(current) || !(key in current)) {\n return undefined;\n }\n current = current[key];\n }\n return current;\n};\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => {\n throw typeof issue === \"string\" ? new Error(issue) : issue;\n};\nexport const assert = (condition, fail) => condition ? undefined : panic(getOrProvide(fail));\nexport const checkIndex = (index, array) => index >= 0 && index < array.length ? index : panic(`Index ${index} is out of bounds`);\nexport const InaccessibleProperty = (failMessage) => new Proxy({}, { get() { return panic(failMessage); } });\nexport const canWrite = (obj, key) => {\n while (isDefined(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (isDefined(descriptor)) {\n return typeof descriptor.set === \"function\";\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n};\nexport const requireProperty = (object, key) => {\n const { status, value } = tryCatch(() => object instanceof Function ? object.name : object.constructor.name);\n const feature = status === \"failure\" ? `${object}.${String(key)}` : `${value}.${String(key)}`;\n console.debug(`%c${feature}%c available`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n if (!(key in object)) {\n throw feature;\n }\n};\nexport class SuccessResult {\n value;\n status = \"success\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when succeeded\");\n}\nexport class FailureResult {\n error;\n status = \"failure\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when failed\");\n}\nexport const tryCatch = (statement) => {\n try {\n return new SuccessResult(statement());\n }\n catch (error) {\n return new FailureResult(error);\n }\n};\nexport const isValidIdentifier = (identifier) => /^[A-Za-z_$][A-Za-z0-9_]*$/.test(identifier);\nexport const asValidIdentifier = (identifier) => isValidIdentifier(identifier) ? identifier : panic(`'${identifier}' is not a valid identifier`);\nexport const asEnumValue = (value, enm) => {\n const keys = Object.keys(enm);\n if (keys.length === 0)\n return panic(\"Empty enum object (are you using `const enum`?)\");\n const values = Object.keys(enm)\n .filter(k => isNaN(Number(k)))\n .map(k => enm[k]);\n return values.includes(value) ? value : panic(`Invalid enum value: ${String(value)}`);\n};\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\n", "import { asDefined, panic } from \"./lang\";\nexport var Sorting;\n(function (Sorting) {\n Sorting[Sorting[\"Ascending\"] = 1] = \"Ascending\";\n Sorting[Sorting[\"Descending\"] = -1] = \"Descending\";\n})(Sorting || (Sorting = {}));\nexport class Arrays {\n static #empty = Object.freeze(new Array(0));\n static empty = () => (() => this.#empty)();\n static clear = (array) => { array.length = 0; };\n static replace = (array, newValues) => {\n array.length = 0;\n array.push(...newValues);\n };\n static consume = (array, procedure) => {\n for (let index = 0; index < array.length;) {\n if (procedure(array[index])) {\n array.splice(index, 1);\n }\n else {\n index++;\n }\n }\n };\n static peekFirst = (array) => array.at(0) ?? null;\n static peekLast = (array) => array.at(-1) ?? null;\n static getFirst = (array, fail) => asDefined(array.at(0), fail);\n static getLast = (array, fail) => asDefined(array.at(-1), fail);\n static getPrev = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index - 1) % array.length), \"Internal Error\");\n };\n static getNext = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index + 1) % array.length), \"Internal Error\");\n };\n static removeLast = (array, fail) => asDefined(array.pop(), fail);\n static create = (factory, n) => {\n const array = new Array(n);\n for (let i = 0; i < n; i++) {\n array[i] = factory(i);\n }\n return array;\n };\n static equals = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n /**\n * The satisfy method checks if all elements in a given array satisfy a provided predicate function\n * when compared with the first element of the array. That essentially means that all tested properties\n * in the predicate function are equal throughout the array.\n * [1, 1, 1, 1, 1] > (a, b) => a === b returns true\n * [1, 1, 1, 1, 2] > (a, b) => a === b returns false\n * [1, 1, 3, 2, 1] > (a, b) => a === b returns false\n */\n static satisfy = (array, predicate) => {\n if (array.length < 2) {\n return true;\n }\n const first = array[0];\n for (let i = 1; i < array.length; i++) {\n if (!predicate(first, array[i])) {\n return false;\n }\n }\n return true;\n };\n static remove = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n array.splice(index, 1);\n };\n static removeIf = (array, predicate) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n array.splice(i, 1);\n }\n }\n };\n static removeOpt = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return false;\n }\n array.splice(index, 1);\n return true;\n };\n static hasDuplicates = (array) => new Set(array).size < array.length;\n static removeDuplicates = (array) => {\n let index = 0 | 0;\n const result = new Set();\n for (const element of array) {\n if (!result.has(element)) {\n result.add(element);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static removeDuplicateKeys = (array, key) => {\n let index = 0 | 0;\n const seen = new Set();\n for (const element of array) {\n const value = element[key];\n if (!seen.has(value)) {\n seen.add(value);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static subtract(array, excludeArray, compareFn) {\n return array.filter(item => !excludeArray.some(excludeItem => compareFn(item, excludeItem)));\n }\n static intersect(array, other, compareFn) {\n return array.filter(item => other.some(includeItem => compareFn(item, includeItem)));\n }\n static merge(baseArray, mergeIntoArray, compareFn) {\n return [...(baseArray\n .filter(baseItem => !mergeIntoArray\n .some(mergeItem => compareFn(baseItem, mergeItem)))), ...mergeIntoArray];\n }\n static *iterate(array) {\n for (let i = 0; i < array.length; i++) {\n yield array[i];\n }\n }\n static *iterateReverse(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n yield array[i];\n }\n }\n static *iterateStateFull(array) {\n const maxIndex = array.length - 1;\n for (let i = 0; i <= maxIndex; i++) {\n yield { value: array[i], isFirst: i === 0, isLast: i === maxIndex };\n }\n }\n static *iterateAdjacent(array) {\n if (array.length <= 1) {\n return;\n }\n for (let i = 1, left = array[0]; i < array.length; i++) {\n const right = array[i];\n yield [left, right];\n left = right;\n }\n }\n static isSorted(array, sorting = Sorting.Ascending) {\n if (array.length < 2) {\n return true;\n }\n let prev = array[0];\n for (let i = 1; i < array.length; i++) {\n const next = array[i];\n if (Math.sign(prev - next) === sorting) {\n return false;\n }\n prev = next;\n }\n return true;\n }\n static toRecord(array, toKey) {\n return array.reduce((record, value) => {\n record[toKey(value)] = value;\n return record;\n }, {});\n }\n static concatArrayBuffers(a, b) {\n const result = new ArrayBuffer(a.byteLength + b.byteLength);\n const view = new Uint8Array(result);\n view.set(new Uint8Array(a), 0);\n view.set(new Uint8Array(b), a.byteLength);\n return result;\n }\n}\n", "import { asDefined, getOrProvide, isDefined, panic } from \"./lang\";\nexport var Option;\n(function (Option) {\n Option.wrap = (value) => isDefined(value) ? new Some(value) : Option.None;\n Option.from = (provider) => Option.wrap(provider());\n Option.tryCatch = (provider) => {\n try {\n return Option.wrap(provider());\n }\n catch (_error) {\n return Option.None;\n }\n };\n Option.execute = (func, ...args) => Option.wrap(func?.apply(null, args));\n Option.async = (promise) => promise.then(value => Option.wrap(value), () => Option.None);\n class Some {\n #value;\n constructor(value) { this.#value = asDefined(value); }\n unwrap() { return this.#value; }\n unwrapOrElse(_) { return this.#value; }\n unwrapOrNull() { return this.#value; }\n unwrapOrUndefined() { return this.#value; }\n contains(value) { return value === this.#value; }\n match(matchable) { return matchable.some(this.#value); }\n ifSome(run) { return run(this.#value); }\n ifAbsent(_func) { return undefined; }\n isEmpty() { return false; }\n nonEmpty() { return true; }\n map(callback) { return Option.wrap(callback(this.#value)); }\n mapOr(func, _or) { return func(this.#value); }\n flatMap(callback) { return callback(this.#value); }\n equals(other) { return this.unwrapOrNull() === other.unwrapOrNull(); }\n assert(_fail) { return this; }\n toString() { return `{Option.Some(${this.#value})}`; }\n get [Symbol.toStringTag]() { return this.toString(); }\n }\n Option.Some = Some;\n Option.None = new class {\n unwrap = (fail) => panic(isDefined(fail) ? getOrProvide(fail) : \"unwrap failed\");\n unwrapOrElse = (value) => getOrProvide(value);\n unwrapOrNull = () => null;\n unwrapOrUndefined = () => undefined;\n contains = (_) => false;\n match = (matchable) => matchable.none();\n ifSome = (_) => { };\n ifAbsent = (exec) => exec(undefined);\n isEmpty = () => true;\n nonEmpty = () => false;\n map = (_) => Option.None;\n mapOr = (_, or) => getOrProvide(or);\n flatMap = (_) => Option.None;\n equals = (other) => other.isEmpty();\n assert = (fail) => panic(getOrProvide(fail) ?? \"assert failed\");\n toString = () => \"{Option.None}\";\n get [Symbol.toStringTag]() { return this.toString(); }\n };\n})(Option || (Option = {}));\n", "import { isDefined } from \"./lang\";\nexport class Iterables {\n static *empty() { }\n static one(value) { return [value]; }\n static count(iterable) {\n let count = 0 | 0;\n for (const _ of iterable) {\n count++;\n }\n return count;\n }\n static some(iterable, predicate) {\n for (const value of iterable) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n }\n static every(iterable, predicate) {\n for (const value of iterable) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n }\n static reduce(iterable, callback, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const value of iterable) {\n accumulator = callback(accumulator, value, index++);\n }\n return accumulator;\n }\n static includes(iterable, include) {\n for (const value of iterable) {\n if (value === include) {\n return true;\n }\n }\n return false;\n }\n static forEach(iterable, procedure) {\n for (const value of iterable) {\n procedure(value);\n }\n }\n static *map(iterable, map) {\n let count = 0 | 0;\n for (const value of iterable) {\n yield map(value, count++);\n }\n }\n static *take(iterator, count) {\n let i = 0;\n for (const value of iterator) {\n if (i++ >= count) {\n return;\n }\n yield value;\n }\n }\n static filter(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n if (fn(value)) {\n result.push(value);\n }\n }\n return result;\n }\n static filterMap(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n const mapped = fn(value);\n if (isDefined(mapped)) {\n result.push(mapped);\n }\n }\n return result;\n }\n static reverse(iterable) {\n const result = [];\n for (const value of iterable) {\n result.push(value);\n }\n return result.reverse();\n }\n static *pairWise(iterable) {\n const iterator = iterable[Symbol.iterator]();\n const { done, value } = iterator.next();\n let prev = value;\n if (done === true) {\n return;\n }\n while (true) {\n const { done, value } = iterator.next();\n if (done === true) {\n yield [prev, null];\n return;\n }\n yield [prev, value];\n prev = value;\n }\n }\n}\n", "import { Arrays } from \"./arrays\";\nimport { EmptyExec } from \"./lang\";\nexport const Terminable = Object.freeze({\n Empty: { terminate: EmptyExec },\n create: (exec) => ({ terminate: exec }),\n many: (...terminables) => ({ terminate: () => { while (terminables.length > 0) {\n terminables.pop().terminate();\n } } })\n});\nexport class Terminator {\n #terminables = [];\n isEmpty() { return this.#terminables.length === 0; }\n nonEmpty() { return this.#terminables.length > 0; }\n own(terminable) {\n this.#terminables.push(terminable);\n return terminable;\n }\n ownAll(...terminables) {\n for (const terminable of terminables) {\n this.#terminables.push(terminable);\n }\n }\n spawn() {\n const terminator = new Terminator();\n terminator.own({ terminate: () => Arrays.removeOpt(this.#terminables, terminator) });\n return this.own(terminator);\n }\n terminate() { while (this.#terminables.length > 0) {\n this.#terminables.pop().terminate();\n } }\n}\nexport class VitalSigns {\n #terminated = false;\n get isTerminated() { return this.#terminated; }\n terminate() { this.#terminated = true; }\n}\nexport class CascadingSubscriptions {\n #current;\n constructor() { this.#current = new Terminator(); }\n next() {\n const current = this.#current;\n const nested = current.own(new Terminator());\n this.#current = nested;\n return {\n own: (subscription) => {\n current.own(subscription);\n return current;\n },\n toObserver: (fn) => (value) => {\n nested.terminate();\n nested.own(fn(value));\n }\n };\n }\n append(subscribe, observer) {\n const current = this.#current;\n const nested = current.own(new Terminator());\n current.own(subscribe((value) => {\n nested.terminate();\n nested.own(observer(value));\n }));\n this.#current = nested;\n return current;\n }\n}\n", "import { Terminable } from \"./terminable\";\nexport class Notifier {\n static subscribeMany(observer, ...observables) {\n return Terminable.many(...observables\n .map(observable => observable.subscribe(() => observer(observable))));\n }\n #observers = new Set(); // A set allows us to remove while iterating\n subscribe(observer) {\n this.#observers.add(observer);\n return { terminate: () => this.#observers.delete(observer) };\n }\n isEmpty() { return this.#observers.size === 0; }\n notify(value) { this.#observers.forEach((observer) => observer(value)); }\n observers() { return this.#observers; }\n terminate() { this.#observers.clear(); }\n}\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static createEstimator = () => {\n const startTime = performance.now();\n let output = TimeSpan.millis(Number.POSITIVE_INFINITY);\n let seconds = 0 | 0;\n return (progress) => {\n if (progress === 0.0) {\n return TimeSpan.POSITIVE_INFINITY;\n }\n if (progress >= 1.0) {\n return TimeSpan.millis(0);\n }\n const elapsedTime = performance.now() - startTime;\n if (elapsedTime > seconds * 1000.0) {\n output = TimeSpan.millis(elapsedTime / progress - elapsedTime);\n seconds++;\n }\n return output;\n };\n };\n static POSITIVE_INFINITY = new TimeSpan(Number.POSITIVE_INFINITY);\n static millis = (value) => new TimeSpan(value);\n static seconds = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_SECOND);\n static minutes = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_MINUTE);\n static hours = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_HOUR);\n static days = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_DAY);\n static toHHMMSS = (seconds) => ((seconds / 3600 | 0) + 100).toString().slice(1) + \":\" +\n (((seconds / 60 | 0) % 60) + 100).toString().slice(1) + \":\" +\n ((seconds % 60) + 100).toString().slice(1);\n static #MILLI_SECONDS_PER_SECOND = 1_000;\n static #MILLI_SECONDS_PER_MINUTE = 60_000;\n static #MILLI_SECONDS_PER_HOUR = 3_600_000;\n static #MILLI_SECONDS_PER_DAY = 86_400_000;\n #ms;\n constructor(ms) { this.#ms = ms; }\n millis() { return this.#ms; }\n absSeconds() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_SECOND; }\n absMinutes() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_MINUTE; }\n absHours() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_HOUR; }\n absDays() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_DAY; }\n split() {\n return {\n d: Math.floor(this.absDays()),\n h: Math.floor(this.absHours()) % 24,\n m: Math.floor(this.absMinutes()) % 60,\n s: Math.floor(this.absSeconds()) % 60\n };\n }\n isNow() { return this.#ms === 0.0; }\n isPast() { return this.#ms < 0.0; }\n isFuture() { return this.#ms > 0.0; }\n toUnitString() {\n let value, unit;\n const seconds = Math.floor(Math.abs(this.#ms) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (seconds < 60) {\n value = seconds;\n unit = \"second\";\n }\n else if (minutes < 60) {\n value = minutes;\n unit = \"minute\";\n }\n else if (hours < 24) {\n value = hours;\n unit = \"hour\";\n }\n else {\n value = days;\n unit = \"day\";\n }\n return new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\", style: \"long\" })\n .format(value * Math.sign(this.#ms), unit);\n }\n toString() {\n if (isNaN(this.#ms)) {\n return \"NaN\";\n }\n if (!isFinite(this.#ms)) {\n return \"\u221E\";\n }\n const { d, h, m, s } = this.split();\n if (d > 0) {\n return [\n TimeSpan.#quantity(\"d\", d), TimeSpan.#quantity(\"h\", h),\n TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (h > 0) {\n return [\n TimeSpan.#quantity(\"h\", h), TimeSpan.#quantity(\"m\", m),\n TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (m > 0) {\n return [TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)]\n .join(\", \");\n }\n else if (s > 0) {\n return TimeSpan.#quantity(\"s\", s);\n }\n else {\n return \"now\";\n }\n }\n static #quantity = (name, count) => {\n switch (name) {\n case \"d\":\n return `${count} ${count < 2 ? \"day\" : \"days\"}`;\n case \"h\":\n return `${count} ${count < 2 ? \"hour\" : \"hours\"}`;\n case \"m\":\n return `${count} ${count < 2 ? \"minute\" : \"minutes\"}`;\n case \"s\":\n return `${count} ${count < 2 ? \"second\" : \"seconds\"}`;\n default:\n return Unhandled(name);\n }\n };\n}\n", "import { asDefined, assert, isDefined, Iterables, panic } from \"@opendaw/lib-std\";\n/**\n * Communicator provides type-safe communication between Window, Worker, MessagePort, BroadcastChannel.\n * Passed objects are structured cloned: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n * It is highly advised not to pass classes with methods and or real private properties (starting with #).\n * They will lose their prototype and private property inheritance, and it is cumbersome to patch that up later.\n * Also read: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n */\nexport var Communicator;\n(function (Communicator) {\n class Transfer {\n value;\n constructor(value) {\n this.value = value;\n }\n }\n Communicator.Transfer = Transfer;\n Communicator.makeTransferable = (value) => new Transfer(value);\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n const extractTransferables = (args) => {\n const transferables = [];\n for (const arg of args) {\n if (arg instanceof Transfer) {\n transferables.push(arg.value);\n }\n else if (arg instanceof MessagePort) {\n transferables.push(arg);\n }\n else if (typeof ImageBitmap !== \"undefined\" && arg instanceof ImageBitmap) {\n transferables.push(arg);\n }\n else if (typeof OffscreenCanvas !== \"undefined\" && arg instanceof OffscreenCanvas) {\n transferables.push(arg);\n }\n }\n return transferables;\n };\n const unwrapArg = (arg) => arg instanceof Transfer ? arg.value : arg;\n class Sender {\n #messenger;\n #expected = new Map();\n #subscription;\n #returnId = 0;\n constructor(messenger) {\n this.#messenger = messenger;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n dispatchAndForget = (func, ...args) => {\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: unwrapArg(arg) })))\n }, transferables);\n };\n dispatchAndReturn = (func, ...args) => new Promise((resolve, reject) => {\n const entries = Iterables.reduce(args, (callbacks, arg, index) => {\n if (typeof arg === \"function\") {\n callbacks.push([index, arg]);\n }\n return callbacks;\n }, []);\n this.#expected.set(this.#returnId, {\n executorTuple: { resolve, reject },\n callbacks: new Map(entries)\n });\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: this.#returnId,\n func: func.name,\n args: Array.from(Iterables.map(args, (arg, index) => typeof arg === \"function\" ? ({ callback: index }) : ({ value: unwrapArg(arg) })))\n }, transferables);\n this.#returnId++;\n });\n #messageHandler = (message) => {\n const returns = this.#expected.get(message.returnId);\n if (isDefined(returns)) {\n if (message.type === \"resolve\") {\n returns.executorTuple.resolve(message.resolve);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"reject\") {\n returns.executorTuple.reject(message.reject);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"callback\") {\n returns.callbacks?.get(message.funcAt).apply(this, message.args);\n }\n }\n else {\n panic(`Promise has already been resolved. ${JSON.stringify(message)}`);\n }\n };\n }\n class Executor {\n #messenger;\n #protocol;\n #subscription;\n constructor(messenger, protocol) {\n this.#messenger = messenger;\n this.#protocol = protocol;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n #messageHandler = (message) => {\n assert(message.type === \"send\", () => \"Message type must be 'send'\");\n const object = Object.getPrototypeOf(this.#protocol) === Object.getPrototypeOf({})\n ? this.#protocol : Object.getPrototypeOf(this.#protocol);\n const func = asDefined(object[message.func], `${message.func.toString()} does not exists on ${this.#protocol}`);\n const returnId = message.returnId;\n if (returnId === false) {\n func.apply(this.#protocol, message.args.map((arg) => \"value\" in arg\n ? arg.value : panic(`${message.func.toString()} has no promise.`)));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg ? (...args) => this.#sendCallback(returnId, arg.callback, args) : arg.value));\n promise.then(value => {\n try {\n this.#sendResolve(returnId, value);\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }, reason => this.#sendReject(returnId, reason));\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }\n };\n #sendResolve = (returnId, value) => this.#messenger.send({ type: \"resolve\", returnId, resolve: value });\n #sendReject = (returnId, reason) => this.#messenger.send({ type: \"reject\", returnId, reject: reason });\n #sendCallback = (returnId, func, args) => this.#messenger.send({ type: \"callback\", returnId, funcAt: func, args });\n }\n Communicator.Executor = Executor;\n})(Communicator || (Communicator = {}));\n", "import { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nconst EmptyTransferables = [];\nclass NativeMessenger {\n #port;\n #notifier = new Notifier();\n constructor(port) {\n this.#port = port;\n if (isDefined(port.onmessage) || isDefined(port.onmessageerror)) {\n console.error(port);\n throw new Error(`${port} is already wrapped.`);\n }\n port.onmessage = (event) => this.#notifier.notify(event.data);\n port.onmessageerror = (event) => { throw new Error(event.type); };\n }\n send(message, transfer) {\n this.#port.postMessage(message, transfer ?? EmptyTransferables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#notifier.terminate();\n this.#port.onmessage = null;\n this.#port.onmessageerror = null;\n }\n}\n// with '__id__' we put in a little security that we are only communicating with the messenger we created\nclass Channel {\n #messages;\n #name;\n #notifier = new Notifier();\n #subscription;\n constructor(messages, name) {\n this.#messages = messages;\n this.#name = name;\n this.#subscription = messages.subscribe(data => {\n if (\"__id__\" in data && data.__id__ === \"42\" && \"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message, transferrables) {\n this.#messages.send({ __id__: \"42\", channel: this.#name, message }, transferrables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#subscription.terminate();\n this.#notifier.terminate();\n }\n}\n", "import { tryCatch } from \"@opendaw/lib-std\";\nexport var Wait;\n(function (Wait) {\n Wait.frame = () => new Promise(resolve => requestAnimationFrame(() => resolve()));\n Wait.frames = (numFrames) => new Promise(resolve => {\n let count = numFrames;\n const callback = () => { if (--count <= 0) {\n resolve();\n }\n else {\n requestAnimationFrame(callback);\n } };\n requestAnimationFrame(callback);\n });\n Wait.timeSpan = (time, ...args) => new Promise(resolve => setTimeout(resolve, time.millis(), ...args));\n Wait.event = (target, type) => new Promise(resolve => target.addEventListener(type, resolve, { once: true }));\n Wait.observable = (observable) => new Promise(resolve => {\n const terminable = observable.subscribe(() => {\n terminable.terminate();\n resolve();\n });\n });\n Wait.complete = (generator) => new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const { status, value: next, error } = tryCatch(() => generator.next());\n if (status === \"success\") {\n const { done, value } = next;\n if (done) {\n clearInterval(interval);\n resolve(value);\n }\n }\n else {\n clearInterval(interval);\n reject(error);\n }\n }, 0);\n });\n})(Wait || (Wait = {}));\n", "// Pulses per quarter note (PPQN)\n// 960 = 3*5*2^6\nconst Quarter = 960;\nconst Bar = Quarter << 2; // 3_840\nconst SemiQuaver = Quarter >>> 2; // 240\nconst fromSignature = (nominator, denominator) => Math.floor(Bar / denominator) * nominator;\nconst toParts = (ppqn, nominator = 4, denominator = 4) => {\n const lowerPulses = fromSignature(1, denominator);\n const beats = Math.floor(ppqn / lowerPulses);\n const bars = Math.floor(beats / nominator);\n const remainingPulses = Math.floor(ppqn) - fromSignature(bars * nominator, denominator);\n const ticks = remainingPulses % lowerPulses;\n const semiquavers = Math.floor(ticks / SemiQuaver);\n const remainingTicks = ticks % SemiQuaver;\n return {\n bars,\n beats: beats - bars * nominator,\n semiquavers,\n ticks: remainingTicks\n };\n};\nconst secondsToPulses = (seconds, bpm) => seconds * bpm / 60.0 * Quarter;\nconst pulsesToSeconds = (pulses, bpm) => (pulses * 60.0 / Quarter) / bpm;\nconst secondsToBpm = (seconds, pulses) => (pulses * 60.0 / Quarter) / seconds;\nconst samplesToPulses = (samples, bpm, sampleRate) => secondsToPulses(samples / sampleRate, bpm);\nconst pulsesToSamples = (pulses, bpm, sampleRate) => pulsesToSeconds(pulses, bpm) * sampleRate;\nexport const PPQN = {\n Bar,\n Quarter,\n SemiQuaver,\n fromSignature,\n toParts,\n secondsToPulses,\n pulsesToSeconds,\n secondsToBpm,\n samplesToPulses,\n pulsesToSamples,\n toString: (pulses, nominator = 4, denominator = 4) => {\n const { bars, beats, semiquavers, ticks } = toParts(pulses | 0, nominator, denominator);\n return `${bars + 1}.${beats + 1}.${semiquavers + 1}:${ticks}`;\n }\n};\n", "import { PPQN } from \"./ppqn\";\nexport const RenderQuantum = 128 | 0;\nexport const TempoChangeGrid = PPQN.fromSignature(1, 48); // make dynamic window 10ms\nexport const SILENCE_THRESHOLD = 1e-4; // \u2248 -80 dB\n", "const LogDb = Math.log(10.0) / 20.0;\nexport const midiToHz = (note = 60.0, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (note + 3.0) / 12.0 - 6.0);\nexport const hzToMidi = (hz, baseFrequency = 440.0) => (12.0 * Math.log(hz / baseFrequency) + 69.0 * Math.LN2) / Math.LN2;\nexport const dbToGain = (db) => Math.exp(db * LogDb);\nexport const gainToDb = (gain) => Math.log(gain) / LogDb;\nexport const velocityToGain = (velocity) => dbToGain(20 * Math.log10(velocity));\nexport const barsToBpm = (bars, duration) => (bars * 240.0) / duration;\nexport const bpmToBars = (bpm, duration) => (bpm * duration) / 240.0;\nexport const estimateBpm = (duration, maxBpm = 180.0) => {\n const bpm = barsToBpm(Math.pow(2.0, Math.floor(Math.log(bpmToBars(maxBpm, duration)) / Math.LN2)), duration);\n return Math.round(bpm * 1000.0) / 1000.0;\n};\nexport const semitoneToHz = (semitones, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (semitones - 69.0) / 12.0);\nexport const hzToSemitone = (hz, baseFrequency = 440.0) => 69.0 + 12.0 * Math.log2(hz / baseFrequency);\n", "type WorkletProcessorConstructor = new (options: Record<string, unknown>) => AudioWorkletProcessor\n\nexport type WorkletGlobals = {\n sampleRate: number\n currentFrame: number\n currentTime: number\n AudioWorkletProcessor: typeof AudioWorkletProcessor\n registerProcessor: (name: string, ctor: WorkletProcessorConstructor) => void\n __registeredProcessors__: Record<string, WorkletProcessorConstructor>\n __workletPort__: MessagePort\n}\n\nconst globals = globalThis as unknown as WorkletGlobals\n\nexport class AudioWorkletProcessor {\n readonly port: MessagePort\n constructor() { this.port = globals.__workletPort__ }\n process(_inputs: Float32Array[][], _outputs: Float32Array[][]): boolean { return false }\n}\n\nexport const setupWorkletGlobals = (config: { sampleRate: number }): void => {\n globals.sampleRate = config.sampleRate\n globals.currentFrame = 0\n globals.currentTime = 0\n globals.AudioWorkletProcessor = AudioWorkletProcessor\n globals.registerProcessor = (name: string, ctor: WorkletProcessorConstructor) => {\n globals.__registeredProcessors__ = globals.__registeredProcessors__ || {}\n globals.__registeredProcessors__[name] = ctor\n }\n}\n\nexport const updateFrameTime = (frame: number, sampleRate: number): void => {\n globals.currentFrame = frame\n globals.currentTime = frame / sampleRate\n}", "import {Arrays, int, isDefined, Option, TimeSpan} from \"@opendaw/lib-std\"\nimport {Communicator, Messenger, Wait} from \"@opendaw/lib-runtime\"\nimport {dbToGain, RenderQuantum} from \"@opendaw/lib-dsp\"\nimport {OfflineEngineInitializeConfig, OfflineEngineProtocol, OfflineEngineRenderConfig} from \"@opendaw/studio-adapters\"\nimport {AudioWorkletProcessor, setupWorkletGlobals, updateFrameTime, WorkletGlobals} from \"./worklet-env\"\n\nconst globals = globalThis as unknown as WorkletGlobals\n\ntype EngineState = {\n readonly processor: AudioWorkletProcessor\n readonly sampleRate: int\n readonly numberOfChannels: int\n totalFrames: int\n running: boolean\n}\n\nlet state: Option<EngineState> = Option.None\n\nCommunicator.executor<OfflineEngineProtocol>(\n Messenger.for(self).channel(\"offline-engine\"), {\n async initialize(enginePort: MessagePort, config: OfflineEngineInitializeConfig) {\n setupWorkletGlobals({sampleRate: config.sampleRate})\n globals.__workletPort__ = enginePort\n await import(config.processorsUrl)\n const ProcessorClass = globals.__registeredProcessors__[\"engine-processor\"]\n state = Option.wrap({\n processor: new ProcessorClass({\n processorOptions: {\n syncStreamBuffer: config.syncStreamBuffer,\n controlFlagsBuffer: config.controlFlagsBuffer,\n hrClockBuffer: new SharedArrayBuffer(32),\n project: config.project,\n exportConfiguration: config.exportConfiguration\n }\n }),\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels,\n totalFrames: 0,\n running: false\n })\n },\n async step(numSamples: int): Promise<Float32Array[]> {\n const engine = state.unwrap()\n const result: Float32Array[] = Arrays.create(() => new Float32Array(numSamples), engine.numberOfChannels)\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n let offset = 0 | 0\n while (offset < numSamples) {\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n engine.processor.process([[]], outputs)\n engine.totalFrames += RenderQuantum\n const needed = numSamples - offset\n const toCopy = Math.min(needed, RenderQuantum)\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n result[ch].set(outputs[0][ch].subarray(0, toCopy), offset)\n }\n offset += toCopy\n }\n return result\n },\n async render(config: OfflineEngineRenderConfig) {\n const engine = state.unwrap()\n const {silenceThresholdDb, silenceDurationSeconds, maxDurationSeconds} = config\n const threshold = dbToGain(silenceThresholdDb ?? -72.0)\n const silenceFramesNeeded = Math.ceil((silenceDurationSeconds ?? 10) * engine.sampleRate)\n const maxFrames = isDefined(maxDurationSeconds) ? Math.ceil(maxDurationSeconds * engine.sampleRate) : Infinity\n const chunks: Float32Array[][] = Arrays.create(() => [], engine.numberOfChannels)\n let consecutiveSilentFrames = 0\n let hasHadAudio = false\n let lastYield = 0\n engine.running = true\n await Wait.timeSpan(TimeSpan.seconds(0))\n while (engine.running && engine.totalFrames < maxFrames) {\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n const keepRunning = engine.processor.process([[]], outputs)\n let maxSample = 0\n for (const channel of outputs[0]) {\n for (const sample of channel) {\n const absoluteValue = Math.abs(sample)\n if (absoluteValue > maxSample) {maxSample = absoluteValue}\n }\n }\n const isSilent = maxSample <= threshold\n if (maxSample > threshold) {hasHadAudio = true}\n if (isSilent && hasHadAudio) {\n consecutiveSilentFrames += RenderQuantum\n if (consecutiveSilentFrames >= silenceFramesNeeded) {break}\n } else {\n consecutiveSilentFrames = 0\n }\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n chunks[ch].push(outputs[0][ch].slice())\n }\n engine.totalFrames += RenderQuantum\n if (!keepRunning) {break}\n if (engine.totalFrames - lastYield >= engine.sampleRate) {\n lastYield = engine.totalFrames\n await new Promise(resolve => setTimeout(resolve, 0))\n }\n }\n const framesToKeep = engine.totalFrames - consecutiveSilentFrames + Math.min(engine.sampleRate / 4, consecutiveSilentFrames)\n return Arrays.create(channelIndex => {\n const total = new Float32Array(framesToKeep)\n let offset = 0\n for (const chunk of chunks[channelIndex]) {\n if (offset >= framesToKeep) {break}\n const toCopy = Math.min(chunk.length, framesToKeep - offset)\n total.set(chunk.subarray(0, toCopy), offset)\n offset += toCopy\n }\n return total\n }, engine.numberOfChannels)\n },\n stop() { state.unwrap().running = false }\n }\n)\n"],
|
|
4
|
+
"sourcesContent": ["// noinspection JSUnusedGlobalSymbols\nexport const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const isNull = (value) => value === null;\nexport const isNotNull = (value) => value !== null;\nexport const isUndefined = (value) => value === undefined;\nexport const isNotUndefined = (value) => value !== undefined;\nexport const isAbsent = (value) => value === undefined || value === null;\nexport const ifDefined = (value, procedure) => value !== undefined && value !== null ? procedure(value) : undefined;\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(getOrProvide(fail)) : value;\nexport const isInstanceOf = (obj, clazz) => obj instanceof clazz;\nexport const asInstanceOf = (obj, clazz) => obj instanceof clazz ? obj : panic(`${obj} is not instance of ${clazz}`);\nexport const assertInstanceOf = (obj, clazz) => {\n if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n }\n};\nexport const isSameClass = (a, b) => a.constructor === b.constructor;\nexport const tryProvide = (provider) => {\n try {\n return provider();\n }\n catch (reason) {\n return panic(String(reason));\n }\n};\nexport const getOrProvide = (value) => value instanceof Function ? value() : value;\nexport const safeWrite = (object, property, value) => property in object ? object[property] = value : undefined;\nexport const safeExecute = (func, ...args) => func?.apply(null, args);\nexport const isRecord = (value) => isDefined(value) && typeof value === \"object\";\nexport const hasField = (record, key, type) => {\n if (!(key in record))\n return false;\n const value = record[key];\n return type === \"null\" ? value === null : typeof value === type;\n};\nexport const safeRead = (object, ...keys) => {\n let current = object;\n for (const key of keys) {\n if (!isRecord(current) || !(key in current)) {\n return undefined;\n }\n current = current[key];\n }\n return current;\n};\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => {\n throw typeof issue === \"string\" ? new Error(issue) : issue;\n};\nexport const assert = (condition, fail) => condition ? undefined : panic(getOrProvide(fail));\nexport const checkIndex = (index, array) => index >= 0 && index < array.length ? index : panic(`Index ${index} is out of bounds`);\nexport const InaccessibleProperty = (failMessage) => new Proxy({}, { get() { return panic(failMessage); } });\nexport const canWrite = (obj, key) => {\n while (isDefined(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (isDefined(descriptor)) {\n return typeof descriptor.set === \"function\";\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n};\nexport const requireProperty = (object, key) => {\n const { status, value } = tryCatch(() => object instanceof Function ? object.name : object.constructor.name);\n const feature = status === \"failure\" ? `${object}.${String(key)}` : `${value}.${String(key)}`;\n if (!(key in object)) {\n throw `${feature} not available`;\n }\n console.debug(`%c${feature}%c available`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n};\nexport class SuccessResult {\n value;\n status = \"success\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when succeeded\");\n}\nexport class FailureResult {\n error;\n status = \"failure\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when failed\");\n}\nexport const tryCatch = (statement) => {\n try {\n return new SuccessResult(statement());\n }\n catch (error) {\n return new FailureResult(error);\n }\n};\nexport const isValidIdentifier = (identifier) => /^[A-Za-z_$][A-Za-z0-9_]*$/.test(identifier);\nexport const asValidIdentifier = (identifier) => isValidIdentifier(identifier) ? identifier : panic(`'${identifier}' is not a valid identifier`);\nexport const asEnumValue = (value, enm) => {\n const keys = Object.keys(enm);\n if (keys.length === 0)\n return panic(\"Empty enum object (are you using `const enum`?)\");\n const values = Object.keys(enm)\n .filter(k => isNaN(Number(k)))\n .map(k => enm[k]);\n return values.includes(value) ? value : panic(`Invalid enum value: ${String(value)}`);\n};\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\n", "import { asDefined, panic } from \"./lang\";\nexport var Sorting;\n(function (Sorting) {\n Sorting[Sorting[\"Ascending\"] = 1] = \"Ascending\";\n Sorting[Sorting[\"Descending\"] = -1] = \"Descending\";\n})(Sorting || (Sorting = {}));\nexport class Arrays {\n static #empty = Object.freeze(new Array(0));\n static empty = () => (() => this.#empty)();\n static clear = (array) => { array.length = 0; };\n static replace = (array, newValues) => {\n array.length = 0;\n array.push(...newValues);\n };\n static consume = (array, procedure) => {\n for (let index = 0; index < array.length;) {\n if (procedure(array[index])) {\n array.splice(index, 1);\n }\n else {\n index++;\n }\n }\n };\n static peekFirst = (array) => array.at(0) ?? null;\n static peekLast = (array) => array.at(-1) ?? null;\n static getFirst = (array, fail) => asDefined(array.at(0), fail);\n static getLast = (array, fail) => asDefined(array.at(-1), fail);\n static getPrev = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index - 1) % array.length), \"Internal Error\");\n };\n static getNext = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index + 1) % array.length), \"Internal Error\");\n };\n static removeLast = (array, fail) => asDefined(array.pop(), fail);\n static create = (factory, n) => {\n const array = new Array(n);\n for (let i = 0; i < n; i++) {\n array[i] = factory(i);\n }\n return array;\n };\n static equals = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n /**\n * The satisfy method checks if all elements in a given array satisfy a provided predicate function\n * when compared with the first element of the array. That essentially means that all tested properties\n * in the predicate function are equal throughout the array.\n * [1, 1, 1, 1, 1] > (a, b) => a === b returns true\n * [1, 1, 1, 1, 2] > (a, b) => a === b returns false\n * [1, 1, 3, 2, 1] > (a, b) => a === b returns false\n */\n static satisfy = (array, predicate) => {\n if (array.length < 2) {\n return true;\n }\n const first = array[0];\n for (let i = 1; i < array.length; i++) {\n if (!predicate(first, array[i])) {\n return false;\n }\n }\n return true;\n };\n static remove = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n array.splice(index, 1);\n };\n static removeIf = (array, predicate) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n array.splice(i, 1);\n }\n }\n };\n static removeOpt = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return false;\n }\n array.splice(index, 1);\n return true;\n };\n static hasDuplicates = (array) => new Set(array).size < array.length;\n static removeDuplicates = (array) => {\n let index = 0 | 0;\n const result = new Set();\n for (const element of array) {\n if (!result.has(element)) {\n result.add(element);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static removeDuplicateKeys = (array, key) => {\n let index = 0 | 0;\n const seen = new Set();\n for (const element of array) {\n const value = element[key];\n if (!seen.has(value)) {\n seen.add(value);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static subtract(array, excludeArray, compareFn) {\n return array.filter(item => !excludeArray.some(excludeItem => compareFn(item, excludeItem)));\n }\n static intersect(array, other, compareFn) {\n return array.filter(item => other.some(includeItem => compareFn(item, includeItem)));\n }\n static merge(baseArray, mergeIntoArray, compareFn) {\n return [...(baseArray\n .filter(baseItem => !mergeIntoArray\n .some(mergeItem => compareFn(baseItem, mergeItem)))), ...mergeIntoArray];\n }\n static *iterate(array) {\n for (let i = 0; i < array.length; i++) {\n yield array[i];\n }\n }\n static *iterateReverse(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n yield array[i];\n }\n }\n static *iterateStateFull(array) {\n const maxIndex = array.length - 1;\n for (let i = 0; i <= maxIndex; i++) {\n yield { value: array[i], isFirst: i === 0, isLast: i === maxIndex };\n }\n }\n static *iterateAdjacent(array) {\n if (array.length <= 1) {\n return;\n }\n for (let i = 1, left = array[0]; i < array.length; i++) {\n const right = array[i];\n yield [left, right];\n left = right;\n }\n }\n static isSorted(array, sorting = Sorting.Ascending) {\n if (array.length < 2) {\n return true;\n }\n let prev = array[0];\n for (let i = 1; i < array.length; i++) {\n const next = array[i];\n if (Math.sign(prev - next) === sorting) {\n return false;\n }\n prev = next;\n }\n return true;\n }\n static toRecord(array, toKey) {\n return array.reduce((record, value) => {\n record[toKey(value)] = value;\n return record;\n }, {});\n }\n static concatArrayBuffers(a, b) {\n const result = new ArrayBuffer(a.byteLength + b.byteLength);\n const view = new Uint8Array(result);\n view.set(new Uint8Array(a), 0);\n view.set(new Uint8Array(b), a.byteLength);\n return result;\n }\n}\n", "import { asDefined, getOrProvide, isDefined, panic } from \"./lang\";\nexport var Option;\n(function (Option) {\n Option.wrap = (value) => isDefined(value) ? new Some(value) : Option.None;\n Option.from = (provider) => Option.wrap(provider());\n Option.tryCatch = (provider) => {\n try {\n return Option.wrap(provider());\n }\n catch (_error) {\n return Option.None;\n }\n };\n Option.execute = (func, ...args) => Option.wrap(func?.apply(null, args));\n Option.async = (promise) => promise.then(value => Option.wrap(value), () => Option.None);\n class Some {\n #value;\n constructor(value) { this.#value = asDefined(value); }\n unwrap() { return this.#value; }\n unwrapOrElse(_) { return this.#value; }\n unwrapOrNull() { return this.#value; }\n unwrapOrUndefined() { return this.#value; }\n contains(value) { return value === this.#value; }\n match(matchable) { return matchable.some(this.#value); }\n ifSome(run) { return run(this.#value); }\n ifAbsent(_func) { return undefined; }\n isEmpty() { return false; }\n nonEmpty() { return true; }\n map(callback) { return Option.wrap(callback(this.#value)); }\n mapOr(func, _or) { return func(this.#value); }\n flatMap(callback) { return callback(this.#value); }\n equals(other) { return this.unwrapOrNull() === other.unwrapOrNull(); }\n assert(_fail) { return this; }\n toString() { return `{Option.Some(${this.#value})}`; }\n get [Symbol.toStringTag]() { return this.toString(); }\n }\n Option.Some = Some;\n Option.None = new class {\n unwrap = (fail) => panic(isDefined(fail) ? getOrProvide(fail) : \"unwrap failed\");\n unwrapOrElse = (value) => getOrProvide(value);\n unwrapOrNull = () => null;\n unwrapOrUndefined = () => undefined;\n contains = (_) => false;\n match = (matchable) => matchable.none();\n ifSome = (_) => { };\n ifAbsent = (exec) => exec(undefined);\n isEmpty = () => true;\n nonEmpty = () => false;\n map = (_) => Option.None;\n mapOr = (_, or) => getOrProvide(or);\n flatMap = (_) => Option.None;\n equals = (other) => other.isEmpty();\n assert = (fail) => panic(getOrProvide(fail) ?? \"assert failed\");\n toString = () => \"{Option.None}\";\n get [Symbol.toStringTag]() { return this.toString(); }\n };\n})(Option || (Option = {}));\n", "import { isDefined } from \"./lang\";\nexport class Iterables {\n static *empty() { }\n static one(value) { return [value]; }\n static count(iterable) {\n let count = 0 | 0;\n for (const _ of iterable) {\n count++;\n }\n return count;\n }\n static some(iterable, predicate) {\n for (const value of iterable) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n }\n static every(iterable, predicate) {\n for (const value of iterable) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n }\n static reduce(iterable, callback, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const value of iterable) {\n accumulator = callback(accumulator, value, index++);\n }\n return accumulator;\n }\n static includes(iterable, include) {\n for (const value of iterable) {\n if (value === include) {\n return true;\n }\n }\n return false;\n }\n static forEach(iterable, procedure) {\n for (const value of iterable) {\n procedure(value);\n }\n }\n static *map(iterable, map) {\n let count = 0 | 0;\n for (const value of iterable) {\n yield map(value, count++);\n }\n }\n static *take(iterator, count) {\n let i = 0;\n for (const value of iterator) {\n if (i++ >= count) {\n return;\n }\n yield value;\n }\n }\n static filter(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n if (fn(value)) {\n result.push(value);\n }\n }\n return result;\n }\n static filterMap(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n const mapped = fn(value);\n if (isDefined(mapped)) {\n result.push(mapped);\n }\n }\n return result;\n }\n static reverse(iterable) {\n const result = [];\n for (const value of iterable) {\n result.push(value);\n }\n return result.reverse();\n }\n static *pairWise(iterable) {\n const iterator = iterable[Symbol.iterator]();\n const { done, value } = iterator.next();\n let prev = value;\n if (done === true) {\n return;\n }\n while (true) {\n const { done, value } = iterator.next();\n if (done === true) {\n yield [prev, null];\n return;\n }\n yield [prev, value];\n prev = value;\n }\n }\n}\n", "import { Arrays } from \"./arrays\";\nimport { EmptyExec } from \"./lang\";\nexport const Terminable = Object.freeze({\n Empty: { terminate: EmptyExec },\n create: (exec) => ({ terminate: exec }),\n many: (...terminables) => ({ terminate: () => { while (terminables.length > 0) {\n terminables.pop().terminate();\n } } })\n});\nexport class Terminator {\n #terminables = [];\n isEmpty() { return this.#terminables.length === 0; }\n nonEmpty() { return this.#terminables.length > 0; }\n own(terminable) {\n this.#terminables.push(terminable);\n return terminable;\n }\n ownAll(...terminables) {\n for (const terminable of terminables) {\n this.#terminables.push(terminable);\n }\n }\n spawn() {\n const terminator = new Terminator();\n terminator.own({ terminate: () => Arrays.removeOpt(this.#terminables, terminator) });\n return this.own(terminator);\n }\n terminate() { while (this.#terminables.length > 0) {\n this.#terminables.pop().terminate();\n } }\n}\nexport class VitalSigns {\n #terminated = false;\n get isTerminated() { return this.#terminated; }\n terminate() { this.#terminated = true; }\n}\nexport class CascadingSubscriptions {\n #current;\n constructor() { this.#current = new Terminator(); }\n next() {\n const current = this.#current;\n const nested = current.own(new Terminator());\n this.#current = nested;\n return {\n own: (subscription) => {\n current.own(subscription);\n return current;\n },\n toObserver: (fn) => (value) => {\n nested.terminate();\n nested.own(fn(value));\n }\n };\n }\n append(subscribe, observer) {\n const current = this.#current;\n const nested = current.own(new Terminator());\n current.own(subscribe((value) => {\n nested.terminate();\n nested.own(observer(value));\n }));\n this.#current = nested;\n return current;\n }\n}\n", "import { Terminable } from \"./terminable\";\nexport class Notifier {\n static subscribeMany(observer, ...observables) {\n return Terminable.many(...observables\n .map(observable => observable.subscribe(() => observer(observable))));\n }\n #observers = new Set(); // A set allows us to remove while iterating\n subscribe(observer) {\n this.#observers.add(observer);\n return { terminate: () => this.#observers.delete(observer) };\n }\n isEmpty() { return this.#observers.size === 0; }\n notify(value) { this.#observers.forEach((observer) => observer(value)); }\n observers() { return this.#observers; }\n terminate() { this.#observers.clear(); }\n}\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static createEstimator = () => {\n const startTime = performance.now();\n let output = TimeSpan.millis(Number.POSITIVE_INFINITY);\n let seconds = 0 | 0;\n return (progress) => {\n if (progress === 0.0) {\n return TimeSpan.POSITIVE_INFINITY;\n }\n if (progress >= 1.0) {\n return TimeSpan.millis(0);\n }\n const elapsedTime = performance.now() - startTime;\n if (elapsedTime > seconds * 1000.0) {\n output = TimeSpan.millis(elapsedTime / progress - elapsedTime);\n seconds++;\n }\n return output;\n };\n };\n static POSITIVE_INFINITY = new TimeSpan(Number.POSITIVE_INFINITY);\n static millis = (value) => new TimeSpan(value);\n static seconds = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_SECOND);\n static minutes = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_MINUTE);\n static hours = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_HOUR);\n static days = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_DAY);\n static toHHMMSS = (seconds) => ((seconds / 3600 | 0) + 100).toString().slice(1) + \":\" +\n (((seconds / 60 | 0) % 60) + 100).toString().slice(1) + \":\" +\n ((seconds % 60) + 100).toString().slice(1);\n static #MILLI_SECONDS_PER_SECOND = 1_000;\n static #MILLI_SECONDS_PER_MINUTE = 60_000;\n static #MILLI_SECONDS_PER_HOUR = 3_600_000;\n static #MILLI_SECONDS_PER_DAY = 86_400_000;\n #ms;\n constructor(ms) { this.#ms = ms; }\n millis() { return this.#ms; }\n absSeconds() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_SECOND; }\n absMinutes() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_MINUTE; }\n absHours() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_HOUR; }\n absDays() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_DAY; }\n split() {\n return {\n d: Math.floor(this.absDays()),\n h: Math.floor(this.absHours()) % 24,\n m: Math.floor(this.absMinutes()) % 60,\n s: Math.floor(this.absSeconds()) % 60\n };\n }\n isNow() { return this.#ms === 0.0; }\n isPast() { return this.#ms < 0.0; }\n isFuture() { return this.#ms > 0.0; }\n toUnitString() {\n let value, unit;\n const seconds = Math.floor(Math.abs(this.#ms) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (seconds < 60) {\n value = seconds;\n unit = \"second\";\n }\n else if (minutes < 60) {\n value = minutes;\n unit = \"minute\";\n }\n else if (hours < 24) {\n value = hours;\n unit = \"hour\";\n }\n else {\n value = days;\n unit = \"day\";\n }\n return new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\", style: \"long\" })\n .format(value * Math.sign(this.#ms), unit);\n }\n toString() {\n if (isNaN(this.#ms)) {\n return \"NaN\";\n }\n if (!isFinite(this.#ms)) {\n return \"\u221E\";\n }\n const { d, h, m, s } = this.split();\n if (d > 0) {\n return [\n TimeSpan.#quantity(\"d\", d), TimeSpan.#quantity(\"h\", h),\n TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (h > 0) {\n return [\n TimeSpan.#quantity(\"h\", h), TimeSpan.#quantity(\"m\", m),\n TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (m > 0) {\n return [TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)]\n .join(\", \");\n }\n else if (s > 0) {\n return TimeSpan.#quantity(\"s\", s);\n }\n else {\n return \"now\";\n }\n }\n static #quantity = (name, count) => {\n switch (name) {\n case \"d\":\n return `${count} ${count < 2 ? \"day\" : \"days\"}`;\n case \"h\":\n return `${count} ${count < 2 ? \"hour\" : \"hours\"}`;\n case \"m\":\n return `${count} ${count < 2 ? \"minute\" : \"minutes\"}`;\n case \"s\":\n return `${count} ${count < 2 ? \"second\" : \"seconds\"}`;\n default:\n return Unhandled(name);\n }\n };\n}\n", "import { asDefined, assert, isDefined, Iterables, panic } from \"@opendaw/lib-std\";\n/**\n * Communicator provides type-safe communication between Window, Worker, MessagePort, BroadcastChannel.\n * Passed objects are structured cloned: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n * It is highly advised not to pass classes with methods and or real private properties (starting with #).\n * They will lose their prototype and private property inheritance, and it is cumbersome to patch that up later.\n * Also read: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n */\nexport var Communicator;\n(function (Communicator) {\n class Transfer {\n value;\n constructor(value) {\n this.value = value;\n }\n }\n Communicator.Transfer = Transfer;\n Communicator.makeTransferable = (value) => new Transfer(value);\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n const extractTransferables = (args) => {\n const transferables = [];\n for (const arg of args) {\n if (arg instanceof Transfer) {\n transferables.push(arg.value);\n }\n else if (arg instanceof MessagePort) {\n transferables.push(arg);\n }\n else if (typeof ImageBitmap !== \"undefined\" && arg instanceof ImageBitmap) {\n transferables.push(arg);\n }\n else if (typeof OffscreenCanvas !== \"undefined\" && arg instanceof OffscreenCanvas) {\n transferables.push(arg);\n }\n }\n return transferables;\n };\n const unwrapArg = (arg) => arg instanceof Transfer ? arg.value : arg;\n class Sender {\n #messenger;\n #expected = new Map();\n #subscription;\n #returnId = 0;\n constructor(messenger) {\n this.#messenger = messenger;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n dispatchAndForget = (func, ...args) => {\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: unwrapArg(arg) })))\n }, transferables);\n };\n dispatchAndReturn = (func, ...args) => new Promise((resolve, reject) => {\n const entries = Iterables.reduce(args, (callbacks, arg, index) => {\n if (typeof arg === \"function\") {\n callbacks.push([index, arg]);\n }\n return callbacks;\n }, []);\n this.#expected.set(this.#returnId, {\n executorTuple: { resolve, reject },\n callbacks: new Map(entries)\n });\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: this.#returnId,\n func: func.name,\n args: Array.from(Iterables.map(args, (arg, index) => typeof arg === \"function\" ? ({ callback: index }) : ({ value: unwrapArg(arg) })))\n }, transferables);\n this.#returnId++;\n });\n #messageHandler = (message) => {\n const returns = this.#expected.get(message.returnId);\n if (isDefined(returns)) {\n if (message.type === \"resolve\") {\n returns.executorTuple.resolve(message.resolve);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"reject\") {\n returns.executorTuple.reject(message.reject);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"callback\") {\n returns.callbacks?.get(message.funcAt).apply(this, message.args);\n }\n }\n else {\n panic(`Promise has already been resolved. ${JSON.stringify(message)}`);\n }\n };\n }\n class Executor {\n #messenger;\n #protocol;\n #subscription;\n constructor(messenger, protocol) {\n this.#messenger = messenger;\n this.#protocol = protocol;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n #messageHandler = (message) => {\n assert(message.type === \"send\", () => \"Message type must be 'send'\");\n const object = Object.getPrototypeOf(this.#protocol) === Object.getPrototypeOf({})\n ? this.#protocol : Object.getPrototypeOf(this.#protocol);\n const func = asDefined(object[message.func], `${message.func.toString()} does not exists on ${this.#protocol}`);\n const returnId = message.returnId;\n if (returnId === false) {\n func.apply(this.#protocol, message.args.map((arg) => \"value\" in arg\n ? arg.value : panic(`${message.func.toString()} has no promise.`)));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg ? (...args) => this.#sendCallback(returnId, arg.callback, args) : arg.value));\n promise.then(value => {\n try {\n this.#sendResolve(returnId, value);\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }, reason => this.#sendReject(returnId, reason));\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }\n };\n #sendResolve = (returnId, value) => this.#messenger.send({ type: \"resolve\", returnId, resolve: value });\n #sendReject = (returnId, reason) => this.#messenger.send({ type: \"reject\", returnId, reject: reason });\n #sendCallback = (returnId, func, args) => this.#messenger.send({ type: \"callback\", returnId, funcAt: func, args });\n }\n Communicator.Executor = Executor;\n})(Communicator || (Communicator = {}));\n", "import { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nconst EmptyTransferables = [];\nclass NativeMessenger {\n #port;\n #notifier = new Notifier();\n constructor(port) {\n this.#port = port;\n if (isDefined(port.onmessage) || isDefined(port.onmessageerror)) {\n console.error(port);\n throw new Error(`${port} is already wrapped.`);\n }\n port.onmessage = (event) => this.#notifier.notify(event.data);\n port.onmessageerror = (event) => { throw new Error(event.type); };\n }\n send(message, transfer) {\n this.#port.postMessage(message, transfer ?? EmptyTransferables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#notifier.terminate();\n this.#port.onmessage = null;\n this.#port.onmessageerror = null;\n }\n}\n// with '__id__' we put in a little security that we are only communicating with the messenger we created\nclass Channel {\n #messages;\n #name;\n #notifier = new Notifier();\n #subscription;\n constructor(messages, name) {\n this.#messages = messages;\n this.#name = name;\n this.#subscription = messages.subscribe(data => {\n if (\"__id__\" in data && data.__id__ === \"42\" && \"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message, transferrables) {\n this.#messages.send({ __id__: \"42\", channel: this.#name, message }, transferrables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#subscription.terminate();\n this.#notifier.terminate();\n }\n}\n", "import { tryCatch } from \"@opendaw/lib-std\";\nexport var Wait;\n(function (Wait) {\n Wait.frame = () => new Promise(resolve => requestAnimationFrame(() => resolve()));\n Wait.frames = (numFrames) => new Promise(resolve => {\n let count = numFrames;\n const callback = () => { if (--count <= 0) {\n resolve();\n }\n else {\n requestAnimationFrame(callback);\n } };\n requestAnimationFrame(callback);\n });\n Wait.timeSpan = (time, ...args) => new Promise(resolve => setTimeout(resolve, time.millis(), ...args));\n Wait.event = (target, type) => new Promise(resolve => target.addEventListener(type, resolve, { once: true }));\n Wait.observable = (observable) => new Promise(resolve => {\n const terminable = observable.subscribe(() => {\n terminable.terminate();\n resolve();\n });\n });\n Wait.complete = (generator) => new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const { status, value: next, error } = tryCatch(() => generator.next());\n if (status === \"success\") {\n const { done, value } = next;\n if (done) {\n clearInterval(interval);\n resolve(value);\n }\n }\n else {\n clearInterval(interval);\n reject(error);\n }\n }, 0);\n });\n})(Wait || (Wait = {}));\n", "// Pulses per quarter note (PPQN)\n// 960 = 3*5*2^6\nconst Quarter = 960;\nconst Bar = Quarter << 2; // 3_840\nconst SemiQuaver = Quarter >>> 2; // 240\nconst fromSignature = (nominator, denominator) => Math.floor(Bar / denominator) * nominator;\nconst toParts = (ppqn, nominator = 4, denominator = 4) => {\n const lowerPulses = fromSignature(1, denominator);\n const beats = Math.floor(ppqn / lowerPulses);\n const bars = Math.floor(beats / nominator);\n const remainingPulses = Math.floor(ppqn) - fromSignature(bars * nominator, denominator);\n const ticks = remainingPulses % lowerPulses;\n const semiquavers = Math.floor(ticks / SemiQuaver);\n const remainingTicks = ticks % SemiQuaver;\n return {\n bars,\n beats: beats - bars * nominator,\n semiquavers,\n ticks: remainingTicks\n };\n};\nconst secondsToPulses = (seconds, bpm) => seconds * bpm / 60.0 * Quarter;\nconst pulsesToSeconds = (pulses, bpm) => (pulses * 60.0 / Quarter) / bpm;\nconst secondsToBpm = (seconds, pulses) => (pulses * 60.0 / Quarter) / seconds;\nconst samplesToPulses = (samples, bpm, sampleRate) => secondsToPulses(samples / sampleRate, bpm);\nconst pulsesToSamples = (pulses, bpm, sampleRate) => pulsesToSeconds(pulses, bpm) * sampleRate;\nexport const PPQN = {\n Bar,\n Quarter,\n SemiQuaver,\n fromSignature,\n toParts,\n secondsToPulses,\n pulsesToSeconds,\n secondsToBpm,\n samplesToPulses,\n pulsesToSamples,\n toString: (pulses, nominator = 4, denominator = 4) => {\n const { bars, beats, semiquavers, ticks } = toParts(pulses | 0, nominator, denominator);\n return `${bars + 1}.${beats + 1}.${semiquavers + 1}:${ticks}`;\n }\n};\n", "import { PPQN } from \"./ppqn\";\nexport const RenderQuantum = 128 | 0;\nexport const TempoChangeGrid = PPQN.fromSignature(1, 48); // make dynamic window 10ms\nexport const SILENCE_THRESHOLD = 1e-4; // \u2248 -80 dB\n", "const LogDb = Math.log(10.0) / 20.0;\nexport const midiToHz = (note = 60.0, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (note + 3.0) / 12.0 - 6.0);\nexport const hzToMidi = (hz, baseFrequency = 440.0) => (12.0 * Math.log(hz / baseFrequency) + 69.0 * Math.LN2) / Math.LN2;\nexport const dbToGain = (db) => Math.exp(db * LogDb);\nexport const gainToDb = (gain) => Math.log(gain) / LogDb;\nexport const velocityToGain = (velocity) => dbToGain(20 * Math.log10(velocity));\nexport const barsToBpm = (bars, duration) => (bars * 240.0) / duration;\nexport const bpmToBars = (bpm, duration) => (bpm * duration) / 240.0;\nexport const estimateBpm = (duration, maxBpm = 180.0) => {\n const bpm = barsToBpm(Math.pow(2.0, Math.floor(Math.log(bpmToBars(maxBpm, duration)) / Math.LN2)), duration);\n return Math.round(bpm * 1000.0) / 1000.0;\n};\nexport const semitoneToHz = (semitones, baseFrequency = 440.0) => baseFrequency * Math.pow(2.0, (semitones - 69.0) / 12.0);\nexport const hzToSemitone = (hz, baseFrequency = 440.0) => 69.0 + 12.0 * Math.log2(hz / baseFrequency);\n", "type WorkletProcessorConstructor = new (options: Record<string, unknown>) => AudioWorkletProcessor\n\nexport type WorkletGlobals = {\n sampleRate: number\n currentFrame: number\n currentTime: number\n AudioWorkletProcessor: typeof AudioWorkletProcessor\n registerProcessor: (name: string, ctor: WorkletProcessorConstructor) => void\n __registeredProcessors__: Record<string, WorkletProcessorConstructor>\n __workletPort__: MessagePort\n}\n\nconst globals = globalThis as unknown as WorkletGlobals\n\nexport class AudioWorkletProcessor {\n readonly port: MessagePort\n constructor() { this.port = globals.__workletPort__ }\n process(_inputs: Float32Array[][], _outputs: Float32Array[][]): boolean { return false }\n}\n\nexport const setupWorkletGlobals = (config: { sampleRate: number }): void => {\n globals.sampleRate = config.sampleRate\n globals.currentFrame = 0\n globals.currentTime = 0\n globals.AudioWorkletProcessor = AudioWorkletProcessor\n globals.registerProcessor = (name: string, ctor: WorkletProcessorConstructor) => {\n globals.__registeredProcessors__ = globals.__registeredProcessors__ || {}\n globals.__registeredProcessors__[name] = ctor\n }\n}\n\nexport const updateFrameTime = (frame: number, sampleRate: number): void => {\n globals.currentFrame = frame\n globals.currentTime = frame / sampleRate\n}", "import {Arrays, int, isDefined, Option, TimeSpan} from \"@opendaw/lib-std\"\nimport {Communicator, Messenger, Wait} from \"@opendaw/lib-runtime\"\nimport {dbToGain, RenderQuantum} from \"@opendaw/lib-dsp\"\nimport {OfflineEngineInitializeConfig, OfflineEngineProtocol, OfflineEngineRenderConfig} from \"@opendaw/studio-adapters\"\nimport {AudioWorkletProcessor, setupWorkletGlobals, updateFrameTime, WorkletGlobals} from \"./worklet-env\"\n\nconst globals = globalThis as unknown as WorkletGlobals\n\ntype EngineState = {\n readonly processor: AudioWorkletProcessor\n readonly sampleRate: int\n readonly numberOfChannels: int\n totalFrames: int\n running: boolean\n}\n\nlet state: Option<EngineState> = Option.None\n\nCommunicator.executor<OfflineEngineProtocol>(\n Messenger.for(self).channel(\"offline-engine\"), {\n async initialize(enginePort: MessagePort, config: OfflineEngineInitializeConfig) {\n setupWorkletGlobals({sampleRate: config.sampleRate})\n globals.__workletPort__ = enginePort\n await import(config.processorsUrl)\n const ProcessorClass = globals.__registeredProcessors__[\"engine-processor\"]\n state = Option.wrap({\n processor: new ProcessorClass({\n processorOptions: {\n syncStreamBuffer: config.syncStreamBuffer,\n controlFlagsBuffer: config.controlFlagsBuffer,\n hrClockBuffer: new SharedArrayBuffer(32),\n project: config.project,\n exportConfiguration: config.exportConfiguration\n }\n }),\n sampleRate: config.sampleRate,\n numberOfChannels: config.numberOfChannels,\n totalFrames: 0,\n running: false\n })\n },\n async step(numSamples: int): Promise<Float32Array[]> {\n const engine = state.unwrap()\n const result: Float32Array[] = Arrays.create(() => new Float32Array(numSamples), engine.numberOfChannels)\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n let offset = 0 | 0\n while (offset < numSamples) {\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n engine.processor.process([[]], outputs)\n engine.totalFrames += RenderQuantum\n const needed = numSamples - offset\n const toCopy = Math.min(needed, RenderQuantum)\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n result[ch].set(outputs[0][ch].subarray(0, toCopy), offset)\n }\n offset += toCopy\n }\n return result\n },\n async render(config: OfflineEngineRenderConfig) {\n const engine = state.unwrap()\n const {silenceThresholdDb, silenceDurationSeconds, maxDurationSeconds} = config\n const threshold = dbToGain(silenceThresholdDb ?? -72.0)\n const silenceFramesNeeded = Math.ceil((silenceDurationSeconds ?? 10) * engine.sampleRate)\n const maxFrames = isDefined(maxDurationSeconds) ? Math.ceil(maxDurationSeconds * engine.sampleRate) : Infinity\n const chunks: Float32Array[][] = Arrays.create(() => [], engine.numberOfChannels)\n let consecutiveSilentFrames = 0\n let hasHadAudio = false\n let lastYield = 0\n engine.running = true\n await Wait.timeSpan(TimeSpan.seconds(0))\n while (engine.running && engine.totalFrames < maxFrames) {\n const outputChannels: Float32Array[] = Arrays.create(() => new Float32Array(RenderQuantum), engine.numberOfChannels)\n const outputs: Float32Array[][] = [outputChannels]\n updateFrameTime(engine.totalFrames, engine.sampleRate)\n const keepRunning = engine.processor.process([[]], outputs)\n let maxSample = 0\n for (const channel of outputs[0]) {\n for (const sample of channel) {\n const absoluteValue = Math.abs(sample)\n if (absoluteValue > maxSample) {maxSample = absoluteValue}\n }\n }\n const isSilent = maxSample <= threshold\n if (maxSample > threshold) {hasHadAudio = true}\n if (isSilent && hasHadAudio) {\n consecutiveSilentFrames += RenderQuantum\n if (consecutiveSilentFrames >= silenceFramesNeeded) {break}\n } else {\n consecutiveSilentFrames = 0\n }\n for (let ch = 0; ch < engine.numberOfChannels; ch++) {\n chunks[ch].push(outputs[0][ch].slice())\n }\n engine.totalFrames += RenderQuantum\n if (!keepRunning) {break}\n if (engine.totalFrames - lastYield >= engine.sampleRate) {\n lastYield = engine.totalFrames\n await new Promise(resolve => setTimeout(resolve, 0))\n }\n }\n const framesToKeep = engine.totalFrames - consecutiveSilentFrames + Math.min(engine.sampleRate / 4, consecutiveSilentFrames)\n return Arrays.create(channelIndex => {\n const total = new Float32Array(framesToKeep)\n let offset = 0\n for (const chunk of chunks[channelIndex]) {\n if (offset >= framesToKeep) {break}\n const toCopy = Math.min(chunk.length, framesToKeep - offset)\n total.set(chunk.subarray(0, toCopy), offset)\n offset += toCopy\n }\n return total\n }, engine.numberOfChannels)\n },\n stop() { state.unwrap().running = false }\n }\n)\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["isDefined", "value", "asDefined", "value", "fail", "panic", "getOrProvide", "getOrProvide", "value", "Unhandled", "empty", "panic", "issue", "assert", "condition", "fail", "getOrProvide", "InaccessibleProperty", "failMessage", "panic", "SuccessResult", "value", "InaccessibleProperty", "FailureResult", "error", "tryCatch", "statement", "EmptyExec", "Sorting", "Arrays", "#empty", "array", "newValues", "procedure", "index", "fail", "asDefined", "element", "panic", "factory", "n", "i", "a", "b", "predicate", "first", "result", "key", "seen", "value", "excludeArray", "compareFn", "item", "excludeItem", "other", "includeItem", "baseArray", "mergeIntoArray", "baseItem", "mergeItem", "maxIndex", "left", "right", "sorting", "prev", "next", "toKey", "record", "view", "Option", "value", "isDefined", "Some", "provider", "func", "args", "promise", "#value", "asDefined", "_", "matchable", "run", "_func", "callback", "_or", "other", "_fail", "fail", "panic", "getOrProvide", "exec", "or", "Iterables", "value", "iterable", "count", "_", "predicate", "callback", "initialValue", "accumulator", "index", "include", "procedure", "map", "iterator", "i", "fn", "result", "mapped", "isDefined", "done", "prev", "Terminable", "EmptyExec", "exec", "terminables", "Notifier", "observer", "observables", "Terminable", "observable", "#observers", "value", "TimeSpan", "_TimeSpan", "startTime", "output", "seconds", "progress", "elapsedTime", "value", "#MILLI_SECONDS_PER_SECOND", "#MILLI_SECONDS_PER_MINUTE", "#MILLI_SECONDS_PER_HOUR", "#MILLI_SECONDS_PER_DAY", "#ms", "ms", "unit", "minutes", "hours", "days", "d", "h", "m", "#quantity", "name", "count", "Unhandled", "Communicator", "Transfer", "value", "messenger", "bind", "Sender", "protocol", "Executor", "extractTransferables", "args", "transferables", "arg", "unwrapArg", "#messenger", "#expected", "#subscription", "#returnId", "#messageHandler", "func", "Iterables", "resolve", "reject", "entries", "callbacks", "index", "message", "returns", "isDefined", "panic", "#protocol", "assert", "object", "asDefined", "returnId", "#sendCallback", "#sendResolve", "reason", "#sendReject", "Messenger", "port", "NativeMessenger", "EmptyTransferables", "#port", "#notifier", "Notifier", "isDefined", "event", "message", "transfer", "name", "Channel", "observer", "_Channel", "#messages", "#name", "#subscription", "messages", "data", "transferrables", "Wait", "resolve", "numFrames", "count", "callback", "time", "args", "target", "type", "observable", "terminable", "generator", "reject", "interval", "status", "next", "error", "tryCatch", "done", "value", "fromSignature", "nominator", "denominator", "toParts", "ppqn", "lowerPulses", "beats", "bars", "ticks", "semiquavers", "remainingTicks", "secondsToPulses", "seconds", "bpm", "pulsesToSeconds", "pulses", "secondsToBpm", "samplesToPulses", "samples", "sampleRate", "pulsesToSamples", "PPQN", "RenderQuantum", "TempoChangeGrid", "PPQN", "LogDb", "dbToGain", "db", "LogDb", "globals", "AudioWorkletProcessor", "_inputs", "_outputs", "setupWorkletGlobals", "config", "name", "ctor", "updateFrameTime", "frame", "sampleRate", "globals", "state", "Option", "Communicator", "Messenger", "enginePort", "config", "setupWorkletGlobals", "ProcessorClass", "numSamples", "engine", "result", "Arrays", "outputChannels", "RenderQuantum", "offset", "outputs", "updateFrameTime", "needed", "toCopy", "ch", "silenceThresholdDb", "silenceDurationSeconds", "maxDurationSeconds", "threshold", "dbToGain", "silenceFramesNeeded", "maxFrames", "isDefined", "chunks", "consecutiveSilentFrames", "hasHadAudio", "lastYield", "Wait", "TimeSpan", "keepRunning", "maxSample", "channel", "sample", "absoluteValue", "isSilent", "resolve", "framesToKeep", "channelIndex", "total", "chunk"]
|
|
7
7
|
}
|