@opendaw/studio-core 0.0.124 → 0.0.125
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 +1 -0
- 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 +3 -3
- package/dist/samples/SampleService.d.ts.map +1 -1
- package/dist/samples/SampleService.js +9 -6
- package/package.json +2 -2
package/dist/AssetService.d.ts
CHANGED
|
@@ -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;IAC3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAChD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC9C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAA;IAC3E,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAEhE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAoB;IAE5D,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY;IAExC,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAI1D,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAExD,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE;QAAE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAsCjG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoChH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAClE"}
|
|
1
|
+
{"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;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"}
|
|
@@ -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,7 +1,7 @@
|
|
|
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
6
|
export declare class SampleService extends AssetService<Sample> {
|
|
7
7
|
#private;
|
|
@@ -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,CAAC;;IAMvC,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,14 +36,17 @@ 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 };
|
|
49
|
+
await SampleStorage.get().save({ uuid, audio: audioData, peaks, meta });
|
|
47
50
|
this.notifier.notify(sample);
|
|
48
51
|
return sample;
|
|
49
52
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendaw/studio-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.125",
|
|
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": "6f73b01e0a666bb2a260e3b2a17dedcc072d1e69"
|
|
66
66
|
}
|