Ein Delay (Engl. für Verzögerung) ist in digitaler Ausführung -im Gegensatz zu analog- ein recht simpel zu implementierender Effekt. In der Grundform ohne Rückkopplung verzögert es das Eingangssignal um einen voreingestellten Zeitversatz und mischt das verzögerte Signal zum Eingangssignal (trockenes Signal) bei. Dabei entsteht ein Delay-Effekt. Mit der Rückkopplung, siehe Abbildung, wird das verzögerte Signal durch ein Feedbackverstärkung abgeschwächt und zum Eingangssignal der Verzögerungseingang zurückgemischt.
Parameter
Folgende Kontrollparameter sind für einen Flanger-Effekt üblich:
Delay-Zeit
Einstellung der Delay-Zeit. Üblicherweise in Millisekunden. Oft wird zur Angabe der Delay-Zeit eine „Tapping“ Funktion zur Verfügung gestellt, mit der der Benutzer den Takt mit einem Taster vorgeben kann und dieser Takt wird in die Zeit umgerechnet.
Takt
Der Parameter, ob der angetippter Takt als z.B. als Viertel, Achtel oder Sechszehntel zu verstehen ist.
Rückkopplungsdämpfung (Feedback gain)
Mit diesem Parameter kontrolliert man die Dämpfung der Rückkopplung. Aus Stabilitsgründen muss sich diese im Intervall von
(1)
befinden.
Multi-Tap
Man kann das Eingangssignal auch mehr als ein mal abzweigen und verzögern. Wenn man die Einstellungen nicht für jeden Tap vornehmen will, kann man diese algorithmisch beliebig zusammensetzen (lassen).
Pre-Delay
Die Verzögerung des trockenen Signals.
Wet/Dry
Hiermit wird kontrolliert, wie stark das verzögerte Signal ins Ausgangssignal beigemischt werden soll.
Implementierung
Für das Delay wird ein großes Kreispuffer für $z^{-M}= benötigt, in dem Delay-Signal aufgenommen wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/*Main process of delay line */ float c_delay::process(float x){ float y; //Calculate output y=dbuf[dptr]*G_w+x*G_d; //Update buffer dbuf[dptr]=x+dbuf[dptr]*G_fb; //Increment pointer (circular buffer) dptr++; //Reset pointer (circular buffer) if(dptr>=n_distance){ dptr=0; } return y; } |
Die Variable n_distance ist das Delay time umgerechnet in Anzahl der Samples und berechnet sich (nach jedem Delay-Time update) folgendermaßen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* Routine for setting the delay time */ void c_delay::set_time(float *time){ //Delay time is incoming as milliseconds delay_time=*time n_distance=(unsigned long)(*time*FSms); //Security for delay length if(n_distance>delay_max){ n_distance=delay_max; } reset_buffer(); } |
Klangbeispiele
Anbei ist dieser Algorithmus mit ein paar verschiedenen Parametern zu hören.
Schreibe einen Kommentar