// title: Scoring a movie with supercollider // author: 56228375 // description: // This is the supercollider code used in the tutorial about creating a generative movie score with supercollider and blender. The tutorial itself is located here: part I about using markers on blender's timeline to trigger OSC commands at https://technogems.blogspot.be/2017/08/scoring-movie-with-supercollider.html and part II about using blender's keyframes and animation curves to animate parameters in supercollider at https://technogems.blogspot.be/2017/08/scoring-movie-with-supercollider_12.html // code: ( s.waitForBoot({ ~animFreq = 440; SynthDef(\singer, { | out=0, freq=440, amp=0.5, vibrato=6| var lfo, lfo2, lfo3, sig; lfo = SinOsc.kr(1/5, 0).range(250,1000); lfo2 = SinOsc.kr(1/5, 0).range(0.1,0.9); lfo3 = SinOsc.kr(vibrato).range(0.3, 1); sig = lfo3*RLPF.ar(in:VarSaw.ar(freq:Lag.ar(in:K2A.ar(freq), lagTime:0.3), iphase:0, width:lfo2, mul:amp), freq:lfo, rq:200/lfo); Out.ar(out, sig!2); }).add; SynthDef(\percussive, { |out=0, freq = 220, rq=0.02| Out.ar(out, Pan2.ar(BPF.ar(WhiteNoise.ar * Line.kr(5, 0, 0.02), freq, rq))); }).add; SynthDef(\explosion, { | out = 0 | var m = Line.kr(0.01, 0.8, Rand(0.01, 0.04)); var x = 0.01*SinOsc.ar(LFDNoise3.ar(m.range(18000, 2) ! 2) * (Rand(1, 2) * 600)) * m.exprange(1, 8) * XLine.kr(0.3, 0.0001, 5, doneAction:2); Out.ar(out, x); }).add; SynthDef(\pulsedsine, { | out=0, freq=440 | var env = EnvGen.kr(Env.perc); var sig = Pan2.ar(0.01*SinOsc.ar(freq)*LFPulse.kr(freq/100.0)); Out.ar(out, sig); }).add; s.sync; n = NetAddr("127.0.0.1"); // local machine; port left unspecified OSCdef(\startPattern).free; // free old OSCdefs that may still be around OSCdef(\startPattern, { | msg, time, addr, port | ("start pattern " ++ msg[1]).postln; Pdef(msg[1].asSymbol).quant_(0); Pdef(msg[1].asSymbol).play; }, '/stap', n); OSCdef(\stopPattern).free; // free old OSCdefs that may still be around OSCdef(\stopPattern, { | msg, time, addr, port | ("stop pattern " ++ msg[1]).postln; Pdef(msg[1].asSymbol).quant_(0.25); Pdef(msg[1].asSymbol).stop; }, '/stop', n); OSCdef(\synth).free; OSCdef(\synth, { | msg, time, addr, port | ("start synth " ++ msg[1]).postln; Synth(msg[1].asSymbol); }, '/synth', n); OSCdef(\init).free; OSCdef(\init, { | msg, time, addr, port | msg.postln; }, '/init', n); OSCdef(\clean).free; OSCdef(\clean, { | msg, time, addr, port | msg.postln; }, '/clean', n); OSCdef(\updatefreq).free; OSCdef(\updatefreq, { | msg, time, addr, port | ~animFreq = msg[1]; }, '/animfreq'); Pdef(\pattern2, Pmono( \singer, \degree, Plag(0.2, Pwhite(0, 5, inf)), \dur, Pbrown(0.1, 0.5, 0.1, inf) )); Pdef(\intropattern, Pbind( \instrument, \percussive, \freq, Prand((30..50).midicps, inf), \dur, Pbrown(0.03, 0.3, 0.01, inf), \rq, Pbrown(0.01, 0.04, 0.001, inf) )); Pdef(\psp, // pulsed sine pattern Pmono( \pulsedsine, \freq, Pfunc({ |ev| ~animFreq; }), \dur, Pseq([0.1], inf), )); }); )