使用 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
并检查缓冲区:
- 以秒为单位的长度为 1.97(当节奏为 120 bpm 时,我预计小节为 2.0)
- 样本长度为 87317(我预计 88200 持续 2 秒,采样率为 44.1)
我正在寻找有关如何准确录制一段音频(即 88200 个样本,120 bpm 和 44.1 采样率)的建议,录制音频的开头正好在小节上。
这是不可能的,因为 Recorder
class 依赖 here at mdn 描述的 MediaSream 记录 API。这是一个独立的 API,不具有任何样本准确性。
您需要做的是创建您自己的 AudioProcessorWorklet,将 UserMedia Stream 与其连接,然后从工作集中获取输入样本以创建 AudioBuffer。然后,您可以通过参数以样本精确的方式控制抓取(记录)和不抓取(不记录)样本。
使用下面的代码,我尝试使用 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
并检查缓冲区:
- 以秒为单位的长度为 1.97(当节奏为 120 bpm 时,我预计小节为 2.0)
- 样本长度为 87317(我预计 88200 持续 2 秒,采样率为 44.1)
我正在寻找有关如何准确录制一段音频(即 88200 个样本,120 bpm 和 44.1 采样率)的建议,录制音频的开头正好在小节上。
这是不可能的,因为 Recorder
class 依赖 here at mdn 描述的 MediaSream 记录 API。这是一个独立的 API,不具有任何样本准确性。
您需要做的是创建您自己的 AudioProcessorWorklet,将 UserMedia Stream 与其连接,然后从工作集中获取输入样本以创建 AudioBuffer。然后,您可以通过参数以样本精确的方式控制抓取(记录)和不抓取(不记录)样本。