2012-02-09 3 views
4

저는 Web Audio API를 사용하여 임펄스를 출력하는 JavaScriptNode를 만들려고합니다. 즉, 1을 출력하고 출력 할 노드가 필요합니다. 그 밖의 것은 0입니다.JavaScriptNode (웹 오디오 API)를 사용하여 임펄스 만들기

아래 코드가이 작업을 수행하는 합리적인 방법이라고 생각했습니다. "timeForAnImpulse"라는 변수를 true로 초기화하고이 변수를 사용하여 오디오 콜백에서 충동적인 출력을 트리거합니다. 그런 다음 콜백에서 "timeForAnImpulse"를 false로 설정합니다.

작동하는 것처럼 보이지만 그렇지 않습니다. 단일 충동 대신에 충동 열차 (각 완충 장치의 시작 부분에 1)를 얻습니다. 내가 뭘 잘못하고 있는거야?

<script type="text/javascript"> 

window.onload = init; 

    function impulseNodeCB(evt){ 

     if(timeForAnImpulse){ 
      var buf = evt.outputBuffer.getChannelData(0); 
      buf[0] = 1; 
      timeForAnImpulse = false; 
     } 
    } 

    var timeForAnImpulse = true; 

    function init() { 
     var context = new webkitAudioContext(); 
     impulseNode = context.createJavaScriptNode(2048,0,1); 
     impulseNode.onaudioprocess = impulseNodeCB; 
     impulseNode.connect(context.destination); 
    } 

</script> 

</head> 
+0

매우 간단한 '클릭'만 만들려고하십니까? 흥미 롭군요. – Lloyd

+0

정확히. 신호 처리 구조를 테스트/디버깅 할 때 충격이 들기는하지만, 나는 듣기에는별로 재미가 없다는 것을 인정한다. ;) –

답변

4

좋아, 알아 냈어!

출력 버퍼 evt.outputBuffer.getChannelData(0)은 각 콜백의 시작 부분에서 0으로 초기화되었다고 가정했습니다. 그렇지 않습니다. 대신 마지막 호출에서 값을 유지하는 것 같습니다. 명시 적으로 else 절의 버퍼를 0으로 설정하면 문제가 해결됩니다.

<script type="text/javascript"> 

window.onload = init; 

    function impulseNodeCB(evt){ 

     if(timeForAnImpulse){ 
      var buf = evt.outputBuffer.getChannelData(0); 
      buf[0] = 1; 
      timeForAnImpulse = false; 
     } else { 
      buf[0] = 0; 
     } 
    } 

    var timeForAnImpulse = true; 

    function init() { 
     var context = new webkitAudioContext(); 
     impulseNode = context.createJavaScriptNode(2048,0,1); 
     impulseNode.onaudioprocess = impulseNodeCB; 
     impulseNode.connect(context.destination); 
    } 

</script> 

</head> 
+1

buf [0]뿐만 아니라 매번 buf의 모든 값을 설정해야합니다. API 스펙은 약속을하지 않으므로 출력 버퍼에 가비지가 들어있을 수 있습니다. AudioBufferSourceNode를 사용하면보다 효율적으로 같은 결과를 얻을 수 있습니다. – aldel