2013-03-07 17 views
8

Próbuję uruchomić i zatrzymać dźwięk. I to działa. Ale nie mogę ponownie uruchomić dźwięku.Web Audio włącz i wyłącz oscylator, następnie uruchom go ponownie

Czy naprawdę muszę ponownie wykonać inny oscylator? To wydaje się wyjątkowo nieintuicyjne. Musi być lepszy sposób.

To wszystko co mam, że działa:

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

Wywołanie noteOn znowu robi nic zrobić. Czemu? Jest poza mną.

Próbowałem także ustawić głośność, lub w kontekście Web Audio ludzi, "gain", równe zero. Ale z jakiegoś powodu zysk zerowy daje dźwięk. Jaka wartość zysku nie dałaby żadnego dźwięku?

człowiek, nie mogę uwierzyć, jak trudne jest to:/

Odpowiedz

3

Musisz użyć metody .disconnect() (chyba że spec zmieniła niedawno).

Napisałem to tutaj:

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

EDIT

Ta odpowiedź jest stary, kiedy tylko próbuje dowiedzieć się, w jaki sposób Web Audio API działało. Nie musisz używać rozłączania.

+0

to większy sens, że zniszczenie oscylatorów! –

+0

Napisałem to 2 lata temu. Nie trzeba ich rozłączać, aby rozpocząć i zatrzymać. – William

7

Właściwie tak, musisz utworzyć nowy węzeł oscylatora. Interfejs API został zaprojektowany i zoptymalizowany do pracy z tym wzorcem.

Schemat rozłączenia w kodzie Taoist'a jest zasadniczo zawiłym sposobem tworzenia nowego oscylatora (robi to za każdym razem, gdy uruchamiany jest oscOn). Nigdy nie wywołuje on jawnie NoteOff na starym oscylatorze, który jest odłączony, więc może nadal działać w tle (nie wiem, jak to działa w web audio), chociaż nie jest słyszalny, ponieważ jest odłączony od łańcucha audio. Mogłoby to potencjalnie zestawiać oscylatory w tle, które pracują i opróżniają procesor.

Oto ten sam kod, chociaż poprawnie używa noteOff(). http://codepen.io/Theodeus/pen/afgqk

Oto ten sam kod, choć dostosowane za pomocą węzła wzmocnienia do sterowania oscylatora a więc tylko przy użyciu tego samego oscylatora cały czas (choć nie jest to zalecane, lepiej, aby utworzyć nowy oscylator do każdej nuty, ja myślę) http://codepen.io/Theodeus/pen/aKFje

Edit kwietnia 2015
Ponieważ próbki kodu wydaje się być zagubiony w cyberprzestrzeni, oto poradnik napisałem na oscylatory, który zawiera przykłady kodu, który pokazuje jeden strzał charakter oscylatorów. Nie jest to dokładnie ten sam kod, jak ten wspomniany powyżej, ale pokazuje tę samą koncepcję. http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - istota tego jest taka:

//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

I tylko po to, aby to udowodnić, oto schemat odłączania przystosowany do używania tylko jednego oscylatora i odłączania/ponownego łączenia. http: // codepen.io/Theodeus/pen/bwoKn –

+0

I właśnie kiedy myślałem, że wiem, co robię. Aby dodać, noteOn() i noteOff() zostały uznane za przestarzałe na korzyść start() i stop() – William

+0

Oryginalny kod Taoista utrzymywałby oscylator przez pewien czas (i działa!), Ale po utworzeniu innego oscylatora (Następnym razem, gdy wywołasz funkcję oscOn()), odwołanie do poprzedniego oscylatora zostanie zwolnione i zostaną zebrane śmieci. – cwilso

Powiązane problemy