Designing Sound - Procedural Audio for Games and Film.

Code examples for “Designing Sound” textbook

Practical 13: Running Water

Pure Data

Water - simple noise algorithm

#N canvas 298 272 80 148 10;
#X obj 0 84 osc~;
#X obj 0 64 + 800;
#X obj 0 44 random 1600;
#X obj 0 130 dac~;
#X msg 0 0 1;
#X obj 0 24 metro 6;
#X msg 35 0 0;
#X obj 0 104 *~ 0.05;
#X connect 0 0 7 0;
#X connect 1 0 0 0;
#X connect 2 0 1 0;
#X connect 4 0 5 0;
#X connect 5 0 2 0;
#X connect 6 0 5 0;
#X connect 7 0 3 0;
#X connect 7 0 3 1;

Download running_water1.pd.

Water - differential algorithm

#N canvas 419 231 446 329 10;
#X obj 71 137 waterflow;
#X obj 173 252 dac~;
#X msg 71 105 2;
#X obj 70 161 *~ 0.2;
#X obj 173 136 waterflow;
#X msg 233 104 600;
#X msg 173 104 6;
#X obj 172 160 *~ 0.5;
#X obj 278 135 waterflow;
#X msg 338 103 400;
#X msg 278 103 12;
#X obj 277 159 *~ 0.8;
#X msg 131 105 800;
#X obj 173 48 loadbang;
#X obj 173 204 *~ 0.8;
#X connect 0 0 3 0;
#X connect 2 0 0 0;
#X connect 3 0 14 0;
#X connect 4 0 7 0;
#X connect 5 0 4 1;
#X connect 6 0 4 0;
#X connect 7 0 14 0;
#X connect 8 0 11 0;
#X connect 9 0 8 1;
#X connect 10 0 8 0;
#X connect 11 0 14 0;
#X connect 12 0 0 1;
#X connect 13 0 6 0;
#X connect 13 0 5 0;
#X connect 13 0 10 0;
#X connect 13 0 9 0;
#X connect 13 0 12 0;
#X connect 13 0 2 0;
#X connect 14 0 1 0;
#X connect 14 0 1 1;

Download running_water2.pd.

Water - experimental rig (needs [delta~])

#N canvas 0 0 498 689 10;
#X obj 240 341 osc~;
#X obj 69 342 delta~;
#X obj 60 460 *~;
#X obj 61 570 dac~;
#X obj 81 -23 noise~;
#X obj 112 511 hsl 128 15 0.05 5 1 1 empty empty empty -2 -6 0 8 -262144
-1 -1 8700 1;
#X obj 82 156 +~ 1000;
#X obj 81 132 *~ 1000;
#X obj 60 425 *~ 0.01;
#X obj 61 541 *~;
#X obj 145 107 hsl 128 15 0 20000 0 1 empty empty empty -2 -6 0 8 -262144
-1 -1 1100 1;
#X obj 144 133 hsl 128 15 0 5000 0 1 empty empty empty -2 -6 0 8 -262144
-1 -1 700 1;
#X obj 82 287 *~;
#X obj 119 261 hsl 128 15 0.03 3 1 1 empty empty empty -2 -6 0 8 -262144
-1 -1 10400 1;
#X obj 134 396 hsl 128 15 0.03 3 1 1 empty empty empty -2 -6 0 8 -262144
-1 -1 1000 1;
#X obj 143 -24 hsl 128 15 0.05 50 1 1 empty empty empty -2 -6 0 8 -262144
-1 -1 9200 1;
#X obj 285 242 hsl 128 15 0.03 30 1 1 empty empty empty -2 -6 0 8 -262144
-1 -1 200 1;
#X obj 264 265 *~;
#X obj 80 6 hip~ 40;
#X obj 81 31 hip~ 40;
#X obj 61 512 *~ 45;
#X obj 80 85 bp~ 15 7;
#X obj 70 364 max~ 0;
#X obj 69 386 min~ 1;
#X obj 106 62 + 2;
#X obj 82 262 *~;
#X obj 83 230 *~ 0.01;
#X obj 139 210 hsl 128 15 0.005 0.5 1 1 empty empty empty -2 -6 0 8
-262144 -1 -1 3500 1;
#X obj 60 481 hip~ 200;
#X obj 240 317 pow~;
#X obj 239 293 sig~ 2;
#X obj 82 310 lop~ 60;
#X connect 0 0 2 1;
#X connect 1 0 22 0;
#X connect 2 0 28 0;
#X connect 4 0 18 0;
#X connect 5 0 9 1;
#X connect 6 0 26 0;
#X connect 6 0 17 0;
#X connect 7 0 6 0;
#X connect 8 0 2 0;
#X connect 9 0 3 0;
#X connect 9 0 3 1;
#X connect 10 0 7 1;
#X connect 11 0 6 1;
#X connect 12 0 31 0;
#X connect 13 0 12 1;
#X connect 14 0 8 1;
#X connect 15 0 18 1;
#X connect 15 0 19 1;
#X connect 15 0 24 0;
#X connect 16 0 17 1;
#X connect 17 0 29 1;
#X connect 18 0 19 0;
#X connect 19 0 21 0;
#X connect 20 0 9 0;
#X connect 21 0 7 0;
#X connect 22 0 23 0;
#X connect 23 0 8 0;
#X connect 24 0 21 1;
#X connect 25 0 12 0;
#X connect 26 0 25 0;
#X connect 26 0 25 1;
#X connect 27 0 26 1;
#X connect 28 0 20 0;
#X connect 29 0 0 0;
#X connect 30 0 29 0;
#X connect 31 0 1 0;

Download running_water3.pd.

Water - required abstraction (water gen)

#N canvas 78 258 227 358 10;
#X obj 5 173 osc~;
#X obj 5 146 line~;
#X obj 46 290 *~;
#X obj 62 269 *~;
#X obj 5 44 metro 6;
#X obj 5 105 + 800;
#X obj 62 244 *~ 0.9;
#X obj 62 224 lop~ 10;
#N canvas 405 235 134 230 bilexp 0;
#X obj 4 48 random 8192;
#X obj 4 122 * 9;
#X obj 4 99 / 4096;
#X obj 72 74 > 4096;
#X obj 72 96 sel 0 1;
#X msg 72 119 -1;
#X msg 104 119 1;
#X obj 4 166 *;
#X obj 4 187 / 23000;
#X obj 4 27 t b;
#X obj 4 7 inlet;
#X obj 4 209 outlet;
#X obj 4 75 mod 4096;
#X obj 4 144 exp;
#X connect 0 0 3 0;
#X connect 0 0 12 0;
#X connect 1 0 13 0;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
#X connect 4 0 5 0;
#X connect 4 1 6 0;
#X connect 5 0 7 1;
#X connect 6 0 7 1;
#X connect 7 0 8 0;
#X connect 8 0 11 0;
#X connect 9 0 0 0;
#X connect 10 0 9 0;
#X connect 12 0 2 0;
#X connect 13 0 7 0;
#X restore 5 64 pd bilexp;
#X obj 62 204 clip~ 0 1;
#X obj 5 125 pack 1 2.689;
#X obj 5 85 * 1600;
#X msg 5 24 1;
#X obj 5 4 loadbang;
#X obj 62 183 fexpr~ $x1 - $x1[-1];
#X obj 46 316 *~ 0.3;
#X obj 46 338 outlet~;
#X obj 69 3 inlet rate;
#X obj 143 3 inlet depth;
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 14 0;
#X connect 2 0 15 0;
#X connect 3 0 2 1;
#X connect 4 0 8 0;
#X connect 5 0 10 0;
#X connect 6 0 3 0;
#X connect 6 0 3 1;
#X connect 7 0 6 0;
#X connect 8 0 11 0;
#X connect 9 0 7 0;
#X connect 10 0 1 0;
#X connect 11 0 5 0;
#X connect 12 0 4 0;
#X connect 13 0 12 0;
#X connect 14 0 9 0;
#X connect 15 0 16 0;
#X connect 17 0 4 1;
#X connect 18 0 5 1;

Download waterflow.pd.

Audio

Water effects

Example contains three parts. First you hear sparse random sweeps approximating the cavity resonances of water. The next example shows how these can become a flow when random sines are run together with a pitch sweep (portamento). The last example contains only two concurrent grains, but shows how the effect of running water is synthesised using only two important parameters, depth and speed of flow to determine the sine sweep frequencies. Much better water effects are obtainable very cheaply by using more bubble models concurrently and adding harmonics to simulate non-spherical cavities.

Download running_water.wav.