«Experiment with roots of unity» by Muse Score
on 28 Jan'23 11:04 inThis is an experiment with roots of unity in supercollider. I took Eulers formula exp(2*pi*I*k/n) = cos(2*pi*k/n)+sin(2*pi*k/n)*I to sonify sums of roots of unity where the sums run through divisors of some numbers.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
(
~divisors = {
arg n;
~divs = List.newClear(0);
for( 1, floor(sqrt(n)), {arg i; if(n%i==0,{
//i.postln;
~divs.add(i);
// (i==n.div(i)).postln;
if(i==n.div(i),{},{~divs.add(n.div(i))});
},{});
});
~divs.sort;
~divs;
};
SynthDef(\rootsOfUnitySum, { |out=0,freq=1,amp=1,n=1,ks=#[1]|
var l,sigl,sigr,env;
sigl = SinOsc.ar(freq:0,mul:0);
sigr = SinOsc.ar(freq:0,mul:0);
ks.do({arg item,i;
k = item;
sigr = sigr+SinOsc.ar(freq:freq*2pi*k/n,mul:amp,phase:0.5*pi);
sigl = sigl+SinOsc.ar(freq:freq*2pi*k/n,mul:amp);
});
env = EnvGen.kr(Env.linen(attackTime: 0.001, sustainTime: 1, releaseTime: 0.01, level: 1.0, curve: 'lin'), doneAction: Done.freeSelf);
sigr = sigr*env;
sigl = sigl*env;
Out.ar(out, [sigl,sigr])
}).add;
~getPbind = { arg n, amps, durs, freq;
~nums = ~divisors.value(n);
r = Pbind(\instrument,\rootsOfUnitySum,
\amp,amps,
\dur,durs,
\freq,freq,
\n,Pseq([n],~nums.size),
\ks , Pseq(all{:~divisors.value(n),n<-~nums},1)).trace();
r
};
~seq = (1..13);
~tau = all{:~divisors.value(n).size,n<-~seq};
~r = Pseq(all{:~getPbind.value(
n:n,
amps:Pseq(all{:0.5/t,t<-~tau},1),
durs:Pseq(all{:0.3333/t,t<-~tau},1),
freq:220/3),n<-~seq},1);
~s = Pseq(all{:~getPbind.value(
n:n,
amps:Pseq(all{:0.5/t,t<-~tau},1),
durs:Pseq(all{:0.5/t,t<-~tau},1),
freq:110),n<-~seq},1);
~t = Pseq(all{:~getPbind.value(
n:n,
amps:Pseq(all{:0.5/t,t<-~tau},1),
durs:Pseq(all{:1/t,t<-~tau},1),
freq:220),n<-~seq},1);
~x = Pseq([
Ppar([~t],1),
Ppar([~s],1),
Ppar([~s,~t],1),
Ppar([~r],1),
Ppar([~r,~t],1),
Ppar([~r,~s],1),
Ppar([~r,~s,~t],1),
],inf);
);
Pdef(\mplayer, ~x).clock_(TempoClock(100/60)).play;
Pdef(\mplayer, Pn(Event.silent)).fadeTime_(8);
reception
comments