«first  …10 11 12 13 14 15 16 last»

droneSines

2011-03-18 00:16:44 supercollider

A very simple SuperCollider drone instrument I wrote for a friend. The GUI is automatically generated from the node proxy using the .edit method. Most of the code is defining specs (min, max curve, stepsize and default values) for all the parameters. The synthesis part is very simple - just an oscillator going through a reverb and the oscillator is frequency, phase and amplitude modulated by other oscillators.

droneSines screenshot

(
//redFrik 2011
s.waitForBoot{
    Spec.add(\freq1, #[20, 10000, \exp, 0, 100]);
    Spec.add(\freq2, #[20, 10000, \exp, 0, 200]);
    Spec.add(\freq3, #[20, 10000, \exp, 0, 300]);
    Spec.add(\fmod1, #[0.001, 100, \exp, 0, 0.11]);
    Spec.add(\fmod2, #[0.001, 100, \exp, 0, 0.22]);
    Spec.add(\fmod3, #[0.001, 100, \exp, 0, 0.33]);
    Spec.add(\fmoda1, #[0, 100, \lin, 0, 1]);
    Spec.add(\fmoda2, #[0, 100, \lin, 0, 1]);
    Spec.add(\fmoda3, #[0, 100, \lin, 0, 1]);
    Spec.add(\pmod1, #[0.001, 100, \exp, 0, 0.1]);
    Spec.add(\pmod2, #[0.001, 100, \exp, 0, 0.2]);
    Spec.add(\pmod3, #[0.001, 100, \exp, 0, 0.3]);
    Spec.add(\amod1, #[0.001, 100, \exp, 0, 0.01]);
    Spec.add(\amod2, #[0.001, 100, \exp, 0, 0.02]);
    Spec.add(\amod3, #[0.001, 100, \exp, 0, 0.03]);
    Spec.add(\amoda1, #[0, 10, \lin, 0, 0.05]);
    Spec.add(\amoda2, #[0, 10, \lin, 0, 0.05]);
    Spec.add(\amoda3, #[0, 10, \lin, 0, 0.05]);
    Spec.add(\smod, #[0.001, 100, \exp, 0, 0.13]);
    Spec.add(\smoda, #[0, 100, \lin, 0, 5]);
    Spec.add(\smodm, #[0, 100, \lin, 0, 6]);
    Spec.add(\smodaa, #[0, 100, \lin, 0, 8]);
    Spec.add(\smodmm, #[0, 100, \lin, 0, 50]);
    Spec.add(\cmod, #[0.001, 100, \exp, 0, 1.2]);
    Spec.add(\cmoda, #[0, 10, \lin, 0, 0.6]);
    Spec.add(\room, #[0, 300, \lin, 1, 20]);
    Spec.add(\reverb, #[0, 30, \lin, 0, 5]);
    Spec.add(\damp, #[0, 1, \lin, 0, 1]);
    Spec.add(\input, #[0, 1, \lin, 0, 0.5]);
    Spec.add(\spread, #[0, 100, \lin, 0, 25]);
    Spec.add(\dry, #[0, 1, \lin, 0, 0]);
    Spec.add(\early, #[0, 1, \lin, 0, 1]);
    Spec.add(\tail, #[0, 1, \lin, 0, 1]);
    Ndef(\droneSines).play;
    Ndef(\droneSines, {|freq1= 100, freq2= 200, freq3= 300, fmod1= 0.11, fmod2= 0.22, fmod3= 0.33, fmoda1= 1, fmoda2= 1, fmoda3= 1, pmod1= 0.1, pmod2= 0.2, pmod3= 0.3, amod1= 0.01, amod2= 0.02, amod3= 0.03, amoda1= 0.05, amoda2= 0.05, amoda3= 0.05, smod= 0.13, smoda= 5, smodm= 6, smodaa= 8, smodmm= 50, cmod= 1.2, cmoda= 0.6, room= 20, reverb= 5, damp= 1, input= 0.5, spread= 25, dry= 0, early= 1, tail= 1, amp= 0.7|
        Limiter.ar(LeakDC.ar(GVerb.ar(Splay.ar(SinOsc.ar([freq1, freq2, freq3]+SinOsc.ar([fmod1, fmod2, fmod3], 0, [fmoda1, fmoda2, fmoda3]), SinOsc.ar([pmod1, pmod2, pmod3], 0, 2pi), SinOsc.ar([amod1, amod2, amod3], 0, [amoda1, amoda2, amoda3])), SinOsc.ar(SinOsc.ar(SinOsc.ar(smod, 0, smoda, smodm), 0, smodaa, smodmm), 0, 1, 1), amp, SinOsc.ar(cmod, 0, cmoda)), room, reverb, damp, input, spread, dry, early, tail)));
    });
    Ndef(\droneSines).edit;
    s.meter;
};
)
//Ndef(\droneSines).clear;
Ndef(\droneSines).stop;

//--save a preset
Ndef(\droneSines).nodeMap.writeArchive("~/Desktop/pset1.txt".standardizePath)

//--recall a preset
Ndef(\droneSines).nodeMap= Object.readArchive("~/Desktop/pset1.txt".standardizePath)

//--scramble settings
(
Ndef(\droneSines).set(\amp, 0.05);
Ndef(\droneSines).controlKeys.do{|k|
    if(k!=\amp, {
        Ndef(\droneSines).set(k, k.asSpec.map(1.0.rand));
    });
};
)

Pact - Februari

2011-02-22 18:58:44 supercollider, visuals

Another 30 days of daily experiments. This time with Cairo 2D and Cinder + SuperCollider for sound. One very simple sketch per day to learn.

pakt29

pakt screenshot 29

Ndef(\wrap).play
(
Ndef(\wrap, {var n= 29; Splay.ar({|i|
  var w= i+LFSaw.ar(i+1*SinOsc.ar(0.1, i/n*2pi, 1, 0.1), 0, 2, 2);
  Saw.ar(340+LFSaw.ar(0.1, i/n, 10, 10).round(20)+i)%Saw.ar(60+w, SinOsc.ar(0.01, i/n*2pi, 2, 2.05))*0.25;
}!n)});
)
Ndef(\wrap).stop

pakt28

pakt screenshot 28

Ndef(\round).play
(
Ndef(\round, {var n= 28; GVerb.ar(Limiter.ar(LeakDC.ar(Mix({|i|
  var z= SinOsc.ar(i.linexp(0, n-1, 70, 1500), LFSaw.ar(i+1*5, 0, 0.5pi), LFSaw.ar(0.2+SinOsc.ar(i+1*0.001, 0, 0.5), i/n, 0.4).max(0))*SinOsc.ar(200+i, 0, SinOsc.ar(0.03, i+1, 0.5, 1))*SinOsc.ar(400+i, 0, SinOsc.ar(0.04, i+2, 0.5, 1))*SinOsc.ar(800+i, 0, SinOsc.ar(0.05, i+3, 0.5, 1));
  Pan2.ar(z, i.linlin(0, n-1, -0.925, 0.925), 1/n);
}!n))), 3, 5, 0.2, 0.8, 20, 0.1)});
)
Ndef(\round).stop

pakt27

pakt screenshot 27

Ndef(\sweep).play
(
Ndef(\sweep, {var n= 9; GVerb.ar(Mix({|i|
  var t= i/n;
  var t2pi= t*2pi;
  var f= 2**i*10+100;
  var z= LeakDC.ar(VarSaw.ar(SinOsc.ar(i+1*0.005, SinOsc.ar(i+1*SinOsc.ar(0.05, t2pi, 0.2, 0.4), 0, 2pi), f*SinOsc.ar(0.002, t2pi, 0.3, 0.5), f), t, SinOsc.ar(i+1*0.006, t2pi, 0.4, 0.5), i.linlin(0, n-1, 0.4, 0.1)));
  Pan2.ar(z, SinOsc.ar(0.015, t2pi, i.linlin(0, n-1, 0.99, 0.2)), 1/n);
}!n), 30, 5, 0.3, 0.8, 10)});
)
Ndef(\sweep).stop

pakt26

pakt screenshot 26

Ndef(\grid).play
(
Ndef(\grid, {var n= 8; Mix({|i|
  var t= i/n;
  var z= LeakDC.ar(VarSaw.ar(SinOsc.ar(VarSaw.ar(i+1*VarSaw.ar(0.048, 0, 0.5, 25, 150), t, 1/3, 150), VarSaw.ar(100+i, t, VarSaw.ar(0.024, t, 0.25, 0.475, 0.5))*pi, VarSaw.ar(0.012, t, 0.75, VarSaw.ar(0.064, t, 0.5, 25, 50), 200), VarSaw.ar(0.16, t, 2/3, VarSaw.ar(0.02, t, 0.5, 7.5).abs, 300)), t));
  Pan2.ar(z, VarSaw.ar(0.02, t, 0.5), 1/n);
}!n)});
)
Ndef(\grid).stop

pakt25

pakt screenshot 25

Ndef(\wobble).play
(
Ndef(\wobble, {var n= 5; Mix({|i|
  var z= SinOsc.ar(0, SinOsc.ar(60+(i*SinOsc.ar(0.004, 0, 0.8, 1)), i/n*2pi, SinOsc.ar(0, SinOsc.ar(1, 0, 2pi), SinOsc.ar(0.006), 2pi)), 1/n);
  Pan2.ar(z, z);
}!n)});
)
Ndef(\wobble).stop

pakt24

pakt screenshot 24

Ndef(\swoop).play
(
Ndef(\swoop, {var n= 24; Mix({|i|
  var t= i/n;
  var f= SinOsc.ar(0.01, t*0.5pi).exprange(i*22+100, i*44+1000);
  var a= SinOsc.ar(0.05*t, t*2pi, 0.15).max(0);
  var z= RLPF.ar(GrayNoise.ar(a), f*(a+1), 1.4-a-t);
  Pan2.ar(z, LFTri.ar(0.05, t*4, 0.95));
}!n)});
)
Ndef(\swoop).stop

pakt23

pakt screenshot 23

Ndef(\sway).play
(
Ndef(\sway, {var n= 23; LeakDC.ar(Splay.ar({|i|
  var t= i/n;
  var f= t.linexp(0, 1, LFTri.ar(0.04, t*4, 400, 600), LFTri.ar(0.03, t*4, 400, 600));
  var a= SinOsc.ar(SinOsc.ar(0.02, t*pi, 0.5), 0, 0.5).max(0);
  SinOsc.ar(f+SinOsc.ar(f, 0, f*a), LFTri.ar(SinOsc.ar(t+0.01, t, 20), t*4, 4pi), a)
}!n))});
)
Ndef(\sway).stop

pakt22

pakt screenshot 22

Ndef(\blob).play
(
Ndef(\blob, {var n= 33; Mix({|i|
  var t= i/n*2pi;
  Pan2.ar(
    LeakDC.ar(SinOsc.ar(Pulse.ar(0.0625, 2/3).range(0.0625, 0.125), SinOsc.ar(Pulse.ar(i+1, Pulse.ar(i+1*0.125, 0.4, 1/3, 0.5), i+1*n, i+1*n*2), t, SinOsc.ar(SinOsc.ar(0.0625, t), t, 2pi)), SinOsc.ar(i+1*0.125, t, i.linexp(0, n-1, 3/n, 0.001)))),
    SinOsc.ar(0.125, t, i.linlin(0, n-1, 0, 0.95))
  )
}!n)});
)
Ndef(\blob).stop

pakt21

pakt screenshot 21

Ndef(\flush).play
(
Ndef(\flush, {var a= {|i| 2.pow(i)}!7; Mix(
  Pan2.ar(
    Resonz.ar(SinOsc.ar(0, GrayNoise.ar(a*30*pi), 0.5), a*300, SinOsc.ar(a*0.13, 0, 0.4, 0.5)),
    SinOsc.ar(a*0.03, 0, 0.95)
  )
)});
)
Ndef(\flush).stop

pakt20

pakt screenshot 20

Ndef(\veil).play
(
Ndef(\veil, {var n= 15; GVerb.ar(Mix({|i|
  var t= i/n*2pi;
  var f= SinOsc.ar(SinOsc.ar(i*0.015+0.015, t), t);
  var a= SinOsc.ar(f*SinOsc.ar(i*0.15+0.15, t, 0.15, 0.3), t, 150, 300);
  var b= SinOsc.ar(f*SinOsc.ar(i*0.15+0.15, t, 0.15, 0.5), t, 1500, 3000);
  Pan2.ar(
    BPF.ar(
      Saw.ar(SinOsc.ar(f, t).exprange(a, b), SinOsc.ar(f, t, SinOsc.ar(0.015*t+0.15, t, 0.15).max(0))),
      a+b*0.5,
      0.15
    ),
    i/(n-1)*2-1
  );
}!n), 15, 1.5, 0.15)});
)
Ndef(\veil).stop

pakt19

pakt screenshot 19

Ndef(\bubbles).play
(
Ndef(\bubbles, {var n= 6;
    GVerb.ar(Mix({|i|
      var q= i/n*2pi;
      var t= Impulse.ar(SinOsc.ar(SinOsc.ar(0.125, q, 0.5), 0, 1.5, 2), i/n);
      Pan2.ar(
        SinOsc.ar(
          SinOsc.ar(0.01, q, SinOsc.ar(0.05, q, 50), 500),
          Decay2.ar(t, 0.02, 0.2, SinOsc.ar(0.05, q, SinOsc.ar(0.01, 0, 8pi, 8pi))),
          Decay2.ar(t, TRand.ar(0.003, 0.03, t), TRand.ar(0.05, 0.1, t), SinOsc.ar(0.08, q, 0.2, 0.05).max(0))
        ),
        (i/(n-1))*2-1
      );
    }!n), 40, 2, 0.6);
});
)
Ndef(\bubbles).stop

pakt18

pakt screenshot 18

Ndef(\grey).play
(
Ndef(\grey, {Mix({|i|
  var t= Impulse.ar(SinOsc.ar(0.1+(i*0.125), i/10*2pi+#[0, 0.1], 4, SinOsc.ar(0.01+(i*0.01), 0, 4, 12)));
  Pan2.ar(
    FreeVerb.ar(
      BPF.ar(
        GrayNoise.ar(
          Decay2.ar(
            t,
            TRand.ar(0.005, 0.015, t),
            TRand.ar(0.1, 0.15, t),
            TRand.ar(0.35, 0.5, t)
          )
        ),
        SinOsc.ar(i+1*0.032, #[0, 0.1]+i).exprange(i+1*300, i+1*600),
        SinOsc.ar(i+1*0.025, #[0, 0.1]+i).range(0.1, 1)
      ),
      0.3
    ),
    SinOsc.ar(0.1, #[0, 0.1]+i, 0.9)
  );
}!10)});
)
Ndef(\grey).stop

pakt17

pakt screenshot 17

Ndef(\shades).play
(
Ndef(\shades, {Mix({|i|
  var x= SinOsc.ar(0, SinOsc.ar(0.01*i+0.03, i, 2pi));
  var y= SelectX.ar(x.range(0, 4), [WhiteNoise.ar, GrayNoise.ar, PinkNoise.ar, BrownNoise.ar]);
  var z= Pan2.ar(y, x*0.4);
  BPF.ar(Rotate2.ar(z[0], z[1], i/3*2-1), i+1*500, SinOsc.kr(0, SinOsc.ar(i*0.02+0.01, i, pi)).range(1, 10), 0.3);
}!4)});
)
Ndef(\shades).stop

pakt16

pakt screenshot 16

Ndef(\wheel).play
(
Ndef(\wheel, {Splay.ar(BPF.ar(PinkNoise.ar(1!3)*SinOsc.ar(VarSaw.ar(#[0.011, 0.012, 0.013], #[0, 0.1, 0.2], 0.5, VarSaw.ar(#[0.01, 0.02, 0.03], #[0, 0.1, 0.2]).exprange(5, 50), #[300, 303, 309]), CombN.ar(Saw.ar(#[3, 2.5, 1], 0.5pi).sum, 0.05, 0.05), 3), VarSaw.ar(#[0.021, 0.022, 0.023], #[0.2, 0.1, 0.3]).exprange(500, 2000), VarSaw.ar(#[0.031, 0.032, 0.033], #[0, 0.1, 0.2]).exprange(0.06, 0.6)))});
)
Ndef(\wheel).stop

pakt15

pakt screenshot 15

Ndef(\spin).play
(
Ndef(\spin, {GVerb.ar(Mix(Pan2.ar(Formlet.ar(LPF.ar(Saw.ar((5..1)*LFPulse.ar(SinOsc.ar(0.1, 0, 0.5, 1), 0.5, 0.5, 10, 50)+SinOsc.ar((6..2)*0.05).exprange(0.05, 50), 0.3), 300)+Impulse.ar((0..4)+SinOsc.ar((4..8)*0.02).exprange(0.3, 300)), (1..5)*SinOsc.ar((5..9)*0.05).exprange(200, 2000)*SinOsc.ar(SinOsc.ar((2..6)*0.1, 0, 0.1), 0, 0.1, 1), 0.001, 0.0015), SinOsc.ar(SinOsc.ar((3..7)*0.1, 0, 0.1)))))});
)
Ndef(\spin).stop

pakt14

pakt screenshot 14

Ndef(\interfere).play
(
Ndef(\interfere, {var a= #[3, 1, 5, 2]; Limiter.ar(Splay.ar(Formlet.ar(LFPulse.ar(a*100+SinOsc.ar(a, 0, a/20), 0, SinOsc.ar(a/10, 0, 0.45, 0.5), LFPulse.ar(a+a, 0, SinOsc.ar(a/10, 0, 0.45, 0.5), 0.1)), a*100+LFPulse.ar(a/2, 0, 0.5, a*SinOsc.ar(a/100, 0, 150, 200)), SinOsc.ar(a/30, 0, 0.01, 0.0125), SinOsc.ar(a/60, 0, 0.05, 0.055), 0.2)))});
)
Ndef(\interfere).stop

pakt13

pakt screenshot 13

Ndef(\pulse).play
(
Ndef(\pulse, {GVerb.ar(Splay.ar(Resonz.ar(LFPulse.ar(#[121, 232, 343]), LFPulse.ar(#[0.121, 0.232, 0.343]).exprange(LFPulse.ar(#[12.1, 23.2, 34.3]).range(80, 100), LFPulse.ar(#[1.21, 2.32, 3.43].reverse).range(800, 1000)).sum*LFPulse.ar(#[0.121, 0.232, 0.343]).range(0.5, 1), 0.3, 0.15)), 34, 3, 0.2)});
)
Ndef(\pulse).stop

pakt12

pakt screenshot 12

Ndef(\waves).play
(
Ndef(\waves, {var n= 3; Mix({|i|
  var z= VarSaw.ar(i+1*0.01, 0, 0.5, 5, VarSaw.ar(i+1*10, 0, 0.5, 0.5, 10));
  var w= VarSaw.ar(i+1*VarSaw.ar(i+1*0.001, 0, 0.5, z, z*z), 0, 0.5, 0.5, 0.5);
  Pan2.ar(
    SinOsc.ar(0, VarSaw.ar(i+1*w*100, 0, w, 2pi), VarSaw.ar(i+1*w*0.1, 0, w, 0.5)),
    i.linlin(0, n-1, -0.9, 0.9),
    2/n
  )
}!n)});
)
Ndef(\waves).stop

pakt11

pakt screenshot 11

Ndef(\hail).play
(
Ndef(\hail, {Splay.ar(Ringz.ar(SinOsc.ar(#[0.000101, 0.000202, 0.000303, 0.000404, 0.000505, 0.000606], SinOsc.ar(#[101, 202, 303, 404, 505, 606], 0, SinOsc.ar(#[0.0101, 0.0202, 0.0303, 0.0404, 0.0505, 0.0606], 0, pi)))*VarSaw.ar(#[1.01, 2.02, 3.03, 4.04, 5.05, 6.06], #[0.101, 0.202, 0.303, 0.404, 0.505, 0.606], SinOsc.ar(#[0.00101, 0.00202, 0.00303, 0.00404, 0.00505, 0.00606], 0, 0.5, 0.5)), #[1010, 2020, 3030, 4040, 5050, 6060], SinOsc.ar(#[10.1, 20.2, 30.3, 40.4, 50.5, 60.6], 0, 0.1, 0.2), 0.2))});
)
Ndef(\hail).stop

pakt10

pakt screenshot 10

Ndef(\rain).play
(
Ndef(\rain, {
  var n= 30;
  Mix({|i|
    var z= SinOsc.ar(i+1*0.01, 0, 0.001);
    var f= i*100+100+SinOsc.ar(0.0123+z, i/n*2pi).exprange(1, 30);
    var q= SinOsc.ar(0.0234+z, i/n*2pi, 0.3, 0.7);
    var p= SinOsc.ar(0.0345+z, i/n*2pi);
    var a= SinOsc.ar(0.0456+z, i/n*2pi, 0.4, 0.45);
    var x= HPF.ar(BPF.ar(HPF.ar(ClipNoise.ar(2)*Crackle.ar(SinOsc.ar(0.0123+z, i/n*2pi, 0.1, 1.8))), f, q));
    Pan2.ar(x, p, a);
  }.dup(n));
});
)
Ndef(\rain).stop

pakt09

pakt screenshot 09

Ndef(\snow).play
(
Ndef(\snow, {
  Mix({|i|
    var m= SinOsc.ar(0.005, i/5*2pi, 2pi);
    var p= WhiteNoise.ar(SinOsc.ar(i*5000+5000)*SinOsc.ar(i*500+500)*SinOsc.ar(i*50+50)*SinOsc.ar(i*5+5));
    Pan2.ar(SinOsc.ar(p, p*m, p), p, 0.5);
  }.dup(5));
});
)
Ndef(\snow).stop

pakt08

pakt screenshot 08

Ndef(\redqueen3).play
(
Ndef(\redqueen3, {GVerb.ar(LeakDC.ar(
  Saw.ar(
    Saw.ar([100, 101]+Saw.ar([102, 103], Saw.ar([4, 5], Saw.ar([1, 2], 6, 7).sum).sum).sum).exprange(Saw.ar(1/12, 4, 50), Saw.ar(1/8, 3, Saw.ar(1/16, 4, 65))),
    Saw.ar([21, 20], Saw.ar([40, 41], 0, 0.1), 0.2)
)), 60, 4, 0.5, 0.5, 5, 0.5, 0.5, 0.75)});
)
Ndef(\redqueen3).stop

pakt07

pakt screenshot 07

Ndef(\redqueen2).play
(
Ndef(\redqueen2, {GVerb.ar(LeakDC.ar(
  SinOsc.ar(
    SinOsc.ar(
      SinOsc.ar(
        SinOsc.ar(
          SinOsc.ar(
            SinOsc.ar(
              SinOsc.ar(
                1,
                0,
                2,
                SinOsc.ar(1/2).exprange(1, 2)
              ),
              0,
              8,
              SinOsc.ar(1/4).exprange(4, 8)
            ),
            0,
            32,
            SinOsc.ar(1/8).exprange(16, 32)
          ),
          0,
          128,
          SinOsc.ar(1/16).exprange(64, 128)
        ),
        0,
        512,
        SinOsc.ar(1/32).exprange(256, 512)
      ),
      0,
      2048,
      SinOsc.ar(1/64).exprange(1024, 2048)
  ), 0, 0.1)
), 16, 8, 0.75, 0.5)});
)
Ndef(\redqueen2).stop

pakt06

pakt screenshot 06

Ndef(\redqueen).play
(
Ndef(\redqueen, {GVerb.ar(LeakDC.ar(SinOsc.ar(SinOsc.ar([1/16, 1/12], 0, 5), SinOsc.ar(0, SinOsc.ar([SinOsc.ar(3, 0, 5, 12), SinOsc.ar(4, 0, 4, 16)], SinOsc.ar([SinOsc.ar(1/64, SinOsc.ar(0.5, 0, pi)).exprange(1, 30), SinOsc.ar(1/48, SinOsc.ar(0.75, 0, pi)).exprange(1, 30)], SinOsc.ar(SinOsc.ar(1/32, 0, 4), 0, 2pi), SinOsc.ar([1/6, 1/8], 0, 0.5pi, 2pi)), SinOsc.ar([1/3, 2/3], 0, 0.5pi, SinOsc.ar(1/8, 0, 0.5pi, 2pi))), SinOsc.ar([4/3, 3/4], 0, 0.5pi, SinOsc.ar([SinOsc.ar(1/256).exprange(80, 800), SinOsc.ar(1/256).exprange(80.8, 808)], 0, 0.5pi, 2pi)))))*0.05, 10, 3, 0.5, 0.5)});
)
Ndef(\redqueen).stop

pakt05

pakt screenshot 05

Ndef(\noises).play
(
Ndef(\noises, {
  var freq= SinOsc.ar(SinOsc.ar((4..0)/150+SinOsc.ar((0..4)/18, 0, 0.8)), SinOsc.ar((0..4)/80+SinOsc.ar((0..4)/20, 0, 0.1), 0, 2pi)).exprange(100, 1000);
  var rq= SinOsc.ar(SinOsc.ar((0..4)/6+SinOsc.ar((0..4)/19, 0, 0.7), SinOsc.ar((4..0)/5+SinOsc.ar((4..0)/2, 0, 0.1), 0, 2pi))).exprange(0.4, 4);
  Splay.ar(BPF.ar(BPF.ar(ClipNoise.ar(1!5), freq, rq), freq, rq), 0.85);
});
)
Ndef(\noises).stop

pakt04

pakt screenshot 04

Ndef(\lines).play
(
Ndef(\lines, {Splay.ar(LeakDC.ar(SinOsc.ar([0.033, 0.066, 0.055, 0.044], SinOsc.ar([0.12, 0.13, 0.11, 0.14]*SinOsc.ar([0.151, 0.152, 0.153, 0.154], SinOsc.ar([5, 4, 3, 2], 0, 2pi), SinOsc.ar([0.043, 0.053, 0.063, 0.073], 0, [80, 60, 40, 100])), SinOsc.ar(([60, 64, 67, 71]+SinOsc.ar([0.024, 0.025, 0.026, 0.027], SinOsc.ar([0.01, 0.02, 0.03, 0.04], 0, pi), 1).round).midicps, 0, 2pi)), 0.2)))})
)
Ndef(\lines).stop

pakt03

pakt screenshot 03

Ndef(\varsaws).play
(
Ndef(\varsaws, {GVerb.ar(CombC.ar(VarSaw.ar(SinOsc.ar([0.1, 0.11], 0, 5, 100+SinOsc.ar([0.05, 0.055], 0, 50, 50).round(50)), 0, SinOsc.ar([0.2, 0.22], 0, 0.5, SinOsc.ar([0.3, 0.33], 0, 0.1, 0.5)), 0.1), 1.01, SinOsc.ar([0.4, 0.44], 0, 0.01, 1), 8), 80, 5, 0.9)})
)
Ndef(\varsaws).stop

pakt02

pakt screenshot 02

Ndef(\saws).play
(
Ndef(\saws, {Splay.ar(BPF.ar(LeakDC.ar(Saw.ar(SinOsc.ar((0..5)+1*0.02, SinOsc.ar((0..5)+1*101+300, 0, 2pi+SinOsc.ar(0.01, 0, 0.5*pi)), 400, 700))), SinOsc.ar((0..5)+1*0.004, 0, 100, 400), SinOsc.ar((0..5)+1*0.006, 0, 0.4, 0.8)))})
)
Ndef(\saws).stop

pakt01

pakt screenshot 01

Ndef(\moreSines).play
(
Ndef(\moreSines, {LeakDC.ar(Splay.ar(SinOsc.ar((0..20)/70+0.01, SinOsc.ar((0..20)+1*50+50+SinOsc.ar((0..20)+1/30), 0, 2pi), SinOsc.ar((0..20)+1/80, (0..20)/40, 0.2).max(0))))})
)
Ndef(\moreSines).stop

pakt00

pakt screenshot 00

Ndef(\sines).play
(
Ndef(\sines, {GVerb.ar(Splay.ar(SinOsc.ar([100, 200, 300]+SinOsc.ar([0.11, 0.22, 0.33]), SinOsc.ar([0.1, 0.2, 0.3], 0, 2pi), 0.1+SinOsc.ar([0.01, 0.02, 0.03], 0, 0.05)), SinOsc.ar(SinOsc.ar(SinOsc.ar(0.13, 0, 5, 6), 0, 8, 50), 0, 1, 1), 0.7, SinOsc.ar(1.2, 0, 0.6)), 20, 5, 1, 0.5, 25, 0, 1, 1)})
)
Ndef(\sines).stop

Updates:

  • 120212: I ported them all to Processing.
  • 120617: Rendered 1min MP3 excerpts. Attached below under the code snippets.
  • 180629: Ported them all to p5js.

atolf lftoa

2011-02-17 01:10:25 supercollider

Using SuperCollider I reverse-engineered two old MaxMSPJitter externals from Cycling'74. They came as part of the pluggo installer and were compiled in the cfm binary format. This format is since long-defunct and cfm externals can't be loaded into MaxMSPJitter running under Windows or newer Intel macs (afaik). Luckily I could still run the externals and help files under Max4.6 on my old PPC mac.

And as far as I could tell, the source code for these binaries was never released. So I took the trial&error route and managed to figure out how they work internally by using simple input strings like 'aa', 'ab', 'ac', 'ba', 'bb', 'aba', 'abc' etc. Then I just observed the output arrays of floating-point numbers and tried to mimic that in SuperCollider code. It was fairly quick to come up with the algorithms that encode (atolf) and decode (lftoa) shown below.

Also a note on MaxMSPJitter vs SuperCollider: no way I could have solved this using MaxMSPJitter only. Algorithms like these are horrendous to implement with patchcords. See the mess in the screenshots below. Also, MaxMSPJitter's floating-point number boxes, as well as the [print] object, does not show the whole 32bit float values! They round off to 6 digits after the decimal point. Why? So MaxMSPJitter can calculate just fine using 32bit floats as long as you don't try to print or output them in any way.

Anyway, I first wrote RedALF for SuperCollider (it is now in the redSys quark) and from that, I then patched f0.atolf and f0.lftoa (now part of my f0.abs MaxMSPJitter abstractions).

(
~atolf= {|str|
    var res= [1/2**5];
    var tre= [2**12, 2**20, 2**28];
    str.do{|chr, i|
        var j= i.div(3);
        if(i%3==2, {
            res= res++(1/2**5);
        });
        res.put(j, res[j]+(chr.ascii/tre[i%3]));
    };
    res;
};
~lftoa= {|arr|
    var res= "";
    arr.do{|val|
        var a, b, c;
        val= val-(1/2**5)*(2**12);
        a= val.asInteger;
        val= val-a*(2**8);
        b= val.asInteger;
        val= val-b*(2**8);
        c= val.asInteger;
        res= res++a.asAscii++b.asAscii++c.asAscii;
    };
    res;
};
)
a= ~atolf.value("aber")  //--> [0.055025476962328, 0.05908203125]
~lftoa.value(a)  //--> "aber"

f0atolf screenshot f0ltfoa screenshot


sinusdeklinationen

2011-02-15 17:59:24 supercollider

A quick port of a very simple Pure Data demonstration patch made by Malte Steiner. Just to show one way how to go about things in SuperCollider.

Get the Pd patch here... sinusdeklinationen.pd

and then compare it with the following...

//--sinusdeklinationen by Malte Steiner, ported to SC by redFrik

s.boot;

(
SynthDef(\sinuscell, {|out= 0, pan= 0, amp= 0.5, fre= 400, atk= 1, sus= 0.2, rel= 1|
    var env= EnvGen.kr(Env.linen(atk, sus, rel, amp), doneAction:2);
    var snd= SinOsc.ar(fre, 0, env);
    Out.ar(out, Pan2.ar(snd, pan));
}).send(s);
)


(
var cells= [-1, -0.6, -0.5, 0, 0.2, 0.5, 0.4, 1];
~mainVol= 0.1;
cells.do{|c|
    Routine({
        inf.do{
            var fre= 1100.rand;
            var atk= 1.0.rand;
            var sus= 0.2;
            var rel= 1.0.rand;
            Synth(\sinuscell, [\fre, fre, \amp, 1.0.rand*~mainVol, \atk, atk, \sus, sus, \rel, rel, \pan, c]);
            (atk+sus+rel).wait;
        };
    }).play;
};
)


~mainVol= 0.2
~mainVol= 0.02

//stop with cmd+.

redUniverse: Support for Discrete Worlds

2010-12-15 06:22:16 supercollider

clean-up #30:

As the last thing for this month-of-cleaning-up-old-code-and-taking-care-of-forgotten-projects, I finally wrote some methods that I had been planning for a long time. They add support for discrete worlds to my redUniverse quark.

It's all fairly simple.

In a 2 dimensional world there are 8 neighbouring cells/locations. The surroundings method returns them.

a= RedWorld(RedVector[100, 200])  //a 2D world
a.surroundings
[ [ -1, -1 ], [ -1, 0 ], [ -1, 1 ], [ 0, -1 ], [ 0, 1 ], [ 1, -1 ], [ 1, 0 ], [ 1, 1 ] ]

And in a 3 dimensional world, the number of surrounding cells grows to 26. That is 3 * 3 * 3 - 1 where the minus one is the [0, 0] location.

a= RedWorld(RedVector[100, 200, 300])  //a 3D world
a.surroundings
[ [ -1, -1, -1 ], [ -1, -1, 0 ], [ -1, -1, 1 ], [ -1, 0, -1 ], [ -1, 0, 0 ], [ -1, 0, 1 ], [ -1, 1, -1 ], [ -1, 1, 0 ], [ -1, 1, 1 ], [ 0, -1, -1 ], [ 0, -1, 0 ], [ 0, -1, 1 ], [ 0, 0, -1 ], [ 0, 0, 1 ], [ 0, 1, -1 ], [ 0, 1, 0 ], [ 0, 1, 1 ], [ 1, -1, -1 ], [ 1, -1, 0 ], [ 1, -1, 1 ], [ 1, 0, -1 ], [ 1, 0, 0 ], [ 1, 0, 1 ], [ 1, 1, -1 ], [ 1, 1, 0 ], [ 1, 1, 1 ] ]

And the numbers for 4, 5 and 6 dimensional worlds (not that I ever used >3) are 80, 242, 728 respectively. (A RedWorld can have any number of dimensions.)

Also it is possible to not only get the directly adjacent cell, but neighbours further away. This example bumps up the surroundingArea variable from the default 1 to 2. Now the surroundings are all the cells next to and two steps away from [0, 0].

a= RedWorld(RedVector[100, 200])  //a 2F world
a.surroundingArea= 2
a.surroundings
[ [ -2, -2 ], [ -2, -1 ], [ -2, 0 ], [ -2, 1 ], [ -2, 2 ], [ -1, -2 ], [ -1, -1 ], [ -1, 0 ], [ -1, 1 ], [ -1, 2 ], [ 0, -2 ], [ 0, -1 ], [ 0, 1 ], [ 0, 2 ], [ 1, -2 ], [ 1, -1 ], [ 1, 0 ], [ 1, 1 ], [ 1, 2 ], [ 2, -2 ], [ 2, -1 ], [ 2, 0 ], [ 2, 1 ], [ 2, 2 ] ]

That is 24 neighbour locations per single cell in a 2D world.

So the surroundings method only give relative positions and the size of the neighbourhood. Not so useful. But there are the two other methods called surroundingLocations and neighbours that is what one should use. surroundingLocations takes an object and returns a list of locations depending on the current surroundings.

a= RedWorld(RedVector[100, 200])  //a 2D world
b= RedObject(a, RedVector[10, 20])  //an object at location [10, 20]
a.surroundingLocations(b)  //get the surrounding locations of object b
[ RedVector[ 9, 19 ], RedVector[ 9, 20 ], RedVector[ 9, 21 ], RedVector[ 10, 19 ], RedVector[ 10, 21 ], RedVector[ 11, 19 ], RedVector[ 11, 20 ], RedVector[ 11, 21 ] ]

Last the neighbours method that returns an array of any nearby objects.

a= RedWorld(RedVector[100, 200])  //a 2D world
b= RedObject(a, RedVector[10, 20])  //an object at location [10, 20]
c= RedObject(a, RedVector[11, 21])  //an object at location [11, 21]
a.neighbours(b)  //get the neighbouring objects of object b
[ a RedObject ]

The different worlds deals with border conditions differently. RedWorld wraps all the locations around and RedWorld3 filters out locations. Compare...

a= RedWorld(RedVector[100, 200])  //a 2D world without borders
b= RedObject(a, RedVector[0, 0])  //an object at upper left corner location [0, 0]
a.surroundingLocations(b)  //get the surrounding locations of object b
[ RedVector[ 99, 199 ], RedVector[ 99, 0 ], RedVector[ 99, 1 ], RedVector[ 0, 199 ], RedVector[ 0, 1 ], RedVector[ 1, 199 ], RedVector[ 1, 0 ], RedVector[ 1, 1 ] ]
a= RedWorld3(RedVector[100, 200])  //a 2D world with borders
b= RedObject(a, RedVector[0, 0])  //an object at upper left corner location [0, 0]
a.surroundingLocations(b)  //get the surrounding locations of object b
[ RedVector[ 0, 1 ], RedVector[ 1, 0 ], RedVector[ 1, 1 ] ]

The neighbours method is quite slow at the moment, but I hope to be able to speed it up considerably later on.

Anyway, here is the complete SVN diff: sourceforge.net/p/quarks/code/1765/



redLeech

2010-12-13 03:21:02 supercollider

clean-up #28:

Code that performs itself. This is number six in a series all working in a similar manner. See low life, more low life and even more low life.

This virtual leech runs around the code and sucks up words now and then. When it's full (c.size>30) it spits them all out wherever it happens to be. And some characters are lost so the code slowly disappears.

At the end of the video, it got stuck in a loop so I killed it off manually with the delete key.

Thanks to Chris for the title.

SuperCollider document attached below. Will only run under older SuperCollider with OSX (Cocoa, <3.6) AFAIK.

Attachments:
redLeech.scd


«first  …10 11 12 13 14 15 16 last»