2016-03-22 4 views
0

Я делаю драм-машину/сэмплер, и я хочу, чтобы пользователь мог контролировать количество искажений на выходе с помощью ползунка. Я создал узел 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; 
} 

То, что кажется, происходит то, что первая смена ползунка приводит к кривой искажения, чтобы изменить что-то, но после того, что дальнейшие изменения не оказывают никакого влияния. Кто-нибудь может объяснить, что происходит?

ответ

0

Я думаю, что это, где это идет не так:

var k = typeof amount === 'number' ? amount : 50 

значение слайдера является строка, а не число, которое могло бы объяснить, почему он работает в первый раз (он оценивает 50). Так что если вы делаете

makeDistortionCurve(parseInt(distortionAmountSlider.value, 10)); 

Вы должны быть добрым идти! (Или используйте parseFloat, если вам нужен поплавок ..)

+0

Спасибо! Это точно. Я никогда не использовал тройной оператор раньше, я должен был посмотреть его, прежде чем копировать код :) –