(/*
	Copyright (c) 2020 Luka Prinčič, All rights reserved.
	This program is free software distributed under
	GNU General Public Licence. See COPYING for more info.
	- - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                   */
// RHIZOSPHERE - STEKLENIK 2020 - CONA //////////////////////////////////////////////

postln("

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
/*
>>> Hello. Starting RHIZOSPHERE                                                 <<<<<

██████╗ ██╗  ██╗██╗███████╗ ██████╗ ███████╗██████╗ ██╗  ██╗███████╗██████╗ ███████╗
██╔══██╗██║  ██║██║╚══███╔╝██╔═══██╗██╔════╝██╔══██╗██║  ██║██╔════╝██╔══██╗██╔════╝
██████╔╝███████║██║  ███╔╝ ██║   ██║███████╗██████╔╝███████║█████╗  ██████╔╝█████╗  
██╔══██╗██╔══██║██║ ███╔╝  ██║   ██║╚════██║██╔═══╝ ██╔══██║██╔══╝  ██╔══██╗██╔══╝  
██║  ██║██║  ██║██║███████╗╚██████╔╝███████║██║     ██║  ██║███████╗██║  ██║███████╗
╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚══════╝ ╚═════╝ ╚══════╝╚═╝     ╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝╚══════╝


");
	*/

Server.default.waitForBoot {

	// library path
	var libPath = PathName(thisProcess.nowExecutingPath.dirname +/+ "lib");

	// for each files in that lib folder 
	libPath.filesDo({|afile|
		// tell me what you're executing:
		postln("   ." + afile.fileName);

		// execute it:
		this.executeFile(afile.fullPath);	
	});
	
	// important for patterns
	s.latency = 0.05; // default server's is 0.2

});

s.meter; s.plotTree;


// octoPan busses //////////////
(
// free busses and panners when re-trying things?
~octoBus1.free; ~octoBus2.free; ~octoBus3.free; ~octoBus4.free;
~panBus1x.free; ~panBus1y.free; ~panBus1r.free;
~panBus2x.free; ~panBus2y.free; ~panBus2r.free;
~panBus3x.free; ~panBus3y.free; ~panBus3r.free;
~panBus4x.free; ~panBus4y.free; ~panBus4r.free;
~revBus.free;

// octoBus1 + panners and control busses:
~octoBus1 = Bus.audio(s,1);
~panBus1x = Bus.control(s,1);
~panBus1y = Bus.control(s,1);
~panBus1r = Bus.control(s,1);
~panBus1y.value = 0.14; // set a fixed value to a bus
~panBus1x.value = 0;
~panBus1r.value = 2;

// octoBus2 + panners and control busses:
~octoBus2 = Bus.audio(s,1);
~panBus2x = Bus.control(s,1);
~panBus2y = Bus.control(s,1);
~panBus2r = Bus.control(s,1);
~panBus2y.value = 0.14; // set a fixed value to a bus
~panBus2x.value = 0;
~panBus2r.value = 2;

// octoBus3 + panners and control busses:
~octoBus3 = Bus.audio(s,1);
~panBus3x = Bus.control(s,1);
~panBus3y = Bus.control(s,1);
~panBus3r = Bus.control(s,1);
~panBus3y.value = 0.14; // set a fixed value to a bus
~panBus3x.value = 0;
~panBus3r.value = 2;

// octoBus4 + panners and control busses:
~octoBus4 = Bus.audio(s,1);
~panBus4x = Bus.control(s,1);
~panBus4y = Bus.control(s,1);
~panBus4r = Bus.control(s,1);
~panBus4y.value = 0.14; // set a fixed value to a bus
~panBus4x.value = 0;
~panBus4r.value = 2;

// 8chan reverb bus
~revBus = Bus.audio(s,8);
">>> loaded all busses".postln;
);

(
var timeLine;

"--- freeing old octoPanners ...".postln;
~octoPanner1.free; ~octoPanner2.free; ~octoPanner3.free; ~octoPanner4.free;

"--- loading octoPanners ...".postln;
~octoPanner1 = Synth("octoPanner", [\inBus, ~octoBus1, \outBus, ~revBus], addAction: \addToTail);
~octoPanner1.map(\x, ~panBus1x);
~octoPanner1.map(\y, ~panBus1y);
~octoPanner1.map(\radius, ~panBus1r); 

~octoPanner2 = Synth("octoPanner", [\inBus, ~octoBus2, \outBus, ~revBus], addAction: \addToTail);
~octoPanner2.map(\x, ~panBus2x);
~octoPanner2.map(\y, ~panBus2y);
~octoPanner2.map(\radius, ~panBus2r); 

~octoPanner3 = Synth("octoPanner", [\inBus, ~octoBus3, \outBus, ~revBus], addAction: \addToTail);
~octoPanner3.map(\x, ~panBus3x);
~octoPanner3.map(\y, ~panBus3y);
~octoPanner3.map(\radius, ~panBus3r); 

~octoPanner4 = Synth("octoPanner", [\inBus, ~octoBus4, \outBus, ~revBus], addAction: \addToTail);
~octoPanner4.map(\x, ~panBus4x);
~octoPanner4.map(\y, ~panBus4y);
~octoPanner4.map(\radius, ~panBus4r);

// 4 x stereo reverbs are fixed to outputs ([0,1][2,3][4,5][6,7]) not panners!
~reverb = Synth("reverBusser", [\inBus, ~revBus, \outBus, 0], addAction: \addToTail);

// some default oscilations of pan and reverb

~panner1y.free;
~panner2y.free;
~panner3y.free;
~panner4y.free;

//~panner1y = SynthDef(\pannerOsc, {Out.kr(~panBus1y, SinOsc.kr(0.1).range(0.1,0.2))}).play;
~panner1y = SynthDef(\randomPanY1, { Out.kr(~panBus1y, LFNoise1.kr(1).range(0,0.28))}).play;
~panner2y = SynthDef(\randomPanY2, { Out.kr(~panBus2y, LFNoise1.kr(1).range(0,0.28))}).play;
~panner3y = SynthDef(\randomPanY3, { Out.kr(~panBus3y, LFNoise1.kr(1).range(0,0.28))}).play;
~panner4y = SynthDef(\randomPanY4, { Out.kr(~panBus4y, LFNoise1.kr(1).range(0,0.28))}).play;
// convert to SynthDef + Synth for common oscilations?

~reverb1wetBus.free; ~wetOsc.free; // clean up
~reverb1wetBus = Bus.control(s, 1); // create control bus
~reverb.map(\verb1wet, ~reverb1wetBus); // map an argument to control bus
~wetOsc = SynthDef(\randomVerb1, {Out.kr(~reverb1wetBus, LFNoise2.kr(1).range(0, 0.8)) }).play;

// ~wetOsc.free;
// ~reverb.set(\verb1wet, 0);
// ~reverb.set(\verb1wet, 1);
// ~reverb.set(\verb2wet, 1);


timeLine = Routine {
	"--- starting main routine ...".postln;


	/// SOIL //////////////////////////////////
	// forestSoil granulation
	"--- starting forestSoil granulation ...".postln;

	~soil1 = Synth(\granSoil, [\out, ~octoBus1, \sndbuf, ~forestSoilBuf, \dur, 0.0001 ,\fadeTime, 20]);
	~soil1durBus = Bus.control(s,1);
	~soil1durBus.value = 0.0001;
	~soil1.map(\dur, ~soil1durBus);
	wait(80);
	
	"--- starting soil2 ...".postln;
	~soil2 = Synth(\granSoil, [\out, ~octoBus2, \sndbuf, ~forestSoilBuf, \dur, 0.0001 ,\fadeTime, 20]);
	~soil2durBus = Bus.control(s,1);
	~soil2durBus.value = 0.0001;
	~soil2.map(\dur, ~soil2durBus);
	wait(20);
	
	"--- starting oscilating duration ...".postln;
	~soil1DurOsc = SynthDef( \soilDurOsc, {Out.kr(~soil1durBus, SinOsc.kr(0.01,1.5pi).range(0.0001, 0.1))} ).play;
	wait(20);
	
	"--- starting oscilating duration 2...".postln;
	~soil2DurOsc = SynthDef( \soilDurOsc, {Out.kr(~soil2durBus, SinOsc.kr(0.01,1.5pi).range(0.0001, 0.2))} ).play;
	wait(120);

	"--- return to static duration...".postln;
	~soil1.set(\dur, 0.0001);
	wait(1);
	~soil2.set(\dur, 0.0001);

	// this could repeat somewhat?

	
	"--- fade soils...".postln;
	~soil1.set(\gate, 0, \fadeTime, 15); // use envelope to fade out
	wait(3);
	~soil2.set(\gate, 0, \fadeTime, 15); // use envelope to fade out
	wait(20);

	~soil1DurOsc.free;
	~soil2DurOsc.free;
	
	// trigRingz //////////////////////////////////////////////////////////////////////////////////////////////////////
	
	"--- starting lorenzTrig1 ...".postln;
	~lorenzTrig1 = Synth(\lorenzTrigRing, [\out, ~octoBus1, \freq, 1400, \amp, 0.5, \fadeTime, 5]);
	wait(30);
	
	"--- starting stdTrig1 ...".postln;
	~stdTrig1 = Synth(\stndTrigRing, [\out, ~octoBus2, \freq,1900, \amp,0.5,\fadeTime, 10]);
	wait(20);

	"--- starting lorenzTrig2 ...".postln;
	~lorenzTrig2 = Synth(\lorenzTrigRing, [\out, ~octoBus3, \freq, 400, \amp, 0.3, \fadeTime, 10, \min, 5, \max, 20]);
	wait(20);

	"--- starting stdTrig2 ...".postln;
	~stdTrig2 = Synth(\stndTrigRing, [\freq, 70, \min, 0, \max, 2, \decay, 2, \ffreq, 200, \amp, 0.4, \out, ~octoBus4, \fadeTime, 20]) ;
	wait(20);

	"--- starting henoTrig1 ...".postln;
	~henoTrig1 = Synth(\henoTrigRing, [\out, ~octoBus2, \freq, 2700, \amp, 1, \min, 0.1, \max, 1, \fadeTime, 20]);
	wait(20);
	
	"--- starting henoTrig1 ...".postln;
	~gbmanTrig1 = Synth(\gbmanTrigRing, [\out, ~octoBus1, \freq, 90, \decay, 2, \min, 0.2, \max, 1, \amp, 0.4, \fadeTime, 2]);
	wait(20);
	
	"--- starting latooTrig1 ...".postln;
	~latooTrig1 = Synth(\latooTrigRing, [\out, ~octoBus4, \freq, 3300, \decay, 3, \min, 0.2, \max, 1, \amp, 0.2, \fadeTime, 10 ]);
	wait(20);

	"--- starting latooTrig2 ...".postln;
	~latooTrig2 = Synth(\latooTrigRing, [\out, ~octoBus3, \freq, 4300, \decay, 0.2, \min, 1, \max, 10, \amp, 0.2, \fadeTime, 10 ]);
	wait(20);

	"--- starting fhnTrig1 ...".postln;
	~fhnTrig1 = Synth(\fhnTrigRing, [\out, ~octoBus1, \freq, 110, \amp, 0.5, \decay, 2, \min, 0.2, \max, 1, \amp, 0.4, \fadeTime, 10]);
	wait(20);

	"--- starting fhnTrig2 ...".postln;
	~fhnTrig2 = Synth(\fhnTrigRing, [\out, ~octoBus2, \freq, 2110, \amp, 0.5, \min, 2, \max, 20, \amp, 0.5, \fadeTime, 10]);
	wait(40);
	
	"--- starting ~fmgrainer ...".postln;
	~fmgrainer = Routine { 200.do({ x = Synth(\fm_grainer, [ "modfreq", rrand(10,1000),	"carfreq", rrand(40,100), \out, ~octoBus1 ]); 	1.wait; }); "--- fmgrains done generating new ones ...".postln; }.play;
	// this one will fade out by itself at some point
	wait(60);

	"--- fading out ~stdTrig1, stdTrig2, lorenzTrig2, henoTrig1...".postln;	
	~stdTrig1.set(\fadeTime, 5, \gate, 0);
	~stdTrig2.set(\fadeTime, 8, \gate, 0);
	~lorenzTrig2.set(\fadeTime, 12, \gate, 0);
	~henoTrig1.set(\fadeTime, 15, \gate, 0);
	wait(30);

	"--- fading out ...".postln;
	~gbmanTrig1.set(\fadeTime, 15, \gate, 0);
	~latooTrig1.set(\fadeTime, 1, \gate, 0);
	~latooTrig2.set(\fadeTime, 10, \gate, 0);
	~fhnTrig1.set(\fadeTime, 1, \gate, 0);
	wait(20);
	
	"--- fading out lorenzTrgi1 ...".postln;
	~lorenzTrig1.set(\fadeTime, 30, \gate, 0);
	wait(80);

	"--- fading out fhnTrig2 ...".postln;	
	~fhnTrig2.set(\fadeTime, 20, \gate, 0);

	"--- latooWanderings ...".postln;	
	~latooWan1 = Synth(\latooWanderings, [\out, ~octoBus4, \fadeTime, 30, \amp, 0.3]);
	wait(60);
	
	"--- markov1 ...".postln;
	~markov1 = Synth(\markovS1,  [ \out, ~octoBus1,	\freq, 440, \tsize, 3, \amp, 0.3, \clip, 0.69, \fadeTime, 0.01 ]);
	wait(60);
	
	"--- markov fade, latooWan fade, distbleeps ...".postln;
	~markov1.set(\gate, 0, \fadeTime, 0.01);
	~latooWan1.set(\gate, 0, \fadeTime, 0.01);
	~distbleeps = Synth(\latooTriggers, [\out, ~octoBus3, \trigA, 1.1, \fadeTime, 0.01, \amp, 0.7]);
	wait(60);

	"--- markov7 ...".postln;
	~markov7 = Synth(\markovS1,  [ \out, ~octoBus2,	\freq, 740, \tsize, 3, \amp, 0.1, \clip, 0.9, \fadeTime, 7 ]);
	wait(60);

	"--- fade: markov7, distbleeps ...".postln;	
	~markov7.set(\gate, 0, \fadeTime, 0.01);
	~distbleeps.set(\gate, 0, \fadeTime, 0.01);

	"--- markov9 ...".postln;
	~markov9 = Synth(\markovS1,  [ \out, ~octoBus1,	\freq, 1940, \tsize, 3, \amp, 0.2, \clip, 0.9, \fadeTime, 0.01 ]);
	wait(30);
	
	"--- fade: markov9 ...".postln;		
	~markov9.set(\gate, 0, \fadeTime, 0.01);
	wait(5);

	"--- markov10,11,12 ...".postln;
	~markov10 = Synth(\markovS1,  [ \out, ~octoBus4,
		\freq, 501, \tsize, 3, \amp, 0.2, \clip, 0.9, \fadeTime, 0.1 ]);
	~markov11 = Synth(\markovS1,  [ \out, ~octoBus3,
		\freq, 1101, \tsize, 3, \amp, 0.2, \clip, 0.9, \fadeTime, 0.1 ]);
	~markov12 = Synth(\markovS1,  [ \out, ~octoBus2,
		\freq, 3001, \tsize, 3, \amp, 0.2, \clip, 0.9, \fadeTime, 0.1 ]);
	wait(60);

	"--- noiseCrackle ...".postln;
	~noiseCr1 = Synth(\noiseCrackle, [\out, ~octoBus1, \fadeTime, 40 ]);
	"--- fade markov10,11,12 ...".postln;
	~markov10.set(\gate, 0, \fadeTime, 50);
	~markov11.set(\gate, 0, \fadeTime, 50);
	~markov12.set(\gate, 0, \fadeTime, 50);
	wait(40);

	"--- noiseCrackle lpfa hpfa ...".postln;
	~noiseCr1.set(\lpfa,1,\hpfa,0);
	wait(10);

	"--- noiseCrackle lpfa hpfa ...".postln;
	~noiseCr1.set(\lpfa,0,\hpfa,1);
	wait(5);

	"--- noiseCrackle lpfa hpfa ...".postln;
	~noiseCr1.set(\lpfa,1,\hpfa,1);
	wait(10);

	"--- darkHenon ...".postln;	
	~darkHenon1 = Synth(\henonLsynth2, [\out, ~octoBus4, \fadeTime, 60]);
	wait(20);
	
	"--- noiseCrackle amp 0.5 ...".postln;
	~noiseCr1.set(\amp, 0.5);
	wait(40);

	"--- noiseCrackle amp 0.2 ...".postln;
	~noiseCr1.set(\amp, 0.2);
	wait(30);
	
	"--- noiseCrackle fade ...".postln;
	~noiseCr1.set(\fadeTime, 30, \gate,0);
	wait(60);

	"--- henonS1 ...".postln;
	~henonS1 = Synth(\henonSynth1, [\out, ~octoBus3, \amp, 0.2, \fadeTime, 40]);
	wait(120); 

	"--- final fade henonS1, darkHenon ...".postln;
	~henonS1.set(\gate, 0, \fadeTime, 50);
	~darkHenon1.set(\gate, 0, \fadeTime, 40);

	wait(50);
	
	"--- end of the TIMELINE ---".postln
	
};

timeLine.play;

);




// testing stuff! ///////////////////////////////////////////////////////////////////////////////////////

~hpfHenon = Synth(\henonLsynth1, [\out, ~octoBus3, \hpfreqmin, 100]);
~hpfHenon = Synth(\henonLsynth1, [\out, ~octoBus1, \hpfreqmin, 100]);
~hpfHenon.set(\hpfreqmin, 1000)
~hpfHenon.free;

~bassLatoo = Synth(\latooThroBass, [\out, ~octoBus1, \amp, 0.2]);
~bassLatoo.free;

~henonSquare = Synth(\henonSquare, [\out, ~octoBus1, \amp, 0.2]);
~henonSquare.set(\gate,0);

// recording

r = Recorder(s);
r.recHeaderFormat = "wav";
r.record(numChannels:2);
r.stopRecording;



//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 