{"id":6322,"date":"2025-06-01T22:24:49","date_gmt":"2025-06-01T21:24:49","guid":{"rendered":"https:\/\/www.celesteh.com\/blog\/?p=6322"},"modified":"2025-06-02T20:24:45","modified_gmt":"2025-06-02T19:24:45","slug":"logging-in-to-scmoo","status":"publish","type":"post","link":"https:\/\/www.celesteh.com\/blog\/2025\/06\/01\/logging-in-to-scmoo\/","title":{"rendered":"Logging in to SCMoo"},"content":{"rendered":"\n<p>Friends, I wrote a Moo in SuperCollider. <\/p>\n\n\n\n<p>Well, it&#8217;s partially written. Anyway, the point is that you can log in and play with the database developed by <a href=\"https:\/\/shellyknotts.wordpress.com\/\">Shelly Knotts<\/a>.<\/p>\n\n\n\n<p>A proper tutorial will be coming, but between this, the included help files and the <a href=\"https:\/\/github.com\/celesteh\/SCMoo\/blob\/main\/README.md\">Github Readme<\/a> should be enough to get started.  If you experience any problems with this script, please leave a comment or reply.<\/p>\n\n\n\n<p>Before you run it the first time, you must install two Quarks.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Quarks.install(\"https:\/\/github.com\/celesteh\/BiLETools.git\");<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Quarks.install(\"https:\/\/github.com\/celesteh\/SCMoo.git\");<\/code><\/pre>\n\n\n\n<p>This should cause the required Quark, JSONlib, to automatically install.<\/p>\n\n\n\n<p>Then you will need to run all of the following code, which you may wish to save in an scd file. Please edit it so variable a gets your name. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n(\na = \"MyName\";\ng = \"Moo\".toUpper;\n\nw = MooWebSocketResponder(a,\"UserPassword\",g,\"GroupPassword\", \"https:\/\/moo.blessing.exchange\/osc.html\").echo_(true);\n\ns.waitForBoot({\n\n\t\/\/trapdoor\n\n\tSynthDef(\\trapdoorCrash, {|out, amp=02, gate=1, pan=0, dur=1|\n\n\t\tvar env, noise, chaos, panner, sin, senv, sline, sfreq;\n\n\t\tchaos = EnvGen.kr(Env.perc) * 2;\n\t\tnoise = Crackle.ar(chaos, amp);\n\t\tsenv =  EnvGen.kr(Env.perc) * 200;\n\t\tsfreq = Rand(60, 80);\n\t\tsline = XLine.kr(sfreq, 50, 1);\n\t\tsin = SinOsc.ar(sline + senv) \/ 2;\n\t\tenv = EnvGen.kr(Env.perc, doneAction:2);\n\t\tpanner = Pan2.ar(noise + sin, pan, env);\n\t\tOut.ar(out, panner);\n\t}).add;\n\n\n\n\t\/\/ 7 midi\n\tSynthDef(\\trapdoorSines, {|midinote, amp, dur, gate=1, out|\n\t\tvar sines, env, filter;\n\n\t\tenv = EnvGen.kr(Env.asr, gate, doneAction:2);\n\t\tsines = Splay.ar(\n\t\t\t&#91;0.5, 1, 2, 4].collect({|i|\n\t\t\t\t&#91;\n\t\t\t\t\tSinOsc.ar(((midinote - 7).midicps *i), 0, amp),\n\t\t\t\t\tSinOsc.ar(((midinote).midicps *i), 0, amp),\n\t\t\t\t\tSinOsc.ar(((midinote + 7).midicps *i), 0, amp)\n\t\t\t\t]\n\t\t}).flat, 1, env);\n\t\tfilter = BBandPass.ar(sines, 500);\n\t\tOut.ar(out, filter);\n\t}).add;\n\n\tSynthDef(\\trapdoorOpen, {|out, amp=02, gate=1, dur=1|\n\t\tvar pos, saw, env, freq, panner;\n\n\t\tpos = SinOsc.ar(2\/dur);\n\t\tfreq = (pos * 150) + 150;\n\t\tsaw = Saw.ar(freq, amp);\n\t\tenv = EnvGen.kr(Env.asr, gate, doneAction:2);\n\t\tpanner = Pan2.ar(saw, pos, env);\n\n\t\tOut.ar(out, panner);\n\t}).add;\n\n\tSynthDef(\\trapdoorSplash, {|out, amp=02, gate=1, dur=1, pan=0|\n\n\t\tvar noise, panner, env, fenv, filter;\n\n\t\tnoise = WhiteNoise.ar(amp*2);\n\t\tfenv = (EnvGen.kr(Env.perc(releaseTime:dur)) * 400) + XLine.kr(800, 200, dur);\n\t\tfilter = RLPF.ar(noise, fenv);\n\t\tenv = EnvGen.kr(Env.adsr, gate, doneAction:2);\n\t\tpanner = Pan2.ar(filter, pan, env);\n\n\t\tOut.ar(out, panner);\n\t}).add;\n\n\n\t\/\/ bats\n\n\tSynthDef(\\batAttack, {|freq, amp, dur, gate=1, pan, out|\n\n\t\tvar sin, panner, env, pmenv, pm;\n\n\t\tpmenv = (EnvGen.kr(Env.adsr) * pi) + (pi\/3);\n\t\tpm= SinOsc.ar(freq * (37\/41), 0, pmenv);\n\t\tsin = SinOsc.ar(freq, pm, amp);\n\t\tenv = EnvGen.kr(Env.adsr, gate, doneAction:2);\n\t\tpanner = Pan2.ar(sin, pan, env);\n\t\tOut.ar(out, panner);\n\t}).add;\n\n\tSynthDef(\\batSing, {|freq, amp, dur, gate=1, pan, out|\n\n\t\tvar trig, vosim, panner, filter, env;\n\n\t\ttrig = Impulse.ar(freq\/2, 0.1, EnvGen.kr(Env.asr, gate));\n\t\tvosim = VOSIM.ar(trig, freq*3);\n\t\tfilter = BPF.ar(vosim, freq*2);\n\t\tenv = EnvGen.kr(Env.triangle(dur), doneAction:2);\n\t\tpanner = Pan2.ar(filter, pan, env);\n\t\tOut.ar(out, panner)\n\t}).add;\n\n\tSynthDef(\\batPing, {|freq, amp, dur, gate=1, pan, out|\n\n\t\tvar sin, env, panner;\n\n\t\tsin = SinOsc.ar(freq, 0, amp*2);\n\t\tenv = EnvGen.kr(Env.perc, doneAction:2);\n\t\tpanner = Pan2.ar(sin, pan, env);\n\t\tOut.ar(out, panner);\n\t}).add;\n\n\tSynthDef(\\bass, { |out=0,amp=0.1,sustain=0.2,freq=200,fb=0, room=3, mix=0.5, res=0, nois=0.2, trem_freq=4, depth=0.9, rel=0.1, att=0.01, frange=50, del=0.05, comb=0.2, freq_n=3, width=1.0, dec=0.01|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = Saw.ar(&#91;freq, freq+10], 1).tanh; \/\/ * LFNoise1.kr(trem_freq).range(depth, 1);\n\t\tsnd = snd + Pulse.ar(freq*0.5, 0.6).dup;\n\t\tsnd = snd + Pluck.ar(WhiteNoise.ar(1), 1, freq.reciprocal, freq.reciprocal, 10, 0);\n\t\t\/\/ SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\t\t\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 0.3).tanh;\n\t\tsnd = RLPF.ar(snd, freq + 100, 0.8);\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.perc(att,rel),doneAction:2);\n\t\t\/\/ env = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\tSynthDef(\\whale, { |out=0,amp=0.1,sustain=0.01,freq=200,fb=0, room=15, mix=0.8, res=0, nois=0.5, trem_freq=4, depth=0.9, rel=0.5, att=0.1, frange=50, del=0.05, comb=10, freq_n=3|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\t\/\/ snd = Formants.ar(LFNoise1.kr(&#91;freq_n, freq_n+1, freq_n-1, freq_n+2]).range(freq, freq+frange) * &#91;1, 1.1, 1.2, 1.3], Vowel(&#91;\\e, \\o, \\u], &#91;\\alto, \\tenor])) * 3; \/\/ * LFNoise1.kr(trem_freq).range(depth, 1);\n\n\t\tsnd = Splay.ar(SinOscFB.ar(&#91;freq, freq + 10, freq + 20, freq + 30], fb,1).tanh);\n\t\tsnd = Splay.ar(PitchShift.ar(snd, 0.2, LFNoise1.kr(0.2).range(1, Array.fill(4, { rrand(0.5, 0.2)} )))).tanh;\n\t\tsnd = DelayC.ar(RLPF.ar(snd, Rand(100, 3000), 0.03), 1, 1 \/ (2), 1, snd * 0.5);\n\t\t\/\/ snd = BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(0.7).range(1.0, 2.0)) * 0.3).tanh;\n\t\t\/\/ snd = snd * (PinkNoise.ar(LFNoise1.kr(0.3).range(1.0, 2.0)) * 0.3).tanh;\n\t\t\/\/ snd = CombC.ar(snd, 0.1, LFNoise1.kr(comb).range(0.03, 0.1));\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\tSynthDef(\\lake_eels, { |out=0,amp=0.1,sustain=0.01,freq=200,fb=0, room=3, mix=0.5, res=0, nois=0.2, trem_freq=4, depth=0.9, rel=0.5, att=0.1, frange=50, del=0.05, comb=0.3, freq_n=3|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = SinOsc.ar(&#91;440, 442] * SinOsc.ar(LFTri.kr(0.5).range(5, 50), 0, LFTri.kr(0.4).range(5, 50)), 0, 1); \/\/ * LFNoise1.kr(trem_freq).range(depth, 1);\n\n\t\t\/\/ SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\t\tsnd = snd + BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 0.3).tanh;\n\t\tsnd = CombC.ar(snd, 0.1, LFNoise1.kr(comb).range(0.03, 0.1));\n\t\tsnd = RLPF.ar(snd, LFSaw.kr(0.3).range(2000, 500));\n\t\tsnd = Mix.ar(FreeVerb.ar(snd, mix, room)).tanh;\n\t\tsnd = Pan2.ar(snd, SinOsc.ar(LFTri.kr(0.1).range(1, 3)).range(-1, 1));\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\n\t\tOffsetOut.ar(out, snd * env * amp);\n\t}).add;\n\n\t\\Formants.asClass.notNil.if({\n\t\t\"\"\"\nSynthDef(\\witch, { |out=0,amp=0.1,sustain=0.01,freq=200,fb=0, room=3, mix=0.5, res=0, nois=0.2, trem_freq=4, depth=0.9, rel=0.5, att=0.1, frange=50, del=0.05, comb=10, freq_n=3, mult=1|\nvar snd, env, ctrl;\n\n\/\/ctrl = ;\nsnd = Formants.ar(LFNoise1.kr(&#91;freq_n, freq_n+1, freq_n-1, freq_n+2]).range(freq, freq+frange) * mult, Vowel(&#91;\\e, \\o, \\u], &#91;\\alto, \\soprano])) * 3; \/\/ * LFNoise1.kr(trem_freq).range(depth, 1);\nsnd = snd + SinOsc.ar(&#91;freq, freq*1.05] * SinOsc.ar(LFSaw.kr(0.5).range(50, 20), 0, LFSaw.kr(0.4).range(20, 50)), 0, 1);\n\n\/\/ SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 0.3).tanh;\n\/\/ snd = CombC.ar(snd, 0.1, LFSaw.kr(comb).range(0.05, 0.01));\nsnd = FreeVerb.ar(snd, mix, room).tanh;\n\/\/ snd = DFM1.ar(snd, freq, res);\nenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\nOffsetOut.ar(out, snd.dup * env * amp);\n}).add;\n\"\"\".interpret;\n\t});\n\n\n\tSynthDef(\\spider, { |out=0,amp=0.1,sustain=0.01,freq=200,fb=0, room=3, mix=0.5, res=0, nois=0.2, trem_freq=4, depth=0.9, rel=0.5, att=0.1, frange=50, del=0.05, comb=0.2, freq_n=3, width=1.0|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = Pulse.ar(&#91;freq, freq+10], LFTri.kr(1).range(0, width), 1).tanh; \/\/ * LFNoise1.kr(trem_freq).range(depth, 1);\n\n\t\t\/\/ SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\t\t\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 0.3).tanh;\n\t\tsnd = CombC.ar(snd, 0.1, LFNoise1.kr(comb).range(0.03, 0.1));\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.perc(att,sustain),doneAction:2);\n\t\t\/\/ env = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\n\t\\Formants.asClass.notNil.if({\n\n\t\t\"\"\"\nSynthDef(\\ghosts, { |out=0,amp=0.1,sustain=0.01,freq=200,fb=0, room=3, mix=0.5, res=0, nois=0.2, trem_freq=4, depth=0.9, rel=0.5, att=0.1, frange=50, del=0.05, comb=10, freq_n=3, cfreq=3|\nvar snd, env, ctrl;\n\n\/\/ctrl = ;\nsnd = Formants.ar(LFNoise1.kr(&#91;freq_n, freq_n+1, freq_n-1, freq_n+2]).range(freq, freq+frange) * &#91;1, 1.1, 1.2, 1.3], Vowel(&#91;\\e, \\o, \\u], &#91;\\alto, \\tenor])) * 3; \/\/ * LFNoise1.kr(trem_freq).range(depth, 1);\n\n\/\/ SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\nsnd = snd + BrownNoise.ar(nois).tanh;\nsnd = snd * (Crackle.ar(LFNoise1.kr(cfreq).range(1.0, 2.0)) * 0.3).tanh;\nsnd = CombC.ar(snd, 0.1, LFNoise1.kr(comb).range(0.03, 0.1));\nsnd = FreeVerb.ar(snd, mix, room).tanh;\n\/\/ snd = DFM1.ar(snd, freq, res);\nenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\nOffsetOut.ar(out, snd.dup * env * amp);\n}).add;\n\"\"\".interpret;\n\t});\n\n\n\tSynthDef(\\dog, { |out=0,amp=0.1,sustain=0.01,freq=440,fb=0, room=3, mix=0.5, res=0, nois=0.5, trem_freq=4, depth=0.8, rel=0.5, att=0.1|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\t\t\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 4).tanh;\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\tSynthDef(\\bar1, {|out=0,amp=0.1,sustain=0.01,freq=440,fb=0, room=3, mix=0.5, res=0.99, nois=0.5, trem_freq=4, depth=0.8, rel=0.5, att=0.1|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = SinOscFB.ar(&#91;freq, freq], fb, 1).tanh;\n\t\t\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 4).tanh;\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.perc(att,sustain),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\tSynthDef(\\mocktail, { |out=0,amp=0.1,sustain=0.01,freq=440,fb=0, room=3, mix=0.5, res=0.99, nois=0.5, trem_freq=4, depth=0.8, rel=0.5, att=0.1|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = SinOscFB.ar(&#91;freq], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\t\t\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\t\tsnd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 4).tanh;\n\t\tsnd = snd + Dust.ar(10);\n\t\t\/\/ snd = Decay2.ar(snd, 0.01, 0.1, WhiteNoise.ar);\n\t\tsnd = DelayN.ar(snd, 0.2, 0.2, 1, snd);\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tsnd = snd * (Crackle.ar(LFNoise1.kr(10).range(1.0, 2.0)) * 4).tanh;\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\tSynthDef(\\cage, {|out=0,amp=0.1,sustain=0.01,freq=440,fb=0, room=3, mix=0.5, res=0.99, nois=0.5, trem_freq=4, depth=0.8, rel=0.5, att=0.1|\n\t\tvar snd, env, ctrl;\n\n\t\t\/\/ctrl = ;\n\t\tsnd = SinOscFB.ar(&#91;freq, freq], fb, 1).tanh;\n\t\t\/\/ snd = snd + BrownNoise.ar(nois).tanh;\n\t\t\/\/ snd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 4).tanh;\n\t\tsnd = FreeVerb.ar(snd, mix, room).tanh;\n\t\t\/\/ snd = DFM1.ar(snd, freq, res);\n\t\tenv = EnvGen.ar(Env.perc(att,sustain),doneAction:2);\n\t\tOffsetOut.ar(out, snd.dup * env * amp);\n\t}).add;\n\n\n\t\\Formants.asClass.notNil.if({\n\t\t\"\"\"\nSynthDef(\\barperson, { |out=0,amp=0.1,sustain=0.01,freq=200,fb=0, room=3, mix=0.5, res=0, nois=0.5, trem_freq=4, depth=0.9, rel=0.5, att=0.1, frange=50, del=0.08|\nvar snd, env, ctrl;\n\n\/\/ctrl = ;\nsnd = Formants.ar(LFNoise1.kr(5).range(freq, freq+frange), Vowel(&#91;\\e, \\o], &#91;\\alto, \\tenor])) * 2 * LFNoise1.kr(trem_freq).range(depth, 1);\n\n\/\/ SinOscFB.ar(&#91;freq, freq + 10], fb,1).tanh * LFNoise1.kr(trem_freq).range(depth, 1);\n\/\/ snd = snd + BrownNoise.ar(nois).tanh;\nsnd = snd * (Crackle.ar(LFNoise1.kr(3).range(1.0, 2.0)) * 0.3).tanh;\nsnd = CombC.ar(snd, 0.1, del);\nsnd = FreeVerb.ar(snd, mix, room).tanh;\n\/\/ snd = DFM1.ar(snd, freq, res);\nenv = EnvGen.ar(Env.linen(att,sustain, rel),doneAction:2);\nOffsetOut.ar(out, snd.dup * env * amp);\n}).add;\n\"\"\".interpret;\n\t});\n\n\n\ts.sync;\n\n\t\/\/w.getJSON({|json| json.debug(\"command line\"); j = json; \"JSON retrieved\".postln});\n\n\tAppClock.sched(0, {\n\t\tw.getJSON({|json| json.debug(\"command line\");\n\n\t\t\tAppClock.sched(0.5, {\n\t\t\t\tn = NetAPI.other(a, g, path:w);\n\n\t\t\t\t{\n\t\t\t\t\t4.wait;\n\t\t\t\t\tm = Moo.login(n, json, \\parseText, rest:0.03);\n\t\t\t\t\tAppClock.sched(1, {\n\t\t\t\t\t\tm.gui.fontSize = 14;\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar spider, ghosts, witch, lake, barperson, cage, mocktail, dog;\n\n\t\t\t\t\t\t\tspider = m&#91;5929];\n\t\t\t\t\t\t\tghosts = m&#91;7668];\n\t\t\t\t\t\t\twitch = m&#91;6360];\n\t\t\t\t\t\t\tlake = m&#91;8829];\n\t\t\t\t\t\t\tbarperson = m&#91;6832];\n\t\t\t\t\t\t\tcage = m&#91;5746];\n\t\t\t\t\t\t\tmocktail = m&#91;4203];\n\t\t\t\t\t\t\tdog = m&#91;3486];\n\n\t\t\t\t\t\t\tbarperson.stop;\n\t\t\t\t\t\t\tbarperson.pattern_(Pbind(\\instrument, \\barperson,\n\t\t\t\t\t\t\t\t\\dur, barperson&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, Prand(&#91;1, 4, 2], 5) * (((Pfunc({barperson&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\att, barperson&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel,  barperson&#91;\\rel],\n\t\t\t\t\t\t\t\t\\room, 0.5,\n\t\t\t\t\t\t\t\t\\octave, Prand(&#91;5, 4], inf),\n\t\t\t\t\t\t\t));\n\n\t\t\t\t\t\t\tcage.stop;\n\t\t\t\t\t\t\tcage.pattern_(Pbind(\\instrument, \\cage,\n\t\t\t\t\t\t\t\t\\dur, Pfunc({cage&#91;\\dur].value}) * Pstutter(8, Pseq(&#91;1, 0.8, 0.6],inf), inf),\n\t\t\t\t\t\t\t\t\\degree, (Pseq(&#91;0, 1, 2, 3, 4], 5) + Pstutter(5, Pseq(&#91;0, 3, 6, 9],inf), inf)) + (((Pfunc({ cage&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\att, cage&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel, cage&#91;\\rel],\n\t\t\t\t\t\t\t\t\\fb, cage&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, cage&#91;\\room],\n\t\t\t\t\t\t\t\t\\octave, Pstutter(4, Pseq(&#91;5, 6, 7], inf), inf),\n\t\t\t\t\t\t\t));\n\n\t\t\t\t\t\t\tmocktail.stop;\n\t\t\t\t\t\t\tmocktail.pattern_(Pbind(\\instrument, \\mocktail,\n\t\t\t\t\t\t\t\t\\dur, mocktail&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, Pseq(&#91;1, 2, 7, 5, 2, 4], 25) * (((Pfunc({ mocktail&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\att, mocktail&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel, mocktail&#91;\\rel],\n\t\t\t\t\t\t\t\t\\fb, mocktail&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, 0.5,\n\t\t\t\t\t\t\t\t\\octave, Pstutter(4, Pseq(&#91;6, 5, 4], inf), inf),\n\t\t\t\t\t\t\t));\n\n\t\t\t\t\t\t\tdog.stop;\n\t\t\t\t\t\t\tdog.pattern_(Pbind(\\instrument, \\dog,\n\t\t\t\t\t\t\t\t\\dur, dog&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, Pseq(&#91;1, 4, 2], 2) * (((Pfunc({dog&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\att, dog&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel,  dog&#91;\\rel],\n\t\t\t\t\t\t\t\t\\fb, dog&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, 0.5,\n\t\t\t\t\t\t\t\t\\octave, Pstutter(3, Pseq(&#91;5, 4], inf), inf),\n\t\t\t\t\t\t\t));\n\n\n\t\t\t\t\t\t\tspider.stop;\n\t\t\t\t\t\t\tspider.pattern_(Pbind(\\instrument, \\spider,\n\t\t\t\t\t\t\t\t\\dur, spider&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, Pseq((0..8), 3) + Pstutter(5, Pseq(&#91;2, 4, 6, 8], inf), inf) + (((Pfunc({~spider&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\freq_n, spider&#91;\\freq_n],\n\t\t\t\t\t\t\t\t\\att, spider&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel,  spider&#91;\\rel],\n\t\t\t\t\t\t\t\t\\fb, spider&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, spider&#91;\\room],\n\t\t\t\t\t\t\t\t\\octave, spider&#91;\\oct],\n\t\t\t\t\t\t\t));\n\n\n\t\t\t\t\t\t\tghosts.stop;\n\t\t\t\t\t\t\tghosts.pattern_(Pbind(\\instrument, \\ghosts,\n\t\t\t\t\t\t\t\t\\dur, ghosts&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, Pseq(&#91;1], 1) * (((Pfunc({ghosts&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\freq_n, ghosts&#91;\\freq_n],\n\t\t\t\t\t\t\t\t\\att, ghosts&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel,  ghosts&#91;\\rel],\n\t\t\t\t\t\t\t\t\\nois, ghosts&#91;\\nois],\n\t\t\t\t\t\t\t\t\\fb, ghosts&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, ghosts&#91;\\room],\n\t\t\t\t\t\t\t\t\\cfreq, ghosts&#91;\\cfreq],\n\t\t\t\t\t\t\t\t\\frange, ghosts&#91;\\frange],\n\t\t\t\t\t\t\t\t\\comb, ghosts&#91;\\comb],\n\t\t\t\t\t\t\t\t\\octave, ghosts&#91;\\oct], \/\/Pseq(&#91;4], inf),\n\t\t\t\t\t\t\t));\n\n\n\t\t\t\t\t\t\twitch.stop;\n\t\t\t\t\t\t\twitch.pattern_(Pbind(\\instrument, \\witch,\n\t\t\t\t\t\t\t\t\\dur, witch&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, (Pseq(&#91;5, 4, 3, 2, 1], 2) + Pstutter(5, Pseq(&#91;0, -1], inf), inf))* (((Pfunc({~witch&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\freq_n, witch&#91;\\freq_n],\n\t\t\t\t\t\t\t\t\\att, witch&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel,  witch&#91;\\rel],\n\t\t\t\t\t\t\t\t\\sustain, 0.5,\n\t\t\t\t\t\t\t\t\\fb, witch&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, 0.5,\n\t\t\t\t\t\t\t\t\\octave, Pseq(&#91;4], inf),\n\t\t\t\t\t\t\t));\n\n\t\t\t\t\t\t\tlake.stop;\n\t\t\t\t\t\t\tlake.pattern_(Pbind(\\instrument, \\lake_eels,\n\t\t\t\t\t\t\t\t\\dur, lake&#91;\\dur],\n\t\t\t\t\t\t\t\t\\degree, Pseq(&#91;1], 2) * (((Pfunc({lake&#91;\\degree].value}) + 1)).round(1)),\n\t\t\t\t\t\t\t\t\/\/ \\legato, 0.001,\n\t\t\t\t\t\t\t\t\\scale, Scale.minor,\n\t\t\t\t\t\t\t\t\\freq_n, lake&#91;\\freq_n],\n\t\t\t\t\t\t\t\t\\att, lake&#91;\\att],\n\t\t\t\t\t\t\t\t\\rel,  lake&#91;\\rel],\n\t\t\t\t\t\t\t\t\\fb, lake&#91;\\fb],\n\t\t\t\t\t\t\t\t\\room, 0.5,\n\t\t\t\t\t\t\t\t\\octave, Pseq(&#91;4], inf),\n\t\t\t\t\t\t\t));\n\n\n\n\t\t\t\t\t\t}.fork;\n\t\t\t\t\t}, nil);\n\n\t\t\t\t}.fork\n\n\t\t\t}, nil);\n\n\t\t});\n\t}, nil)\n\n});\n\n\n)\n\n\n\/\/n = NetAPI.other(a, g, path:w, joinAction:{\"Join the Moo now\".postln});\n\/\/m = Moo.login(n, j, \\parseText);\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Friends, I wrote a Moo in SuperCollider. Well, it&#8217;s partially written. Anyway, the point is that you can log in and play with the database developed by Shelly Knotts. A proper tutorial will be coming, but between this, the included help files and the Github Readme should be enough to get started. If you experience &hellip; <a href=\"https:\/\/www.celesteh.com\/blog\/2025\/06\/01\/logging-in-to-scmoo\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Logging in to SCMoo<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":6324,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[1],"tags":[227,64],"class_list":["post-6322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-moo","tag-supercollider"],"_links":{"self":[{"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/posts\/6322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/comments?post=6322"}],"version-history":[{"count":2,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/posts\/6322\/revisions"}],"predecessor-version":[{"id":6333,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/posts\/6322\/revisions\/6333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/media\/6324"}],"wp:attachment":[{"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/media?parent=6322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/categories?post=6322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.celesteh.com\/blog\/wp-json\/wp\/v2\/tags?post=6322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}