Creating reverb efects using granular synthesis
Creating reverb efects using granular synthesis
Creating reverb efects using granular synthesis
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
CSOUND CONFERENCE 2011<br />
<strong>Creating</strong> <strong>reverb</strong> effects <strong>using</strong> <strong>granular</strong> <strong>synthesis</strong><br />
Author Kim Ervik AT kimer@ntnu.stud.no<br />
And Øyvind Brandsegg AT oyvind.brandtsegg@ntnu.no<br />
Abstract<br />
In this article we will explain how we have used Csound to create a <strong>reverb</strong> effect <strong>using</strong><br />
<strong>granular</strong> <strong>synthesis</strong>. At first we will present some commercial varieties of <strong>granular</strong> <strong>reverb</strong>,<br />
then show how to create the same effects <strong>using</strong> Csound. We will then show that due to<br />
the flexibility of Csound it is possible to take this idea even further and expand the<br />
concept of a <strong>granular</strong> <strong>reverb</strong> effect by presenting our variant of the <strong>granular</strong> <strong>reverb</strong> effect.<br />
Introduction<br />
Granular <strong>synthesis</strong> has long been available as a sound manipulating and sound generating<br />
technique, and lately has been increasingly used in commercial music software.<br />
Explained shortly, <strong>granular</strong> <strong>synthesis</strong> generates sound based on the additive combination<br />
of many very short sonic grains in to larger acoustical events. This technique has large<br />
expressive possibilities for parametric control tied to the time and frequency domain.<br />
Some basic examples of <strong>granular</strong> <strong>synthesis</strong> are parameters are grain rate, grain envelope,<br />
grain duration, grain pitch and waveform inside each grain.<br />
For a long time it has been common to use pre-sampled sound or complex<br />
waveforms as source waveform in the <strong>granular</strong> <strong>synthesis</strong>. In recent times, due to faster<br />
home computers, <strong>granular</strong> <strong>synthesis</strong> has additionally become relevant as an audio effect<br />
in real time, for instance in a live performance, or as a plug-in in a DAW. One common<br />
usage of <strong>granular</strong> <strong>synthesis</strong> on an incoming audio stream is to create delay- or <strong>reverb</strong>effects.<br />
One example is Ableton Live’s “grain delay”. This effect is similar to the delay in<br />
that it delays the incoming signal, with optional feedback amount and a dry/wet amount.<br />
It differs from the classical delay effect in the way that it’s possible to chop the delayed<br />
signal into grains and treat the signal with <strong>granular</strong> <strong>synthesis</strong>, <strong>using</strong> parameters like grain<br />
pitch, grain rate and modulation of these. It is also possible to scatter the placement of the<br />
grains in the time domain up to 500 ms with the “spray” parameter, which creates a lush<br />
cloud of the repeated signal. If the parameters is tweaked right, this delay effect can<br />
sound like a <strong>reverb</strong> effect.<br />
With Line 6s new stompbox “M” series (M5, M9, and M13) two interesting<br />
<strong>reverb</strong> effect is called “particle verb” and “octoverb” and generates a lush cloud output,<br />
made from the audio input signal. Both these effects contains pitch shift as an integrated<br />
part of the algorithm. Knowing this and taking the name “particle verb” in account we<br />
can assume that <strong>granular</strong> <strong>synthesis</strong> constitute a significant part of the <strong>reverb</strong> algorithm. In
“particle verb” one can also hear a kind of grain scattering, which can also indicate that<br />
this is a variant of grain delay.<br />
I. Granular <strong>reverb</strong>s<br />
Commercial <strong>granular</strong> <strong>reverb</strong>s<br />
In the physical world, <strong>reverb</strong> is generated by reflection from surfaces around the sound<br />
source giving the sound object 1 a short tail. In the early days of spatial effects, sounds<br />
were played back into an echo chamber and recorded to produce such effects. Later, tapedelay<br />
machines could produce the illusion of early reflections by delaying the incoming<br />
signal. A combination of allpass and comb filters has been used to create artificial <strong>reverb</strong><br />
(e.g. Moorer <strong>reverb</strong>, Gardner <strong>reverb</strong>, Freeverb), and feedback delay networks (e.g.<br />
<strong>reverb</strong>sc in Csound) constitute another well-known technique. Currently, also<br />
convolution (Boulanger, 2000: 507) has been used to artificially recreate the response of<br />
a physical room or hall. Granular synthesized <strong>reverb</strong> is more like the delay-effect in the<br />
way that it makes use of the early reflection illusion, but resembles <strong>reverb</strong> in that it also<br />
creates <strong>reverb</strong>-like, lush tails. One could easily term <strong>granular</strong> <strong>reverb</strong> more of a special<br />
effect then a “realistic” effect.<br />
A <strong>granular</strong> <strong>reverb</strong> effect in Csound can be created the same way as Ableton Lives<br />
“grain delay”, with a delayed signal that is chopped up to smaller grains and treated with<br />
<strong>granular</strong> <strong>synthesis</strong>. This is shown in example1.csd. To emulate the Line 6 “octaverb”, we<br />
can use the same example as with the grain delay, but with grain pitch one octave above.<br />
Further expansion on the concept of <strong>granular</strong> <strong>synthesis</strong> as a <strong>reverb</strong><br />
effect<br />
Another way to create a long tail is to stretch the sound object in the time domain. This is<br />
easily done <strong>using</strong> <strong>granular</strong> <strong>synthesis</strong>. One can “chop” the sound object into grains and<br />
stretch the duration of the entire sound object by filling the empty spaces between the<br />
grains with nearby grains. This way we get a longer sound object with the same structure<br />
as the shorter sound object, and without a drop in pitch.<br />
Time stretch <strong>using</strong> <strong>granular</strong> <strong>synthesis</strong><br />
With low grain rates less than 30 Hz, the pitch of the sound object is perceived<br />
through transposition of the source audio, as the original source waveform is not distorted<br />
by <strong>granular</strong> amplitude modulation. We can to some extent avoid the AM effect at higher<br />
grain rates too, by <strong>using</strong> a small random deviation on the sample position for reading<br />
grains.<br />
1 Sound object is described as one isolated sound event, for example a note or a drum hit<br />
or the sound of a train passing by (Roads, 2001)
One way to create a smooth time stretch effect is <strong>using</strong> grain rates on about 30 –<br />
40 grains per second, overlapping grains (3 overlaps seems to be OK) and a tiny random<br />
offset on the sample position. To achieve a broad stereo image one can double the sample<br />
rate and mask every other grain to the left and right stereo channels.<br />
Time stretch as a real time audio effect<br />
There are obviously some conceptual problems with the idea of time stretching in<br />
real time. When a sound is played in its original tempo, at the same time as the same<br />
sound is played back in a lower tempo, the lower tempo playback will lag behind the<br />
original, and increasingly so over time. In real time processing this is a problem because<br />
shortly after the effect instrument is started, the time between the playback position of the<br />
original signal and the playback position of the stretched signal is far to large for it to<br />
sound like a <strong>reverb</strong> effect. Letting the stretching process “skip” some parts of the<br />
incoming sound can solve this problem, though it is not ideal because its not predictable<br />
which parts of the original signal are stretched and which parts are not.<br />
A better approach to real time time stretch is to use several buffers and several<br />
instances of the time stretch instrument simultaneously. Using the “schedkwhen” Csound<br />
opcode we can trigger a Csound instrument to record incoming sound to a buffer or a<br />
table (GENroutine 2 or 1). A metronome and a counter can keep track of which table to<br />
write to, and when to start and stop the instances of the recording instrument. Another<br />
“shedkwhen” can trigger the <strong>granular</strong>- or the time stretching instrument. In this manner,<br />
we can allow several overlapping time stretch instances simultaneously. This can also be<br />
seen as a <strong>granular</strong> process, so we have in effect two separate layers of <strong>granular</strong> <strong>synthesis</strong><br />
running on top of each other, or nested <strong>granular</strong> <strong>synthesis</strong>, if you wish. It can also be<br />
preferable to let the recording instances overlap each other to compensate for the random<br />
offset on the sample position.<br />
Writing to buffer <br />
Reading from <br />
buffers <br />
Figur 1.1 Writing audio to 8 different buffers, at the same time as they are played back.<br />
In our example we’ve used 8 buffers, recording 0.5 seconds to each buffer. This<br />
fraction of sound is time stretched 8 times to 4 seconds (see figure 1.1). These values has<br />
been tweaked by empirical adjustments to find the suitable settings, so that the <strong>reverb</strong> tail<br />
is long enough at the same time as its not too unpredictable when an incoming sound<br />
“returns” from the audio processing. We’ve also applied an envelope with a slow attack<br />
and a slow release to get all the instances to overlap each other smoothly.
GIDELAYTIME INIT 0.5<br />
GITALETIME INIT 4<br />
; LENGTH OF CHUNK TO BE RECORDED FOR STRETCHING<br />
; PLAYBACK TIME OF THE RECORDED CHUNK<br />
; (0.5 SECONDS STRETCHED TO 4 SECONDS)<br />
INSTR 1<br />
KMETROTIME = 2<br />
KTRIG METRO KMETROTIME<br />
; ------- COUNTING TABLE NUMBERS FOR TIME STRETCH INSTRUMENT -------<br />
GKTABLENR = GKTABLENR + KTRIG<br />
IF GKTABLENR > 8 THEN<br />
GKTABLENR = 1<br />
ENDIF<br />
SCHEDKWHEN KTRIG, 0, 3, 2, 0, GIDELAYTIME + 0.4, GKTABLENR ;REC TRIG<br />
IF GKPLAYTABLENR > 0 THEN<br />
SCHEDKWHEN KTRIG, 0, 8, 3, 0, GITALETIME, GKTABLENR ;STRETCH TRIG<br />
ENDIF<br />
ENDIN<br />
Example1.1 :Time stretch trigger instrument.<br />
II. Using the partikkel opcode<br />
The “Partikkel” opcode is inspired by Curtis Roads book “Microsound” (2001) and is<br />
capable of generating all the varieties of <strong>granular</strong> <strong>synthesis</strong> described in his book. It is<br />
extremely flexible and offers a large set of control parameters.<br />
A design detail that profits the time stretch technique is that all the sound<br />
generating calculations is done, and stored in a list, before the grain is played. With the<br />
exception of FM modulation, none of the parameters of a grain can be changed during the<br />
life cycle of the grain. This is done to optimize the CPU usage. If one changes any of the<br />
parameters during the lifecycle of a grain, the changes apply before the next grain is<br />
played. Due to the obvious need to change the sample position when time stretching this<br />
is an advantage. With some <strong>granular</strong> tools the grain is re-pitch when the sample position<br />
is changed. This will not be a problem <strong>using</strong> the “partikkel” opcode.<br />
The “partikkel” opcode is also a good choice because one can use up to four<br />
sound sources in each instrument instance.<br />
With “partikkel” one has “per grain control” over some of the parameters,<br />
meaning that one can, for example, specify the pitch and the amp of each grain. This way<br />
one can spectrally compose the “<strong>reverb</strong> cloud”. A neat suggestion is to let every other<br />
grain be one octave above the original grains. With “per grain control” one can also<br />
adjust the amplitude level of the grains that are pitched one octave above the original<br />
grains.
III. Conclution<br />
We have shown that it is possible to create a <strong>reverb</strong> effect <strong>using</strong> <strong>granular</strong> <strong>synthesis</strong>, <strong>using</strong><br />
commercial tools, and we have shown how to do the same with more flexibly and control<br />
in Csound.
Acknowledgements<br />
- Ableton – “http://www.ableton.com/live-8”<br />
- Boulanger, Richard: 2000. The Csound book. MIT Press, Cambridge, Massachusetts.<br />
- Brandtsegg, Ø. and Saue, S. Particle <strong>synthesis</strong>, a unified model for <strong>granular</strong> <strong>synthesis</strong>.<br />
Accepted paper at Linux Audio Conference 2011<br />
- Line 6 – “http://line6.com/m9/models.html”<br />
- Roads, Curtis: 2001. Microsound. MIT Press, Cambridge, Massachusetts.<br />
- Smith, Julius O, “dsprelated.com/dspbooks/filters” “Introduction to digital filters”<br />
- Smith, Julius O, “dsprelated.com/dspbooks/pasp/Schroeder_Allpas_Sections.html”<br />
“Introduction to digital filters”<br />
- Smith, Julius O, “dsprelated.com/dspbooks/pasp/Schroeder_Reverberations.html”<br />
“Introduction to digital filters”<br />
- Smith, Julius O, “dsprelated.com/dspbooks/pasp/Freeverb.html” “Introduction to digital<br />
filters”