FLOSS Manuals

 English |  Español |  Français |  Italiano |  Português |  Русский |  Shqip

CSOUND Español

DELAY AND FEEDBACK

RETRASO Y RETROALIMENTACIÓN

 

A delay in DSP is a special kind of buffer, sometimes called a circular buffer. The length of this buffer is finite and must be declared upon initialization as it is stored in RAM. One way to think of the circular buffer is that as new items are added at the beginning of the buffer the oldest items at the end of the buffer are being 'shoved' out.

Un retraso en DSP es un tipo especial de buffer, a veces llamado buffer circular. La longitud de este búfer es finita y debe declararse al inicializarse ya que se almacena en RAM. Una forma de pensar en el búfer circular es que cuando se agregan nuevos elementos al principio del búfer, los elementos más antiguos al final del búfer están siendo expulsados.

 

Besides their typical application for creating echo effects, delays can also be used to implement chorus, flanging, pitch shifting and filtering effects.

Además de su aplicación típica para crear efectos de eco, los retrasos también se pueden utilizar para implementar efectos de chorus, flanging, pitch shifting y filtering.

Csound offers many opcodes for implementing delays. Some of these offer varying degrees of quality - often balanced against varying degrees of efficiency whilst some are for quite specialized purposes.

Csound ofrece muchos opcodes para implementar retrasos. Algunos de estos ofrecen diversos grados de calidad - a menudo equilibrado en función de diversos grados de eficiencia, mientras que algunos son para propósitos muy especializados.

To begin with, this section is going to focus upon a pair of opcodes, delayr and delayw. Whilst not the most efficient to use in terms of the number of lines of code required, the use of delayr and delayw helps to clearly illustrate how a delay buffer works. Besides this, delayr and delayw actually offer a lot more flexibility and versatility than many of the other delay opcodes.

Para empezar, esta sección se centrará en un par de opcodes, delayr y delayw. Aunque no es el más eficiente de usar en términos del número de líneas de código requerido, el uso de delayr y delayw ayuda a ilustrar claramente cómo funciona un buffer de retardo. Además de esto, delayr y delayw ofrecen en realidad mucha más flexibilidad y versatilidad que muchos de los otros opcodes de retardo.

When using delayr and delayw the establishement of a delay buffer is broken down into two steps: reading from the end of the buffer using delayr (and by doing this defining the length or duration of the buffer) and then writing into the beginning of the buffer using delayw.

Cuando se utiliza delayr y delayw el establecimiento de un buffer de retardo se divide en dos pasos: lectura desde el final del buffer usando delayr (y haciendo esto definiendo la longitud o duración del buffer) y luego escribiendo en el comienzo del buffer Utilizando delayw.

The code employed might look like this:

El código empleado podría tener este aspecto:

aSigOut delayr 1

         delayw  aSigIn

where 'aSigIn' is the input signal written into the beginning of the buffer and 'aSigOut' is the output signal read from the end of the buffer. The fact that we declare reading from the buffer before writing to it is sometimes initially confusing but, as alluded to before, one reason this is done is to declare the length of the buffer. The buffer length in this case is 1 second and this will be the apparent time delay between the input audio signal and audio read from the end of the buffer.

Donde aSigIn es la señal de entrada escrita en el principio del búfer y aSigOut es la señal de salida leída desde el final del búfer. El hecho de que declaremos la lectura desde el búfer antes de escribir a él es a veces inicialmente confuso, pero, como se ha mencionado antes, una de las razones por las que se hace es declarar la longitud del búfer. La longitud del búfer en este caso es de 1 segundo y este será el retardo de tiempo aparente entre la señal de audio de entrada y la lectura de audio desde el final del búfer.

The following example implements the delay described above in a .csd file. An input sound of sparse sine tone pulses is created. This is written into the delay buffer from which a new audio signal is created by read from the end of this buffer. The input signal (sometimes referred to as the dry signal) and the delay output signal (sometimes referred to as the wet signal) are mixed and set to the output. The delayed signal is attenuated with respect to the input signal.

El ejemplo siguiente implementa el retardo descrito anteriormente en un archivo .csd. Se crea un sonido de entrada de pulsos de tono seno disperso. Esto se escribe en el buffer de retardo desde el cual se crea una nueva señal de audio por lectura desde el final de este buffer. La señal de entrada (a veces denominada señal seca) y la señal de salida de retardo (a veces denominada señal húmeda) se mezclan y se ajustan a la salida. La señal retardada se atenúa con respecto a la señal de entrada.

   EXAMPLE 05D01_delay.csd 

<CsoundSynthesizer>
<CsOptions>
-odac ; activates real time sound output
</CsOptions>

<CsInstruments>
; Example by Iain McCurdy

sr = 44100
ksmps = 32
nchnls = 1
0dbfs = 1
giSine   ftgen   0, 0, 2^12, 10, 1 ; a sine wave

  instr 1
; -- create an input signal: short 'blip' sounds --
kEnv    loopseg  0.5, 0, 0, 0,0.0005, 1 , 0.1, 0, 1.9, 0, 0
kCps    randomh  400, 600, 0.5
aEnv    interp   kEnv
aSig    poscil   aEnv, kCps, giSine

; -- create a delay buffer --
aBufOut delayr   0.3
        delayw   aSig

; -- send audio to output (input and output to the buffer are mixed)
        out      aSig + (aBufOut*0.4)
  endin

</CsInstruments>

<CsScore>
i 1 0 25
e
</CsScore>
</CsoundSynthesizer>

If we mix some of the delayed signal into the input signal that is written into the buffer then we will delay some of the delayed signal thus creating more than a single echo from each input sound. Typically the sound that is fed back into the delay input is attenuated, so that sound cycles through the buffer indefinitely but instead will eventually die away. We can attenuate the feedback signal by multiplying it by a value in the range zero to 1. The rapidity with which echoes will die away is defined by how close to zero this value is. The following example implements a simple delay with feedback.

Si mezclamos algo de la señal retardada en la señal de entrada que se escribe en el búfer entonces retrasaremos algo de la señal retardada así creando más que un solo eco de cada sonido de entrada. Normalmente, el sonido que se devuelve a la entrada de retardo se atenúa, de modo que el sonido atraviesa el búfer indefinidamente, pero en su lugar finalmente desaparecerá. Podemos atenuar la señal de retroalimentación multiplicándola por un valor en el rango de cero a 1. La rapidez con la que los ecos se extinguirán se define por la proximidad a cero de este valor. El ejemplo siguiente implementa un retardo simple con retroalimentación.

   EXAMPLE 05D02_delay_feedback.csd

<CsoundSynthesizer>
<CsOptions>
-odac ;activates real time sound output
</CsOptions>

<CsInstruments>
;Example by Iain McCurdy

sr = 44100
ksmps = 32
nchnls = 1
0dbfs = 1

giSine   ftgen   0, 0, 2^12, 10, 1  ; a sine wave

  instr 1
; -- create an input signal: short 'blip' sounds --
kEnv    loopseg  0.5,0,0,0,0.0005,1,0.1,0,1.9,0,0 ; repeating envelope
kCps    randomh  400, 600, 0.5                    ; 'held' random values
aEnv    interp   kEnv                             ; a-rate envelope
aSig    poscil   aEnv, kCps, giSine               ; generate audio

; -- create a delay buffer --
iFdback =        0.7                    ; feedback ratio
aBufOut delayr   0.3                    ; read audio from end of buffer
; write audio into buffer (mix in feedback signal)
        delayw   aSig+(aBufOut*iFdback)

; send audio to output (mix the input signal with the delayed signal)
        out      aSig + (aBufOut*0.4)
  endin

</CsInstruments>
<CsScore>
i 1 0 25
e
</CsScore>
</CsoundSynthesizer>

Constructing a delay effect in this way is rather limited as the delay time is static. If we want to change the delay time we need to reinitialise the code that implements the delay buffer. A more flexible approach is to read audio from within the buffer using one of Csounds opcodes for 'tapping' a delay buffer, deltap, deltapi, deltap3 or deltapx. The opcodes are listed in order of increasing quality which also reflects an increase in computational expense. In the next example a delay tap is inserted within the delay buffer (between the delayr and the delayw) opcodes. As our delay time is modulating quite quickly we will use deltapi which uses linear interpolation as it rebuilds the audio signal whenever the delay time is moving.

Construir un efecto de retardo de esta manera es bastante limitado ya que el tiempo de retardo es estático. Si queremos cambiar el tiempo de retardo necesitamos reinicializar el código que implementa el buffer de retardo. Un enfoque más flexible es leer audio desde dentro del búfer usando uno de los opcodes Csounds para tocar un buffer de retardo, deltap, deltapi, deltap3 o deltapx. Los opcodes se enumeran en orden de calidad creciente que también refleja un aumento en el gasto computacional. En el ejemplo siguiente, se inserta un toque de retardo dentro de los códigos de operación del búfer de retardo (entre el retardo y el retardo). Como nuestro tiempo de retardo es la modulación muy rápidamente vamos a utilizar deltapi que utiliza la interpolación lineal, ya que reconstruye la señal de audio cada vez que el tiempo de retardo se mueve.

Note that this time we are not using the audio output from the delayr opcode as we are using the audio output from deltapi instead. The delay time used by deltapi is created by randomi which creates a random function of straight line segments. A-rate is used for the delay time to improve the accuracy of its values, use of k-rate would result in a noticeably poorer sound quality. You will notice that as well as modulating the time gap between echoes, this example also modulates the pitch of the echoes – if the delay tap is static within the buffer there would be no change in pitch, if it is moving towards the beginning of the buffer then pitch will rise and if it is moving towards the end of the buffer then pitch will drop. This side effect has led to digital delay buffers being used in the design of many pitch shifting effects.

Tenga en cuenta que esta vez no estamos utilizando la salida de audio del código de operación delayr, ya que estamos utilizando la salida de audio de deltapi en su lugar. El tiempo de retardo utilizado por deltapi se crea aleatoriamente, lo que crea una función aleatoria de segmentos de línea recta. A-tasa se utiliza para el tiempo de retraso para mejorar la precisión de sus valores, el uso de k-tasa resultaría en una calidad de sonido notablemente más pobres. Observará que así como la modulación del intervalo de tiempo entre ecos, este ejemplo también modula el tono de los ecos - si el retardo de toma es estático dentro del búfer no habría cambio de tono, si se está moviendo hacia el comienzo del eco El búfer entonces el tono subirá y si se está moviendo hacia el final del búfer entonces el tono caerá. Este efecto secundario ha llevado a amortiguadores de retardo digital que se utilizan en el diseño de muchos efectos de cambio de tono.

 

 

The user must take care that the delay time demanded from the delay tap does not exceed the length of the buffer as defined in the delayrline. If it does it will attempt to read data beyond the end of the RAM buffer – the results of this are unpredictable. The user must also take care that the delay time does not go below zero, in fact the minumum delay time that will be permissible will be the duration of one k cycle (ksmps/sr).

El usuario debe tener cuidado de que el tiempo de retardo exigido por el retardo no exceda la longitud del buffer como se define en la línea de retardo. Si lo hace intentará leer los datos más allá del final del búfer de RAM - los resultados de esto son impredecibles. El usuario también debe tener cuidado de que el tiempo de retardo no sea inferior a cero, de hecho el tiempo mínimo de retardo que será permisible será la duración de un ciclo k (ksmps / sr).

   EXAMPLE 05D03_deltapi.csd

<CsoundSynthesizer>
<CsOptions>
-odac ; activates real time sound output
</CsOptions>

<CsInstruments>
; Example by Iain McCurdy

sr = 44100
ksmps = 32
nchnls = 1
0dbfs = 1

giSine   ftgen   0, 0, 2^12, 10, 1  ; a sine wave

  instr 1
; -- create an input signal: short 'blip' sounds --
kEnv          loopseg  0.5,0,0,0,0.0005,1,0.1,0,1.9,0,0
aEnv          interp   kEnv
aSig          poscil   aEnv, 500, giSine

aDelayTime    randomi  0.05, 0.2, 1      ; modulating delay time
; -- create a delay buffer --
aBufOut       delayr   0.2               ; read audio from end of buffer
aTap          deltapi  aDelayTime        ; 'tap' the delay buffer
              delayw   aSig + (aTap*0.9) ; write audio into buffer

; send audio to the output (mix the input signal with the delayed signal)
              out      aSig + (aTap*0.4)
  endin

</CsInstruments>

<CsScore>
i 1 0 30
e
</CsScore>
</CsoundSynthesizer>

We are not limited to inserting only a single delay tap within the buffer. If we add further taps we create what is known as a multi-tap delay. The following example implements a multi-tap delay with three delay taps. Note that only the final delay (the one closest to the end of the buffer) is fed back into the input in order to create feedback but all three taps are mixed and sent to the output. There is no reason not to experiment with arrangements other than this, but this one is most typical.

No estamos limitados a insertar un solo retardo de retardo dentro del buffer. Si añadimos más golpes creamos lo que se conoce como un retardo de múltiples taps. El ejemplo siguiente implementa un retardo de múltiples taps con tres taps de retardo. Observe que sólo el retardo final (el más cercano al final del búfer) se devuelve a la entrada para crear retroalimentación, pero los tres grifos se mezclan y se envían a la salida. No hay razón para no experimentar con arreglos distintos de esto, pero éste es el más típico.

   EXAMPLE 05D04_multi-tap_delay.csd 

<CsoundSynthesizer>
<CsOptions>
-odac ; activates real time sound output
</CsOptions>

<CsInstruments>
; Example by Iain McCurdy

sr = 44100
ksmps = 32
nchnls = 1
0dbfs = 1

giSine   ftgen   0, 0, 2^12, 10, 1 ; a sine wave

  instr 1
; -- create an input signal: short 'blip' sounds --
kEnv    loopseg  0.5,0,0,0,0.0005,1,0.1,0,1.9,0,0; repeating envelope
kCps    randomh  400, 1000, 0.5                 ; 'held' random values
aEnv    interp   kEnv                           ; a-rate envelope
aSig    poscil   aEnv, kCps, giSine             ; generate audio

; -- create a delay buffer --
aBufOut delayr   0.5                    ; read audio end buffer
aTap1   deltap   0.1373                 ; delay tap 1
aTap2   deltap   0.2197                 ; delay tap 2
aTap3   deltap   0.4139                 ; delay tap 3
        delayw   aSig + (aTap3*0.4)     ; write audio into buffer

; send audio to the output (mix the input signal with the delayed signals)
        out      aSig + ((aTap1+aTap2+aTap3)*0.4)
  endin

</CsInstruments>
<CsScore>
i 1 0 25
e
</CsScore>
</CsoundSynthesizer>

As mentioned at the top of this section many familiar effects are actually created from using delay buffers in various ways. We will briefly look at one of these effects: the flanger. Flanging derives from a phenomenon which occurs when the delay time becomes so short that we begin to no longer perceive individual echoes. Instead a stack of harmonically related resonances are perceived with frequencies are in simple ratio with 1/delay_time. This effect is known as a comb filter. When the delay time is slowly modulated and the resonances shifting up and down in sympathy the effect becomes known as a flanger. In this example the delay time of the flanger is modulated using an LFO that employs an U-shaped parabola as its waveform as this seems to provide the smoothest comb filter modulations.

Como se mencionó en la parte superior de esta sección muchos efectos familiares se crean de hecho utilizando buffers de retardo de varias maneras. Veremos brevemente uno de estos efectos: el flanger. Flanging deriva de un fenómeno que ocurre cuando el tiempo de retardo se hace tan corto que comenzamos a no percibir más ecos individuales. En su lugar se percibe una pila de resonancias relacionadas armónicamente con frecuencias en una relación simple con 1 / delay_time. Este efecto se conoce como un filtro de peine. Cuando el tiempo de retardo se modula lentamente y las resonancias se desplazan hacia arriba y hacia abajo en simpatía, el efecto se conoce como flanger. En este ejemplo, el tiempo de retardo del flanger se modula utilizando un LFO que emplea una parábola en forma de U como forma de onda, ya que esto parece proporcionar las modulaciones de filtro de peine más suaves.

   EXAMPLE 05D05_flanger.csd

<CsoundSynthesizer>
<CsOptions>
-odac ; activates real time sound output
</CsOptions>

<CsInstruments>
;Example by Iain McCurdy

sr = 44100
ksmps = 32
nchnls = 1
0dbfs = 1

giSine   ftgen   0, 0, 2^12, 10, 1                 ; a sine wave
giLFOShape  ftgen   0, 0, 2^12, 19, 0.5, 1, 180, 1 ; u-shaped parabola

  instr 1
aSig    pinkish  0.1                               ; pink noise

aMod    poscil   0.005, 0.05, giLFOShape           ; delay time LFO
iOffset =        ksmps/sr                          ; minimum delay time
kFdback linseg   0.8,(p3/2)-0.5,0.95,1,-0.95       ; feedback

; -- create a delay buffer --
aBufOut delayr   0.5                   ; read audio from end buffer
aTap    deltap3  aMod + iOffset        ; tap audio from within buffer
        delayw   aSig + (aTap*kFdback) ; write audio into buffer

; send audio to the output (mix the input signal with the delayed signal)
        out      aSig + aTap
  endin

</CsInstruments>

<CsScore>
i 1 0 25
e
</CsScore>
</CsoundSynthesizer>

Delay buffers can be used to implement a wide variety of signal processing effects beyond simple echo effects. This chapter has introduced the basics of working with Csound's delay opcodes and also hinted at some of the further

Los buffers de retardo se pueden utilizar para implementar una amplia variedad de efectos de procesamiento de señal más allá de los simples efectos de eco. Este capítulo ha introducido los conceptos básicos de trabajar con Csounds retardo opcodes y también insinuado en algunos de los más

There has been error in communication with Booktype server. Not sure right now where is the problem.

You should refresh this page.