• jon@schemawound.com
Supercollider
fxLoop

fxLoop

Due to the demands of everyday life and a studio that suffered from periodic flooding, I have been an audio nomad for several years. My work has been created on a variety of different machine and synced by Dropbox, Google Drive and SkyDrive. My material had to be portable between machines as I never knew where I would be working on it next. As things have begun to settle down I am starting to turn an eye towards my hardware synths and collaborations with live instruments.

I decided the simplest way to begin to marry these two worlds would be using Supercollider as a livecoded effect processor for whatever input I happened to be receiving. The way in which I have accomplished this is very simple and I decided to share it here in case it can be of use to anyone else.

Do not worry if you don’t understand how all the pieces interact after the first time through this post. ProxySpace is very hard to understand until you have actually worked with it. Once you begin running the code all the pieces should fall into place.

The first block of code to run will set up your environment for livecoding:

(//*********PREPARE**********
p.pop;
p = ProxySpace.push(s);
~fxLoop.play.fadeTime_(5);
)

The first line of this block:

p.pop;

will accomplish nothing the first time through. On repeated runs this line will restore the previous environment. Between the pop and the push you can interact with any environment variables that you may need. For example I store the class for my QuNeo controller in the environment variable ~quNeo, since this will not be available while in ProxySpace I assign it to interpreter variable q. The next line:

p = ProxySpace.push(s);

will set our current environment to Proxyspace. This will allow us to modify the running code without interruption. The next line:

~fxLoop.play.fadeTime_(5);

will create a NodeProxy and assign it to the environment variable ~fxLoop. ~fxLoop will begin playing and all changes will crossfade over the period of 5 seconds. This whole prepare block can be rerun if needed to reset the environment.

This next block is the real meat of the FX Loop. This is the section you will run each time you wish to change your processing:

(//*********FXLoop**********
~fxLoop = {
	var in = SoundIn.ar([0,1]);
	in;
}
)

The first line:

var in = SoundIn.ar([0,1]);

Will take the first 2 inputs from your soundcard and assign them to the variable in. The next line:

in;

is sending the input out to the speakers. As the code currently stands we are doing no processing, we are taking the input and passing it to the output. But if you were to make this change and rerun the code:

(//*********FXLoop**********
~fxLoop = {
	var in = SoundIn.ar([0,1]);
        in = GVerb.ar(in);
	in;
}
)

Your input would now run through a reverb, because of the 5 second crossfade there would be no interruption to your material.