【问题标题】:Slider not moving & strange pitch change in Web-AudioWeb-Audio 中的滑块不移动和奇怪的音高变化
【发布时间】:2013-10-30 12:26:50
【问题描述】:

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

  1. 在按下播放按钮之前,滑块不会移动,但值仍然会发生变化。
  2. 按下播放时,最初会播放正确的音高,但当移动音高滑块以设置新频率,然后暂停并再次播放时,听起来仍是正确的频率,但高了一个八度。
  3. 在第一次奇怪的“八度变化”之后,如果它被暂停并再次播放,它将保持在新的意外频率上,就像它应该放在首位一样。

这是我的代码:

<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/

【问题讨论】:

  • 如果您在使用 jQuery 的 .slider 时遇到问题,可以使用 html5 的 &lt;input type="range"&gt;

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


【解决方案1】:

在按下播放按钮之前,滑块不会移动,但值仍然会发生变化。

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

按下播放时,最初会播放正确的音高,但当移动音高滑块以设置新频率,然后暂停并再次播放时,听起来仍是正确的频率,但高了一个八度。

在第一次奇怪的“八度变化”之后,如果它被暂停并再次播放,它会像一开始一样停留在新的意外频率。

这是一个错误:

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

【讨论】:

  • 你是什么意思他们抛出错误?你怎么知道?我没有注意到……这就是导致问题的原因,谢谢!
  • 您没有看到错误?你打开你的javascript控制台了吗?没有人你是怎么走到这一步的? O.o
  • 通过我的浏览器进行试验和错误......这很糟糕吗?哈哈,我就是这样测试我的代码的。
  • 呃。是的。您应该使用 javascript 控制台。按 F12,如果可以找到,请转到控制台。
猜你喜欢
  • 2016-10-31
  • 2019-06-24
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多