Я делаю драм-машину/сэмплер, и я хочу, чтобы пользователь мог контролировать количество искажений на выходе с помощью ползунка. Я создал узел WaveShaper, подключил его соответствующим образом, задал кривую, используя уравнение, найденное на этом сайте, все это работает нормально.Изменение кривой WebAudio WaveShaper Node во время игры
Затем я хочу ввести диапазон для вызова функции в событии изменения, чтобы сбросить кривую, чтобы обеспечить более или менее искажение в соответствии с новым значением входа.
Вот что у меня есть:
// Distortion:
bussDistortion = audioContext.createWaveShaper();
bussDistortion.curve = makeDistortionCurve(0);
bussDistortion.connect(audioContext.destination);
// Slider:
distortionAmountSlider = document.querySelector('#distortion_amount');
// Event listener:
distortionAmountSlider.addEventListener('change', changeDistortionAmount, false);
// Update function:
function changeDistortionAmount() {
bussDistortion.curve = makeDistortionCurve(distortionAmountSlider.value);
}
function makeDistortionCurve(amount) {
var k = typeof amount === 'number' ? amount : 50,
n_samples = 44100,
curve = new Float32Array(n_samples),
i = 0,
x;
for (; i < n_samples; ++i) {
x = i * 2/n_samples - 1;
curve[i] = (Math.PI + k) * x * (1/6)/(Math.PI + k * Math.abs(x));
}
return curve;
}
То, что кажется, происходит то, что первая смена ползунка приводит к кривой искажения, чтобы изменить что-то, но после того, что дальнейшие изменения не оказывают никакого влияния. Кто-нибудь может объяснить, что происходит?
Спасибо! Это точно. Я никогда не использовал тройной оператор раньше, я должен был посмотреть его, прежде чем копировать код :) –