{
   "labels" : [
      "osc",
      "synchronization",
      "movie",
      "timeline",
      "blender"
   ],
   "is_private" : null,
   "id" : "1-57D",
   "code" : "(\r\ns.waitForBoot({\r\n\t~animFreq = 440;\r\n\r\n\tSynthDef(\\singer, {\r\n\t\t| out=0, freq=440, amp=0.5, vibrato=6|\r\n\t\tvar lfo, lfo2, lfo3, sig;\r\n\t\tlfo = SinOsc.kr(1/5, 0).range(250,1000);\r\n\t\tlfo2 = SinOsc.kr(1/5, 0).range(0.1,0.9);\r\n\t\tlfo3 = SinOsc.kr(vibrato).range(0.3, 1);\r\n\t\tsig = 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);\r\n\t\tOut.ar(out, sig!2);\r\n\t}).add;\r\n\r\n\tSynthDef(\\percussive, {\r\n\t\t|out=0, freq = 220, rq=0.02|\r\n        Out.ar(out, Pan2.ar(BPF.ar(WhiteNoise.ar * Line.kr(5, 0, 0.02), freq, rq)));\r\n\t}).add;\r\n\r\n\tSynthDef(\\explosion, {\r\n\t\t| out = 0 |\r\n\t\tvar m = Line.kr(0.01, 0.8, Rand(0.01, 0.04));\r\n\t\tvar 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);\r\n\t\tOut.ar(out, x);\r\n\t}).add;\r\n\r\n\tSynthDef(\\pulsedsine, {\r\n\t\t| out=0, freq=440 |\r\n\t\tvar env = EnvGen.kr(Env.perc);\r\n\t\tvar sig = Pan2.ar(0.01*SinOsc.ar(freq)*LFPulse.kr(freq/100.0));\r\n\t\tOut.ar(out, sig);\r\n\t}).add;\r\n\r\n\ts.sync;\r\n\r\n\tn = NetAddr(\"127.0.0.1\"); // local machine; port left unspecified\r\n\r\n\tOSCdef(\\startPattern).free; // free old OSCdefs that may still be around\r\n\tOSCdef(\\startPattern, {\r\n\t\t| msg, time, addr, port |\r\n\t\t(\"start pattern \" ++ msg[1]).postln;\r\n\t\tPdef(msg[1].asSymbol).quant_(0);\r\n\t\tPdef(msg[1].asSymbol).play;\r\n\t}, '/stap', n);\r\n\r\n\tOSCdef(\\stopPattern).free; // free old OSCdefs that may still be around\r\n\tOSCdef(\\stopPattern, {\r\n\t\t| msg, time, addr, port |\r\n\t\t(\"stop pattern \" ++ msg[1]).postln;\r\n\t\tPdef(msg[1].asSymbol).quant_(0.25);\r\n\t\tPdef(msg[1].asSymbol).stop;\r\n\t}, '/stop', n);\r\n\r\n\tOSCdef(\\synth).free;\r\n\tOSCdef(\\synth, {\r\n\t\t| msg, time, addr, port |\r\n\t\t(\"start synth \" ++ msg[1]).postln;\r\n\t\tSynth(msg[1].asSymbol);\r\n\t}, '/synth', n);\r\n\r\n\tOSCdef(\\init).free;\r\n\tOSCdef(\\init, {\r\n\t\t| msg, time, addr, port |\r\n\t\tmsg.postln;\r\n\t}, '/init', n);\r\n\r\n\tOSCdef(\\clean).free;\r\n\tOSCdef(\\clean, {\r\n\t\t| msg, time, addr, port |\r\n\t\tmsg.postln;\r\n\t}, '/clean', n);\r\n\r\n\tOSCdef(\\updatefreq).free;\r\n\tOSCdef(\\updatefreq, {\r\n\t\t| msg, time, addr, port |\r\n\t\t~animFreq = msg[1];\r\n\t}, '/animfreq');\r\n\r\n\tPdef(\\pattern2,\r\n\t\tPmono(\r\n\t\t\t\\singer,\r\n\t\t\t\\degree, Plag(0.2, Pwhite(0, 5, inf)),\r\n\t\t\t\\dur, Pbrown(0.1, 0.5, 0.1, inf)\r\n\t));\r\n\r\n\tPdef(\\intropattern,\r\n\t\tPbind(\r\n\t\t\t\\instrument, \\percussive,\r\n\t\t\t\\freq, Prand((30..50).midicps, inf),\r\n\t\t\t\\dur, Pbrown(0.03, 0.3, 0.01, inf),\r\n\t\t\t\\rq, Pbrown(0.01, 0.04, 0.001, inf)\r\n\t));\r\n\r\n\tPdef(\\psp, // pulsed sine pattern\r\n\t\tPmono(\r\n\t\t\t\\pulsedsine,\r\n\t\t\t\\freq, Pfunc({ |ev| ~animFreq; }),\r\n\t\t\t\\dur, Pseq([0.1], inf),\r\n\t));\r\n\r\n\r\n});\r\n)",
   "author" : "56228375",
   "name" : "Scoring a movie with supercollider",
   "ancestor_list" : [],
   "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"
}
