2016-07-08 15 views
0

Web Audio APIを使用して、オシレータを使用して基本音を生成し、演奏された音符の継続時間(秒)を変える問題があります。AudioContext.currentTime +可変時間

"サステイン"変数がオシレータの停止に期待どおりに動作しないことが問題です。この変数は、演奏された1音に対して期待どおりに機能し、残りの音は無期限に演奏されます。私が変数を削除し、変数を使用するのではなく持続時間をハードコードすると、正常に動作します。 context.currentTimeのログは、可変またはハードコーディングされた期間の間に差異を示さない。思考以上のもの。私は何が欠けているのですか?

JS:

//start new audio session. Do this only once 

VARコンテキスト=新しいwindow.webkitAudioContext()。

function playSound(注){ oscillator = context.createOscillator();

//create volume controller 
var gainNode = context.createGain(); 

//connect signal to audio output(speakers by default) 
oscillator.connect(gainNode); 
gainNode.connect(context.destination); 

//adjusts frequency played by 50%, 100% or 200% 
var octave = document.getElementById('octave').value; 

//sets oscillator frequency 
oscillator.frequency.value = frequencies[note] * octave; 

//oscillator wave type 
oscillator.type = document.getElementById('waveSelect').value; 

//starts oscillator. Delayed start can be achieved by adding time(in secs) after currentTime 
oscillator.start(context.currentTime + 0.01); 

//determines note duration 
var sustain = document.getElementById('sustain').value; 

//stops oscillator by exponentially ramping down sound over .015 seconds to avoid audible click 
gainNode.gain.setTargetAtTime(0, context.currentTime + sustain, 0.0015); 


//for testing 
console.log("Hz:" + frequencies[note] * octave + " octave:" + octave + " wave:" + oscillator.type + "duration: " + sustain + " time:" + context.currentTime); 

}

HTML:助けを

<select class="lists" id="sustain"> 
      <option value="0.5">EIGHTH NOTE</option> 
      <option value="1.0">QUARTER NOTE</option> 
      <option value="2.0">HALF NOTE</option> 
      <option value="4.0">WHOLE NOTE</option>    
     </select> 

ありがとう!

答えて

2

サステイン選択要素の結果の値を浮動小数点数に解析する必要があります。これは、文字列値を返すためです。 そして、文字列をjavascriptの数値と組み合わせると、文字列に評価されます。 は実用的例えば、このjsbinを見てください:

http://jsbin.com/qexusoyida/edit?html,js,console,output

ただ、当然のことながら、この

var sustain = parseFloat(document.getElementById('sustain').value); 
+0

よう

var sustain = document.getElementById('sustain').value; 

この行を編集します!ダー。ありがとうございました!それはいつも私を得る最も簡単な小さなものです。すぐにそれを発見したはずです。感謝します! – Fedreg

+0

これはみんなに起こるようなものだと思います。お役に立てて嬉しいです! – scriptify

関連する問題