2013-03-07 1 views
8

소리를 시작하고 중지하려고합니다. 그리고 그것은 작동합니다. 그러나 나는 소리를 다시 시작할 수 없다.웹 오디오를 시작하고 중지 한 다음 다시 시작하십시오.

다른 오실레이터를 다시 만들어야합니까? 이것은 단지 매우 직관적이지 않은 것처럼 보입니다. 더 좋은 방법이 있어야합니다.

oscillator1.noteOn(0); 
oscillator1.noteOff(0); 

호출 noteOn을 다시 아무것도 할 나던 :

작동이 내가 가진 전부입니다. 왜? 나를 넘어.

또한 웹 오디오 사용자의 컨텍스트에서 "gain"을 0으로 설정하려고 시도했습니다. 그러나 어떤 이유로 든 0의 게인은 소리를냅니다. 이득의 가치는 아무런 소리도 내지 않을 것입니까?

사람, 난이게 얼마나 어려운 믿을 수 없어 :/

답변

3

당신은 (스펙 최근 변경하지 않는 한)이 .disconnect() 메소드를 사용합니다.

나는 여기를 썼다 :

http://en.wikiaudio.org/Web_Audio_API:Toggle_oscillator_on_and_off

편집 난 그냥 웹 오디오 API가 작동하는 방법을 배우려고 할 때

이 응답이 오래되었습니다. 연결 해제를 사용할 필요가 없습니다.

+0

오실레이터를 파괴하는 것이 더 합리적입니다. –

+0

나는 2 년 전에 그것을 썼다. 시작하고 중지하려면 연결을 끊을 필요가 없습니다. – William

7

사실, 새로운 오실레이터 노드를 만들어야합니다. API는 해당 패턴을 처리하도록 설계되고 최적화되었습니다.

Taoist 코드의 연결 끊기 패턴은 기본적으로 새로운 오실레이터를 생성하는 복잡한 방법입니다 (oscOn이 실행될 때마다 수행됨). 그것은 연결 해제 된 오래된 오실레이터에서 noteOff를 명시 적으로 호출하지 않으므로 오디오 체인에서 연결이 끊어지기 때문에 소리가 나지 않지만 백그라운드에서 계속 실행 중일 수 있습니다. 따라서 CPU를 실행하고 배수하는 백그라운드에서 오실레이터를 잠재적으로 스택 할 수 있습니다.

noteOff()를 올바르게 사용했지만 동일한 코드가 있습니다. http://codepen.io/Theodeus/pen/afgqk

여기서 나는, 비록 오실레이터를 제어하기 위해 게인 노드를 사용하여 적응이하지 않는 것이 좋습니다 불구하고, 따라서 각 노트에 대한 새로운 오실레이터를 만들려면 (같은 오실레이터에게 더 나은 모든 시간을 사용하여, 동일한 코드입니다 생각은) http://codepen.io/Theodeus/pen/aKFje

편집 4 월 코드 샘플 이후 2015
여기, 사이버 공간에서 손실 될 것으로 보인다 오실레이터의 원샷 특성을 보여줍니다 코드 예제를 포함하고 내가 오실레이터에 쓴 튜토리얼입니다. 위에서 언급 한 코드와 정확히 같은 코드는 아니지만 동일한 개념을 보여줍니다. http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - 그 요지는 다음과 같습니다.

//This won't work. Can't call play twice. 
var context = new AudioContext(), 
    oscillator = context.createOscillator(); 

oscillator.connect(context.destination); 
oscillator.start(context.currentTime); 
oscillator.stop(context.currentTime + 0.5); 
oscillator.start(context.currentTime + 1); 
oscillator.stop(context.currentTime + 1.5); 


//this will work! 
var context = new AudioContext(), 
    oscillator; 

function playOscillator(startTime, endTime) { 
    oscillator = context.createOscillator(); 
    oscillator.connect(context.destination); 
    oscillator.start(startTime); 
    oscillator.stop(endTime); 
} 

playOscillator(context.currentTime, context.currentTime + 0.5); 
playOscillator(context.currentTime + 1, context.currentTime + 1.5); 
+0

그리고 요점을 증명하기 위해 하나의 오실레이터 만 사용하고 연결 해제/다시 연결하는 데 사용되는 연결 해제 패턴이 있습니다. http : // codepen.io/Theodeus/pen/bwoKn –

+0

그리고 내가 생각한 바로는 내가하고있는 것을 알았습니다. addOn()과 noteOff()는 start()와 stop()을 사용하여 더 이상 사용되지 않습니다 – William

+0

도교의 원래 코드는 오실레이터를 잠시 동안 유지하고 실행합니다!하지만 다른 오실레이터를 생성하면 다음에 oscOn()을 호출하면 이전 오실레이터에 대한 참조가 해제되고 가비지 수집됩니다. – cwilso