Caddis, an update…

Caddis – Notated work for solo instrument


Caddis flies live near ponds and streams. As larvae, they live underwater and make wearable tubes from local materials, such as twigs, sand, stones, or snail shells. The items they select are bound with silk and the larva hooks itself inside with the end of its abdomen. The tubes serve various purposes – stones can be added to increase traction in fast-moving streams; irregular twigs make the tube (and its inhabitant) difficult for a trout to swallow. This may be considered more of an engineering than creative process, but are they are none the less candidates for the stable of “natural assemblage artists”

Caddis draws on this phenomena creating a work from a bank of two dozen notated samples, reworking, organizing and blending them into a new abode for the performer to inhabit.

In order to make this happen I have been playing around with a number of melodies and then algorithmically “composing” them. I have been taking 24 event-rows of pitches and rhythms deriving ‘sets’ from these and applying transformations like time stretching and transposition to them.  Obviously writing these out long hand and applying various transformations could be incredibly laborious and I would probably create a few minutes and then get bored. So I have been building and refining the framework on computer and then auditioning it at the click of a button to see what works best.

supercolliderTo fit in with the spirit of recycling and self sufficiency of the project I’ve been working in supercollider, not the easiest of environments but it is free, open source and incredibly powerful. Its a way of working which I have known about for a long time but have never really taken to, it’s nice to finally have the excuse…

If you want to have a go you can click the icon to the left to download it. If you would like to see my wobbly code and make up some of your own please go for it! If you want to go hacking about the simplest place to start is changing numbers in the Pitch or Duration rows, also the number of runs defines how long a piece it will create. It’s still in early days but its good fun. The real skill will come with tweaking the parameters and making all of the other elements such as volume, tempo and timbre work well, but that is something for another day 🙂

/*CADDIS pitch duration builder*/

var runs = 3;//  enter the number of runs and then evaluate


/*musical parameters*/

//Pitch rows (midi numbers)

var p1 = [64,62,64,67,66,62,59,62,57,55,57,62,59,62,66,69,67,66,67,59,62,64,59,62];
p2 = [66,63,62,62,66,67,63,62,60,58,57,58,55,57,58,60,66,67,63,70,64,62,68,67];
p3 = [59,63,67,62,58,65,62,60,59,61,64,67,59,66,65,64,69,56,61,69,59,64,62,68];
p4 = [64,68,68,68,64,67,64,68,68,64,68,68,64,68,64,64,64,67,67,68,64,64,67,64];
p5 = [57,61,59,63,68,57,61,59,60,59,57,56,57,61,59,63,68,66,65,64,60,59,57,56];
p6 = [58,68,62,58,64,65,62,61,58,63,58,65,61,68,60,62,61,58,67,56,56,64,65,65];
p7 = [60,65,62,55,67,62,59,60,62,60,65,67,69,62,59,60,62,65,64,57,62,64,59,57];
p8 = [60,56,67,68,63,62,66,70,59,59,58,63,62,65,57,65,58,62,65,58,61,68,64,60];
p9 = [59,63,68,62,58,65,62,60,59,62,65,68,59,66,65,65,69,56,62,69,59,65,62,68];
p10 = [71,70,69,68,69,68,67,66,65,62,61,60,71,70,69,68,66,65,64,63,62,61,60,59];
p11 = [62,59,62,62,60,59,59,62,62,62,60,62,60,60,62,60,60,62,59,62,60,60,60,62];
p12 = [54,62,61,61,57,67,61,60,60,59,58,57,55,59,57,59,64,60,67,59,65,56,65,63];

var pitch = [{p1},{p2},{p3},{p4},{p5},{p6},{p7},{p8},{p9},{p10},{p11},{p12}];// Pitch row titles

//Duration rows (ms)

var d1 = [0.25,0.25,1.5,0.25,0.25,0.25,0.5,0.5,0.25,0.25,0.25,1.5,0.25,0.25,1.5,0.25,0.25,0.5,0.5,0.5,0.25,0.5,0.25,0.25];
var d2 = [0.25,0.125,0.25,0.375,0.5,0.25,0.5,0.25,0.25,0.25,0.5,0.5,0.25,0.25,1.25,0.5,0.25,0.25,0.5,0.25,0.25,0.25,0.5,0.25];
var d3 = [0.5,0.25,0.625,0.125,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.125,0.375,0.25,0.25,0.25,0.25,0.25,0.5,1.5];
var d4 = [0.75,0.75,0.5,0.25,0.25,0.25,0.75,0.25,0.25,0.75,0.25,0.25,0.25,0.5,0.375,0.125,0.25,0.25,0.25,0.5,0.25,0.125,0.25,0.125];
var d5 = [0.125,0.25,0.125,0.25,0.5,0.25,0.25,0.25,0.125,0.375,0.5,0.25,0.25,0.25,0.75,0.25,0.25,0.75,0.25,0.25,0.25,0.5,0.75,0.75];
var d6 = [0.5,0.5,0.5,0.25,0.25,0.5,0.25,0.25,0.375,0.125,0.25,0.25,0.5,0.25,0.25,0.125,0.125,0.125,0.125,0.25,0.25,0.5,0.5,1];
var d7 = [1,0.5,0.5,0.5,0.25,0.25,0.5,0.25,0.25,0.375,0.125,0.25,0.25,0.5,0.25,0.25,0.125,0.125,0.125,0.125,0.25,0.25,0.5,0.5];
var d8 = [0.125,0.5,0.25,0.25,0.125,0.25,0.5,0.75,0.5,0.125,0.125,0.375,0.125,0.875,0.375,0.25,0.125,0.125,0.5,0.75,0.5,0.5,0.25,0.25];
var d9 = [0.5,0.5,0.25,0.25,0.125,0.125,0.125,0.125,0.125,0.125,0.125,0.125,0.125,0.125,0.125,0.125,1,0.125,0.125,0.25,0.25,0.25,0.5,0.5];
var d10 = [0.5,0.5,1,1,0.5,1.5,0.5,0.25,0.25,0.25,0.25,0.5,0.5,0.5,0.5,0.5,0.5,1.5,0.5,0.25,0.25,0.25,0.25,1.5];
var d11 = [0.75,0.5,0.75,0.75,0.5,0.75,0.25,0.125,0.25,0.125,0.25,0.25,0.25,0.5,0.5,0.5,0.125,0.25,0.25,0.25,0.125,0.25,0.25,0.75];
var d12 = [0.125,0.125,0.125,0.125,1,0.25,0.25,1,0.5,1,0.75,0.25,0.5,0.5,0.5,1,1,0.75,1,0.125,0.125,0.25,0.5,0.75];
var duration = [{d1},{d2},{d3},{d4},{d5},{d6},{d7},{d8},{d9},{d10},{d11},{d12}];// Duration row titles

var transp = [Pn(0,20),Pn(1,25),Pn(2,10),Pn(3,15),Pn(4,15),Pn(5,20),Pn(6,10),Pn(7,20),Pn(8,10),Pn(9,10),Pn(10,5),Pn(11,15)]; //Transposition row

var durMulti = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //Duration multiplier row


/*control data*/

var listLength = [1,2,3,4,5,6,7,8,9,10,11]; //list of choices for set length

var rowList = [0,1,2,3,4,5,6,7,8,9,10,11];//bank to choose set starting points

/*functioning code*/

{ {

var length = listLength.choose; // sets length to reuse

var startingP = rowList.choose; // sets Pitch starting point to reuse

var startingD = rowList.choose; // sets Duration starting point to reuse

var durMult = durMulti.choose;//duration multiplier

var durSet=duration.choose.value; //decide duration row

var range=startingD+(length-1); //find duration string length

var short=durSet.copyRange(startingD,range); //trim duration string to length

var looptime=(short.sum)*durMult; //duration time for loop

\midinote, Pser((pitch.choose.value), length, startingP),
, transp.choose,
, Pser(durSet*durMult, length, startingD)


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s