Skip to content
Permalink
228e087d3c
Go to file
 
 
Cannot retrieve contributors at this time
213 lines (178 sloc) 6.41 KB
// Engine_Downtown
// sctweet loops
// find more at
// https://twitter.com/search?q=SinOsc%20(%23supercollider%20OR%20%23sc%20OR%20%23sctweet)&src=typed_query&f=live
// testing in supercollider ide
// ({
// var amp=0.4;
// var amplag = 0.02;
// var bpm=120;
// var amp_, snd;
// amp_ = Lag.ar(K2A.ar(amp), amplag);
// // <-- INSERT SOUND CODE HERE -->
// // snd = ??????????
// [snd.scope,snd]
// }.play)
// Inherit methods from CroneEngine
Engine_Downtown : CroneEngine {
// Define a getter for the synth variable
var <synthBirds;
var <synthBells;
var <synthPulse;
var <synthSnare;
var <synthKick;
var <synthPower;
// Define a class method when an object is created
*new { arg context, doneCallback;
// Return the object from the superclass (CroneEngine) .new method
^super.new(context, doneCallback);
}
// Rather than defining a SynthDef, use a shorthand to allocate a function and send it to the engine to play
// Defined as an empty method in CroneEngine
// https://github.com/monome/norns/blob/master/sc/core/CroneEngine.sc#L31
alloc {
// birds, adapted from https://twitter.com/aucotsi/status/408981450994638848
synthBirds = {
arg amp=0.0, amplag=0.02;
var amp_, snd;
amp_ = Lag.ar(K2A.ar(amp), amplag);
snd = Limiter.ar(GVerb.ar(Formlet.ar(LFCub.ar(Convolution.ar(LinCongN.ar(5),LinCongN.ar(5))),LFCub.ar(Sweep.ar(LFCub.ar(1/9),3)).range(1999,3999),0.01,0.1),mul:10),0.02*amp_);
snd
}.play(target: context.xg);
// bells, adapted from https://twitter.com/joshpar/status/100417407021092864
synthBells = {
arg amp=0.0, amplag=0.02;
var amp_, snd;
amp_ = Lag.ar(K2A.ar(amp), amplag);
snd=SinOsc.ar(LFNoise0.ar(10).range(100,1e4),0,0.05)*Decay.kr(Dust.kr(1));
snd=GVerb.ar(snd*LFNoise1.ar(32.703),299,10,0.2,0.5,50,0,0.2,0.9);
snd = HPF.ar(snd,20,mul:amp_);
snd
}.play(target: context.xg);
// pulse, adapted from https://sccode.org/1-55m
synthPulse = {
arg amp=0.0, amplag=0.02, bpm=120, midinote=24;
var amp_, hz_, snd, pulse, bass, lfo;
amp_ = Lag.ar(K2A.ar(amp), amplag);
hz_ = midinote.midicps;
pulse = Decay2.ar(Impulse.ar(bpm/60), 0.01, 1)*SinOsc.ar(hz_,mul:0.25);
bass = Splay.ar(SinOscFB.ar(hz_, 1.5));
lfo = SinOsc.kr(SinOsc.kr(0.1,mul:0.05).abs,add:1);
snd = Compander.ar(bass, pulse, 0.02, 1, 0.05, 0.01, 0.2);
snd = MoogFF.ar(Mix.new([snd*lfo,bass*(1-lfo)]),1300,0.5,mul:amp_);
[snd,snd]
}.play(target: context.xg);
// drumbeat, adapted from https://twitter.com/aucotsi/status/400603496140906496
synthSnare = {
arg amp=0.0, amplag=0.02, bpm=120, hz=1300;
var amp_, hz_, snd;
amp_ = Lag.ar(K2A.ar(amp), amplag);
hz_ = Lag.ar(K2A.ar(hz), amplag);
snd = IFFT(PV_BrickWall(FFT(Buffer.alloc(context.server,512),WhiteNoise.ar*Pulse.ar(4*(bpm/60),1e-4*TChoose.kr(SinOsc.kr(0.5),[0.25,0.5,1,2,3,4,5,6,7,8,9,10]))),SinOsc.ar(bpm/60/8,mul:0.05).abs+0.01));
snd = Slew.ar(snd,3000,1000,mul:amp_);
snd = Pan2.ar(snd,SinOsc.kr(bpm/60/8,mul:0.5));
snd = HPF.ar(snd,20);
snd
}.play(target: context.xg);
// kick, adapted from https://twitter.com/aucotsi/status/400603496140906496
synthKick = {
arg amp=0.0, amplag=0.02, bpm=120, hz=1300;
var amp_, hz_, snd;
amp_ = Lag.ar(K2A.ar(amp), amplag);
snd = Limiter.ar(SinOsc.ar(9*Pulse.ar(bpm/60/4),0,Pulse.kr(bpm/60/4)),level:amp_);
snd = HPF.ar(snd,20);
[snd,snd]
}.play(target: context.xg);
// // bongo, adapted from https://twitter.com/awhillas/status/22165574690
// synth6 = {
// arg amp=0.0, amplag=0.02, bpm=120, hz=1300;
// var amp_, hz_, snd;
// amp_ = Lag.ar(K2A.ar(amp), amplag);
// snd = Pan2.ar(
// Mix.new(
// Limiter.ar(
// SinOsc.ar(
// [50,80,120,40],
// 0,
// EnvGen.kr(
// Env.perc(0.01,0.3),
// Impulse.kr([2,2,3,1.5]*bpm/60/2)
// )
// ))
// ),level:amp_);
// snd = HPF.ar(snd,10);
// [snd,snd]
// }.play(target: context.xg);
// powerlines adapted from sccode https://sccode.org/1-4VU
synthPower = {
arg amp=0.0, amplag=0.02;
var amp_, snd;
amp_ = Lag.ar(K2A.ar(amp), amplag);
snd = Saw.ar(50)*(LFNoise0.kr(50)>0)*SinOsc.kr(0.1, 0, 0.4, 0.45);
snd = FreeVerb.ar(snd, SinOsc.kr(0.01, 0, 0.4, 0.5),0.9,0.6,mul:amp_);
[snd,snd]
}.play(target: context.xg);
// // storm adapted from https://sccode.org/1-e
// synthStorm = {
// arg amp=0.0, amplag=0.02;
// var amp_, snd;
// amp_ = Lag.ar(K2A.ar(amp), amplag);
// snd = Limiter.ar(
// Mix.new([
// tanh(
// 3 * GVerb.ar(
// HPF.ar(
// PinkNoise.ar(0.08+LFNoise1.kr(0.3,0.02))+LPF.ar(Dust2.ar(LFNoise1.kr(0.2).range(40,50)),7000),
// 400
// ),
// 250,100,0.25,drylevel:0.3
// ) * Line.kr(0,1,10)
// ), GVerb.ar(
// LPF.ar(
// 10 * HPF.ar(PinkNoise.ar(LFNoise1.kr(3).clip(0,1)*LFNoise1.kr(2).clip(0,1) ** 1.8), 20)
// ,LFNoise1.kr(1).exprange(100,2500)
// ).tanh,
// 270,30,0.7,drylevel:0.5
// ) * 2 * SinOsc.kr(0.1,mul:3).tanh.abs * Line.kr(0,2,30)
// ])
// ,level:0.5) * amp_;
// snd = HPF.ar(snd,5);
// snd
// }.play(target: context.xg);
this.addCommand("bpm", "f", { arg msg;
synthPulse.set(\bpm, msg[1]);
synthKick.set(\bpm, msg[1]);
synthSnare.set(\bpm, msg[1]);
});
this.addCommand("birds", "f", { arg msg;
synthBirds.set(\amp, msg[1]);
});
this.addCommand("bells", "f", { arg msg;
synthBells.set(\amp, msg[1]);
});
this.addCommand("pulse", "f", { arg msg;
synthPulse.set(\amp, msg[1]);
});
this.addCommand("pulsenote", "f", { arg msg;
synthPulse.set(\midinote, msg[1]);
});
this.addCommand("kick", "f", { arg msg;
synthKick.set(\amp, msg[1]);
});
this.addCommand("snare", "f", { arg msg;
synthSnare.set(\amp, msg[1]);
});
this.addCommand("power", "f", { arg msg;
synthPower.set(\amp, msg[1]);
});
}
// define a function that is called when the synth is shut down
free {
synthBirds.free;
synthBells.free;
synthPulse.free;
synthSnare.free;
synthKick.free;
synthPower.free;
}
}