Rui Vieira
Rui Vieira

Reputation: 5328

in SuperCollider what is the best way to render a sound a file?

What is the best way to programatically render a SuperCollider program to a file (say a wav file).

Can I specify the duration of the file (eg 30 seconds)?

Upvotes: 2

Views: 5057

Answers (2)

caseyanderson
caseyanderson

Reputation: 530

There are lots of different ways to do this in addition to Score.recordNRT (which is maybe one of the more convenient ones, and also something I did not know about). DiskOut.ar takes path and channelsArray as args. You could also try the .record instance method that Server has. Here are examples (from the help docs) of both:

The DiskOut.ar way

// start something to record
x = Synth.new("bubbles");

// allocate a disk i/o buffer
b= Buffer.alloc(s, 65536, 2);

// create an output file for this buffer, leave it open
b.write("~/diskouttest.aiff".standardizePath, "aiff", "int16", 0, 0, true);
// create the diskout node; making sure it comes after the source
d = Synth.tail(nil, "help-Diskout", ["bufnum", b]);
// stop recording
d.free;
// stop the bubbles
x.free;
// close the buffer and the soundfile
b.close;
// free the buffer
b.free;

// play it back
(
x = Synth.basicNew("help-Diskin-2chan");
m = { arg buf; x.addToHeadMsg(nil, [\bufnum,buf])};

b = Buffer.cueSoundFile(s,"~/diskouttest.aiff".standardizePath, 0, 2, completionMessage: m);
)
x.free; b.close; b.free; // cleanup

The Server.record way:

s.boot; // start the server

// something to record
(
SynthDef("bubbles", {
    var f, zout;
    f = LFSaw.kr(0.4, 0, 24, LFSaw.kr([8,7.23], 0, 3, 80)).midicps; // glissando function
    zout = CombN.ar(SinOsc.ar(f, 0, 0.04), 0.2, 0.2, 4); // echoing sine wave
    Out.ar(0, zout);
}).add;
SynthDef("tpulse", { arg out=0,freq=700,sawFreq=440.0;
    Out.ar(out, SyncSaw.ar(freq,  sawFreq,0.1) )
}).add;

)

x = Synth.new("bubbles");

s.prepareForRecord; // you have to call this first

s.record;

s.pauseRecording; // pausable

s.record // start again

s.stopRecording; // this closes the file and deallocates the buffer recording node, etc.

x.free; // stop the synths

// look in your recordings folder and you'll find a file named for this date and time    

Upvotes: 3

irh
irh

Reputation: 668

You can do this with Score.recordNRT.

There's a tutorial on how to use it here.

Upvotes: 4

Related Questions