|
|
|
|
Note that the finished piece is 74 minutes and not available for download at this time. However, there are examples on this page. Enjoy...
Dedication
My question: "What kinds of sounds would you want your computer to make...if you could just turn it on and ask it to make sound?"
Corey Fogel's reply, after a moment of thought: "Some whitenoise and...maybe some blips...and blops" Corey Fogel is a very serious musician, and I knew that he would give the question the consideration it needed before offering an answer. My motivation was curiosity I suppose: I wanted to know what sounds he - and therefore an audience - might want a computer to produce.
The Finished Product
My discussion with Corey was a little more involved than the scenario above, and as we talked he raised a few points that I felt were important to the composition:
- Computers can/should be considered "musical instruments".
- It is (in most cases) pointless to use computers/synthesizers to emulate "acoustic" instruments.
- Computers, as instruments, are capable of producing any and all sounds, most of which humans have never heard before.
- Corey also briefly said that a human voice distorted and altered beyond recognition, resulting in mumblings, babblings, and mono-syllabic-meaninglessness, would be a "cool sound".
- The finished work is approximately 74 minutes of music (as much as I could burn onto a CD) divided into three main sections as follows:
- "Some whitenoise and...
- maybe some blips...
- and blops"
The Sounds
The following sounds were produced in Supercollider for this work. I then assembled the sounds in Pro Tools.
- Corey's Voice
- This is a clip I recorded from a conversation with Corey -- the concept of the entire piece.
- Upwards XLine and Latch
- This sound was used in conjunction with noise during the first section, "Some whitenoise and...", as a transition to the second section.
- Modal Pulses
- This sound was used as the basis of "maybe some blips...", the second section.
- Random Pulses
- This sound almost made it into the piece, but didn't!
- Bounce, then Ring
- This sound served as transition between section one and two. This is perhaps one of my favourite sounds I have ever generated with Supercollider.
- Talking Rhythm
- This sound was used as the basis of "and blops." It is created reading the above file, Corey's Voice, at random speeds and a somewhat random order.
- "C" Pulses
- This sound was used in "and blops." for harmonic interest.
The SuperCollider Code
(
{ // whitenoise fades in over 1 minute
// used in the introduction of for_Corey_Fogel
a = WhiteNoise.ar(1);
b = Env.new([0.01,1,0],[60,0.5],'exponential');
a = a * EnvGen.kr(b);
Limiter.ar(a, 0.4,0.01)
}.scope;
)
(
// other noises, overlapping texture
// used in the introduction of for_Corey_Fogel
Synth.play({
a = [
{Pan2.ar(WhiteNoise.ar(0.3),1.0.rand2)},
{Pan2.ar(PinkNoise.ar(0.4),1.0.rand2)},
{Pan2.ar(Resonz.ar(PinkerNoise.ar(1),8000.16000.rand,XLine.kr(0.1,1,8),2),1.0.rand2)},
{Pan2.ar(BrownNoise.ar(0.5),1.0.rand2)},
{Pan2.ar(GrayNoise.ar(0.5),1.0.rand2)},
{Pan2.ar(ClipNoise.ar(0.5),1.0.rand2)},
{Pan2.ar(LFNoise0.ar(40.1000.rand,0.5),1.0.rand2)},
{Pan2.ar(LFNoise1.ar(1000.4000.rand,0.5),1.0.rand2)},
{Pan2.ar(LFNoise2.ar(4000.16000.rand,0.5),1.0.rand2)},
{Pan2.ar(LFClipNoise.ar(40.16000.rand,0.5),1.0.rand2)},
{Pan2.ar(Crackle.ar(1.97,1.5),1.0.rand2)}
];
b = OverlapTexture.ar({arg sp, i; a.choose.value},30,15,5,2,nil,1,1);
c = Env.new([0.001,1,1,0],[0.01,60 * 4,60],'exponential');
b = b * EnvGen.kr(c);
Limiter.ar(b,0.98,0.01)
})
)
(
// 3 minutes of multiple saw waves rising in pitch.
// effected by a Sample & Hold effect and low pass
// filter.
// used in the introductin of for_Corey_Fogel
Synth.play(
{
a = Env.linen(4,60,4);
b = Spawn.ar({ Pan2.ar( EnvGen.ar(a, RLPF.ar(Saw.ar(XLine.kr(1,4000,60) +
(100 * Latch.ar(LFNoise0.ar(30), Impulse.ar(67))), 0.5), 450 +
(400 * Latch.ar(LFNoise0.ar(30),Impulse.ar(60))),0.2)),1.0.rand2)},2,20);
c = Env.new([0.1,1,1,0], [0.1,180,0.01], 'exponential');
b = b * EnvGen.kr(c);
Limiter.ar(b,0.7,0.01)
},180.11, "upwards_aiff")
)
(
// waves
// used in the ending of for_Corey_Fogel
Synth.write(
{
a = [
{ Pan2.ar(WhiteNoise.ar(0.1),1.0.rand2) },
{ Pan2.ar(PinkNoise.ar(0.4),1.0.rand2) },
{ Pan2.ar(PinkerNoise.ar(0.3),1.0.rand2) },
{ Pan2.ar(BrownNoise.ar(0.2),1.0.rand2) },
{ Pan2.ar(GrayNoise.ar(0.2),1.0.rand2) },
{ Pan2.ar(ClipNoise.ar(0.3),1.0.rand2) }
];
b = OverlapTexture.ar({ a.choose.value },sustainTime: 2, numChannels: 2, density: 6);
Limiter.ar(b,0.2,0.1)
})
)
(
// soft hi-hat sound
// used during "maybe some blips" in for_Corey_Fogel
Synth.play({ arg synth;
var t;
t = LFPulse.ar(7); // uses a pulse wave as a trigger
a = Decay2.ar( // hi-hats
ImpulseSequencer.ar({0.1.linrand},t),
attackTime:0.1,decayTime:1,mul: WhiteNoise.ar(0.35));
Limiter.ar(a,0.4,0.1)
})
)
(
// pulses on C octaves
// used in and blops in for_Corey_Fogel
Synth.play({
var lfo, lfoFreq, lfo2, delayTime, left, right;
lfoFreq = 6;
lfo = LFNoise0.kr(lfoFreq, mul: 1200, add: 1200);
lfo2 = LFSaw.ar(freq: 2,mul: 0.4).abs;
left = RHPF.ar(
OverlapTexture.ar({
f = #[60,1].choose.midicps; // midi notes
LFPulse.ar(f,
lfo2,
1,
0)
},
sustainTime:24,
transitionTime:0.01,
density:1,
numChannels:1)
* 0.02, // multiplied here to control output level.
lfo, // this LFO controls either the bandwidth or cut-off freq of the filter.
lfo2 ); // this saw wave controls either the bandwidth or cut-off freq of the filter.
delayTime = 2/lfoFreq;
right = DelayL.ar(left, delayTime, delayTime);
Limiter.ar([right,left],0.7,0.1) // to limit output level
})
)
(
// pulses
// used in "maybe some blips" in for_Corey_Fogel
Synth.play({
var lfo, lfoFreq, lfo2, delayTime, left, right;
lfoFreq = 7;
lfo = LFNoise0.kr(lfoFreq, mul: 1200, add: 1200); // the multiply level has something to do with frequency RANGE
lfo2 = LFSaw.ar(freq: 0.05,mul: 0.4).abs;
left = RLPF.ar(
OverlapTexture.ar({
f = #[51,54,56,58,60,63,65,66,68,70,72,72,75,78,82,85].choose.midicps; // midi notes
LFPulse.ar(f,
lfo2, // used here to control dutycycle of pulse wave
1,
0)
},
sustainTime:4,
transitionTime:2,
density:4,
numChannels:1)
* 0.02, // multiplied here to control output level.
lfo, // this LFO controls either the bandwidth or cut-off freq of the filter.
lfo2 ); // this saw wave controls either the bandwidth or cut-off freq of the filter.
delayTime = 2/lfoFreq;
right = DelayL.ar(left, delayTime, delayTime);
Limiter.ar([right,left],0.4,0.1) // to limit output level
})
)
(
// random-frequency pulses
// not used in for_Corey_Fogel
Synth.play({
var lfo, lfoFreq, lfo2, delayTime, left, right;
lfoFreq = 7;
lfo = LFNoise0.kr(lfoFreq, mul: 1200, add: 1200); // the multiply level has something to do with frequency RANGE
lfo2 = LFSaw.ar(freq: 0.05,mul: 0.4).abs;
left = RLPF.ar(
OverlapTexture.ar({
f = 200.12000.rand;
LFPulse.ar(f,
lfo2, // used here to control dutycycle of pulse wave
1,
0)
},
sustainTime:4,
transitionTime:2,
density:4,
numChannels:1,
maxRepeats: 20)
* 0.02, // multiplied here to control output level.
lfo, // this LFO controls either the bandwidth or cut-off freq of the filter.
lfo2 ); // this saw wave controls either the bandwidth or cut-off freq of the filter.
delayTime = 2/lfoFreq;
right = DelayL.ar(left, delayTime, delayTime);
Limiter.ar([right,left],0.4,0.1) // to limit output level
})
)
(
// talking rhythms
// used in and blops. in for_Corey_Fogel
var filename, sound, signal;
filename = ":sounds:voice"; // path is relative to SUPERCOLLIDER
sound = SoundFile.new; // instance of SoundFile
if (sound.read(filename), { // conditional, in case the sound file isn't found.
signal = sound.data.at(0);
Synth.play({ arg synth;
var t;
t = LFPulse.ar(6); // uses a pulse wave as a trigger
a = Mix.arFill(2, {
var pat, rate;
rate = Plug.kr(exprand(0.25, 0.5), 0);
pat = `scramble([1,0,1]);
synth.repeat(1, 1, {
if (0.1.coin, {
pat.value = pat.value.scramble;
rate.source = exprand(0.1, 0.5);
});
});
Pan2.ar(
Decay2.ar(
ImpulseSequencer.ar(pat, t),
0.001, 0.5, PlayBuf.ar(signal, sound.sampleRate, rate, 0, 0, signal.size-2, 1)),1.0.rand2)
})
+
Mix.arFill(16, {
var pat, rate;
rate = Plug.kr(exprand(-1,-1.25), 0);
pat = `scramble([1,0,1]);
synth.repeat(0.02,6, {
if (0.1.coin, {
pat.value = pat.value.scramble;
rate.source = exprand(-1,-1.25);
});
});
Pan2.ar(
ImpulseSequencer.ar({1.0.linrand}, t),
0.001, 0.15, PlayBuf.ar(signal, sound.sampleRate, rate, 0, 0, signal.size-2, 0.5)),1.0.rand2)
})
+
Mix.arFill(1, {
var pat, rate;
rate = Plug.kr(exprand(1,1), 0);
pat = `scramble([1,0,1]);
synth.repeat(1,1, {
if (0.1.coin, {
pat.value = pat.value.scramble;
rate.source = exprand(1,1);
});
});
Pan2.ar(
Decay2.ar(
ImpulseSequencer.ar(`#[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], t),
0.5, 3, PlayBuf.ar(signal, sound.sampleRate, rate, 0, 0, signal.size-2, 1)),1.0.rand2)
});
Limiter.ar(a,0.9,0.1)
})
})
)
|
|
|
|