[rk, SC meeting 20-Jan-2018] 

The idea is a little melodic cell that’s repeated. The basic idea of the program is to say: I’ll take every distinct subgrouping of pitches from that phrase. Let’s take three notes. I’ll take every distinct one. And then I’ll find how to play every one of those notes in combination in that grouping. So these are some little extracted sub melodies from the larger sequence. It just turns out that in order to do this in SuperCollider, you need a bunch of coding, because even though array manipulations are certainly great, they’re not necessarily set up to do exactly this. This kind of idea is atemporal. You don’t want to do it in a sequential fashion. You wanna take an array and generate all this possibilities. This is a kind of question that probably turns out to be much nicer to do within a functional programming language. 

var pitchsets, timepoints, patterndurations;

var lPat = Pseq( (8..12).mirror, inf).asStream;

var rPat = Pseq( (5..8).mirror/25, inf).asStream;
var length = lPat.next;
var cantus = (Pbrown(-6, 6, 3) ).asStream.nextN(length); 
{ cantus[cantus.size.rand] = \r }.dup((~length * rPat.next).asInteger.postln);
~pitchsets = cantus.asSet.asArray.powerset.select{ | v | v.size == 3};

pitchsets = pitchsets.collect(_.scramble);

timepoints = pitchsets.collect({ | pset | ~computeDurs.(pset, cantus) });

patterndurations = timepoints.sum;

[excerpt from program notes] The Fifth Root of Two derives from a fascination with the musical procedures of Javanese gamelan. Most gamelan instruments are of limited range, so melodic lines extending beyond an octave are never explicitly expressed. Those instruments that have extended range are generally softer, insinuating presences in the overall texture. Instruments playing the basic thread of the music are in unison or at doubled tempo, following specific procedures of elaboration to provide the additional note events. It is as if the octave ambiguity of the Shepard tone has been given full expression in a music of melodic mirage. The fifth root of two attempts an exploration of this musical space following different rules.

The Fifth Root Of Two

Ron Kuivila, generative sound installation, 2018




24-channels generative sound installation realized by Ron Kuivila within the Almat artistic research residency program, presented during the Open CUBE concert, 26 Jan 2018.

When calling ~computeDurs two inputs are given:

pset: a set of three pitches (subpattern), found in

cantus: a pattern of 8 to 12 notes

A pset is a collection of three arbitrary pitches found in cantus. In other words, a pset is a subpattern of cantus.

Therefore pset is also a set of three notes that corresponds to three specific time points, or occurrences, within the pattern cantus. Given any pset, ~computeDurs computes the duration of each note of the subpattern, with respect to the occurences found in cantus. 

For example,

given a pattern p

and a subpattern sp

first it looks for the occurences of c in p

then it computes the distances (durations) between occurrences

the sum of the distances gives the whole duration of sp


if (stutter == 1) {
    pattern = [\r, Pseq(argpattern, inf)];
} {
    pattern = [Pseq(\r.dup(stutter)), Pseq(argpattern.clump(stutter).stutter(stutter).flat, inf)];
    durs = durs.stutter(stutter)/stutter;
Ptuple([Pseq(pattern), Pseq(durs * 0.2)])



Thus we obtain diverse pairs of sets of three pitches and three durations, all derived from a common pattern. These are the core building blocks of the installation: each subpattern is assigned to a different speaker and they all run in parallel, together with the original cantus, in a Gamelan fashion. A 'stutter' variable define if and how many time a pattern is repeated. 

[excerpt from program notes] 

In this case a short melodic line of 8 to 12 pitches is generated via Brownian noise.

Then every distinct sub-collection of three pitches is taken from the original line.

Since pitches are repeated, this yields multiple collections of time points where those three pitches can be found.

The three pitches are then played, sequencing through those time points until they are all exhausted and in synchronization with the basic melodic line. Each sub-collection is assigned to its own speaker among the 24 speakers in the CUBE.

p = [ 3, 2, 1, 0, -1, -4, -5, -2 ];

sp = [-2, 0, 1];

occurrences = [7, 3, 2];

durations = [7, 4, 7]:

duration = 18;