davesabine.com

 Search
for Corey Fogel

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:
    1. "Some whitenoise and...
    2. maybe some blips...
    3. 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)
})
})
)