fix sample slicing + unit + nudge

This commit is contained in:
Felix Roos 2022-09-21 22:25:35 +02:00
parent 17c83e1a85
commit 819abbfa7a

View File

@ -187,6 +187,8 @@ Pattern.prototype.out = function () {
begin = 0,
end = 1,
vowel,
unit,
nudge = 0, // TODO: is this in seconds?
} = hap.value;
const { velocity = 1 } = hap.context;
gain *= velocity; // legacy fix for velocity
@ -253,17 +255,22 @@ Pattern.prototype.out = function () {
console.warn('no buffer source');
return;
}
// TODO: cut, loop
bufferSource.playbackRate.value = Math.abs(speed) * bufferSource.playbackRate.value;
// TODO: nudge, unit, cut, loop
let duration = soundfont || clip ? hapDuration : bufferSource.buffer.duration;
// let duration = bufferSource.buffer.duration;
const offset = begin * duration;
duration = ((end - begin) * duration) / Math.abs(speed);
if (soundfont || clip) {
bufferSource.start(t, offset); // duration does not work here for some reason
} else {
bufferSource.start(t, offset, duration);
if (unit === 'c') {
// are there other units?
bufferSource.playbackRate.value = bufferSource.playbackRate.value * bufferSource.buffer.duration;
}
let duration = soundfont || clip ? hapDuration : bufferSource.buffer.duration / bufferSource.playbackRate.value;
// "The computation of the offset into the sound is performed using the sound buffer's natural sample rate,
// rather than the current playback rate, so even if the sound is playing at twice its normal speed,
// the midway point through a 10-second audio buffer is still 5."
const offset = begin * duration * bufferSource.playbackRate.value;
duration = (end - begin) * duration;
t += nudge;
bufferSource.start(t, offset);
chain.push(bufferSource);
if (soundfont || clip) {
const env = ac.createGain();