我编写了以下代码来定义一个 SynthDef,它将声音记录到作为参数之一传递的缓冲区中。
(
SynthDef(\recordTone, { |freq, bufnum, duration|
var w = SinOsc.ar(freq) * XLine.ar(101,1,duration,add: -1) / 100;
RecordBuf.ar(w!2,bufnum,loop: 0,doneAction: 2);
}).add;
)
我还有下面的代码,它为上述 SynthDef 调用 Synth 并尝试将缓冲区写入文件。
({
var recordfn = { |freq, duration, fileName|
var server = Server.local;
var buf = Buffer.alloc(server,server.sampleRate * duration,2);
Synth(\recordTone,[\freq, 440, \bufnum, buf.bufnum, \duration, duration]);
buf.write(
"/Users/minerva/Temp/snd/" ++ fileName ++ ".wav",
"WAVE",
"int16",
completionMessage: ["b_free", buf.bufnum]
);
};
recordfn.value(440,0.5,"test");
}.value)
正在创建输出文件,但不包含任何声音。我究竟做错了什么?我浏览了所有我能找到的 SuperCollider 文档,但似乎没有任何效果!非常感谢任何指针。