I first implemented equalization for Mandelbrot Set normalized iteration counts, which went something along these lines:

/* compare with neighbours too */int float_cmpx(const void *a, const void *b) { const float *x = a; const float *y = b; if (*y <= *x && *x < *(y+1)) return 0; if (*x < *y) return -1; if (*y < *x) return 1; return 0; }/* equalize escapees to lie evenly in (0..1] */void equalize(float *dwell, int n) {/* make a copy with extra end elements */float *dwellcopy = calloc(1, (n + 2) * sizeof(float)); memcpy(dwellcopy + 1, dwell, n * sizeof(float));/* sort the valid part of the copy */qsort(dwellcopy + 1, n, sizeof(float), float_cmp); dwellcopy[0] = -1e30; dwellcopy[n+1] = 1e30;/* ignore non-escaped points */int mink = 0; for (int k = 0; k < n; ++k) { if (dwellcopy[k+1] <= 0) { ++mink; } else { break; } }/* get normalized index */#pragma omp parallel for schedule(static, 1) for (int j = 0; j < n; ++j) { float d = dwell[j]; if (d <= 0) { continue; } float *e = bsearch(&d, dwellcopy, n+1, sizeof(float), float_cmpx); dwell[j] = ((1 + e - dwellcopy - mink) / (double) (1 + n - mink); }/* no longer need the copy */free(dwellcopy); }

Note: **float_cmpx()** and the extra padding elements are
unnecessary in this particular snippet because it uses the whole image as
control source: my real code uses only part of the image as control while
equalizing the whole image, this means **bsearch()** might
return **NULL** if using a normal comparator: the neighbour
comparator will always succeed assuming the extra padding elements are
outside the range of the entire input.

This worked out quite well for the floating point images I was using as input, which had a very low probability of multiple pixels having the same value. But when I tried to apply the same sort/lookup technique to regular images with only 8 bits per channel, the collision likelihood is so much greater that this simple technique fails.

The solution is to take into account collisions, and collapse the (possibly wide) range of indices for identical values down to 1 unit. I implemented this in GridFlow for Pure-data like this:

The output image above is with the chroma gain set to 1536. Notice how the peaks in the output histogram are wider and the troughs shallower. The input image is from quick tricks for correcting poor exposure.

]]>z→z²+c is GOSUB10's third release, by a sad coincidence arriving soon after the passing of Benoît Mandelbrot - the man whose mathematics were the inspiration for all this. I recommend watching his TED talk.

The Mandelbrot set is possibly the world's most famous fractal. *z→z²+c*
is a series of sonifications, focussing on the periodic attractors
found almost everywhere within the Mandelbrot set. Given just two real
numbers (forming one point in the complex plane), dynamic patterns can
emerge as the one simple equation governing the system is repeated over
and over: *z→z²+c*

The source code for this release (implemented in Pure-data using GridFlow and zexy) is free software distributable under the terms of the GNU General Public License (version 3 or greater).

Copyleft: This is a free work, you can copy, distribute, and modify it under the terms of the Free Art License.

Released on 17th October 2010.

]]>Live improv techno performance on 2010-02-17 at Goldsmiths Digital Studio Expo, using Pd, Gem, GridFlow, etc.

Downloads of the digital render:

]]>Live improv techno performance on 2009-11-13 at Kiblix, Maribor, Slovenia, using Pd, Gem, GridFlow, etc.

Downloads of the digital render:

]]>Live improv techno performance on 2009-08-08 at Summerlab, Gijon, Spain, using Pd, Gem, GridFlow, etc.

Downloads of the digital render:

Or you can watch or download the filmed with real cameras version at the Summerlab09 multimedia archive.

]]>Crystalline Cortex is a journey into the central nervous system of an organism of unknown species. There seems to be some thought in process, but appearances have been known to deceive in the past. But on what else can we base judgement, than what we can percieve?

Made for the OpenLab3 Exhbition 2006.

Download sample:

Note: this is from 2006, but I forgot to post about it before.

]]>Audio-visual interpretation of a 24-cell. Live improv techno performance on 2009-05-08 at OpenLab, Winchester, UK, using Pd, Gem, GridFlow, etc.

Downloads:

]]>Audio-visual interpretation of a 24-cell. Live improv techno performance on 2009-04-24 at LiWoLi09, Linz, Austria, using Pd, Gem, GridFlow, etc.

Downloads:

]]>Audio/visual reinterpretation of a five-dimensional cube. Pastel glyphs swarm and pulse. Made with Pd, Gem, GridFlow, etc.

Downloads:

- DVD (149MB)
- VCD (104MB)
- 512kb MPEG4 (19MB)

Video feedback loop turned into sound. Made with Pd and GridFlow.

Downloads:

]]>Video feedback loop turned into sound. Made with Pd and GridFlow.

Downloads:

- DVD (88MB)
- VCD (37MB)
- 256kb MPEG4 (11MB)

Playing around with sonification of images in a painting program written in Pd and GridFlow.

Downloads:

- DVD (108MB)
- VCD (35MB)
- 256kb MPEG4 (20MB)
- 64kb MPEG4 (8.8MB)