2015-04-23 11 views
7

Ich bin nicht in der Lage, eine gleitende Änderung der Lautstärke durch exponentialRampToValueAtTime eines GainNode zu bekommen. HierWie funktioniert das audioParam.exponentialRampToValueAtTime?

ein Beispiel:

var context = new AudioContext(), 
    osc = context.createOscillator(), 
    gain = context.createGain(); 

osc.frequency.value = 440; // A note 
osc.start(0); 
osc.connect(gain); 

gain.gain.value = 0; 
gain.connect(context.destination); 

gain.gain.cancelScheduledValues(0); 
gain.gain.setValueAtTime(0, context.currentTime); 
gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 2); 

In meinem Verständnis dieser allmählich die Lautstärke erhöhen sollte, bis zum Erreichen 1 (100%) und dieser ganze Prozess sollte 2sec nehmen. Ist diese Annahme richtig?

Wenn ja, warum bleibt 2 Sekunden lang auf 0 stehen und schaltet plötzlich auf volle Lautstärke?

Vielen Dank im Voraus für Ihre Zeit und Mühe.

+0

Haben Sie 'linearRampToValueAtTime' versucht? –

+0

Ich habe, und es funktioniert, aber ich lese, dass linear klingt nicht so gut wie exponentielle Rampe, also wollte ich dies ausprobieren. Ich schreibe einen Hüllkurvengenerator und möchte einige Optionen testen. –

+0

Ich denke, so soll es funktionieren. Rampe schnell hoch. –

Antwort

8

Es scheint, dass diese Funktion 0 Wert nicht mag. FF wirft "SyntaxError: Eine ungültige oder ungültige Zeichenfolge wurde angegeben". Der folgende Code wird korrekt rampen. Siehe auf Plnkr.

var context = new AudioContext(), 
    osc = context.createOscillator(), 
    gain = context.createGain(); 

osc.frequency.value = 440.0; // A note 
osc.start(0); 
osc.connect(gain); 

gain.connect(context.destination); 

gain.gain.setValueAtTime(0.0001, context.currentTime); // <-- line of interest 

gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 10); 

UPDATE: „A NotSupportedError Ausnahme ausgelöst werden muss, wenn dieser Wert kleiner als oder gleich 0 ist, oder wenn der Wert zu dem Zeitpunkt des vorhergehenden Ereignisses kleiner als oder gleich 0“ nach Web Audio specification . Wie von @cwilso herausgefunden (siehe Kommentare).

+0

Sie haben absolut recht. Vielen Dank! Aber ist das nicht ein Fehler? Ich stelle mir vor, dass es wahrscheinlich eine Multiplikation gibt, die mit dem Anfangswert beginnt und deshalb 0 bis zum allerletzten Schritt ist. Und da sich die Funktion exponentiell verlangsamt, setzen sie wahrscheinlich nur den bereitgestellten Wert (zu dem die Folie hinführt), wenn sie geringfügig näher (nicht wahrnehmbar) ist. –

+0

Beispiel Wert <1/Math.pow (2, Bittiefe) ist 0. –

+2

Ich denke, das ist das Problem: https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/webaudio/AudioParamTimeline CPP # L232 und diese: https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/webaudio/AudioParamTimeline.cpp#L237 Dies ist in Webkit, aber es ist das gleiche in Blinken. –

0

The docs at Mozilla sagen, der Wert muss positiv sein.

+0

Danke, aber es hat keinen Sinn, dass dies eine separate Antwort ist. Und das gilt für die Implementierung von FF, nicht für Webkit und Blink. Auch "illegal string error" ... das sieht nach einem "dokumentierten Bug" aus, der eine Umgehung bietet. :) –

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – MZaragoza

+1

@MZaragoza: Aber sie haben den wesentlichen Teil hier aufgenommen. – BoltClock