2014-04-11 1 views
0

나는 연주하는 각 노트마다 새로운 오실레이터를 만듭니다.웹 오디오 API : 모든 오실레이터를 음소거하고 멜로디를 일시 중지하는 방법

function playSound(freq, duration) { 
    var attack = 5, 
     decay = duration, 
     gain = context.createGain(), 
     osc = context.createOscillator(); 

    gain.connect(context.destination); 
    gain.gain.setValueAtTime(0, context.currentTime); 
    gain.gain.linearRampToValueAtTime(0.1, context.currentTime + attack/1000); 
    gain.gain.linearRampToValueAtTime(0, context.currentTime + decay/1000); 

    osc.frequency.value = freq; 
    osc.type = "sine"; 
    osc.connect(gain); 
    osc.start(0); 

    setTimeout(function() { 
     osc.stop(0); 
     osc.disconnect(gain); 
     gain.disconnect(context.destination); 
    }, decay) 
} 

멜로디는 for 루프에서 재생되며 여기서 playSound가 호출됩니다. 일시 중지 버튼을 클릭하면 멜로디를 음소거하고 for 루프를 일시 중지하여 다시 재생 버튼을 클릭하면 멜로디가 다시 시작됩니다. 현재 발진기를 모두 연결 해제하려면 어떻게합니까?

+0

웹 오디오에서는 오디오 노드를 일시 중지 할 수는 없지만 중지해야하며 다시 시작할 때 노드를 다시 만들어야합니다. 당신은 이미 이것을 알고있을 것입니다. 아래 @cwilso 대답은 정확합니다. 나중에 상호 작용할 노드에 대한 참조를 저장해야합니다. – OJay

답변

4

이 코드에서 사용할 수 없습니다.

1) Web Audio API에는 노드 그래프의 인트로 스펙 션이 없습니다. 가비지 수집을 최적화하고 많은 수의 노드를 최적화합니다. 두 가지 가능한 솔루션 - 재생 오실레이터 목록을 유지하거나 단일 게인 노드에 모두 연결 (즉, 자신의 엔벨로프 게인 노드를 "믹서"게인 노드에 연결) 한 다음 해당 게인을 끊고 (참조를 릴리스) 마디.

2) "for the loop for"을 무슨 뜻으로하는지 잘 모르겠다 - 나는 for 루프가 play note 방법을 감싸고 있다고 생각 하나?

관련 문제