2016-12-04 2 views
0

Kontext: Ich versuche, eine 100% modulare Synthesizer auf dem NetzWebAudioAPI: Trigger Umschlag auf Basis eines Eingangs

Bisher zu machen, die Tutorials Ich habe für die Herstellung von Briefumschlägen verwendeten Funktionen zu sehen, die verschiedenen Stadien der triggern die Hüllkurve, aber was, wenn ich eine Hüllkurve basierend auf der Ausgabe eines AudioNode auslösen möchte?

Zum Beispiel Angriff auf die steigende Flanke eines Rechteckwellenoszillators und Freigabe auf der fallenden Kante?

Muss ich auf einen Skriptprozessor-Knoten zurückgreifen (und in der Leistung leiden) oder gibt es einen besseren Weg, dies zu tun, den ich noch nicht herausgefunden habe?

Vielen Dank im Voraus

Klarstellung:

Der Eingang ein einfaches Binärgatter ist. 1 wenn die Taste gedrückt wird, 0 wenn nicht.

Es sollte ein paar Parameter geben, die AudioParams sind, die die Kontrolle über Attack Time, Decay Time, Sustain Level und Release Time erlauben. Es wird angenommen, dass der Abklingpegel (die Spitze der ADSR-Hüllkurve) 1

ist. Der Ausgang ist das ADSR-Hüllkurvensignal selbst.

Antwort

1

Hier ist ein alternativer Ansatz: Wenn Sie analoge Schaltungen hätten, könnten Sie Ihre Rechteckwelle differenzieren ein positiver Impuls an der Vorderkante und ein negativer Impuls an der Hinterkante. Führen Sie diese Impulsfolge in einen RC-Kreis ein. Dies würde eine Angriffs- und Freigabephase erzeugen.

In WebAudio können Sie ein einfaches Differentiator machen, indem Sie das Signal um ein Sample verzögern und es vom Original subtrahieren. Für die RC-Schaltung können Sie eine BiquadFilterNode oder eine IIRFilterNode verwenden, um das gewünschte Ergebnis zu erzielen.

Ich bin nicht genau sicher, was zu tun ist, wenn Sie eine kompliziertere ADSR-Antwort möchten.

+0

Welchen Mechanismus im Filterknoten würden Sie als Callback zu tigger asdr verwenden. Mit anderen Worten, ich denke, er sucht nach einer Art von Event-Listener? – bob

+0

Ich denke, wir brauchen wirklich mehr Informationen darüber, wie das "andere" Signal genau aussieht und was der Anwendungsfall wirklich ist. –

+0

Vielen Dank für Ihre Antwort! Es funktioniert gut in Bezug auf die Angriffs- und Freigabephasen, aber ich möchte letztendlich auch eine Abklingphase. Ich werde diese Methode vorübergehend anwenden. Im Moment experimentiere ich mit DynamicCompressor-Knoten und etwas Signalverstärkung und Offset-Manipulation, um zu sehen, ob ich einen vollen ADSR mit konvertierbaren Audio-Parametern bekommen kann. – euwbah

1

Während ich nicht ganz verstehe, wo/wie der zum Auslösen verwendete Knoten tatsächlich etwas auslöst (anders als das sourceNode.onended-Ereignis, glaube ich, dass Sie mit der Hüllkurve mit setValueAtTime und linearRampToValueAtTime umgehen müssen) .. auf einen angeschlossenen Verstärkungsknoten wieder, wie Sie die Zeit für den Angriff ableiten, Sustain und Release ist immer noch ein Rätsel

auf jeden Fall ist dies ein grundlegender Kern, wie baue ich den Umschlag:

var triggerAtTime = 10; 
var attackTime = 3; 
var sustainTime = 5; 
var releaseTime = 5; 

var attackVol = 0.8; 

var attackStartTime = triggerAtTime; 
var attackEndTime = triggerAtTime + attackTime; 

var releaseStartTime = attackEndTime + sustainTime; 
var releaseEndTime = releaseStartTime + releaseTime; 

var gainNode = ctx.createGain(); 
var gng = gainNode.gain; 

gng.setValueAtTime(0, attackStartTime); 
gng.linearRampToValueAtTime(attackVol, attackEndTime); 

gng.setValueAtTime(attackVol, releaseStartTime); 
gng.linearRampToValueAtTime(0, releaseEndTime); 

sourceNode.connect(gainNode); 
+0

Danke für Ihre Antwort. Das ist, was ich bereits habe, und was ich tatsächlich suche, ist, wie man die Funktionen setValueAtTime() & linearRampToValueAtTime() basierend auf der Ausgabe eines anderen Knotens auslöst. In diesem Fall wurden alle ADSR-Zeiten fest codiert. Aber gibt es eine Möglichkeit, diese Hüllkurve beispielsweise auf der Grundlage eines anderen Rechteckwellenoszillators auszulösen, bei der die steigende Flanke als "Note ein" und die fallende Flanke als "Note aus" behandelt wird? – euwbah

+0

Wenn der andere Knoten eine Rechteckwelle ist, können Sie dies (zumindest teilweise) mit einem einfachen Filter implementieren. Der Eingang zum Filter ist die Rechteckwelle und der Ausgang des Filters stellt die Verstärkung eines Verstärkungsknotens ein. Bei steigender Flanke der Welle steigt der Ausgang des Filters auf 1 an. Bei der fallenden Flanke fällt der Ausgang des Filters auf 0 ab. Diese Rampen haben eine gewisse Symmetrie, die Sie nicht wünschen. dann wird ein komplizierteres Schema benötigt. –

Verwandte Themen