@opendaw/studio-core 0.0.121 → 0.0.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AssetService.d.ts +4 -3
- package/dist/AssetService.d.ts.map +1 -1
- package/dist/AssetService.js +3 -5
- 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/RecordingWorklet.d.ts +2 -0
- package/dist/RecordingWorklet.d.ts.map +1 -1
- package/dist/RecordingWorklet.js +8 -25
- package/dist/capture/CaptureAudio.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +2 -1
- package/dist/capture/RecordMidi.d.ts.map +1 -1
- package/dist/capture/RecordMidi.js +24 -2
- 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/ProjectEnv.d.ts +4 -0
- package/dist/project/ProjectEnv.d.ts.map +1 -1
- 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/samples/SampleService.d.ts +5 -3
- package/dist/samples/SampleService.d.ts.map +1 -1
- package/dist/samples/SampleService.js +16 -7
- package/dist/soundfont/SoundfontService.d.ts +2 -2
- package/dist/soundfont/SoundfontService.d.ts.map +1 -1
- package/dist/soundfont/SoundfontService.js +3 -3
- package/dist/ui/renderer/audio.d.ts +13 -1
- package/dist/ui/renderer/audio.d.ts.map +1 -1
- package/dist/ui/renderer/audio.js +28 -20
- package/dist/ui/renderer/fading.d.ts.map +1 -1
- package/dist/ui/renderer/fading.js +23 -20
- package/dist/ui/renderer/index.d.ts +1 -0
- package/dist/ui/renderer/index.d.ts.map +1 -1
- package/dist/ui/renderer/index.js +1 -0
- package/dist/ui/renderer/notes.d.ts.map +1 -1
- package/dist/ui/renderer/notes.js +7 -4
- package/dist/ui/renderer/riffle.d.ts +3 -0
- package/dist/ui/renderer/riffle.d.ts.map +1 -0
- package/dist/ui/renderer/riffle.js +106 -0
- package/dist/workers-main.js +1 -1
- package/dist/workers-main.js.map +1 -1
- package/package.json +15 -15
package/dist/AssetService.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Class,
|
|
1
|
+
import { Class, Notifier, Observer, Progress, Subscription, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { BoxGraph } from "@opendaw/lib-box";
|
|
3
3
|
import { Sample, Soundfont } from "@opendaw/studio-adapters";
|
|
4
4
|
import { AudioFileBox, SoundfontFileBox } from "@opendaw/studio-boxes";
|
|
@@ -8,15 +8,16 @@ export declare namespace AssetService {
|
|
|
8
8
|
name?: string;
|
|
9
9
|
arrayBuffer: ArrayBuffer;
|
|
10
10
|
progressHandler?: Progress.Handler;
|
|
11
|
+
origin?: "import" | "recording";
|
|
11
12
|
};
|
|
12
13
|
}
|
|
13
14
|
export declare abstract class AssetService<T extends Sample | Soundfont> {
|
|
14
|
-
protected readonly onUpdate: Procedure<T>;
|
|
15
15
|
protected abstract readonly nameSingular: string;
|
|
16
16
|
protected abstract readonly namePlural: string;
|
|
17
17
|
protected abstract readonly boxType: Class<AudioFileBox | SoundfontFileBox>;
|
|
18
18
|
protected abstract readonly filePickerOptions: FilePickerOptions;
|
|
19
|
-
protected
|
|
19
|
+
protected readonly notifier: Notifier<T>;
|
|
20
|
+
subscribe(observer: Observer<T>): Subscription;
|
|
20
21
|
browse(multiple: boolean): Promise<ReadonlyArray<T>>;
|
|
21
22
|
abstract importFile(args: AssetService.ImportArgs): Promise<T>;
|
|
22
23
|
replaceMissingFiles(boxGraph: BoxGraph, manager: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetService.d.ts","sourceRoot":"","sources":["../src/AssetService.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,
|
|
1
|
+
{"version":3,"file":"AssetService.d.ts","sourceRoot":"","sources":["../src/AssetService.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EAKL,QAAQ,EACR,QAAQ,EAER,QAAQ,EAER,YAAY,EACZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AAEpE,yBAAiB,YAAY,CAAC;IAC1B,KAAY,UAAU,GAAG;QACrB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,WAAW,CAAC;QACzB,eAAe,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;QACnC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;KAClC,CAAA;CACJ;AAED,8BAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS;IAC3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAChD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC9C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAA;IAC3E,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAEhE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAoB;IAE5D,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY;IAExC,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAI1D,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAExD,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;QAAE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAsCjG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoChH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAClE"}
|
package/dist/AssetService.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { DefaultObservableValue, Errors, isInstanceOf, isNotUndefined, panic, Progress, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
|
1
|
+
import { DefaultObservableValue, Errors, isInstanceOf, isNotUndefined, Notifier, panic, Progress, RuntimeNotifier, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { Files } from "@opendaw/lib-dom";
|
|
3
3
|
import { Promises } from "@opendaw/lib-runtime";
|
|
4
4
|
export class AssetService {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
this.onUpdate = onUpdate;
|
|
8
|
-
}
|
|
5
|
+
notifier = new Notifier();
|
|
6
|
+
subscribe(observer) { return this.notifier.subscribe(observer); }
|
|
9
7
|
async browse(multiple) {
|
|
10
8
|
return this.browseFiles(multiple, this.filePickerOptions);
|
|
11
9
|
}
|
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
|
|
@@ -2,6 +2,7 @@ import { int, Observer, Option, Procedure, Subscription, Terminable, UUID } from
|
|
|
2
2
|
import { AudioData } from "@opendaw/lib-dsp";
|
|
3
3
|
import { Peaks } from "@opendaw/lib-fusion";
|
|
4
4
|
import { RingBuffer, SampleLoader, SampleLoaderState } from "@opendaw/studio-adapters";
|
|
5
|
+
import { SampleService } from "./samples";
|
|
5
6
|
export declare class RecordingWorklet extends AudioWorkletNode implements Terminable, SampleLoader {
|
|
6
7
|
#private;
|
|
7
8
|
readonly uuid: UUID.Bytes;
|
|
@@ -9,6 +10,7 @@ export declare class RecordingWorklet extends AudioWorkletNode implements Termin
|
|
|
9
10
|
own<T extends Terminable>(terminable: T): T;
|
|
10
11
|
limit(count: int): void;
|
|
11
12
|
set onSaved(callback: Procedure<UUID.Bytes>);
|
|
13
|
+
set sampleService(service: SampleService);
|
|
12
14
|
setFillLength(value: int): void;
|
|
13
15
|
get numberOfFrames(): int;
|
|
14
16
|
get data(): Option<AudioData>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordingWorklet.d.ts","sourceRoot":"","sources":["../src/RecordingWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"RecordingWorklet.d.ts","sourceRoot":"","sources":["../src/RecordingWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAY,QAAQ,EAAE,MAAM,EAAS,SAAS,EAAE,YAAY,EAAE,UAAU,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC9H,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAmB,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAGtG,OAAO,EAAC,aAAa,EAAC,MAAM,WAAW,CAAA;AAEvC,qBAAa,gBAAiB,SAAQ,gBAAiB,YAAW,UAAU,EAAE,YAAY;;IAGtF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAkB;gBAe/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM;IAuBhE,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC;IAE3C,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAOvB,IAAI,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAyC;IACpF,IAAI,aAAa,CAAC,OAAO,EAAE,aAAa,EAA8C;IAEtF,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAE/B,IAAI,cAAc,IAAI,GAAG,CAA6C;IACtE,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAoB;IACjD,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAA6E;IACvG,IAAI,KAAK,IAAI,iBAAiB,CAAqB;IAEnD,UAAU,IAAI,IAAI;IAElB,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,YAAY;IAQ9D,SAAS,IAAI,IAAI;IAMjB,QAAQ,IAAI,MAAM;CAsBrB"}
|
package/dist/RecordingWorklet.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { AudioData
|
|
3
|
-
import { SamplePeaks } from "@opendaw/lib-fusion";
|
|
1
|
+
import { Notifier, Option, panic, Terminable, Terminator, UUID } from "@opendaw/lib-std";
|
|
2
|
+
import { AudioData } from "@opendaw/lib-dsp";
|
|
4
3
|
import { mergeChunkPlanes, RingBuffer } from "@opendaw/studio-adapters";
|
|
5
|
-
import { SampleStorage } from "./samples";
|
|
6
4
|
import { RenderQuantum } from "./RenderQuantum";
|
|
7
|
-
import { Workers } from "./Workers";
|
|
8
5
|
import { PeaksWriter } from "./PeaksWriter";
|
|
9
6
|
export class RecordingWorklet extends AudioWorkletNode {
|
|
10
7
|
#terminator = new Terminator();
|
|
@@ -19,6 +16,7 @@ export class RecordingWorklet extends AudioWorkletNode {
|
|
|
19
16
|
#limitSamples = Number.POSITIVE_INFINITY;
|
|
20
17
|
#state = { type: "record" };
|
|
21
18
|
#onSaved = Option.None;
|
|
19
|
+
#sampleService = Option.None;
|
|
22
20
|
constructor(context, config) {
|
|
23
21
|
super(context, "recording-processor", {
|
|
24
22
|
numberOfInputs: 1,
|
|
@@ -48,6 +46,7 @@ export class RecordingWorklet extends AudioWorkletNode {
|
|
|
48
46
|
}
|
|
49
47
|
}
|
|
50
48
|
set onSaved(callback) { this.#onSaved = Option.wrap(callback); }
|
|
49
|
+
set sampleService(service) { this.#sampleService = Option.wrap(service); }
|
|
51
50
|
setFillLength(value) { this.#peakWriter.numFrames = value; }
|
|
52
51
|
get numberOfFrames() { return this.#output.length * RenderQuantum; }
|
|
53
52
|
get data() { return this.#data; }
|
|
@@ -74,31 +73,15 @@ export class RecordingWorklet extends AudioWorkletNode {
|
|
|
74
73
|
return panic("No recording data available");
|
|
75
74
|
}
|
|
76
75
|
const totalSamples = this.#limitSamples;
|
|
77
|
-
const sample_rate = this.context.sampleRate;
|
|
78
|
-
const numberOfChannels = this.channelCount;
|
|
79
76
|
const mergedFrames = mergeChunkPlanes(this.#output, RenderQuantum, this.#output.length * RenderQuantum)
|
|
80
77
|
.map(frame => frame.slice(-totalSamples));
|
|
81
|
-
const audioData = AudioData.create(
|
|
82
|
-
mergedFrames.forEach((frame,
|
|
78
|
+
const audioData = AudioData.create(this.context.sampleRate, totalSamples, this.channelCount);
|
|
79
|
+
mergedFrames.forEach((frame, index) => audioData.frames[index].set(frame));
|
|
83
80
|
this.#data = Option.wrap(audioData);
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
.Peak.generateAsync(Progress.Empty, shifts, audioData.frames, totalSamples, numberOfChannels);
|
|
87
|
-
this.#peaks = Option.wrap(SamplePeaks.from(new ByteArrayInput(peaks)));
|
|
88
|
-
const bpm = BPMTools.detect(audioData.frames[0], sample_rate);
|
|
89
|
-
const duration = totalSamples / sample_rate;
|
|
90
|
-
const meta = { name: "Recording", bpm, sample_rate, duration, origin: "recording" };
|
|
91
|
-
const sample = {
|
|
92
|
-
uuid: this.uuid,
|
|
93
|
-
audio: audioData,
|
|
94
|
-
peaks: peaks,
|
|
95
|
-
meta
|
|
96
|
-
};
|
|
97
|
-
await SampleStorage.get().save(sample);
|
|
98
|
-
this.#onSaved.ifSome(callback => callback(this.uuid));
|
|
81
|
+
const sample = await this.#sampleService.unwrap("SampleService not set").importRecording(audioData);
|
|
82
|
+
this.#onSaved.ifSome(callback => callback(UUID.parse(sample.uuid)));
|
|
99
83
|
this.#setState({ type: "loaded" });
|
|
100
84
|
this.terminate();
|
|
101
|
-
return sample;
|
|
102
85
|
}
|
|
103
86
|
#setState(value) {
|
|
104
87
|
this.#state = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaptureAudio.d.ts","sourceRoot":"","sources":["../../src/capture/CaptureAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,uBAAuB,EAEvB,MAAM,EAEN,UAAU,EACb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAK/C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAE/C,qBAAa,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;;gBAe1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAwCjG,IAAI,YAAY,IAAI,OAAO,CAAwC;IACnE,IAAI,cAAc,IAAI,cAAc,CAA8B;IAClE,IAAI,cAAc,CAAC,KAAK,EAAE,cAAc,EAQvC;IACD,IAAI,MAAM,IAAI,MAAM,CAAsB;IAC1C,IAAI,eAAe,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAA+B;IACnE,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAmD;IACnF,IAAI,MAAM,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAsB;IACxE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,CAEnC;IACD,IAAI,KAAK,IAAI,MAAM,CAAsE;IACzF,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAA+D;IAChG,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAE/C;IACD,IAAI,UAAU,IAAI,MAAM,CAAC,SAAS,CAAC,CAAiD;IACpF,IAAI,qBAAqB,IAAI,MAAM,CAA6C;IAE1E,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"CaptureAudio.d.ts","sourceRoot":"","sources":["../../src/capture/CaptureAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,uBAAuB,EAEvB,MAAM,EAEN,UAAU,EACb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAC,YAAY,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AACjC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAK/C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAE/C,qBAAa,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;;gBAe1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAwCjG,IAAI,YAAY,IAAI,OAAO,CAAwC;IACnE,IAAI,cAAc,IAAI,cAAc,CAA8B;IAClE,IAAI,cAAc,CAAC,KAAK,EAAE,cAAc,EAQvC;IACD,IAAI,MAAM,IAAI,MAAM,CAAsB;IAC1C,IAAI,eAAe,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAA+B;IACnE,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAmD;IACnF,IAAI,MAAM,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAsB;IACxE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,CAEnC;IACD,IAAI,KAAK,IAAI,MAAM,CAAsE;IACzF,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAA+D;IAChG,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAE/C;IACD,IAAI,UAAU,IAAI,MAAM,CAAC,SAAS,CAAC,CAAiD;IACpF,IAAI,qBAAqB,IAAI,MAAM,CAA6C;IAE1E,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BvC,cAAc,IAAI,UAAU;CAsH/B"}
|
|
@@ -75,7 +75,7 @@ export class CaptureAudio extends Capture {
|
|
|
75
75
|
get effectiveChannelCount() { return this.#audioChain?.channelCount ?? 1; }
|
|
76
76
|
async prepareRecording() {
|
|
77
77
|
const { project } = this.manager;
|
|
78
|
-
const { env: { audioContext, audioWorklets, sampleManager } } = project;
|
|
78
|
+
const { env: { audioContext, audioWorklets, sampleManager, sampleService } } = project;
|
|
79
79
|
if (isUndefined(audioContext.outputLatency)) {
|
|
80
80
|
const approved = RuntimeNotifier.approve({
|
|
81
81
|
headline: "Warning",
|
|
@@ -94,6 +94,7 @@ export class CaptureAudio extends Capture {
|
|
|
94
94
|
}
|
|
95
95
|
const { gainNode, channelCount } = audioChain;
|
|
96
96
|
const recordingWorklet = audioWorklets.createRecording(channelCount, RenderQuantum);
|
|
97
|
+
recordingWorklet.sampleService = sampleService;
|
|
97
98
|
sampleManager.record(recordingWorklet);
|
|
98
99
|
gainNode.connect(recordingWorklet);
|
|
99
100
|
this.#preparedWorklet = recordingWorklet;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordMidi.d.ts","sourceRoot":"","sources":["../../src/capture/RecordMidi.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EAKR,UAAU,EAGb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAa,UAAU,EAA2B,MAAM,0BAA0B,CAAA;AACzF,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,UAAU,CAAC;IACxB,KAAK,iBAAiB,GAAG;QACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAA;IAgBD,MAAM,CAAC,MAAM,KAAK,GAAI,gCAA8B,iBAAiB,KAAG,
|
|
1
|
+
{"version":3,"file":"RecordMidi.d.ts","sourceRoot":"","sources":["../../src/capture/RecordMidi.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EAKR,UAAU,EAGb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAa,UAAU,EAA2B,MAAM,0BAA0B,CAAA;AACzF,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAGjC,yBAAiB,UAAU,CAAC;IACxB,KAAK,iBAAiB,GAAG;QACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAA;IAgBD,MAAM,CAAC,MAAM,KAAK,GAAI,gCAA8B,iBAAiB,KAAG,UA2KvE,CAAA;;CACJ"}
|
|
@@ -13,6 +13,7 @@ export var RecordMidi;
|
|
|
13
13
|
const { loopArea } = timelineBox;
|
|
14
14
|
const terminator = new Terminator();
|
|
15
15
|
const activeNotes = new Map();
|
|
16
|
+
const pendingNotes = new Map();
|
|
16
17
|
const latency = PPQN.secondsToPulses(audioContext.outputLatency ?? 10.0, timelineBox.bpm.getValue());
|
|
17
18
|
let currentTake = Option.None;
|
|
18
19
|
let lastPosition = 0;
|
|
@@ -79,6 +80,19 @@ export var RecordMidi;
|
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
};
|
|
83
|
+
const flushPendingNotes = (take) => {
|
|
84
|
+
for (const [pitch, velocity] of pendingNotes) {
|
|
85
|
+
const event = NoteEventBox.create(boxGraph, UUID.generate(), box => {
|
|
86
|
+
box.position.setValue(0);
|
|
87
|
+
box.duration.setValue(MIN_NOTE_DURATION);
|
|
88
|
+
box.pitch.setValue(pitch);
|
|
89
|
+
box.velocity.setValue(velocity);
|
|
90
|
+
box.events.refer(take.collection.events);
|
|
91
|
+
});
|
|
92
|
+
activeNotes.set(pitch, { event, take, creationOffset: positionOffset });
|
|
93
|
+
}
|
|
94
|
+
pendingNotes.clear();
|
|
95
|
+
};
|
|
82
96
|
const startNewTake = (position) => {
|
|
83
97
|
const previousTrack = currentTake.mapOr(take => take.trackBox, null);
|
|
84
98
|
currentTake = Option.wrap(createTakeRegion(position, previousTrack));
|
|
@@ -107,7 +121,9 @@ export var RecordMidi;
|
|
|
107
121
|
if (currentTake.isEmpty()) {
|
|
108
122
|
editing.modify(() => {
|
|
109
123
|
const pos = quantizeFloor(currentPosition, beats);
|
|
110
|
-
|
|
124
|
+
const take = createTakeRegion(pos, null);
|
|
125
|
+
currentTake = Option.wrap(take);
|
|
126
|
+
flushPendingNotes(take);
|
|
111
127
|
}, false);
|
|
112
128
|
}
|
|
113
129
|
currentTake.ifSome(({ regionBox, collection }) => {
|
|
@@ -140,6 +156,7 @@ export var RecordMidi;
|
|
|
140
156
|
if (NoteSignal.isOn(signal)) {
|
|
141
157
|
const { pitch, velocity } = signal;
|
|
142
158
|
if (currentTake.isEmpty()) {
|
|
159
|
+
pendingNotes.set(pitch, velocity);
|
|
143
160
|
return;
|
|
144
161
|
}
|
|
145
162
|
const take = currentTake.unwrap();
|
|
@@ -160,7 +177,12 @@ export var RecordMidi;
|
|
|
160
177
|
}, false);
|
|
161
178
|
}
|
|
162
179
|
else if (NoteSignal.isOff(signal)) {
|
|
163
|
-
|
|
180
|
+
if (pendingNotes.has(signal.pitch)) {
|
|
181
|
+
pendingNotes.delete(signal.pitch);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
activeNotes.delete(signal.pitch);
|
|
185
|
+
}
|
|
164
186
|
}
|
|
165
187
|
}));
|
|
166
188
|
return terminator;
|
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
|