Four Pillars I



Media: 2-channel Audio
Non-standard Sound Synthesis, Feedback Synthesis

This piece is the first of a series (still in progress) of pieces that explore feedback networks, interactivity (perceived) and aural serendipity. The recording above is one realization of the piece as each time the code is executed the results vary.

This is a two-channel realization of the four-channel feedback system. In the four-channel version, audio from different channels affects parameters of the feedback system in other channels. The originating audio source is a simple impulse which is fed through a series of feedback mechanisms consisting of variable delay lines and amplitude gates whose parameters are informed by low-frequency ramp noise.

Below is a graph of the feedback system.

Here is the code used for this realization.

/*_________________________________________________________________________

USE THIS FOR 2 CHANNEL VERSION: Pans the synths accross the 2 channels instead
of making them left or right only

Execute I: allocates more memory, boots server, and registers the synthdef
___________________________________________________________________________*/

s.options.sampleRate = "int24";
s.options.memSize = 1024*10
s.reboot;

SynthDef("four_pillars_I", {|out=0, pan=0|

var range, offset, amp, speed, input, fBLoopIn, processing, fBLoopOut;

range = EnvGen.kr(Env([0.5, 0.45, 0.35, 0.30, 0.1], [100, 140, 30, 120]), 1);

offset = EnvGen.kr(Env([0.7, 0.725, 0.75, 0.85, 0.3], [100, 140, 30, 120]), 1, doneAction:2);

amp = LFNoise0.kr(0.5, range, offset).round(1);

speed = LFNoise0.kr(0.5, 2, 2.1);

input = Impulse.ar(speed, mul:0.35);

input = Amplitude.kr(input);

fBLoopIn = LocalIn.ar(1);

processing = input + LeakDC.ar(DelayN.ar(fBLoopIn, 3.5, speed, 1.1*amp));

processing = RLPF.ar(processing, LFNoise0.kr(speed, 400, 800), 0.15);

fBLoopOut = LocalOut.ar(processing);

processing = processing.thresh(0.45);

processing = Limiter.ar(processing).softclip;

processing = FreeVerb.ar(processing, 0.25, 0.45, 0.75);

processing = Pan2.ar(processing, pan);

Out.ar(out, processing);

}).add;

/*_________________________________________________________________________

Execute II: to begin piece, double-click inside the parentheses below to select all of the code and evaluate it by pressing 'cmd + c'.
___________________________________________________________________________*/

(
w = Synth("four_pillars_I", [\pan, -0.8]);
x = Synth("four_pillars_I", [\pan, -0.2]);
y = Synth("four_pillars_I", [\pan, 0.2]);
z = Synth("four_pillars_I", [\pan, 0.8]);
)