@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.
@@ -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;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,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,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"}
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"}
@@ -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.unwrap("SampleService not set").importRecording(audioData);
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;IA2BvC,cAAc,IAAI,UAAU;CAsH/B"}
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,UA+JL,CAAA;;CACJ"}
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 => project.trackUserCreatedSample(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,EAA2B,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAA;AACpC,OAAO,EAAC,SAAS,EAAc,MAAM,kBAAkB,CAAA;AAIvD,OAAO,EAAC,MAAM,EAAiB,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,IAAI,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlF,UAAU,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,eAAgC,EAAE,MAAiB,EAAC,EAC5E,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;cAyB5C,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;CAkBpE"}
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
- await SampleStorage.get().save({ uuid, audio: audioData, peaks, meta });
45
+ if (isDefined(transformMeta)) {
46
+ await transformMeta(meta, audioData);
47
+ }
46
48
  const sample = { uuid: UUID.toString(uuid), ...meta };
47
- this.notifier.notify(sample);
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;;IACzD,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"}
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.124",
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": "bcacc3de31ba8c899be229f7ca0b9186a21cd290"
65
+ "gitHead": "816b8a6586f84c88171530e4df9af72a93caca36"
66
66
  }