使用 tone.js 进行精确采样的切入和切出录音

Sample-accurate punch-in and punch-out recording using tone.js

使用下面的代码,我尝试使用 tonejs` Recorder(MediaRecorder 的包装器)准确录制一段音频。

const userMedia = new Tone.UserMedia();
await userMedia.open();
const recorder = new Recorder();
userMedia.connect(recorder);

Tone.Transport.scheduleOnce(t => {
  console.log('starting recorder', t);
  recorder.start();
}, "4:0:0");

Tone.Transport.scheduleOnce(async t => {
  const data = await recorder.stop();
  // ... when I load the audio data into a SamplePlayer and inspect the buffer:
  //  * the length in seconds is 1.97 (I expect 2.0 for a bar when the tempo is 120 bpm)
  //  * the length in samples is 87317 (I expect 88200 for 2 secs w/ 44.1 sample rate) 

}, "5:0:0");

录制后,我将音频数据加载到 SamplePlayer 并检查缓冲区:

我正在寻找有关如何准确录制一段音频(即 88200 个样本,120 bpm 和 44.1 采样率)的建议,录制音频的开头正好在小节上。

这是不可能的,因为 Recorder class 依赖 here at mdn 描述的 MediaSream 记录 API。这是一个独立的 API,不具有任何样本准确性。

您需要做的是创建您自己的 AudioProcessorWorklet,将 UserMedia Stream 与其连接,然后从工作集中获取输入样本以创建 AudioBuffer。然后,您可以通过参数以样本精确的方式控制抓取(记录)和不抓取(不记录)样本。