///// // / / / / / / / // // supercollider tests // ////// / / "e p h e m e r a l g a r d e n".postln; // sc server s = Server.local; //s.options.memSize = 1024 * 1024; //s.options.maxNodes = 1024 * 1024; //s.options.numBuffers = 1024 * 1024 * 1024; //s.latency = 0.05; s.options.sampleRate = 44100; s.boot; "...".postln; // time of day - see AppClock for scheduling ~now=Date.gmtime; // dont trust the clock if it's n 1970 (not ntp synced) if ( ~now.year == 1970, {"previously".postln;}, {"post 1970".postln;} ) ~now.hour.postln; ~prefix = Platform.userHomeDir ++ "/snd/"; ~background = { "background >> ".post; // list of soundfiles ~sources = [ "39-incomprehensible-restaurtant-chatter-02.wav", "39-incomprehensible-restaurtant-chatter-03.wav", "39-incomprehensible-restaurtant-chatter-04.wav", "46-afternoon-chorus-02.wav", "46-afternoon-chorus-03.wav", "46-afternoon-chorus-04.wav", ]; // select random element from the list ~file = ~sources.choose; ~file.postln; // read file then play buffer Buffer.read (server: s, path: ~prefix++~file, action: ~play1); }; ~foreground = { "foreground >> ".post; // list of soundfiles ~sources = [ "26-multilayered-conversations-01.wav", "26-multilayered-conversations-02.wav", "39-incomprehensible-restaurtant-chatter-02.wav", "39-incomprehensible-restaurtant-chatter-03.wav", "39-incomprehensible-restaurtant-chatter-04.wav", "26-party-chatter-02.wav", "26-party-chatter-03.wav", "26-party-chatter-04.wav", "06-uw-pebbles-urchins-waves.wav", "17-uw-waves-crashing-on-pebble-beach-slow.wav" ]; // select random element from the list ~file = ~sources.choose; ~file.postln; // read file then play buffer Buffer.read (server: s, path: ~prefix++~file, action: ~play2); }; ~play1 = { arg b1; Routine { "~play [bg - ".post; b1.path.post; "]".postln; {(PlayBuf.ar(1, b1, rate: 1, loop: 0, doneAction: 2) * 0.1).dup }.play.waitForFree; // free buffer once done? "freed [bg - ".post; b1.path.post; "]".postln; b1.free; ~background.value; }.play; }; ~play2 = { arg b2; Routine { "~play [fg - ".post; b2.path.post; "]".postln; {(PlayBuf.ar(1, b2, rate: 1, loop: 0, doneAction: 2) * 0.1).dup }.play.waitForFree; // free buffer once done? "freed [fg - ".post; b2.path.post; "]".postln; b2.free; ~foreground.value; }.play; }; s.waitForBoot { "booted...".postln; i = 0; j = 0; p = 2; // how many background layers? q = 3; // how many foreground layers? while ( { i < p }, { i = i + 1; ~background.value;}); while ( { j < q }, { j = j + 1; ~foreground.value;}); }; // 167/31 -> 175/31 -> 168/31 // via http://danielnouri.org/docs/SuperColliderHelp/Tutorials/Getting-Started/Buffers.html // Streaming a File in From Disk // In some cases, for instance when working with very large files, you might not want to load a sound completely into memory. Instead, you can stream it in from disk a bit at a time, using the UGen DiskIn, and Buffer's 'cueSoundFile' method: // ( // SynthDef("tutorial-Buffer-cue",{ arg out=0,bufnum; // Out.ar(out, // DiskIn.ar( 1, bufnum ) // ) // }).send(s); // ) // b = Buffer.cueSoundFile(s,"sounds/a11wlk01-44_1.aiff", 0, 1); // y = Synth.new("tutorial-Buffer-cue", [\bufnum,b.bufnum], s); // b.free; y.free; // This is not as flexible as PlayBuf (no rate control), but can save memory.