2013-10-30 34 views
0

我有一個振盪器,它的初始頻率,失諧和增益參數設置爲他們所附帶的滑塊的值。一切正常,除了我注意到的幾件奇怪的事情:滑條不移動&網絡音頻奇怪的音調變化

  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/

+0

如果您在使用jQuery的.slider麻煩,你可以使用HTML5的'' – uber5001

回答

2

滑不動,直到播放按鈕被按下,但仍有價值變化。

你的事件處理程序拋出錯誤。這會導致滑塊無法正確更新。

當按下播放,正確的音高首先出場,但是當俯仰移動滑塊來設置一個新的頻率,然後停頓了一下,並再次發揮,這聽起來像它仍然在正確的頻率,而是倍頻程。

在第一個奇怪的「八度變化」之後,如果它暫停並再次播放,它將保持在新的意想不到的頻率,就像它應該放在首位一樣。

這是一個錯誤:

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

你是什麼意思他們投擲錯誤?你怎麼知道? 而我沒有注意到...那是什麼引起了這個問題,謝謝! – ryanhagz

+0

你沒有看到錯誤?你打開你的JavaScript控制檯嗎?沒有一個,你是如何得到這個的? O.o – uber5001

+0

通過我的瀏覽器進行試用和錯誤....是不是很糟糕?大聲笑我這就是我總是測試我的代碼。 – ryanhagz