• jon@schemawound.com

DrumChucKer (Chucklib Test)

First test of ChuckLib. Random drumbeats generated using the drum sounds included with Renoise. Change the paths to use your own directories of samples.

(
	var renoiseSampDir, reverbChannel, kickFiles, snareFiles, hatFiles;

	/*Change Directory Settings As Needed*/
	renoiseSampDir = "C:/Program Files/Renoise 2.8.0/Samples/";
	kickFiles = PathName(renoiseSampDir ++ "Kicks/").files.collect{|file| file.fullPath};
	snareFiles = PathName(renoiseSampDir ++ "Snares/").files.collect{|file| file.fullPath};
	hatFiles = PathName(renoiseSampDir ++ "HiHats/").files.collect{|file| file.fullPath};
	
	//Number Of Steps In A Bar And Tempo
	~numSteps = 16;
	TempoClock.default.tempo = 2.1366279069767;

	//Get Number Of Buffers Loaded
	~numKik = kickFiles.size;
	~numSnare = snareFiles.size;
	~numHat = hatFiles.size;

	//Clean Up just in case
	BP([kik, snare, hat]).free;

	// ----- KICK -----
	PR(bufPerc).chuck(BP(kik), parms: (
	   bufPaths: kickFiles,
	   bufCoords: [0, -1]!~numSteps,
	   amps: [1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1],
	   rates: [1],
	   bufs: {~numKik.rand}!~numSteps,
	));
	BP(kik).barCount = -1;
	BP(kik).pbindPreAction = {~barCount = (~barCount + 1) % 4; if(~barCount == 0, {~bufs = {41.rand}!16; "KICK:".postln; (~bufs * ~amps).postln;}) };

	// ----- SNARE -----
	PR(bufPerc).chuck(BP(snare), parms: (
	   bufPaths: snareFiles,
	   bufCoords: [0, -1]!~numSteps,
	   amps: [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1],
	   rates: [1],
	   bufs: {~numSnare.rand}!~numSteps
	));
	BP(snare).barCount = -1;
	BP(snare).pbindPreAction = {~barCount = (~barCount + 1) % 5; if(~barCount == 0, {~bufs = {44.rand}!16; "SNARE:".postln; (~bufs * ~amps).postln;}) };

	// ----- HAT -----
	PR(bufPerc).chuck(BP(hat), parms: (
	   bufPaths: hatFiles,
	   bufCoords: [0, -1]!~numSteps,
	   amps: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
	   rates: [1],
	   bufs: {~numHat.rand}!~numSteps
	));
	BP(hat).barCount = -1;
	BP(hat).pbindPreAction = {~barCount = (~barCount + 1) % 3; if(~barCount == 0, {~bufs = {50.rand}!16; "HAT:".postln; (~bufs * ~amps).postln;}) };


	//Create Mixer
	~dcMixer = MixingBoard('DrumChucKer', nil, BP(kik).chan, BP(snare).chan, BP(hat).chan);

	reverbChannel = MixerChannel(rvb, s, 2, 2, level:1, completionFunc: { |chan|
		"creating reverb synth".postln;
		chan.playfx({ |outbus|
			var	sig = In.ar(outbus, 2);  // read from channel's bus
			FreeVerb2.ar(sig[0], sig[1], 1, 0.6, 0.5)
		});
	});
	~dcMixer.add(reverbChannel);  // add to MixingBoard

	BP(kik).chan.newPostSend(reverbChannel, 0.0);
	BP(snare).chan.newPostSend(reverbChannel, 0.0);
	BP(hat).chan.newPostSend(reverbChannel, 0.0);

	//Clean up when CmdPeriod is hit
	CmdPeriod.doOnce{
		BP([kik, snare, hat]).free;
		{~dcMixer.free}.defer(0.4); //Delay cleaning up the mixer to avoid throwing an error
	};

	//Play after a delay to let everything have a chance to load
	{BP([kik, snare, hat]).play;}.defer(4);

)