Colin Sullivan

Sounds of the Subconscious Seas

The "All Worlds Fair" took place in San Francisco at the beautiful old mint building. It was quite a delightful gathering of people and showcased some art and performances that I found quite amazing.

I built a soundscape for the "Seas of the Subconscious" experience that took place in the basement. It sounded pretty sweet in that steel-walled room.

The soundscape is generative, so I could render out 3 minutes or 5 hours if I needed. Here is a short sample:

Sounds of the subconscious seas.
Download:
.aif Apple Lossless .m4a .flac .mp3.ogg

It is written entirely in SuperCollider so I now have the start of a framework for developing soundscapes in the way that I like to think about them. It is open source:

github.com/colinsullivan/seas-of-subconscious

I was there on Thursday to help set up and saw the sets coming to life, and on Saturday night I was able to attend the spectacular event. What a wonderful assortment of artists.

Soundscapes

I have come across a few opportunities recently to design soundscapes to support existing projects. I love to think about how ambient sound influences a setting and collaborating with an artist to design a soundscape that supports their vision is a challenge that is most appealing to me.

On Wikipedia currently:

A soundscape is a sound or combination of sounds that forms or arises from an immersive environment. The study of soundscape is the subject of acoustic ecology. The idea of soundscape refers to both the natural acoustic environment, consisting of natural sounds, including animal vocalizations and, for instance, the sounds of weather and other natural elements; and environmental sounds created by humans, through musical composition, sound design, and other ordinary human activities including conversation, work, and sounds of mechanical origin resulting from use of industrial technology. The disruption of these acoustic environments results in noise pollution.

The term "soundscape" can also refer to an audio recording or performance of sounds that create the sensation of experiencing a particular acoustic environment, or compositions created using the found sounds of an acoustic environment, either exclusively or in conjunction with musical performances.

Elements of a Soundscape

In general I find myself breaking down a soundscape into two different types of components:

  • drones or ambience
  • everything else

The elements in the second category are sounds that I want to be "triggered" at a particular frequency, i.e. once every 5 - 10 seconds.

SuperCollider

My new favorite tool for synthesis and algorithmic music is SuperCollider. Aside from having a wicked efficient client / server architecture, it allows me to abstract away common functionality in my components as I would in any other mature programming environment. This is necessary for my sanity and I welcome it as a challenge alongside other technical and aesthetic challenges.

Checkout this play method of my SoundscapeElement class. This class is a parent class of all elements in the soundscape that are triggered at a particular frequency as described above.

/**
* @file SoundscapeElement.sc
*
* @author Colin Sullivan <colin [at] colin-sullivan.net>
*
* Copyright (c) 2013 Colin Sullivan
* Licensed under the MIT license.
**/
 
/**
* @class Base class for all soundscape elements that are triggered with
* a particular frequency.
**/
SoundscapeElement : Object {
var <>outChannel,
/**
* A unique symbol to use for this element. Override in child
* classes.
**/
<>key,
// reference to Soundscape instance
<>soundscape,
// instrument we are triggering
<>instr,
// transition on and off envelope duration
<>transitionTime,
// maximum time this sound will be played for
<>onTimeMax,
// minimum time this sound will be played for
<>onTimeMin,
// minimum duration between previous off and next on
<>offTimeMin,
// maximum duration between previous off and next on
<>offTimeMax,
// amount of reverb :)
<>reverbLevel;
 
...
 
/**
* Called from soundscape when it starts up.
**/
play {
var onTime,
offTime;

/**
* Main run loop.
**/
{
 
while({ true }, {
 
// prepare instrument
this.instr = this.create_next_patch();
this.outChannel.play(this.instr);
 
// wait for the desired off time
offTime = rrand(this.offTimeMin, this.offTimeMax);
offTime.wait();
 
// turn sound on
this.instr.set(\gate, 1);
 
// wait for transition time
this.transitionTime.wait();

// wait for on time
onTime = rrand(this.onTimeMin, this.onTimeMax) - (2.0 * this.transitionTime);
onTime.wait();
 
// turn sound off
this.instr.set(\gate, 0);
 
// off envelope time is same as on time
this.transitionTime.wait();
 
// stop patch (just for safety)
this.instr.stop();

});

}.fork();

}
}

SuperCollider

Then to use this superclass, I only have to define a few member variables and write the method that creates the patch. There are a few other things that I didn't have time to move to the superclass as well, like creating the mixer channel for the reverb.

/**
* @file FogHornElement.sc
*
* @author Colin Sullivan <colin [at] colin-sullivan.net>
*
* Copyright (c) 2013 Colin Sullivan
* Licensed under the MIT license.
**/
 
/**
* @class Foghorn action.
**/
FogHornElement : SoundscapeElement {
var <>outLevelMin,
<>outLevelMax,
<>bufKeys;

init {
arg args;
 
super.init(args);

this.outChannel.newPreSend(
this.soundscape.reverbReturn,
-10.0.dbamp()
);
 
this.bufKeys = [\fogHornBuf, \fogHorn02Buf];
 
this.outLevelMin = -18.0.dbamp();
this.outLevelMax = -20.0.dbamp();
 
this.offTimeMin = 30.0;
this.offTimeMax = 80.0;
/*this.offTimeMin = 5.0;*/
/*this.offTimeMax = 5.0;*/
 
this.transitionTime = 0.1;
}
 
create_next_patch {
var bufKey,
bufSection,
buf;
 
super.create_next_patch();

bufKey = this.bufKeys.choose();
buf = this.soundscape.bufs[bufKey];
 
("preparing fog horn" ++ bufKey).postln();
 
this.onTimeMin = buf.duration;
this.onTimeMax = buf.duration;
 
this.outChannel.level = rrand(this.outLevelMin, this.outLevelMax);
 
^Patch("cs.sfx.PlayBuf", (
buf: buf,
attackTime: this.transitionTime,
releaseTime: this.transitionTime,
gate: KrNumberEditor.new(0, \gate.asSpec())
));
}
}

SuperCollider

I am looking forward to seeing what comes of this framework. I've already got some plans for it over the summer. For more detailed information see the code:

github.com/colinsullivan/seas-of-subconscious