Read Me and Required Ugens Coming Soon...
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var rhythmArray, ampArray, positionArray, probArray, rhythmArrayCopy, sampleArray; var randVol; var barLength = 32, barOffset = 0, barHigh = 32, tempo = 120 , mainRoutine, tableFill; var bus, bufferArray, bufferSizeArray, bufferBarsArray = 32, channelsArray = 1, group, synthDefArray; var pathPopUp; var lengthValue = 1, entropyValue = 0, sampleEntropy = 0, pathPopUpValue = 0, rollProb = 0; var entropyConstValue = 0, entropyFillValue = 0; var volumeValue = 1; var tally = 0; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bufferArray = Array.new; bufferSizeArray = Array.new; bufferBarsArray = Array.new; channelsArray = Array.new; bus = Bus.new; group = Group.head(RootNode.new); probArray = [0.1, 0.2, 0.4, 0.5, 0.4]; // Tempo.bpm_(160); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SynthDef("DrumCutterMono", { arg bus, buffer, amp, rate, length, offset; var env, sound; env = EnvGen.kr(Env.new([0,1,1,0], [0.01, 0.98, 0.01]), timeScale:length, levelScale:amp, doneAction:2); sound = PlayBuf.ar(1, buffer, rate, 1.0, offset * 44100, 1) * env; Out.ar(bus, [sound, sound]); }).load(s); SynthDef("DrumCutterStereo", { arg bus, buffer, amp, rate, length, offset; var env, sound; env = EnvGen.kr(Env.new([0,1,1,0], [0.01, 0.98, 0.01]), timeScale:length, doneAction:2) * amp; sound = PlayBuf.ar(2, buffer, rate, 1.0, offset * 44100, 1) * env; Out.ar(bus, sound); }).load(s); SynthDef("DrumCutterMonoLoop", { arg bus, buffer, amp, rate, length, offset, speed; var env, sound, offSmp; offSmp = offset * 44100; env = EnvGen.kr(Env.new([0,1,1,0], [0.01, 0.98, 0.01]), timeScale:length, levelScale:amp, doneAction:2); sound = LoopBuf.ar(1, buffer, rate, 1.0, offSmp, offSmp + (speed * 44100)) * env; Out.ar(bus, [sound, sound]); }).load(s); SynthDef("DrumCutterStereoLoop", { arg bus, buffer, amp, rate, length, offset, speed; var env, sound, offSmp; offSmp = offset * 44100; env = EnvGen.kr(Env.new([0,1,1,0], [0.01, 0.98, 0.01]), timeScale:length, doneAction:2) * amp; sound = LoopBuf.ar(2, buffer, rate, 1.0, offSmp, offSmp + (speed * 44100)) * env; Out.ar(bus, sound); }).load(s); synthDefArray = ["DrumCutterMono", "DrumCutterStereo", "DrumCutterMonoLoop", "DrumCutterStereoLoop"]; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// w = SCWindow("Metroid", Rect(0, 0, 110, 340), false); w.view.background_(Color.new(0.8, 0.8, 1.0)); w.front; w.onClose = { mainRoutine.stop; bufferArray.do({ arg item; item.free; }); group.free; bus.free; }; SCButton(w, Rect( 10, 10, 90, 15)) .states_([["load", Color.black, Color.new(0.7, 0.7, 0.9)]]) .action = { CocoaDialog.getPaths({ arg paths; var sf, low, high, bbars; paths.do({ arg item, i; var bundle; //sf = SoundFile.new; //sf.openRead(item); //channelsArray = channelsArray.add(sf.numChannels); //bufferSizeArray = bufferSizeArray.add(sf.duration); //sf.close; //bbars = (bufferSizeArray.last / (Tempo.beats2secs(4))).asInteger.max(1); //low = bbars.log2.asInteger; //high = 2.pow(low + 1); //low = 2.pow(low); //bufferBarsArray = bufferBarsArray.add([low,high].at((((bbars - low) / (high - low)) + 0.4) // .round(1).asInteger.min(1).max(0))); //bufferBarsArray.last; bundle = CXBundle.new; bufferArray = bufferArray.add(Sample.new(item)); pathPopUp.items_(pathPopUp.items.add(bufferArray.last.name)); bufferArray.last.prepareToBundle(group, bundle); bundle.send(s, 0); bufferArray.last.bufnum.post; "buffer".postln; // bufferArray.last.size.post; "size".postln; // bufferArray.last.numChannels.post; "channels".postln; }); }, {"Canceled".postln}, 20); }; SCButton(w, Rect(10, 30, 15, 15)) .states_([["-"]]) .action_({ var items; //channelsArray.removeAt(pathPopUp.value); //bufferSizeArray.removeAt(pathPopUp.value); //bufferBarsArray.removeAt(pathPopUp.value); bufferArray.at(pathPopUp.value).free; bufferArray.removeAt(pathPopUp.value); items = pathPopUp.items; items.removeAt(pathPopUp.value); pathPopUp.items_(items); }); pathPopUp = SCPopUpMenu(w, Rect(25, 30, 75,15)) .action_({ arg view; pathPopUpValue = view.value; }); SCButton(w, Rect( 10, 50, 90, 15)) .states_([ ["Start", Color.black, Color.new(0.7, 0.7, 0.9)], ["Stop", Color.black, Color.new(0.6, 0.6, 0.8)] ]) .action_({ arg view; if (view.value == 1, { mainRoutine.reset; SystemClock.play(mainRoutine); }, { mainRoutine.stop; }); }); SCButton(w, Rect( 10, 70, 90, 15)) .states_([["Fill", Color.black, Color.new(0.7, 0.7, 0.9)]]) .action_({ var tally = 0; tableFill.value; (barLength).do({ arg i; if (rhythmArray.at(barHigh - 1 - i) == 0, { tally = tally + 1 }, { rhythmArrayCopy.put((barHigh -1- i), tally + 1); tally = 0; }); }); }); SCRangeSlider(w, Rect( 10, 90, 90, 15)) .step_(0.25) .hi_(0.5) .lo_(0) .action_({ arg view; var tally = 0, high; barLength = ((view.hi - view.lo) * 64).max(16).asInteger; barOffset = (view.lo * 64).asInteger; barHigh = (view.hi * 64).asInteger.max(16); (barLength).do({ arg i; if (rhythmArray.at(barHigh - 1 - i) == 0, { tally = tally + 1 }, { rhythmArrayCopy.put((barHigh -1- i), tally + 1); tally = 0; }); }); }); SCStaticText(w, Rect( 10, 110, 90, 15)) .string_("Probability") .align_(\center) .background_(Color.new(0.7, 0.7, 0.9)); SCMultiSliderView(w, Rect(10, 130, 90, 60)) .gap_(0) .thumbSize_(90 / 5) .action_({ arg view; probArray.put(view.index, view.currentvalue); }) .value_(probArray); SCSlider(w, Rect( 10, 195, 90, 15)) .value_(0.5) .action_({ arg view; lengthValue = view.value; }) .value_(1); SCSlider(w, Rect( 10, 215, 90, 15)) .value_(0.5) .action_({ arg view; entropyValue = view.value; }) .value_(0); SCSlider(w, Rect( 10, 235, 90, 15)) .value_(0.5) .action_({ arg view; sampleEntropy = view.value; }) .value_(0); SCSlider(w, Rect( 10, 255, 90, 15)) .value_(0.5) .action_({ arg view; rollProb = view.value; }) .value_(0); SCButton(w, Rect( 10, 275, 90, 15)) .states_([ ["Constant Entropy", Color.black, Color.new(0.7, 0.7, 0.9)], ["Random Fill", Color.black, Color.new(0.6, 0.6, 0.8)] ]) .action_({ arg view; entropyConstValue = view.value; }); SCButton(w, Rect( 10, 295, 90, 15)) .states_([ ["Entropy Write Off", Color.black, Color.new(0.7, 0.7, 0.9)], ["Entropy Write On", Color.black, Color.new(0.6, 0.6, 0.8)] ]) .action_({ arg view; entropyFillValue = view.value; }); SCSlider(w, Rect(10, 315, 90, 15)) .value_(1) .action_({ arg view; volumeValue = \amp.asSpec.map(view.value); }); SCStaticText(w, Rect(5, 5, 100, 330)) .string_(" ") .background_(Color.new(0.6, 0.6, 0.8)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// mainRoutine = Routine({ var offset, dbeat, sample, length, loop; dbeat = OSCSched.global.deltaTillNext(4); Tempo.beats2secs(dbeat).wait; loop({ barLength.do({ arg i; i = i + barOffset; if (rhythmArrayCopy.at(i) != 0, { sample = [pathPopUpValue, sampleArray.at(i)].at( windex([1 - sampleEntropy, sampleEntropy])); offset = if (entropyConstValue == 0, { [positionArray.at((i % (bufferArray.wrapAt(sample).beats * 4)).asInteger), (bufferArray.wrapAt(sample).beats * (16.rand / 4)) ].at(windex([1 - entropyValue, entropyValue])); }, { positionArray.at((i % (bufferArray.wrapAt(sample).beats * 4)).asInteger); }); "asd".postln; loop = windex([1 - rollProb, rollProb]); length = Tempo.beats2secs(0.25)*(rhythmArrayCopy.at(i)*lengthValue).max(0.2); if (((loop == 1) & (rhythmArrayCopy.at(i) < 4)), { Synth(synthDefArray.at(bufferArray.wrapAt(sample).numChannels + 1), [ "bus", bus.index, "buffer", bufferArray.wrapAt(sample).bufnum, "amp", ampArray.at(i) * volumeValue, "rate", (bufferArray.wrapAt(sample).size / 44100) / Tempo.beats2secs(bufferArray.wrapAt(sample).beats), "length", length, "speed", Tempo.beats2secs([0.0625, 0.125, 0.25, 0.33].choose), "offset",((bufferArray.wrapAt(sample).size / 44100) / (bufferArray.wrapAt(sample).beats * 4)) *offset ], group, \addToHead); }, { Synth(synthDefArray.at((bufferArray.wrapAt(sample).numChannels - 1).min(1)), [ "bus", bus.index, "buffer", bufferArray.wrapAt(sample).bufnum, "amp", ampArray.at(i) * volumeValue, "rate", (bufferArray.wrapAt(sample).size / 44100) / Tempo.beats2secs(bufferArray.wrapAt(sample).beats), "length", length, "offset",((bufferArray.wrapAt(sample).size / 44100) / (bufferArray.wrapAt(sample).beats * 4))*offset ], group, \addToHead); }); if (entropyFillValue == 1, { positionArray.put(i, offset); }); }); Tempo.beats2secs(0.25).wait; }); }); }); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// tableFill = { var wholePlus, low, high, tally = 0; /* bufferSizeArray.do({ arg item, i; var bufferBars; bufferBars = (item / (Tempo.beats2secs(4))).asInteger.max(1); low = bufferBars.log2.asInteger; high = 2.pow(low + 1); low = 2.pow(low); bufferBars = [low,high].at((((bufferBars - low) / (high - low)) - 0.25) .round(1).asInteger); bufferBarsArray.put(i, bufferBars); }); */ rhythmArray = Array.new; while ({rhythmArray.size <= 64}, { wholePlus = [16, 20, 24, 28, 32].choose; rhythmArray = rhythmArray ++ [ ([wholePlus] ++ Array.fill(wholePlus - 1, 0)), [8, 0, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0], [2, 0], [1], ].at(windex( if (probArray.normalizeSum == [0, 0, 0, 0, 1], { probArray.normalizeSum; }, { probArray.normalizeSum + [ [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 1.0] ].at(rhythmArray.size % 2).normalizeSum }); )); }); rhythmArrayCopy = rhythmArray; positionArray = Array.fill(rhythmArray.size, {0}); rhythmArray.do({ arg item, i; positionArray.put(i, [i , rhythmArray.size.rand] .at(windex([1 - entropyValue, entropyValue]))); }); randVol = { arg i; [0.9, 0.6, 0.7, 0.6, 0.8, 0.6, 0.7, 0.6].at(i % 8) + rrand(-0.2, 0.2); }; ampArray = Array.fill(rhythmArray.size, {0}); rhythmArray.do({ arg item, i; ampArray.put(i, randVol.value(i)); }); sampleArray = Array.fill(rhythmArray.size, {40.rand}); }; tableFill.value; (barLength).do({ arg i; if (rhythmArray.at(barHigh - 1 - i) == 0, { tally = tally + 1 }, { rhythmArrayCopy.put((barHigh -1- i), tally + 1); tally = 0; }); });