0

我正在制作一个基于使用 Tonejs 的合成器的项目。我创建了一个录制选项(不是声音,而是音符和音符之间的间隔)。我的问题从尝试播放“录音”时开始。我不确定如何跟踪整个时间范围并在正确的时间触发音频上下文。

记录功能:

const startCurrInt = () =>
    setInterval(() => {
      currInterval += 0.05;
    }, 50);

const handleKeyDown = (e) => {
    const key = e.key;
    if (e.repeat) {
      return;
    }
    const noteObj = all.filter((note) => note.key === key.toLowerCase())[0];
    if (noteObj.key === key.toLowerCase()) {
      console.log(noteObj.note, noteObj.octave);
      synth.triggerAttackRelease(
        `${noteObj.note}${noteObj.octave}`,
        `${noteObj.timing}n`
      );
      if (recording.current) {
        noteObj.interval = currInterval;
        recorded.current.push(noteObj);
        setRecordedArr(recorded.current);
        // console.log(recorded.current, recording);
        clearInterval(startCurrInt);
        currInterval = 0;
        startCurrInt();
      }
    }
  };

我得到了按键之间的间隔,但没有得到整体时间线,但即使有了整体时间线,我也不知道如何将其传递给 Tonejs。

播放功能:

const handlePlayRecording = (arr) => {
    const now = Tone.now();
    let int = 0;
    arr.forEach((element) => {
      const { note, interval, octave, timing } = element;
      synth.triggerAttackRelease(
        `${note}${octave}`,
        `${timing}n`,
        `${now + interval}`
      );
    });
  };

你可以在我的 github 的 src 文件夹中找到完整的代码

播放有时会起作用,但大多数时候至少一个音符是时间,通常不止一个。如果当前音符的间隔短于它首先播放的前一个音符,那么如果你要减去间隔,则前一个音符会在剩余的时间内播放(至少我认为这是正在发生的)

4

0 回答 0