2016-01-09 4 views
5

Ich versuche Volume-Hüllkurven zu implementieren, die zu einem bestimmten Zeitpunkt neu gestartet werden können, auch wenn es sich gerade in der Mitte einer Param-Bewegung befindet Finden Sie heraus, wie Sie dies ohne Klicks in den resultierenden Audiodaten tun können (die in Bezug auf den Zeitpunkt, an dem sie auftreten, etwas unregelmäßig zu sein scheinen).Wie kann ich ein sich derzeit änderndes AudioParam in der Web Audio API korrekt löschen?

Ist das überhaupt möglich? Ich sehe, dass AudioParam.cancelScheduledValues()"alle geplanten zukünftigen Änderungen an der AudioParam" bricht, aber ich bin mir nicht sicher, was passiert bei einer Änderung, die gerade läuft.

Dies ist der Code, den ich verwende, um die Lautstärke-Hüllkurve zu starten/neu zu starten.

var now = context.currentTime; 
var currentVol = gain.gain.value; 
gain.gain.cancelScheduledValues(now); 
gain.gain.setValueAtTime(currentVol, now); 
gain.gain.exponentialRampToValueAtTime(1, now + volAttack); 
gain.gain.exponentialRampToValueAtTime(0.000001, now + volAttack + volDecay); 
+0

Ich habe genau das gleiche Problem, habe meine Haare seit Tagen gezogen. Das Problem ist, dass wenn Sie die nächste Note einplanen, geplante Werte gelöscht werden, so dass die Rampe der vorherigen Note vollständig aufgehoben wird, wenn der Decay lang genug ist. –

Antwort

2

Ich finde individuelle Kurven zuverlässiger arbeiten und sind besser kontrollierbar

function expCurve(start, end) { 
    var count = 10; 
    var t = 0; 
    var curve = new Float32Array(count + 1); 
    start = Math.max(start, 0.0000001); 
    end = Math.max(end, 0.0000001); 
    for (var i = 0; i <= count; ++i) { 
     curve[i] = start * Math.pow(end/start, t); 
     t += 1/count; 
    } 
    return curve; 
} 


gain.gain.cancelScheduledValues(0); 
var currentVol = gain.gain.value; 
var now = context.currentTime; 
gain.gain.setValueCurveAtTime(expCurve(currentVol, 1), now, volAttack); 
gain.gain.setValueCurveAtTime(expCurve(1, 0), now + volAttack, volDecay); 
+0

Aber löst das das Problem, das ich in meinem Kommentar oben erwähnt habe? Das Problem mit cancelScheduledValues ​​ist, dass wenn der Cancel vor dem Ende des vorherigen Decay terminiert wird, der Decay gar nicht stattfindet ... weil wir ihn abbrechen wollen. AFAIK gibt es keine Möglichkeit, eine Rampe in der Mitte abzubrechen und die Hälfte der Rampe zu bekommen. Im Moment ist das Problem für mich unlösbar. –

+0

Haben Sie es versucht? Es funktioniert gut für mich genau für diesen Anwendungsfall – Esailija

+0

Ich werde es versuchen und auf Sie zurückkommen. Es hört sich seltsam an, dass das funktioniert und die Standard-Rampen nicht, weil sie beide von der gleichen Laufzeit behandelt werden ... aber wer weiß. In meinem Fall habe ich lineare Rampen, also brauche ich nur zwei Punkte: Start und Ende. Dann kann das genauso ausfallen wie die nativen linearen Rampen. Vielleicht ist es der Trick, mehr Zwischenpunkte hinzuzufügen ... nur zu raten. –

2

Nachdem am slack Web Audio-Kanal zu fragen, erklärte sie mir, dass dies ein bekanntes Problem der aktuellen spec. Hier

ist der Link zu dem Thema auf GitHub: https://github.com/WebAudio/web-audio-api/issues/344

So die kurze Antwort ist, dass Rampen auf halbem Weg durch Anhalten wird derzeit nicht unterstützt. Als Workaround müssen sie in jedem Segment kontrolliert werden.