clean-up #1:
two supercollider classes i wrote long ago (nov 2008) after a technique described by Godfried Toussaint in his paper 'The Euclidean Algorithm Generates Traditional Musical Rhythms'
also see for another implementation with some great demos. and Bjorn Westergard has a sc demo here.

lots of typical patterns in say techno music can be described like this using only two numbers (relation).

below is some example supercollider code with resulting output as mp3. the hihat plays a 9/16 rhythm throughout and the snare plays 3 different ones... 5/8, 15/16 and 3/8.

a=, "sounds/Free_CR68/CR68_BD_B_03.wav")
b=, "sounds/Free_CR68/CR68_SD_B1.wav")
c=, "sounds/Free_CR68/CR68_hh_02.wav")

SynthDef(\oneshotMono, {|out= 0, amp= 0.1, pan= 0, rate= 1, buffer|
        var src=, buffer, rate*, doneAction:2);,, pan, amp));

d= TempoClock(120/60)
Pdef(\bd).play(d, quant:4)
Pdef(\hh).play(d, quant:4)
Pdef(\sd).play(d, quant:4)
Pdef(\bd, Pbind(\instrument, \oneshotMono, \buffer, a, \dur, 1.00, \amp, 0.7))
Pdef(\hh, Pbind(\instrument, \oneshotMono, \buffer, c, \dur, 0.25, \amp, Pbjorklund(9, 16, inf)*0.7, \pan, Pbrown(-1, 1, 0.2, inf)))
Pdef(\sd, Pbind(\instrument, \oneshotMono, \buffer, b, \dur, 0.25, \amp, Pbjorklund(5, 8, inf)*0.3))
Pdef(\sd, Pbind(\instrument, \oneshotMono, \buffer, b, \dur, 0.25, \amp, Pbjorklund(15, 16, inf)*0.3))
Pdef(\sd, Pbind(\instrument, \oneshotMono, \buffer, b, \dur, 0.25, \amp, Pbjorklund(3, 8, inf)*0.3))

update 110316: adapted Pbjorklund to also take patterns as arguments.
update 110320: made a quark out of it

Bjorklund is now available as a supercollider quark. install it via the following commands...

//check Bjorklund, click save and recompile

or download and install it manually from here


my latest controller. i'll premiere it this friday (23july, 2010) at the bring-your-own-laptop event at staalplaat. it inlcludes a light sensor, 2 touch sensors, some big switches and lots of knobs for control. it is also wireless and runs off either a 9v battery or a 9-14v wall adapter. the controller data is picked up by redWirelessMaster and is then read by the computer via a serial port.

firmware, partslist and schematics attached below. a supercollider class for interpreting the data is also included. (101109: minor updates)

photostream from the build process. i took out most of this beautiful old electronics and replaced it with my own circuit board. only kept the front end interface with the nice knobs.

update 130122: supercollider gui class updated and new helpfiles and midi control (via a nanoKontroll).

OpenObject tutorials

7 short screencasts with code examples showing how to connect supercollider with max/pd/processing (etc) using the openobject quark.
download the example code here...

update 150316: uploaded the code here below and made it compatible with sc3.6. thanks to edN for noticing.

to run all the examples you will need supercollider, processing (with the oscP5 library), maxmsp and puredata extended (could be easily adapted for pd vanilla).

install OpenObject from within supercollider with Quarks.install("OpenObject");

these screencasts were made at the 10days of SuperCollider network music workshop at subnet, salzburg, october 2009.

openobject quark by julian rohrhuber, tutorials by fredrik olofsson, voiceover and support by max kickinger.

thanks to

OpenObject overview from redFrik on Vimeo.

OpenObject 00 maxmsp from redFrik on Vimeo.

OpenObject 01 maxmsp from redFrik on Vimeo.

OpenObject 02 maxmsp from redFrik on Vimeo.

OpenObject 03 puredata from redFrik on Vimeo.

OpenObject 04 puredata from redFrik on Vimeo.

OpenObject 05 processing from redFrik on Vimeo.

Package icon openobject_demos.zip28.2 KB


just a listing of some of the supercollider code i've published on the swiki. much is old but still fully functional and hopefully useful. - 3d extensions for the Pen class. vector and matrix multiplication. - 1d cellular automata pattern. - livecoding practice sessions. - more livecoding practice sessions. - tempo clock synchronisation and beat matching. - some drawings. - examples ported from nodebox. - examples ported from processing. - quicklauncher folder gui. - hacked server windows. - a silly drummachine. - port of particle chamber by derek holzer. - examples ported from form+code.

klipp av logo

some supercollider code to generate old school klipp av logos.

click the window in the sc code to generate new pictures.

        var width= 800, height= 600;
        var win, usr, p0, p1, l= 50, w= 10, h= 15, c= 0.9, o= 0.1;
        win= Window("nystan", Rect(128, 64, width, height), false);
        usr= UserView(win, Rect(0, 0, width, height));
        usr.mouseDownAction= {usr.refresh};
        usr.background= Color.new255(51, 47, 57);
        usr.drawFunc= {
                Pen.translate(width*0.5, height*0.5);
                        var p, pp1, len;
                        p0= Point(0, 0);
                        p1= Point(0, h.rand*10.linrand);
                        pp1= p1;
                                len= l+l.rand2;
                                Pen.color= Color(c, c, c.rrand(1.0), (1-c).rrand(1.0));
                                if(o.coin, {
                                        p= 200.rand;
                                        p0= p0+p;
                                        p1= p1+p;
                                }, {
                                        p0= p0+Point(len+w.rand2, h.rand);
                                        p1= p1+Point(len+w.rand2, h.rand);
                        Pen.lineTo(Point(0, 0));
        CmdPeriod.doOnce({if(win.isClosed.not, {win.close})});

sunday drawings

2006 i fiddled with some simple drawing routines in sc. ( now i've added matching (?) sound synthesis and some slight modifications to the drawing code. there are 7 parameters that are used to both generate the picture and the sound. normally the parameters are randomised but it is possible to copy&paste a good sounding/looking set of parameters into the code to get the same drawing back.

below is the new code + embedded vimeos.

s.latency= 0.05;
        var width= 640, height= 480, w, u, drawFunc, clearFunc;
        var fadeAtk= 1400, fadeSus= 700, fadeRel= 350;
        var a, b, c, d, e, f, g, i= 0, theta= 0;
        var syn= SynthDef(\sunday, {|amp= 0, a= 1, b= 1, c= 1, d= 1, e= 1, f= 1, g= 1|
                var z0= Mix([a, b]), a+b, e, amp));
                var z1=,, c.abs, f, 2pi), amp);
                var z2=,, d.abs, g, 2pi), amp);
      ,, 0, 0.3), -0.3, 0.3), 0.3, 0.3));
        w= Window("sunday drawings2", Rect(128, 64, width, height), false);
        drawFunc= {
                var x, y;
                if(i==0, {
                                \a, a, \b, b, \c, c, \d, d, \e, e, \f, f, \g, g
                        ].pairsDo{|m, n| (""++m++"="+n++";").postln};
                if(i<fadeAtk, {
                        theta= theta+(d*e*f);
                        x= sin(theta*a%a/b*c*2pi);
                        y= sin(theta*b%b/a*d*2pi);
                        Pen.strokeColor= Color.grey(1, 0.5);
                        Pen.translate(width*0.5, height*0.5);
                        Pen.scale(f, g);
                                0, {Pen.strokeOval(Rect.aboutPoint(Point(x*100, y*100), a, b))},
                                1, {Pen.strokeRect(Rect.aboutPoint(Point(x*100, y*100), a, b))},
                                2, {Pen.line(Point(x*100, y*100), Point(a*c*100, b*d*100)); Pen.stroke}
                        syn.set(\amp, i/fadeAtk, \a, a, \b, b, \c, c, \d, d, \e, e, \f, f, \g, g);
                if(i>(fadeAtk+fadeSus), {
                        theta= 0;
                        Pen.fillColor= Color.grey(0, 5/fadeRel);
                        Pen.fillRect(Rect(0, 0, width, height));
                        syn.set(\amp, i.linexp(fadeAtk+fadeSus, fadeAtk+fadeSus+fadeRel, 1, 0.0001));
                if(i==(fadeAtk+fadeSus+fadeRel), {
                        i= 0;
                }, {
                        i= i+1;
        clearFunc= {
                //--replace with preset from here
                a= 200.rand+1;
                b= 200.rand+1;
                c= 3.0.rand2;
                d= 3.0.rand2;
                e= 3.0.rand;
                f= 0.1.rrand(1.5)*#[1, -1].choose;
                g= 0.1.rrand(1.5)*#[1, -1].choose;
                //--to here
        u= UserView(w, Rect(0, 0, width, height))
        u.animate= true;
        CmdPeriod.doOnce({if(w.isClosed.not, {w.close})});
        w.onClose= {};

ipod touch microphone

i bought the klinkenstecker 3,5mm 4pol for €2,40 from the capsule microphone i had laying around. sorry no data or idea where i got it. the whole thing is very simple to build and the sound is totally allright. now i can record into the ipod thouch and run apps like rjdj and supercollider with audio input.

sc140 - the sctweets album

i'm proud to have contributed with one short track on the just released CC BY-NC-SA 3 licensed album sc140. download/listen here. it is compiled by dan stowell and consists of 22 tracks with corresponding supercollider source code. the thing with this project is that all the tracks are written to fit within the twitter limitation of 140 characters. read the source code here

reference: 140 character examples


Subscribe to f0blog RSS