изменение типа осциллятора в Web Audio API с помощью ползунка диапазона

мне удалось заставить ползунок измениться на частоту генератора, но не работает для типа генератора.

вот ссылка jsfiddle http://jsfiddle.net/ehsanziya/aKDkf/1/

и вот JavaScript

$(document).ready(function () {

var context = new webkitAudioContext();
var osc = context.createOscillator();

//initializing oscillator type to 0 (Sinewave)
osc.type=0;
$('oscType').change(function(){
osc.type = $(this).val();
})

//setting initial OSC frequency to 440.
osc.frequency.value = 440;
//changing  Oscillator's frequency with the range input
$('#oscFreq').change(function(){
osc.frequency.value = $(this).val()
})



$('#onOff').click(function () {
    this.value = this.value === 'ON' ? 'OFF' : 'ON';
});


$('#onOff').click(function () {
    var buttonValue = $('#onOff').val();

    // creating AudioContext


    if (buttonValue === 'OFF') {
        osc.connect(context.destination);
        osc.noteOn(0);

    } else if (buttonValue === 'ON') {
        osc.disconnect(0);
    }


});

});


person zya    schedule 31.03.2013    source источник


Ответы (2)


Две вещи:

Во-первых, в строке 7 ваш селектор неверен. Должно быть $('#oscType'). В вашем не было #.

Во-вторых, в строке 8 вам нужно изменить на osc.type = parseInt($(this).val(), 10);, потому что входные значения всегда являются строками, а вам нужно целое число.

person Kevin Ennis    schedule 31.03.2013
comment
да, спасибо, я исправил, глупая ошибка. теперь он работает. что именно делает второй аргумент в parseInt? я имею в виду 10. - person zya; 01.04.2013
comment
Второй аргумент называется основанием или основанием. Всегда полезно поставить его, потому что в некоторых случаях вы можете столкнуться со странными проблемами. Например, некоторые браузеры будут интерпретировать строку "065" как 53, потому что они предполагают, что начальный ноль означает, что это восьмеричное число или основание 8. - person Kevin Ennis; 01.04.2013

Я не проверял другие возможные проблемы, но в соответствии со спецификациями API веб-аудио вы должны передать строку, указывающую желаемый тип, а не int, см. примечания об устаревании

//OscillatorNode constants for the .type attribute

//New way  
enum OscillatorType {"sine",
                     "square",   
                     "sawtooth", 
                     "triangle",
                     "custom" }
person kr1    schedule 31.03.2013
comment
он работает, когда я вручную меняю его на 1 и меняю тип генератора на прямоугольную волну, но не работает с ползунком. - person zya; 31.03.2013
comment
@EhsanZiya, jQuery на вашем слайдере дает вам целые числа или строки? - person kr1; 31.03.2013
comment
Я действительно не знаю, как я могу проверить? - person zya; 31.03.2013
comment
теперь я сделал это с радиоселектором, и он работает jsfiddle.net/ehsanziya/b39Dq/1 - person zya; 31.03.2013
comment
@EhsanZiya, хорошо. вы можете проверить с помощью typeof(<your var>) и привести к номеру с помощью Number(<your var>) - person kr1; 31.03.2013
comment
я пробовал для обоих ползунков/оба не определены. вот почему он не работает. но мне интересно, почему это работает для узла осциллятора. - person zya; 31.03.2013