logo_jazz jp


granularsynthesis

granularsynthesis



Over the years, Granular Synthesis has become one of the most popular sound processing techniques, enjoyed as well by professional sound designers, contemporary music composers as by laptop music performers. Indeed, from randomly generated soundscapes to accurate sample transformations, this powerfull algorithm enables to create an infinite range of unprecedented sound textures. Among other great applications, the granularisation is capable of ‘freezing’ the sound as though the time were suspended, and of exploring audio samples at a microscopical scale.

The main disadvantage of granular synthesizers is that they come along with a great number of parameters to deal with. Evidence is that conventionnal controllers comprised of knobs and faders are frustrating and under-developed when it comes to ‘perform’ granular synthesis in real-time.

This tutorial is about to introduce you to an intuitive performance instrument which associates a simple polyphonic granular synthetizer made with Max/MSP and an appealing Lemur interface. The last part of this issue might also be regarded as a polyphonic mapping tutorial for Max/MSP users.



granular_step1

The Max/MSP patch shown below is a 5 voices polyphonic and multi-timbral granular synthetizer. Each voice is comprised of eight sound ‘grains’.
You can load a bank of up to 16 audio samples to be ‘granularized’. To do so, just drag and drop sound files directly to the waveform display corresponding to each ‘buffer’ of the bank.

The grains size, their position within the sample as well as the pitch and the amplitude of each voice can be adjusted individually. You can also dynamically choose the sample you want to play.

tutos_granular01mini tutos_granular02mini tutos_granular03mini


granular_step2

The microsound exploration made possible by the granular synthesis is typical of the kind of applications for which a bi-dimensional control should be relevant. Therefore , we will naturally use a Multiball object as the central piece of our interface. We will control intuitively the ‘time exploration’ , by mapping X axys position to the grain, as well as the pitch modification on the Y axys.

After having created the ‘GranCtl’ (for Granular Control) Multiball object, we have to set up its properties. Since our synthetizer can deal five polyphony voices, let’s limitate the number of balls to 5.

Note that the behavior is set on ‘ephemeral’ mode. That means that balls will be created when you touch the area and will ‘stay alive’ until you release them. Then, they will smoothly evaporate accordingly to the duration you specified in the ‘release’ field of the Multiball ‘properties’ window. You can also set the attack time of the balls, that is the duration of their apparition, as well as the sustain level.


tutos_granular05mini

In addition to x and y values, the multiball object provides a z output that corresponds to the brightness of the balls. We are going to use this parameter to trigger the granulation (i.e. activating voices) and to control the amplitude of each voice.

puce Adjusting the position

You may have noticed an horizontal fader called ‘PosM’ just below the main multiball. Actually, PosM stands for ‘Position Main Control’. We have added it in case you would like to load a long audio sample (> 2 min) in the buffer you are playing. In that case, you might find the Multiball not wide enough to keep an accurate control over the grain position. For that purpose, it is more convenient to have another object to set approximatively the position and use the GranCtl.x to refine it.

tutos_granular06

puce Overall control

Above the GranCtl Object, the three leftmost faders are in charge of controlling global parameters of our granular synth : the grain duration, the position randomness and the output level.

puce Controlling the control object

Beside this objects, we’ve added more faders, respectivelly labeled release and attack. They are meant to change the release and the attack time of the multiball object. At the top-right corner, we also placed another multiball called ‘physic’ which aims to set the friction and attraction values of the main multiball. The figures below shows how to map the objects values to the GranCtl multiball behavior.

puce Audio sample selection

An on-the-fly changes of the granularized sample might certainly be a plus. For that purpose, we use a set of switches in ‘radio’ mode to select one of the 16 sound files among the granulator’s Bank.


granular_step3

We could not end this example without having a look at the max patch to see how osc messages are received and linked to the synthesis parameters. For this last section, we assume you have some knowledge about Max/MSP programming. The granular synth itself is a patcher called ‘polygranulateur’. The 5 polyphony voices are created using a poly~ object which handles 5 instances of polygranulateur.
The figure below shows one instance of the ‘polygranulateur’ patcher. The subpatch called ‘JazzCtl’ is responsible for mapping the differents messages to the target parameters.

tutos_granular07

To do so, a JazzClient object has been placed inside. It takes 4 arguments, which states the differents OSC messages to route inside the polygranulateur : GranCtl.granpos (the grains position), GranCtl.pitch (the pitch ratio), GranCtl.z (amplitude/voice activation) and GranDur.x (grain duration). Each message is sent out through the corresponding outlet. The messages from the GranCtl Multiball are lists of float values. Each element of the list corresponds to one particular ball. The ‘zl’ objects with the ‘nth’ argument enables to select the element of the lists that corresponds to the voice number (i.e. the polygranulateur instance). A thispoly~ object is connected to the right inlet of each Zl object in order to defines the voice number.

tutos_granular08 tutos_granular09

puce Buffer selection

Another jazzclient object is hidden somewhere in the subpatcher called ‘realloc’. This patcher aims to define the audio sample to be played by the granulator. The JazzClient receives the ‘buffersel’ message from the Lemur, which is a list of 0-1 values that reports the state of our switches. By using a zl object with the arguments ‘sub 1.’, we’re getting the number of the highlighted button, i.e. the

tutos_granular10

Download this MaxMSP patch example
Download JazzEditor from Support Section
Go back to workshops


© Copyright JazzMutant 2016 12-25-2016