javascript - slider 不移动且网络音频中的音调发生奇怪变化

标签 javascript jquery html jquery-ui web-audio-api

我有一个振荡器,其初始频率、失谐和增益参数设置为它们所连接的 slider 的值。除了我注意到的一些奇怪的事情之外,一切正常:

  1. 在按下播放按钮之前 slider 不会移动,但值仍然会发生变化。
  2. 按下播放按钮时,最初会播放正确的音高,但是当移动音高 slider 以设置新频率,然后暂停并再次播放时,听起来仍然处于正确的频率,但高了 Octave 。
  3. 在第一次奇怪的“ Octave 变化”之后,如果暂停并再次播放,它会像一开始那样保持在新的意外频率。

这是我的代码:

<input type="button" id="play_pause" value="play"/><br/>
<label for="cur_vol">Current Volume:</label><input type="text" id="cur_vol" />
<div id="osc1_vol"></div>
<label for="cur_pitch">Current Pitch:</label><input type="text" id="cur_pitch" />
<div id="osc1_pitch"></div>
<label for="cur_detune">Current Detune:</label><input type="text" id="cur_detune" />
<div id="osc1_detune"></div>


$(document).ready(function(){
//GAIN SLIDER//
$(function() {
    $("#osc1_vol").slider({
        min: 0,
        max: 1,
        value: .5,
        step: .01,
        slide: function(event, ui) {
            $("#cur_vol").val(ui.value);
            gainNode.gain.value = $("#cur_vol").val();
        }
    });
    $("#cur_vol").val($("#osc1_vol").slider("value"));
});
//PITCH SLIDER//
$(function() {
    $("#osc1_pitch").slider({
        min: 0,
        max: 25000,
        value: 440,
        step: 1,
        slide: function(event, ui) {
            $("#cur_pitch").val(ui.value);
            osc.detune.value = $("#cur_pitch").val();
        }
    });
    $("#cur_pitch").val($("#osc1_pitch").slider("value"));
});
//DETUNE SLIDER//
$(function() {
    $("#osc1_detune").slider({
        min: -4800,
        max: 4800,
        value: 0,
        step: 1,
        slide: function(event, ui) {
            $("#cur_detune").val(ui.value);
            osc.detune.value = $("#cur_detune").val();
        }
    });
    $("#cur_detune").val($("#osc1_detune").slider("value"));
});
//PLAY/PAUSE BUTTON//
$('#play_pause').click(function() {
    if ($(this).val() == "play") {
        $(this).val("pause");
        osc1();
    }
    else {
        $(this).val("play");
        osc.disconnect();
    }
});
});
//WEB AUDIO SET UP//
var ctx = new webkitAudioContext();
//CREATE OSCILLATOR//
function osc1(){ 
osc = ctx.createOscillator(), 
osc.type = 0; //0 = sine, 1 = square, 2 = saw, 3 = triangle, 4 = custom
osc.frequency.value = $("#osc1_pitch").slider("value");
osc.detune.value = $("#osc1_detune").slider("value");
gainNode = ctx.createGainNode(); 
osc.connect(gainNode); 
gainNode.connect(ctx.destination);
gainNode.gain.value - $("#osc1_vol").slider("value"); 
osc.noteOn(0); 
};

这是一个有效的演示: http://jsfiddle.net/ryanhagz/tvfDZ/

最佳答案

Sliders don't move until play button is pressed, but the values still change.

您的事件处理程序正在抛出错误。这会导致 slider 无法正确更新。

When play is pressed, the correct pitch is played initially, but when the pitch slider is moved to set a new frequency, then paused, and played again, it sounds like it's still at the correct frequency, but an octave higher.

After the first strange "octave change", if it is paused and played once again, it stays at the new unexpected frequency like it should in the first place.

这是一个错误:

//PITCH SLIDER//
$(function() {
...
        osc.detune.value = $("#cur_pitch").val();
        //why are you changing detune here?
...
});

关于javascript - slider 不移动且网络音频中的音调发生奇怪变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673710/

相关文章:

javascript - 替换 href http ://with//的脚本

javascript - 从 AJAX 调用的 PHP 脚本,返回值不会一直显示

jQuery 移动用户代理检测

javascript - 使用纯javascript将绝对定位元素放在窗口顶部

javascript - 无法将 Parse 安装设置为两个 channel 以进行推送通知

javascript - 在向前迭代之前等待调用函数完成

html - 水平滚动 - Div - 页面内容 css 类

javascript - 以调试器的方式在 HTML 中显示 JS 对象的库

javascript - 从浏览器建立任意 TCP 连接

javascript - Highcharts 标题对齐