我正在制作一个基于使用 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 文件夹中找到完整的代码
播放有时会起作用,但大多数时候至少一个音符是时间,通常不止一个。如果当前音符的间隔短于它首先播放的前一个音符,那么如果你要减去间隔,则前一个音符会在剩余的时间内播放(至少我认为这是正在发生的)