• jon@schemawound.com
Disquiet Junto
Disquiet Junto 0048: Unloop Antidote

Disquiet Junto 0048: Unloop Antidote

I have long admired the concept of the Disquiet Junto but have not ever gotten involved until today.

This was the assignment for this week:
This is a shared-sample project. We’re going to celebrate the dual forces of the phenomenon known as the netlabel and of the Creative Commons license that allows for derivative works. We’ll do this by reworking music from an example of the former that employs the latter. The assignment this week is simple. Please download the following three tracks from the netlabel Three Legs Duck, based in Paris, France, and combine them into a new track. You can process the sourced audio in any way you choose, but you can’t add anything to it. Note that the tracks are available for a price named by the purchaser — this includes paying nothing at all:

Deadline: Monday, December 3, at 11:59pm wherever you are.

Length: Your finished work should be between 2 and 5 minutes in length.
I decided this would be a good challenge for me as none of my previous Supercollider works used buffers. I added another restriction to the track, I would not do any sample editing outside of Supercollider. I feel that as electronic musicians we sometimes spend too much time using our eyes instead of our ears when trying to create music. In a wave editor it is far too easy to automatically choose where to snip your samples based on the look of the waveform rather than really listening.

The first thing I did was create a small section that would allow me to slice samples.
Note: ~unloop is just a referance to one of the file names. Please see the full code block.

//Cutting Section
(
    fork{
        b.free;
        b = Buffer.read(s, ~unloop, 455000, 300000);
        s.sync;
        b.play;
    }
)

This would allow me to constantly change the start position and length of my buffers, every time I found one I liked I would add it to an Event I created named ~buffers.

All my buffers are played back by two different SynthDefs

  • bufPlay2 – Trigger the buffer and let it play until completion. doneAction is controlled by the buffer length. This is used to play back my percussive samples because I always want to them to play completely.
  • bufADSR2 – Buffer is controlled by an ADSR envelope. This is used for “synth” style samples where I want to be able to change the length of each note.

The rest of the code handles creates effects, instrument patterns and a Ppar used to sequence the instrument patterns. Apologies for some sloppy code in the effect SynthDefs, due to time constraints I did not have a chance to clean this piece up as much as my usual tracks.

Note: ~media.disquiet just points to the location of the wav files for the project.

/*
Unloop Antidote [disquiet0048-libertederive]
By Schemawound

All code by Jonathan Siemasko
All sound sampled from the releases mentioned below

NOTE: ~media.disquiet just points to the directory containing the files.

DESCRIPTION:
This Disquiet Junto project was done as a celebration of the efforts of the Three Legs Duck netlabel,
and to support its employment of licenses that allow for derivative works. This track is comprised of
three pieces of music, all originally released on Three Legs Duck: “Unloop Hullaballoo” off The Fleet’s
Lit Up by Alex Charles and Richard Sanderson, “Etude” off Emosphere by !Kung, and “04:54AM” off Four AM
at Dusk Jérôme Poirier. More on the Three Legs Duck netlabel, and the original versions of these tracks,
at http://threelegsduck.weebly.com/.

More on this 48th Disquiet Junto project at: http://disquiet.com/2012/11/29/disquiet0048-libertederive/

More details on the Disquiet Junto at: http://soundcloud.com/groups/disquiet-junto/info/
*/

(
fork{
	//Source Files
	~etude = ~media.disquiet ++ "Emosphere - 03 Etude.wav";
	~four54 = ~media.disquiet ++ "Four AM at Dusk - 02 04-54AM.wav";
	~unloop = ~media.disquiet ++ "The Fleets Lit Up - 04 Unloop Hullaballoo.wav";

	//Cut Samples
	Buffer.freeAll;
	~buffers = ();
	~buffers.squeak = Buffer.read(s, ~etude, 0, 29000);
	~buffers.hornSnip = Buffer.read(s, ~etude, 29000, 6000);
	~buffers.clickClack = Buffer.read(s, ~etude, 5000, 15000);
	~buffers.thumpThump = Buffer.read(s, ~etude, 50000, 15000);
	~buffers.paperNoise = Buffer.read(s, ~etude, 70000, 15000);
	~buffers.steamlet = Buffer.read(s, ~etude, 83000, 15000);
    ~buffers.steamlet2 = Buffer.read(s, ~etude, 105000, 15000);
	~buffers.steamSynth = Buffer.read(s, ~unloop, 105000, 300000);
	~buffers.steamSynth2 = Buffer.read(s, ~unloop, 555000, 300000);
	~buffers.stab = Buffer.read(s, ~unloop, 4005000, 30000);
	~buffers.clickSnare = Buffer.read(s, ~unloop, 9025500, 6000);
	~buffers.lowPluck = Buffer.read(s, ~four54, 1222000, 1400);

	//SynthDef
	SynthDef(\bufPlay2, {|out = 0, bufnum, rateScale = 1, amp = 1|
		var buf = PlayBuf.ar(2, bufnum, BufRateScale.kr(bufnum) * rateScale, doneAction: 2);
		Out.ar(out, buf * amp);
	}).add;

	SynthDef(\bufADSR2, {|out = 0, gate = 1, bufnum, rateScale = 1, amp = 1, attack = 0.01, decay = 0.3, release = 1|
		var buf = PlayBuf.ar(2, bufnum, BufRateScale.kr(bufnum) * rateScale);
		var env = EnvGen.ar(Env.adsr(attack, decay, 1, release), gate, doneAction: 2);
		Out.ar(out, buf * env * amp);
	}).add;

	SynthDef(\snareFX, {|out = 0, in, amp = 1|
		var inSig = In.ar(in, 2);
		inSig = inSig + (CombC.ar(inSig, 10, 0.5, 0.5) * 0.8);
		inSig = inSig + (GVerb.ar(inSig, 8, 2) * 0.2);
		Out.ar(out, inSig * amp);
	}).add;

	SynthDef(\hatFX, {|out = 0, in, amp = 1|
		var inSig = In.ar(in, 2);
		inSig = inSig + (CombC.ar(inSig, 10, 0.5, 0.5) * 0.8);
		inSig = GVerb.ar(inSig);
		Out.ar(out, inSig * amp);
	}).add;

	SynthDef(\squeakFX, {|out = 0, in, amp = 1|
		var inSig = In.ar(in, 2);
		inSig = inSig + (CombC.ar(inSig, 10, 0.3, 3) * 0.8);
		inSig = GVerb.ar(inSig);
		Out.ar(out, inSig * amp);
	}).add;

	SynthDef(\kickFX, {|out = 0, in, amp = 1|
		var inSig = In.ar(in, 2);
		inSig = BLowPass4.ar(inSig, 300);
		Out.ar(out, inSig * amp);
	}).add;

	SynthDef(\twinkleFilterFX, {|out = 0, in, amp = 1|
		var inSig = In.ar(in, 2);
		inSig = RHPF.ar(inSig, 1000);
		Out.ar(out, inSig * amp);
	}).add;

	//Sync
	s.sync;

	//Display
	~buffers.do{|buf| buf.postln};

	//FX
	~snareBus = Bus.audio(Server.default, 2);
	~snareFX = Synth(\snareFX, [\out: [0,1], \in: ~snareBus, amp: 0.3]);
	~hatBus = Bus.audio(Server.default, 2);
	~hatFX = Synth(\hatFX, [\out: [0,1], \in: ~hatBus, amp: 0.5]);
	~squeakBus = Bus.audio(Server.default, 2);
	~squeakFX = Synth(\squeakFX, [\out: [0,1], \in: ~squeakBus, amp: 0.5]);
	~kickBus = Bus.audio(Server.default, 2);
	~kickFX = Synth(\kickFX, [\out: [0,1], \in: ~kickBus, amp: 0.5]);
	~twinkleFilterBus = Bus.audio(Server.default, 2);
	~twinkleFilterFX = Synth(\twinkleFilterFX, [\out: ~hatBus, \in: ~twinkleFilterBus, amp: 0.5]);

	//Sequence (8 beat bars)
    ~songClock = TempoClock(1, 0);
	~pat = ();
	~pat.intro = Pbind(*[instrument: \bufADSR2, bufnum: ~buffers.steamSynth2, dur: 8, amp: Pn(1, 1), rateScale: 1, out: ~snareBus]);
	~pat.thump = Ppar([
		Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.thumpThump, dur: 1, amp: Pseq([Pseq([1.5,Rest], 3), Pn(1,2)], 1), rateScale: 0.5]),
		Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.thumpThump, dur: 1, amp: Pseq([1,Rest], 4), rateScale: 0.2]),
	]);
	~pat.clickSnare = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.clickSnare, dur: 1, amp: Pseq([Rest, 0.9], 4), rateScale: 1, out: ~snareBus]);
	~pat.squeakHalf = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.squeak, dur: 1, amp: Pseq([Pn(Rest,4), Pn(1,4)],1), rateScale: 0.5]);
	~pat.squeak = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.squeak, dur: 1, amp: Pn(0.9,8), rateScale: 0.5]);
	~pat.squeakInfinity = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.squeak, dur: 1, amp: Pn(0.9,8), rateScale: 0.5, out: ~squeakBus]);
	~pat.squeakInfinity2 = Pbind(*[instrument: \bufADSR2, bufnum: ~buffers.squeak, dur: 1, sustain: 5, amp: Pn(0.5,8), rateScale: 0.05, out: ~squeakBus]);
	~pat.clickClack = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.clickClack, dur: 1/2, amp: Pseq([Rest, 0.5], 8), rateScale: Pseq([Pn(1, 8), Pn(0.8, 8)])]);
	~pat.paperNoise = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.paperNoise, dur: 1/2, amp: Pseq([0.9], 16), rateScale: 0.7]);
	~pat.steamlet2Half = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.steamlet2, dur: 1/4, amp: Pseq([Pn(Rest, 8), Pn(1, 4), Pn(Rest, 4)], 2), rateScale: 0.5, amp: 0.6]);
	~pat.steamSynth = Pbind(*[instrument: \bufADSR2, bufnum: ~buffers.steamSynth, dur: Pseq([Pn(1,7),Pn(1/4,4)]), sustain: Pkey(\dur), amp: 3.3, rateScale: Pseq([Pn(1,4), Pn(1.5,7)]), amp: 0.6, decay: 0.01]);
	~pat.steamSynth2 = Pbind(*[instrument: \bufADSR2, bufnum: ~buffers.steamSynth2, dur: Pseq([Pn(1,7),Pn(1/4,4)]), sustain: Pkey(\dur), amp: 3.3, rateScale: Pseq([Pn(1,4), Pn(1.5,7)]), amp: 0.6, decay: 0.01]);
	~pat.stab = Pbind(*[instrument: \bufADSR2, bufnum: ~buffers.stab, dur: 1/4, sustain: Pkey(\dur), amp: 0.1, rateScale: Pseq([0.5, Rest, Rest, 0.7], 4), amp: 0.6, decay: 0.01]);
	~pat.hat = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.steamlet, dur: 1/8, amp: Pn(0.15, 64), rateScale: Pseq([10, 20, 30, 20], inf), out: ~hatBus]);
	~pat.hatDoubleTime = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.steamlet, dur: 1/16, amp: Pn(0.15, 128), rateScale: Pseq([10, 10, 10, 10], inf), out: ~hatBus]);
	~pat.pluck = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.lowPluck, dur: 1/8, amp: Pn(0.3, 64), rateScale: Pseq([10, 20, 30, 20], inf), out: ~hatBus]);
	~pat.kickish = Pbind(*[instrument: \bufPlay2, bufnum: ~buffers.lowPluck, dur: 2, amp: Pn(2, 4), rateScale: 0.18, release: 0.25, out: ~kickBus]);
	~pat.twinkleFilter = Pbind(*[instrument: \bufADSR2, bufnum: ~buffers.steamSynth, dur: 1/16, amp: Pseq([0.2, Rest], 32), rateScale: Pseq([4,5,6,7],inf), release: 0.1, out: ~twinkleFilterBus]);

	Pseq([
		~pat.intro,
		Pn(Ppar([~pat.thump, ~pat.paperNoise, ~pat.squeakHalf, ~pat.clickSnare, ~pat.kickish]), 2),
		Pn(Ppar([~pat.thump, ~pat.paperNoise, ~pat.clickClack, ~pat.clickSnare, ~pat.steamlet2Half, ~pat.steamSynth, ~pat.hat, ~pat.kickish]), 2),
		Pn(Ppar([~pat.thump, ~pat.squeakHalf, ~pat.paperNoise, ~pat.clickSnare, ~pat.clickClack, ~pat.steamlet2Half, ~pat.steamSynth, ~pat.hat, ~pat.kickish]), 2),
		Pn(Ppar([~pat.thump, ~pat.paperNoise, ~pat.clickClack, ~pat.clickSnare, ~pat.steamlet2Half, ~pat.steamSynth2, ~pat.hat, ~pat.kickish, ~pat.twinkleFilter]), 2),
		Pn(Ppar([~pat.thump, ~pat.squeakHalf, ~pat.paperNoise, ~pat.clickSnare, ~pat.clickClack, ~pat.steamlet2Half, ~pat.steamSynth2, ~pat.hat, ~pat.kickish, ~pat.twinkleFilter]), 2),
		Pn(Ppar([~pat.thump, ~pat.clickSnare, ~pat.steamSynth, ~pat.hat, ~pat.kickish, ~pat.pluck]), 2),
		Pn(Ppar([~pat.thump, ~pat.paperNoise, ~pat.clickSnare, ~pat.steamSynth, ~pat.kickish, ~pat.hatDoubleTime, ~pat.pluck]), 2),
		Pn(Ppar([~pat.thump, ~pat.paperNoise, ~pat.clickClack, ~pat.clickSnare, ~pat.steamlet2Half, ~pat.steamSynth, ~pat.hat, ~pat.kickish, ~pat.pluck]), 2),
		Pn(Ppar([~pat.thump, ~pat.squeakHalf, ~pat.paperNoise, ~pat.clickSnare, ~pat.clickClack, ~pat.steamlet2Half, ~pat.steamSynth, ~pat.hat, ~pat.kickish, ~pat.pluck]), 2),
		Pn(Ppar([~pat.thump, ~pat.paperNoise, ~pat.clickClack, ~pat.clickSnare, ~pat.steamlet2Half, ~pat.steamSynth2, ~pat.hat, ~pat.kickish, ~pat.pluck, ~pat.twinkleFilter]), 2),
		Pn(Ppar([~pat.thump, ~pat.squeakHalf, ~pat.paperNoise, ~pat.clickSnare, ~pat.clickClack, ~pat.steamlet2Half, ~pat.steamSynth2, ~pat.hat, ~pat.kickish, ~pat.pluck, ~pat.twinkleFilter]), 2),
		Pn(Ppar([~pat.thump, ~pat.squeak]), 2),
		~pat.squeakInfinity,
		Ppar([~pat.squeakInfinity2, ~pat.intro]),
		~pat.squeakInfinity2
	]).play(~songClock);
};
)