@opendaw/studio-core 0.0.124 → 0.0.126
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/RecordingWorklet.d.ts +1 -0
- package/dist/RecordingWorklet.d.ts.map +1 -1
- package/dist/RecordingWorklet.js +5 -1
- package/dist/capture/CaptureAudio.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +1 -0
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +21 -1
- package/dist/samples/SampleService.d.ts +4 -4
- package/dist/samples/SampleService.d.ts.map +1 -1
- package/dist/samples/SampleService.js +10 -7
- package/dist/soundfont/SoundfontService.d.ts +1 -1
- package/dist/soundfont/SoundfontService.d.ts.map +1 -1
- package/dist/soundfont/SoundfontService.js +1 -1
- package/package.json +2 -2
package/dist/AssetService.d.ts
CHANGED
|
@@ -6,18 +6,19 @@ export declare namespace AssetService {
|
|
|
6
6
|
type ImportArgs = {
|
|
7
7
|
uuid?: UUID.Bytes;
|
|
8
8
|
name?: string;
|
|
9
|
+
bpm?: number;
|
|
9
10
|
arrayBuffer: ArrayBuffer;
|
|
10
11
|
progressHandler?: Progress.Handler;
|
|
11
12
|
origin?: "import" | "recording";
|
|
12
13
|
};
|
|
13
14
|
}
|
|
14
|
-
export declare abstract class AssetService<T extends Sample | Soundfont> {
|
|
15
|
+
export declare abstract class AssetService<T extends Sample | Soundfont, RAW = void> {
|
|
15
16
|
protected abstract readonly nameSingular: string;
|
|
16
17
|
protected abstract readonly namePlural: string;
|
|
17
18
|
protected abstract readonly boxType: Class<AudioFileBox | SoundfontFileBox>;
|
|
18
19
|
protected abstract readonly filePickerOptions: FilePickerOptions;
|
|
19
|
-
protected readonly notifier: Notifier<T>;
|
|
20
|
-
subscribe(observer: Observer<T>): Subscription;
|
|
20
|
+
protected readonly notifier: Notifier<[T, RAW]>;
|
|
21
|
+
subscribe(observer: Observer<[T, RAW]>): Subscription;
|
|
21
22
|
browse(multiple: boolean): Promise<ReadonlyArray<T>>;
|
|
22
23
|
abstract importFile(args: AssetService.ImportArgs): Promise<T>;
|
|
23
24
|
replaceMissingFiles(boxGraph: BoxGraph, manager: {
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,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,EAAE,GAAG,GAAG,IAAI;IACvE,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,EAAE,GAAG,CAAC,CAAC,CAA2B;IAE1E,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,YAAY;IAE/C,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"}
|
|
@@ -10,6 +10,7 @@ export declare class RecordingWorklet extends AudioWorkletNode implements Termin
|
|
|
10
10
|
own<T extends Terminable>(terminable: T): T;
|
|
11
11
|
limit(count: int): void;
|
|
12
12
|
set onSaved(callback: Procedure<UUID.Bytes>);
|
|
13
|
+
set bpm(value: number);
|
|
13
14
|
set sampleService(service: SampleService);
|
|
14
15
|
setFillLength(value: int): void;
|
|
15
16
|
get numberOfFrames(): int;
|
|
@@ -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,EACH,GAAG,EAEH,QAAQ,EACR,MAAM,EAEN,SAAS,EACT,YAAY,EACZ,UAAU,EAEV,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,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;gBAgB/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,GAAG,CAAC,KAAK,EAAE,MAAM,EAAkC;IACvD,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;CAwBrB"}
|
package/dist/RecordingWorklet.js
CHANGED
|
@@ -17,6 +17,7 @@ export class RecordingWorklet extends AudioWorkletNode {
|
|
|
17
17
|
#state = { type: "record" };
|
|
18
18
|
#onSaved = Option.None;
|
|
19
19
|
#sampleService = Option.None;
|
|
20
|
+
#bpm = Option.None;
|
|
20
21
|
constructor(context, config) {
|
|
21
22
|
super(context, "recording-processor", {
|
|
22
23
|
numberOfInputs: 1,
|
|
@@ -46,6 +47,7 @@ export class RecordingWorklet extends AudioWorkletNode {
|
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
set onSaved(callback) { this.#onSaved = Option.wrap(callback); }
|
|
50
|
+
set bpm(value) { this.#bpm = Option.wrap(value); }
|
|
49
51
|
set sampleService(service) { this.#sampleService = Option.wrap(service); }
|
|
50
52
|
setFillLength(value) { this.#peakWriter.numFrames = value; }
|
|
51
53
|
get numberOfFrames() { return this.#output.length * RenderQuantum; }
|
|
@@ -78,7 +80,9 @@ export class RecordingWorklet extends AudioWorkletNode {
|
|
|
78
80
|
const audioData = AudioData.create(this.context.sampleRate, totalSamples, this.channelCount);
|
|
79
81
|
mergedFrames.forEach((frame, index) => audioData.frames[index].set(frame));
|
|
80
82
|
this.#data = Option.wrap(audioData);
|
|
81
|
-
const sample = await this.#sampleService
|
|
83
|
+
const sample = await this.#sampleService
|
|
84
|
+
.unwrap("SampleService not set")
|
|
85
|
+
.importRecording(audioData, this.#bpm.unwrapOrElse(120));
|
|
82
86
|
this.#onSaved.ifSome(callback => callback(UUID.parse(sample.uuid)));
|
|
83
87
|
this.#setState({ type: "loaded" });
|
|
84
88
|
this.terminate();
|
|
@@ -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;IA4BvC,cAAc,IAAI,UAAU;CAsH/B"}
|
|
@@ -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.bpm = project.timelineBox.bpm.getValue();
|
|
97
98
|
recordingWorklet.sampleService = sampleService;
|
|
98
99
|
sampleManager.record(recordingWorklet);
|
|
99
100
|
gainNode.connect(recordingWorklet);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordAudio.d.ts","sourceRoot":"","sources":["../../src/capture/RecordAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,UAAU,EAIb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAa,mBAAmB,EAA2B,MAAM,0BAA0B,CAAA;AAClG,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,yBAAiB,WAAW,CAAC;IACzB,KAAK,kBAAkB,GAAG;QACtB,gBAAgB,EAAE,gBAAgB,CAAA;QAClC,UAAU,EAAE,SAAS,CAAA;QACrB,aAAa,EAAE,mBAAmB,CAAA;QAClC,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;QAChB,aAAa,EAAE,MAAM,CAAA;KACxB,CAAA;IAOD,MAAM,CAAC,MAAM,KAAK,GACd,kFAAgF,kBAAkB,KAChG,
|
|
1
|
+
{"version":3,"file":"RecordAudio.d.ts","sourceRoot":"","sources":["../../src/capture/RecordAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,UAAU,EAIb,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAa,mBAAmB,EAA2B,MAAM,0BAA0B,CAAA;AAClG,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,yBAAiB,WAAW,CAAC;IACzB,KAAK,kBAAkB,GAAG;QACtB,gBAAgB,EAAE,gBAAgB,CAAA;QAClC,UAAU,EAAE,SAAS,CAAA;QACrB,aAAa,EAAE,mBAAmB,CAAA;QAClC,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;QAChB,aAAa,EAAE,MAAM,CAAA;KACxB,CAAA;IAOD,MAAM,CAAC,MAAM,KAAK,GACd,kFAAgF,kBAAkB,KAChG,UAmLL,CAAA;;CACJ"}
|
|
@@ -96,7 +96,27 @@ export var RecordAudio;
|
|
|
96
96
|
const previousTrack = currentTake.mapOr(take => take.trackBox, null);
|
|
97
97
|
currentTake = Option.wrap(createTakeRegion(position, currentWaveformOffset, previousTrack));
|
|
98
98
|
};
|
|
99
|
-
recordingWorklet.onSaved = uuid =>
|
|
99
|
+
recordingWorklet.onSaved = uuid => {
|
|
100
|
+
project.trackUserCreatedSample(uuid);
|
|
101
|
+
editing.modify(() => {
|
|
102
|
+
fileBox.ifSome(oldFileBox => {
|
|
103
|
+
editing.modify(() => {
|
|
104
|
+
const newFileBox = AudioFileBox.create(boxGraph, uuid, box => {
|
|
105
|
+
box.fileName.setValue(oldFileBox.fileName.getValue());
|
|
106
|
+
box.startInSeconds.setValue(oldFileBox.startInSeconds.getValue());
|
|
107
|
+
box.endInSeconds.setValue(oldFileBox.endInSeconds.getValue());
|
|
108
|
+
});
|
|
109
|
+
for (const pointer of [...oldFileBox.pointerHub.incoming()]) {
|
|
110
|
+
pointer.refer(newFileBox);
|
|
111
|
+
}
|
|
112
|
+
for (const pointer of [...oldFileBox.transientMarkers.pointerHub.incoming()]) {
|
|
113
|
+
pointer.refer(newFileBox.transientMarkers);
|
|
114
|
+
}
|
|
115
|
+
oldFileBox.delete();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
};
|
|
100
120
|
terminator.ownAll(Terminable.create(() => {
|
|
101
121
|
tryCatch(() => sourceNode.disconnect(recordingWorklet));
|
|
102
122
|
if (recordingWorklet.numberOfFrames === 0 || fileBox.isEmpty()) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Class } from "@opendaw/lib-std";
|
|
2
2
|
import { Box } from "@opendaw/lib-box";
|
|
3
3
|
import { AudioData } from "@opendaw/lib-dsp";
|
|
4
|
-
import { Sample } from "@opendaw/studio-adapters";
|
|
4
|
+
import { Sample, SampleMetaData } from "@opendaw/studio-adapters";
|
|
5
5
|
import { AssetService } from "../AssetService";
|
|
6
|
-
export declare class SampleService extends AssetService<Sample> {
|
|
6
|
+
export declare class SampleService extends AssetService<Sample, AudioData> {
|
|
7
7
|
#private;
|
|
8
8
|
readonly audioContext: AudioContext;
|
|
9
9
|
protected readonly namePlural: string;
|
|
@@ -11,8 +11,8 @@ export declare class SampleService extends AssetService<Sample> {
|
|
|
11
11
|
protected readonly boxType: Class<Box>;
|
|
12
12
|
protected readonly filePickerOptions: FilePickerOptions;
|
|
13
13
|
constructor(audioContext: AudioContext);
|
|
14
|
-
importRecording(audioData: AudioData, name?: string): Promise<Sample>;
|
|
15
|
-
importFile({ uuid, name, arrayBuffer, progressHandler, origin }: AssetService.ImportArgs): Promise<Sample>;
|
|
14
|
+
importRecording(audioData: AudioData, bpm: number, name?: string): Promise<Sample>;
|
|
15
|
+
importFile({ uuid, name, bpm, arrayBuffer, progressHandler, origin }: AssetService.ImportArgs, transformMeta?: (meta: SampleMetaData, audioData: Readonly<AudioData>) => Promise<void>): Promise<Sample>;
|
|
16
16
|
protected collectAllFiles(): Promise<ReadonlyArray<Sample>>;
|
|
17
17
|
}
|
|
18
18
|
//# sourceMappingURL=SampleService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SampleService.d.ts","sourceRoot":"","sources":["../../src/samples/SampleService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,
|
|
1
|
+
{"version":3,"file":"SampleService.d.ts","sourceRoot":"","sources":["../../src/samples/SampleService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAsC,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AACpC,OAAO,EAAC,SAAS,EAAc,MAAM,kBAAkB,CAAA;AAIvD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAO5C,qBAAa,aAAc,SAAQ,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;;IAMlD,QAAQ,CAAC,YAAY,EAAE,YAAY;IAL/C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAY;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAW;IAClD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAe;IACrD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAiC;gBAEnE,YAAY,EAAE,YAAY;IAEzC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAU/F,UAAU,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,eAAgC,EAAE,MAAiB,EAAC,EACjF,YAAY,CAAC,UAAU,EACzB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;cA4B1G,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;CAkBpE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Arrays, Progress, tryCatch, UUID } from "@opendaw/lib-std";
|
|
1
|
+
import { Arrays, isDefined, Progress, tryCatch, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { AudioData, estimateBpm } from "@opendaw/lib-dsp";
|
|
3
3
|
import { Promises } from "@opendaw/lib-runtime";
|
|
4
4
|
import { SamplePeaks } from "@opendaw/lib-fusion";
|
|
@@ -19,16 +19,16 @@ export class SampleService extends AssetService {
|
|
|
19
19
|
super();
|
|
20
20
|
this.audioContext = audioContext;
|
|
21
21
|
}
|
|
22
|
-
async importRecording(audioData, name = "Recording") {
|
|
22
|
+
async importRecording(audioData, bpm, name = "Recording") {
|
|
23
23
|
const arrayBuffer = WavFile.encodeFloats({
|
|
24
24
|
frames: audioData.frames.slice(),
|
|
25
25
|
numberOfFrames: audioData.numberOfFrames,
|
|
26
26
|
numberOfChannels: audioData.numberOfChannels,
|
|
27
27
|
sampleRate: audioData.sampleRate
|
|
28
28
|
});
|
|
29
|
-
return this.importFile({ name, arrayBuffer, origin: "recording" });
|
|
29
|
+
return this.importFile({ name, bpm, arrayBuffer, origin: "recording" });
|
|
30
30
|
}
|
|
31
|
-
async importFile({ uuid, name, arrayBuffer, progressHandler = Progress.Empty, origin = "import" }) {
|
|
31
|
+
async importFile({ uuid, name, bpm, arrayBuffer, progressHandler = Progress.Empty, origin = "import" }, transformMeta) {
|
|
32
32
|
console.debug(`importSample '${name}' (${arrayBuffer.byteLength >> 10}kb)`);
|
|
33
33
|
uuid ??= await UUID.sha256(arrayBuffer);
|
|
34
34
|
const audioData = await this.#decodeAudio(arrayBuffer);
|
|
@@ -36,15 +36,18 @@ export class SampleService extends AssetService {
|
|
|
36
36
|
const shifts = SamplePeaks.findBestFit(audioData.numberOfFrames);
|
|
37
37
|
const peaks = await Workers.Peak.generateAsync(progressHandler, shifts, audioData.frames, audioData.numberOfFrames, audioData.numberOfChannels);
|
|
38
38
|
const meta = {
|
|
39
|
-
bpm: estimateBpm(duration),
|
|
39
|
+
bpm: bpm ?? estimateBpm(duration),
|
|
40
40
|
name: name ?? "Unnnamed",
|
|
41
41
|
duration,
|
|
42
42
|
sample_rate: audioData.sampleRate,
|
|
43
43
|
origin
|
|
44
44
|
};
|
|
45
|
-
|
|
45
|
+
if (isDefined(transformMeta)) {
|
|
46
|
+
await transformMeta(meta, audioData);
|
|
47
|
+
}
|
|
46
48
|
const sample = { uuid: UUID.toString(uuid), ...meta };
|
|
47
|
-
|
|
49
|
+
await SampleStorage.get().save({ uuid, audio: audioData, peaks, meta });
|
|
50
|
+
this.notifier.notify([sample, audioData]);
|
|
48
51
|
return sample;
|
|
49
52
|
}
|
|
50
53
|
async collectAllFiles() {
|
|
@@ -2,7 +2,7 @@ import { Class, Option } from "@opendaw/lib-std";
|
|
|
2
2
|
import { Box } from "@opendaw/lib-box";
|
|
3
3
|
import { Soundfont } from "@opendaw/studio-adapters";
|
|
4
4
|
import { AssetService } from "../AssetService";
|
|
5
|
-
export declare class SoundfontService extends AssetService<Soundfont> {
|
|
5
|
+
export declare class SoundfontService extends AssetService<Soundfont, void> {
|
|
6
6
|
#private;
|
|
7
7
|
protected readonly namePlural: string;
|
|
8
8
|
protected readonly nameSingular: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoundfontService.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAE,MAAM,EAA+B,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAGpC,OAAO,EAAC,SAAS,EAAoB,MAAM,0BAA0B,CAAA;AAIrE,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAG5C,qBAAa,gBAAiB,SAAQ,YAAY,CAAC,SAAS,CAAC;;
|
|
1
|
+
{"version":3,"file":"SoundfontService.d.ts","sourceRoot":"","sources":["../../src/soundfont/SoundfontService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAE,MAAM,EAA+B,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AAGpC,OAAO,EAAC,SAAS,EAAoB,MAAM,0BAA0B,CAAA;AAIrE,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAG5C,qBAAa,gBAAiB,SAAQ,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;;IAC/D,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAe;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAc;IACrD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAmB;IACzD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAuC;;IAgB9F,IAAI,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAqB;IAClE,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAsB;IAE9D,UAAU,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;cA4ClE,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;CAKvE"}
|
|
@@ -64,7 +64,7 @@ export class SoundfontService extends AssetService {
|
|
|
64
64
|
if (!list.some(other => other.uuid === soundfont.uuid)) {
|
|
65
65
|
list.push(soundfont);
|
|
66
66
|
}
|
|
67
|
-
this.notifier.notify(soundfont);
|
|
67
|
+
this.notifier.notify([soundfont, undefined]);
|
|
68
68
|
updater.terminate();
|
|
69
69
|
return soundfont;
|
|
70
70
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendaw/studio-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.126",
|
|
4
4
|
"license": "LGPL-3.0-or-later",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
"@opendaw/studio-forge-boxes": "^0.0.83",
|
|
63
63
|
"@opendaw/typescript-config": "^0.0.29"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "816b8a6586f84c88171530e4df9af72a93caca36"
|
|
66
66
|
}
|