Запись punch-in и punch-out с точностью до семпла с использованием тона. js - PullRequest
1 голос
/ 26 мая 2020

Используя приведенный ниже код, я пытаюсь записать ровно одну полосу звука с помощью 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 (я ожидаю 2,0 для бара при темпе 120 ударов в минуту)
  • длина в сэмплах составляет 87317 (я ожидаю, что 88200 за 2 секунды с частотой дискретизации 44,1) ), причем начало записанного звука точно соответствует такту.

1 Ответ

1 голос
/ 29 августа 2020

Это невозможно из-за того, что класс Recorder полагается на API записи MediaSream, описанный здесь по адресу mdn . Это независимый API, не имеющий какой-либо точности сэмплов.

Что вам нужно сделать, так это создать свой собственный AudioProcessorWorklet, подключить к нему поток UserMedia и затем взять входные образцы из рабочего листа для создания AudioBuffer . Затем вы можете управлять захватом (записью), а не захватом (не записью) сэмплов с помощью параметра с точностью до сэмпла.

...