Ein Choruseffekt (engl. für Chor-Effekt) ist ein Modulationseffekt, der das Eingangssignal kopiert und dessen Tonhöhe (Pitch) mit einem Niedrigfrequenzoszillator (LFO: engl. Low-frequency oscillator) ändert. Somit entsteht eine „imperfekte“ Kopie vom Eingangssignal, das dem Ausgangssignal beigemischt wird. Dadurch entsteht der sogenannte Chor-Effekt. Im folgenden ist das Grundprinzip eines Chorus aufgezeigt.
Im obigen Diagramm gibt es nur eine Kopie des Eingangssignals (single-tap). Es ist auch üblich mehrere Kopien zu machen und mit verschiedenen Parametern einen „mehrköpfigen“ Chor zu erzielen.
Parameter
Folgende Kontrollparameter sind für einen Chorus-Effekt üblich:
Frequenz
Mit der Frequenz kontrolliert man die Geschwindigkeit der Frequenzmodulation. Üblicherweise in Hertz [Hz]. Typische Werte zwischen 1Hz und 25Hz.
Tiefe (Depth)
Mit diesem Parameter kontrolliert man die Wirksamkeit der Modulation. Sie wird in Prozent oder in Millisekunden (Delay-Zeit) angegeben. Wenn z.B. die Basis-Delayzeit 25ms ist und die Tiefe 50%, dann bedeutet das, dass das Delay zwischen 12,5ms und 37,5ms moduliert wird.
Wet/Dry
Hiermit wird kontrolliert, wie stark das modulierte Signal ins Ausgangssignal beigemischt werden soll.
Multi-Tap
Man kann das Eingangssignal auch mehr als ein mal abzweigen und modulieren. Wenn man die Einstellungen nicht für jeden Tap vornehmen will, kann man diese algorithmisch beliebig zusammensetzen.
Modulation mit LFO
Ein LFO ist nichts anderes als ein Signalgenerator, der in der Regel ein niederfrequentes Sinus-Signal generiert. Diese Signalquelle nutzt man u. a. zur Modulation eines Signals.
Im Fall eines Chorus moduliert man „die Abtastfrequenz“. Konkret tut man das, in dem man die Delay-Zeit kontinuierlich erhöht und reduziert. Diese Delay-Zeit ist in der Regel sehr kurz und liegt im Fall von Chorus in der Regel 5-50ms. Man nimmt eine Referenzdelayzeit. Z.b. 20ms und moduliert diese mit LFO zwischen 10ms und 30ms. Dadurch verlangsamt und beschleunigt das Signal und es entsteht eine Frequenzverschiebung. Dies wird musikalisch als eine Intonation wahrgenommen.
Implementierung
LFO
Für das Chorus-Puffer wird ein Kreispuffer benötigt, in dem Eingangssignal aufgenommen wird. Beim Multi-tap-Chorus braucht man nicht mehrere Puffer sondern nur mehrere LFOs und mehrere Zeiger auf das Puffer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/* LFO */ float c_chorus::lfo(void){ float y_lfo; //Calculate LFO value y_lfo=sin(a_lfo); //Update angle a_lfo+=a_step; if(a_lfo>=2*PI){ a_lfo=a_lfo-2*PI; } return y_lfo; } /* Calculate rotating delay */ float c_chorus::get_current_delay(void){ //Calculate time float t; t=d_base+depth*lfo(); //Return the delay time return t; } |
Hauptroutine
Der Algorithmus vom Chorus ist vergleichbar mit einem Delay-Algorithmus ohne Feedback und mit variabler Delay-Zeit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* Main chorus single tap */ float c_chorus::process(float x){ float y; float t_c; //Current delay //Get tap distance t_c=get_current_delay(); //Tap distance //Calculate the position of the pointer int wptr; wptr=cptr-lrint(t_c*FSms); if(wptr<0){ wptr+=chorus_len; } //Calculate output y=G_d*x + G_w*cbuf[wptr]; //Update the buffer cbuf[cptr]=x; //Increment cptr++; if(cptr>=chorus_len){ cptr-=chorus_len; } return y; } |
Klangbeispiele
Anbei ist dieser Algorithmus mit ein paar verschiedenen Parametern zu hören.